Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  X/Y-Position von Buchstaben in einem Textstring herausfinden

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  X/Y-Position von Buchstaben in einem Textstring herausfinden (1556 mal gelesen)
Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 129
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 13. Mai. 2008 11:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Andreas Kraus an!   Senden Sie eine Private Message an Andreas Kraus  Schreiben Sie einen Gästebucheintrag für Andreas Kraus

Beiträge: 1356
Registriert: 11.01.2006

WIN 10
ACAD 2022

erstellt am: 13. Mai. 2008 12:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Theodor Schoenwald an!   Senden Sie eine Private Message an Theodor Schoenwald  Schreiben Sie einen Gästebucheintrag für Theodor Schoenwald

Beiträge: 1672
Registriert: 16.04.2002

erstellt am: 13. Mai. 2008 12:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von d.balogh an!   Senden Sie eine Private Message an d.balogh  Schreiben Sie einen Gästebucheintrag für d.balogh

Beiträge: 21
Registriert: 13.05.2008

Acad Mechanical 2007 SP0
Inventor 11 SP3

erstellt am: 13. Mai. 2008 15:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 14. Mai. 2008 09:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 129
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 15. Mai. 2008 08:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Ihr Experten!
War leider ein paar Tage Offline. Werde jetzt mal am Wochenende Eure Vorschläge testen.
Vielen Dank nochmal, Ihr seid echt super!

Gruß Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Ex-Mitglied
CADwiesel
Moderator
CAD4FM UG




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 16. Mai. 2008 13:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 129
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 16. Mai. 2008 13:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo!
Aber wie bekomme ich dann heraus, welcher Buchstabe/Ziffer an dieser Position sitzt? Habe ich etwas entscheidenes übersehen?
Gruß Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADwiesel
Moderator
CAD4FM UG




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 19. Mai. 2008 07:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Du musst doch nur das Element, was durch die Box 'gefangen' wird fragen was es ist.
das geht z.B. über (ssget "_C" p1 p2 '(0 . "TEXT"))

------------------
Gruß
CADwiesel
Besucht uns im CHAT

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Ex-Mitglied
CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 19. Mai. 2008 16:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz