| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Mit Lisp Blöcke auslesen und Teile des Inhalts in Textzeilen abbilden (238 / mal gelesen)
|
100dpi Mitglied selbständig
Beiträge: 26 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB
|
erstellt am: 24. Nov. 2024 15:03 <-- editieren / zitieren --> Unities abgeben:
Hallo Gemeinde, ich bin seit zwei Tagen im Zwiegespräch mit ChatGPT und komme nicht ans Ziel... Problemstellung: Ich bekomme von einem Architekten ACAD-Dateien von Etagen. In den Räumen befinden sich jeweils Raumstempel mit (für mich) überflüssigen Angaben über Raum-Größe und Umfang etc. Ich versuche aus den Blöcken den Zimmernamen und die Raumnummer zu extrahieren um sie anschließend an der Stelle des Plocks zu platzieren und den Block ansich auf den Layer "Ausschalten" zu schieben. Folgendes Script ist der aktuelle Stand: (defun c:REMFIELD (/ blockRef attributes roomName roomNumber selection newText1 newText2 insertionPoint x y z layer) (vl-load-com) ;; COM-Schnittstellen laden ;; Block auswählen (prompt "\nWählen Sie einen Block aus: ") (setq selection (entsel)) ;; Benutzer wählt Block aus (if selection (progn (setq blockRef (vlax-ename->vla-object (car selection))) ;; Blockreferenz holen ;; Überprüfen, ob es sich um eine Blockreferenz handelt (if (eq (vla-get-ObjectName blockRef) "AcDbBlockReference") (progn ;; Attributwerte holen (setq attributes (vlax-invoke blockRef 'GetAttributes)) ;; Durch die Attribute iterieren und ROOM_NAME und ROOM_NUMBER extrahieren (foreach attr attributes (setq tag (strcase (vla-get-TagString attr))) ;; Tag des Attributs (setq value (vla-get-TextString attr)) ;; Wert des Attributs (cond ((equal tag "ROOM_NAME") (setq roomName value)) ((equal tag "ROOM_NUMBER") (setq roomNumber value)) )) ;; Ausgabe der Werte in der Befehlszeile (princ (strcat "\nROOM_NAME: " roomName)) (princ (strcat "\nROOM_NUMBER: " roomNumber)) ;; InsertionPoint des Blocks holen und als Liste erhalten (setq insertionPoint (vla-get-InsertionPoint blockRef)) ;; Manuelles Extrahieren der Koordinaten (x, y, z) (setq x (vlax-get insertionPoint 'x)) (setq y (vlax-get insertionPoint 'y)) (setq z (vlax-get insertionPoint 'z)) ;; Ausgabe des InsertionPoints (princ (strcat "\nInsertion Point: " (rtos x 2 2) ", " (rtos y 2 2))) ;; Textobjekte erstellen ;; Text 1 für ROOM_NAME, 1.0 für die Höhe, keine Rotation (setq newText1 (vla-addtext (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) roomName (list x y z) 1.0)) ;; Höhe des Textes auf 1.0 gesetzt ;; Text 2 für ROOM_NUMBER, leicht versetzt unter dem ersten Text (setq newText2 (vla-addtext (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) roomNumber (list x (+ y -0.2) z) 1.0)) ;; Höhe des Textes ebenfalls auf 1.0 gesetzt ;; Block auf Layer "Ausschalten" verschieben (vla-put-Layer blockRef "Ausschalten") ) (princ "\nFehler: Das ausgewählte Objekt ist kein Block.")) ) (princ "\nFehler: Kein Objekt ausgewählt.") ) (princ) ;; Abschluss ) Dieser führt allerdings seit Stunden zu diesem Ergebnis bei Ausführung: Befehl: REMFIELD Wählen Sie einen Block aus: Objekt wählen: ROOM_NAME: KU/MU ROOM_NUMBER: A0.027; Fehler: Fehlerhafter Argumenttyp: VLA-OBJECT #<variant 8197 ...> Habt Ihr da eine Lösung? Danke schon mal für Eure Mühe Gruß 100dpi ------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3082 Registriert: 26.08.2002 ACAD R11 - 2018.1.2 (Plant3D) AVIS ACAD LT 2013- 2020 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 25. Nov. 2024 10:09 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Hy, klar man kann fast alles mit Lisp machen, aber warum , Block editieren ( extra Layer für die Attribute geh ich mal aus ) Bloch updaten und Layerschalten und gut ( max 10min ) Bitte Block posten , dann kann ich meinen Ansatz auch das macht. cu cw ------------------ Also ich finde Unities gut ... und andere sicher auch ------------------------------------------------ cadwomen™ Plant ist nur die Spitze des Berges der da treibt ? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
100dpi Mitglied selbständig
Beiträge: 26 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB
|
erstellt am: 25. Nov. 2024 10:18 <-- editieren / zitieren --> Unities abgeben:
So dieses Script funktioniert soweit: (defun c:remfield () (prompt "\nWählen Sie mehrere Blöcke aus:") ; Benutzeraufforderung für die Auswahl (setq blk-selection (ssget '((0 . "INSERT")))) ; Alle eingefügten Blöcke auswählen (if blk-selection (progn (setq blk-count (sslength blk-selection)) ; Anzahl der ausgewählten Blöcke (princ (strcat "\nEs wurden " (itoa blk-count) " Blöcke ausgewählt.")) (repeat blk-count (setq blk (ssname blk-selection (1- blk-count))) ; Nächsten Block aus der Auswahl holen (setq vla-blk (vlax-ename->vla-object blk)) ; Verwandelt das ausgewählte Objekt in ein VLA-Objekt (if (and (vlax-property-available-p vla-blk 'HasAttributes) ; Prüft, ob der Block Attribute hat (= (vla-get-HasAttributes vla-blk) :vlax-true)) (progn (setq attr-list (vlax-invoke vla-blk 'GetAttributes)) ; Ruft die Attribute ab (setq room-name "") (setq room-number "") (setq text-height 1.0) ; Standard-Schrifthöhe, falls keine gefunden wird (foreach attr attr-list (setq tag (strcase (vla-get-TagString attr))) ; Tag des Attributs holen (setq value (vla-get-TextString attr)) ; Wert des Attributs holen (setq text-height (vla-get-Height attr)) ; Schrifthöhe des Attributs holen (cond ((= tag "ROOM_NAME") (setq room-name value)) ((= tag "ROOM_NUMBER") (setq room-number value)) ) ) ; Block auf Layer "Ausschalten" verschieben (vla-put-Layer vla-blk "Ausschalten") (vla-update vla-blk) (princ "\nBlock wurde auf den Layer 'Ausschalten' verschoben.") ; Wenn beide Werte gefunden sind, Text erstellen (if (and room-name room-number) (progn (setq ins-point (vlax-get vla-blk 'InsertionPoint)) ; Einfügepunkt des Blocks (setq x (car ins-point) y (cadr ins-point) z (caddr ins-point)) ; Erstellen der Textzeilen auf dem Layer "Beschriftung_neu" (entmake (list '(0 . "TEXT") (cons 10 (list x y z)) ; Position des Textes (cons 40 text-height) ; Dynamische Schrifthöhe (cons 1 room-name) ; Textinhalt '(7 . "Standard") ; Standard-Schriftstil '(8 . "Beschriftung_neu"))) ; Layer setzen (entmake (list '(0 . "TEXT") (cons 10 (list x (- y (* text-height 1.5)) z)) ; Zweite Zeile etwas tiefer (cons 40 text-height) ; Dynamische Schrifthöhe (cons 1 room-number) ; Textinhalt '(7 . "Standard") ; Standard-Schriftstil '(8 . "Beschriftung_neu"))) ; Layer setzen (princ "\nText wurde erstellt und auf den Layer 'Beschriftung_neu' verschoben.") ) (princ "\nROOM_NAME oder ROOM_NUMBER fehlt, keine Textzeilen erstellt.") ) ) (princ "\nDer ausgewählte Block hat keine Attribute.") ) (setq blk-count (1- blk-count)) ; Zähler für die Schleife dekrementieren ) ) (princ "\nEs wurden keine Blöcke ausgewählt.") ) (princ) ) Hat vielleicht jemand eine Idee, wie ich ACAD dazu bekomme, den neu zu erstellenden Text mitte zentr. zu setzen? ------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1465 Registriert: 11.01.2006
|
erstellt am: 25. Nov. 2024 14:05 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Zitat: Hat vielleicht jemand eine Idee, wie ich ACAD dazu bekomme, den neu zu erstellenden Text mitte zentr. zu setzen?
Gruppencode 72 auf 1 und 73 auf 2 Also einfach '(72 . 1) '(73 . 2) beim entmake ergänzen ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
100dpi Mitglied selbständig
Beiträge: 26 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB
|
erstellt am: 25. Nov. 2024 14:47 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Antworten @cadwoman: Block editieren weil es dynamische Raumstempel sind, aus denen ich bloß zwei Infos in den Grundrissen brauche. Diese Architektenpläne erzeugen wohl für jeden Raumstempel einen eigenen Block mit den selben Attributen. Ich müsste also zig Blöcke einzeln editieren. So bin ich den Weg gegangen die Werte der Attribute zu extrahieren und dann in zwei Textzeilen schreiben zu lassen. Zur Erklärung: Ich erstelle Feuerwehrpläne und da benötige ich keine m²-Daten. @Andreas: Das genau hab ich versucht, Acad schiebt die Texte dann aber ALLE zum Punkt 0,0 Gruß 100dpi ------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1770 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 26. Nov. 2024 08:01 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Hallo 100dpi, mit folgendem Code kann der mit ENTMAKE erstellte Text auf Mitte-Zentrisch umgestellt werden, die Position sollte erhalten bleiben: Code:
(defun TextMitteZentrisch (ename / P VLA-OBJ) (setq vla-obj (vlax-ename->vla-object ename)) (setq p (vla-get-InsertionPoint vla-obj)) (vla-put-alignment vla-obj 10) (vla-move vla-obj (vla-get-InsertionPoint vla-obj)p) (vla-update vla-obj) )(defun c:test ( / ) (TextMitteZentrisch (car(entsel))) )
Das Einbinden in Deinen Code: Direkt nach der ENTMAKE-Funktion mit (TextMitteZentrisch (entlast))
------------------ viele Grüße Jörn http://www.bosse-engineering.com das Flächenstempel_Tool(2023) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1770 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 26. Nov. 2024 08:11 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Hallo 100dpi, ich habe auch mal ChatGPT gefragt was mein Code so alles macht, eine erstaunlich gute Erklärung (finde ich): Erkläre mit bitte folgenden AutoLISP-Programmcode: (defun TextMitteZentrisch (ename / P VLA-OBJ) (setq vla-obj (vlax-ename->vla-object ename)) (setq p (vla-get-InsertionPoint vla-obj)) (vla-put-alignment vla-obj 10) (vla-move vla-obj (vla-get-InsertionPoint vla-obj)p) (vla-update vla-obj) )
ChatGPT: ChatGPT Dieser AutoLISP-Code definiert eine Funktion namens TextMitteZentrisch, die darauf abzielt, die Ausrichtung eines Textobjekts in AutoCAD auf "zentriert" zu setzen und es korrekt zu positionieren. Hier ist eine schrittweise Erklärung des Codes: 1. Funktionsdeklaration (defun TextMitteZentrisch (ename / P VLA-OBJ) TextMitteZentrisch ist der Name der Funktion. ename ist ein Parameter und erwartet die Eingabe eines Entitätsnamens (z. B. ein Textobjekt in AutoCAD). Der / trennt die Eingabeparameter von den lokal deklarierten Variablen. Die lokalen Variablen sind hier P und VLA-OBJ. 2. Objektreferenz erstellen (setq vla-obj (vlax-ename->vla-object ename)) Mit vlax-ename->vla-object wird der AutoCAD-Entitätsname (ename) in ein VLA-Objekt umgewandelt, das für ActiveX-Methoden verwendet werden kann. vla-obj repräsentiert das Textobjekt, das bearbeitet werden soll. 3. Einfügepunkt des Textes abrufen (setq p (vla-get-InsertionPoint vla-obj)) vla-get-InsertionPoint holt die Koordinaten des Einfügepunkts des Textobjekts. Der Einfügepunkt wird in der Variablen p gespeichert. Dieser Punkt wird später für die Neuausrichtung genutzt. 4. Ausrichtung auf zentriert setzen (vla-put-alignment vla-obj 10) vla-put-alignment ändert die Ausrichtung des Textobjekts. 10 ist der numerische Code für die zentrierte Ausrichtung (Middle Center) in AutoCAD. 5. Position anpassen (vla-move vla-obj (vla-get-InsertionPoint vla-obj) p) Hier wird das Objekt mit vla-move verschoben. Der Startpunkt ist der neue Einfügepunkt (nach der Änderung der Ausrichtung). Der Endpunkt (p) ist der ursprüngliche Einfügepunkt. Damit wird sichergestellt, dass sich der Text nicht bewegt, obwohl seine Ausrichtung geändert wurde. 6. Aktualisierung erzwingen (vla-update vla-obj) vla-update stellt sicher, dass die Änderungen an dem Objekt sofort sichtbar werden. Gesamtfunktion Die Funktion nimmt ein Textobjekt, setzt dessen Ausrichtung auf "zentriert" und justiert die Position, sodass der Text optisch an derselben Stelle bleibt, obwohl die Ausrichtung geändert wurde. Beispielanwendung: (TextMitteZentrisch (car (entsel "Wählen Sie einen Text aus: "))) entsel lässt den Benutzer ein Textobjekt auswählen. Der Entitätsname (ename) wird an die Funktion übergeben. Nach der Ausführung ist der Text zentriert ausgerichtet. ------------------ viele Grüße Jörn http://www.bosse-engineering.com das Flächenstempel_Tool(2023) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1148 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 26. Nov. 2024 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Zitat: Original erstellt von 100dpi: ... @Andreas: Das genau hab ich versucht, Acad schiebt die Texte dann aber ALLE zum Punkt 0,0
Du musst den GC 11 noch setzen, der wird bei Ausrichtungen anders als links verwendet. Also: (cons 11 (list x y z)) bzw. (cons 11 (list x (- y (* text-height 1.5)) z)) noch in die entmake Listen nehmen. Gruß Thomas
[Diese Nachricht wurde von spider_dd am 26. Nov. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
100dpi Mitglied selbständig
Beiträge: 26 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB
|
erstellt am: 27. Nov. 2024 11:49 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, hallo Thomas, vielen Dank, aber es ändert sich nichts. Die Attribute bleiben in der Ausrichtung auf "unten links" Angehängt habe ich Euren Code an den ersten Text (wie im Code unten zu sehen) Vielleicht noch weitere Ideen? (defun c:remfield () (prompt "\nWählen Sie mehrere Blöcke aus:") ; Benutzeraufforderung für die Auswahl (setq blk-selection (ssget '((0 . "INSERT")))) ; Alle eingefügten Blöcke auswählen (if blk-selection (progn (setq blk-count (sslength blk-selection)) ; Anzahl der ausgewählten Blöcke (princ (strcat "\nEs wurden " (itoa blk-count) " Blöcke ausgewählt.")) (repeat blk-count (setq blk (ssname blk-selection (1- blk-count))) ; Nächsten Block aus der Auswahl holen (setq vla-blk (vlax-ename->vla-object blk)) ; Verwandelt das ausgewählte Objekt in ein VLA-Objekt (if (and (vlax-property-available-p vla-blk 'HasAttributes) ; Prüft, ob der Block Attribute hat (= (vla-get-HasAttributes vla-blk) :vlax-true)) (progn (setq attr-list (vlax-invoke vla-blk 'GetAttributes)) ; Ruft die Attribute ab (setq room-name "") (setq room-number "") (setq text-height 1.0) ; Standard-Schrifthöhe, falls keine gefunden wird (foreach attr attr-list (setq tag (strcase (vla-get-TagString attr))) ; Tag des Attributs holen (setq value (vla-get-TextString attr)) ; Wert des Attributs holen (setq text-height (vla-get-Height attr)) ; Schrifthöhe des Attributs holen (cond ((= tag "ROOM_NAME") (setq room-name value)) ((= tag "ROOM_NUMBER") (setq room-number value)) ) ) ; Block auf Layer "Ausschalten" verschieben (vla-put-Layer vla-blk "Ausschalten") (vla-update vla-blk) (princ "\nBlock wurde auf den Layer 'Ausschalten' verschoben.") ; Wenn beide Werte gefunden sind, Text erstellen (if (and room-name room-number) (progn (setq ins-point (vlax-get vla-blk 'InsertionPoint)) ; Einfügepunkt des Blocks (setq x (car ins-point) y (cadr ins-point) z (caddr ins-point)) ; Erstellen der Textzeilen auf dem Layer "Beschriftung_neu" (entmake (list '(0 . "TEXT") (cons 10 (list x y z)) ; Position des Textes (cons 11 (list x (- y (* text-height 1.5)) z)) (cons 40 text-height) ; Dynamische Schrifthöhe (cons 1 room-name) ; Textinhalt '(7 . "Standard") ; Standard-Schriftstil '(8 . "Beschriftung_neu"))) ; Layer setzen (defun TextMitteZentrisch (ename / P VLA-OBJ) (setq vla-obj (vlax-ename->vla-object ename)) (setq p (vla-get-InsertionPoint vla-obj)) (vla-put-alignment vla-obj 10) (vla-move vla-obj (vla-get-InsertionPoint vla-obj)p) (vla-update vla-obj) ) (defun c:test ( / ) (TextMitteZentrisch (car(entsel))) ) (entmake (list '(0 . "TEXT") (cons 10 (list x (- y (* text-height 1.5)) z)) ; Zweite Zeile etwas tiefer (cons 40 text-height) ; Dynamische Schrifthöhe (cons 1 room-number) ; Textinhalt '(7 . "Standard") ; Standard-Schriftstil '(8 . "Beschriftung_neu"))) ; Layer setzen (princ "\nText wurde erstellt und auf den Layer 'Beschriftung_neu' verschoben.") ) (princ "\nROOM_NAME oder ROOM_NUMBER fehlt, keine Textzeilen erstellt.") ) ) (princ "\nDer ausgewählte Block hat keine Attribute.") ) (setq blk-count (1- blk-count)) ; Zähler für die Schleife dekrementieren ) ) (princ "\nEs wurden keine Blöcke ausgewählt.") ) (princ) )
------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1770 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 27. Nov. 2024 12:10 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Hallo 100dpi, probier es mal wie folgt, ist aber ungetestet: [code] (defun c:remfield () (defun TextMitteZentrisch (ename / P VLA-OBJ) (setq vla-obj (vlax-ename->vla-object ename)) (setq p (vla-get-InsertionPoint vla-obj)) (vla-put-alignment vla-obj 10) (vla-move vla-obj (vla-get-InsertionPoint vla-obj)p) (vla-update vla-obj) ) (prompt "\nWählen Sie mehrere Blöcke aus:") ; Benutzeraufforderung für die Auswahl (setq blk-selection (ssget '((0 . "INSERT")))) ; Alle eingefügten Blöcke auswählen (if blk-selection (progn (setq blk-count (sslength blk-selection)) ; Anzahl der ausgewählten Blöcke (princ (strcat "\nEs wurden " (itoa blk-count) " Blöcke ausgewählt.")) (repeat blk-count (setq blk (ssname blk-selection (1- blk-count))) ; Nächsten Block aus der Auswahl holen (setq vla-blk (vlax-ename->vla-object blk)) ; Verwandelt das ausgewählte Objekt in ein VLA-Objekt (if (and (vlax-property-available-p vla-blk 'HasAttributes) ; Prüft, ob der Block Attribute hat (= (vla-get-HasAttributes vla-blk) :vlax-true)) (progn (setq attr-list (vlax-invoke vla-blk 'GetAttributes)) ; Ruft die Attribute ab (setq room-name "") (setq room-number "") (setq text-height 1.0) ; Standard-Schrifthöhe, falls keine gefunden wird (foreach attr attr-list (setq tag (strcase (vla-get-TagString attr))) ; Tag des Attributs holen (setq value (vla-get-TextString attr)) ; Wert des Attributs holen (setq text-height (vla-get-Height attr)) ; Schrifthöhe des Attributs holen (cond ((= tag "ROOM_NAME") (setq room-name value)) ((= tag "ROOM_NUMBER") (setq room-number value)) ) ) ; Block auf Layer "Ausschalten" verschieben (vla-put-Layer vla-blk "Ausschalten") (vla-update vla-blk) (princ "\nBlock wurde auf den Layer 'Ausschalten' verschoben.") ; Wenn beide Werte gefunden sind, Text erstellen (if (and room-name room-number) (progn (setq ins-point (vlax-get vla-blk 'InsertionPoint)) ; Einfügepunkt des Blocks (setq x (car ins-point) y (cadr ins-point) z (caddr ins-point)) ; Erstellen der Textzeilen auf dem Layer "Beschriftung_neu" (entmake (list '(0 . "TEXT") (cons 10 (list x y z)) ; Position des Textes (cons 11 (list x (- y (* text-height 1.5)) z)) (cons 40 text-height) ; Dynamische Schrifthöhe (cons 1 room-name) ; Textinhalt '(7 . "Standard") ; Standard-Schriftstil '(8 . "Beschriftung_neu"))) ; Layer setzen (TextMitteZentrisch (entlast)) (entmake (list '(0 . "TEXT") (cons 10 (list x (- y (* text-height 1.5)) z)) ; Zweite Zeile etwas tiefer (cons 40 text-height) ; Dynamische Schrifthöhe (cons 1 room-number) ; Textinhalt '(7 . "Standard") ; Standard-Schriftstil '(8 . "Beschriftung_neu"))) ; Layer setzen (TextMitteZentrisch (entlast)) (princ "\nText wurde erstellt und auf den Layer 'Beschriftung_neu' verschoben.") ) (princ "\nROOM_NAME oder ROOM_NUMBER fehlt, keine Textzeilen erstellt.") ) ) (princ "\nDer ausgewählte Block hat keine Attribute.") ) (setq blk-count (1- blk-count)) ; Zähler für die Schleife dekrementieren ) ) (princ "\nEs wurden keine Blöcke ausgewählt.") ) (princ) ) {/code]
------------------ viele Grüße Jörn http://www.bosse-engineering.com das Flächenstempel_Tool(2023) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
100dpi Mitglied selbständig
Beiträge: 26 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB
|
erstellt am: 27. Nov. 2024 13:01 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank Jörn, Text ist jetzt schön mittig zentriert. Kleiner Haken noch: Acad positioniert den neuen Text am rechten Rand (siehe Bilder, grüner Rahmen zur Orientierung) Gibt es auch dafür eine Lösung? Gruß Ralf
------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1770 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 27. Nov. 2024 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Hallo Ralf, für eine bündige Ausrichtung kannst Du mal nach der Funktion TEXTBOX schauen, es werden die relativen Koordianten linksunten und rechtsoben des Textes ermittelt. aus diesen können dann über POLAR die Punkte rechtsunten und linksoben berechnet werden (im Beispiel mit Winkel 0, bei gedrehten Texten gibt es Murks) Wenn dann diesen Eckkoordinaten der Einfügepunkt des Textes hinzuaddiert wird hat man die Weltkoordinaten und kann z.B. ein Umgrenzung zeichnen oder aus den Umgrenzungskoordinaten Funktionen schreiben, die für eine gemeinschaftliche, linke Begrenzungslinie verwendet werden können. Code:
(defun c:test ( / COORDS OBJ P P1 P2 P3 P4) (if (setq obj (car(entsel "\nText picken:"))) (progn (setq coords (textbox (entget obj))) (setq p (cdr(assoc 10 (entget obj)))) (setq p1 (polar '(0.0 0.0) (+ (angle '(0.0 0.0) (car coords)) 0) (distance '(0.0 0.0) (car coords))) p2 (polar p1 0 (- (car (cadr coords)) (car (car coords)))) p3 (polar p2 (+ 0 (* pi 0.5)) (- (cadr (cadr coords)) (cadr (car coords)))) p4 (polar p3 pi (- (car (cadr coords)) (car (car coords))))) (setq coords (list p1 p2 p3 p4)) (setq coords (mapcar '(lambda(coord) (mapcar '+ coord p))coords)) ;;;Umgrenzungslinie (entmake (list (cons 0 "LINE")(cons 10 (car coords))(cons 11 (cadr coords))(cons 62 6))) (entmake (list (cons 0 "LINE")(cons 10 (cadr coords))(cons 11 (caddr coords))(cons 62 6))) (entmake (list (cons 0 "LINE")(cons 10 (caddr coords))(cons 11 (cadddr coords))(cons 62 6))) (entmake (list (cons 0 "LINE")(cons 10 (cadddr coords))(cons 11 (car coords))(cons 62 6))) ) ) (princ) )
Also, das Beispiel ist nur für nicht gedrehte Texte im WKS. ------------------ viele Grüße Jörn http://www.bosse-engineering.com das Flächenstempel_Tool(2023) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|