| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: X/Y-Position von Buchstaben in einem Textstring herausfinden (1578 mal gelesen)
|
Big Sven Mitglied Techn. Angestellter
Beiträge: 133 Registriert: 14.09.2005 HP ZBook Intel Core 12.Gen i7 2,3GHz 32GB RAM Windows 11 Pro AutoCAD 2024
|
erstellt am: 13. Mai. 2008 11:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum! Ich würde gerne durch anklicken eines Textstrings feststellen, an welcher Stelle/an welchem Buchstaben ich den Text angewählt habe. Ich bekomme ja den Einfügepunkt des Textes recht leicht heraus, wie sieht es aber mit der Länge von einzelnen Ascii Zeichen aus? Hat hier jemand einen Tipp für mich? Vielen Dank! Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 13. Mai. 2008 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Hallo Sven, ich hab mal vor Ewigkeiten was gebraucht um Texte in einzelne Zeichen zu zerlegen. Da kann man sicher was basteln um die Position rauszukriegen. Gruß Andreas (defun c:txt_solo ()
(defun txt_solo_richt (e_name / e_data1 e_data2 dif_x dif_y aus_x aus_y) (setq e_data1 (entget e_name)) (cond ((= (cdr (assoc 0 e_data1)) "TEXT") (setq e_ri_x (cdr (assoc 72 e_data1))) (setq e_ri_y (cdr (assoc 73 e_data1))) (setq e_data1 (subst ri_x (assoc 72 e_data1) e_data1)) (setq e_data1 (subst ri_y (assoc 73 e_data1) e_data1)) (entmod e_data1) (setq e_data2 (entget e_name)) (cond ((not (= e_data1 e_data2)) (setq dif_x (- (cadr (assoc 10 e_data1)) (cadr (assoc 10 e_data2)) ) ) (setq dif_y (- (caddr (assoc 10 e_data1)) (caddr (assoc 10 e_data2)) ) ) (setq dif_z (- (cadddr (assoc 10 e_data1)) (cadddr (assoc 10 e_data2)) ) ) (setq aus_x (cadr (assoc 11 e_data1))) (setq aus_y (caddr (assoc 11 e_data1))) (setq aus_z (cadddr (assoc 11 e_data1))) (setq aus_x (+ aus_x dif_x)) (setq aus_y (+ aus_y dif_y)) (setq aus_z (+ aus_z dif_z)) (setq aus (list 11 aus_x aus_y aus_z)) (setq e_data2 (subst (assoc 10 e_data1) (assoc 10 e_data2) e_data2 ) ) (setq e_data2 (subst aus (assoc 11 e_data2) e_data2)) (entmod e_data2) ) (t nil) ) ) (t nil) ) ;ende cond ) (setq filter (list (cons 0 "TEXT"))) (setq satz (ssget filter)) (if satz (progn (setq n (1- (sslength satz))) (repeat (sslength satz) (setq ent_name (ssname satz n)) (setq ent_data (entget ent_name)) (while (not (equal (cdr (assoc 1 ent_data)) "")) (setq ri_x '(72 . 0)) (setq ri_y '(73 . 0)) (txt_solo_richt ent_name) (setq ent_data (entget ent_name)) (setq txt (cdr (assoc 1 ent_data))) (if (not (equal (substr txt 1 1) " ")) (progn (command "_copy" ent_name "" "0,0" "0,0") (setq e_name (entlast)) (setq e_data (entget e_name)) (setq e_data (subst (cons 1 (substr txt 1 1)) (assoc 1 e_data) e_data)) (entmod e_data) ) ) (setq ri_x '(72 . 2)) (setq ri_y '(73 . 0)) (txt_solo_richt ent_name) (setq ent_data (entget ent_name)) (setq ent_data (subst (cons 1 (substr txt 2)) (assoc 1 ent_data) ent_data)) (entmod ent_data) (setq ent_data (entget ent_name)) ) (setq n (1- n)) ) (command "_erase" satz "") ) ) (princ) ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 13. Mai. 2008 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Hallo Sven, in den Expresstools gibt es die Funktion "Text auflösen", danach hast Du alle Koordinaten. Allerdings ist der Text dann zu Polylinien aufgelöst, Du kannst ihn ja vorher kopieren. Gruß Theodor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
d.balogh Mitglied
Beiträge: 21 Registriert: 13.05.2008 Acad Mechanical 2007 SP0 Inventor 11 SP3
|
erstellt am: 13. Mai. 2008 15:17 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Muß natürlich noch verfeinert werden, aber als Konzept hilft Dir das vielleicht. Einen Text (keinen Mtext...) einfügen, lsp laden, (textpos) ausführen und dann auf den Text klicken (entlang der Linienführung!) Lg, Daniel (defun textpos () (vl-load-com) (setq pickpoint (getpoint "Pick text")) (setq sset (ssget "_C" (list (- (car pickpoint) 10) (- (cadr pickpoint)) 0) (list (+ (car pickpoint) 10) (+ (cadr pickpoint)) 0) '((0 . "TEXT")) ) ) (if (not (ssname sset 1)) (setq text (vlax-ename->vla-object (ssname sset 0))) ) (if text (progn (setq num_char (strlen (vla-get-TextString text))) (vla-GetBoundingBox text 'll 'ur) (setq startx (car (vlax-safearray->list ll)) starty (cadr (vlax-safearray->list ll)) dist_per_char (/ (- (car (vlax-safearray->list ur)) (car (vlax-safearray->list ll))) num_char) ) (setq x_dist2start (- (car pickpoint) startx)) (setq sel_char (1+ (fix (/ x_dist2start dist_per_char)))) ) ) sel_char ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 14. Mai. 2008 09:11 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Beide Ansätze sind m.E schon nahe dran. Die Lösung von d.balogh basiert allerdings darauf, das alle Zeichen gleich groß sind. Das führt allerdings zu falschen Ergebnissen, bei Texten mit 'schmalen' Buchstaben, wie bslw. dem i . Die Lösung von Andreas ist Ansatzweise zielführender, da hier jeder Buchstabe nachgebildet wird. Diese Lösung muss nun in Teilen mit der von d.balogh ergänzt werden. Es muss nun jeder Buchstabe mit einer boundingbox belegt werden und geprüft werden, ob der pickpunkt innerhalb der jenigen boundingbox liegt. dann hat mann das richtige Ergebniss. ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Big Sven Mitglied Techn. Angestellter
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 15. Mai. 2008 08:37 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied | |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 16. Mai. 2008 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Das stimmt wohl. Also entweder eine ausgerichtete getboundingbox erstellen, oder mal den Befehl textbox nutzen. Eine Alternative ist ein Lisp, welches eine Schattenbox oder Box um einen Text zeichnen kann zu nehmen, und dann durch diese um jeden Buchstaben eine Textbox erstellen zu lassen, die dann abklappern, ob der klickpunkt drin liegt und dann wieder löschen lassen. ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Big Sven Mitglied Techn. Angestellter
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 16. Mai. 2008 13:26 <-- editieren / zitieren --> Unities abgeben:
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 19. Mai. 2008 07:59 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
|
Ex-Mitglied | |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 19. Mai. 2008 16:12 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
wie wäre es mit einem Ansatz für die Breite mit (setq Breite(distance(cdr(assoc 10 DUMMY)) (cdr(assoc 11 DUMMY)) ) ) wobei Dummy eben die durch entget ermittelten Textdaten eines mit den Originaleinstellungen erzeugten "rechtsbündig" ausgerichteten Dummytextes sind.(nur bei nicht linksausgerichtetem Text wird GC11 berechnet) Die Textlänge von z.B. "a" im String "Darum" läßt sich durch die Differenz der Längen von "D" und "Da" ermitteln...... ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |