| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Lisp oder Script Textstil ändern (2019 mal gelesen)
|
redfire Mitglied
Beiträge: 21 Registriert: 05.03.2008 AutoCAD 2020, MicroStation V8i
|
erstellt am: 12. Aug. 2020 14:38 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich versuche ein Script oder Lisp zu erstellen, das mir die Arbeit ein wenig vereinfacht. Leider sind meine Recherchen dazu nicht wirklich erfolgreich gewesen, vielleicht kann mir jemand beim Einstieg ein wenig unterstützen? und kennt eine gute Website wo man die LSP-Programmierung ausführlich dokumentiert ist. Ich versuche allen Text und Mtexten auf einem bestimmten Layer "Layer1" einen bestehenden Textstil "Arial25" zuzuweisen - Layer 1 --> Arial25 - Layer 2 --> Arial18 usw.
Leider bin ich nur zur Deklaration der Funktion gekommen (defun C:TestFunction () ?????? ); end function Für eure Unterstützung bedanke ich mich im voraus ------------------ Gruss redfire 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: 2966 Registriert: 26.08.2002 ACAD R11 - 2022 (Plant3D) AVIS ACAD LT 2013- 2021 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: 12. Aug. 2020 15:16 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
Hy redfire, einmalig oder dauernd ? ich würde Filter oder _.QSELECT dazu nehmen und gut. 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 |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 12. Aug. 2020 16:15 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
Dieser Post vom 14.02.20, 11:05 http://forum.cad.de/foren/ubb/Forum145/HTML/004727.shtml#000004Um alle Text und MText Objekte zu erreichen, nicht nur die im Modellbereich (setq satz (ssget "_X" '((0 . "TEXT,MTEXT") (410 . "Model")))) ersetzen durch (setq satz (ssget "_X" '((0 . "TEXT,MTEXT")))) Um die Auswahl einzuschränken auf einen Layer "Layer1" würde es dann so aussehn: (setq satz (ssget "_X" '((0 . "TEXT,MTEXT") (8 . "Layer1")))) Da bastelst du dann noch deine "Deklaration der Funktion" dazu, welche im Fall von defun c: den Aufruf als AutoCAD-Befehl ermöglicht, fertig. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1111 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 13. Aug. 2020 08:22 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
|
redfire Mitglied
Beiträge: 21 Registriert: 05.03.2008 AutoCAD 2020, MicroStation V8i
|
erstellt am: 13. Aug. 2020 16:05 <-- editieren / zitieren --> Unities abgeben:
Dankeeuch allen für die Unterstützung und die praktischen Links Hat soweit funktioniert. Aktuell habe ich für alle zu bearbeiteten Layer einen If Block kopiert. Macht glaube ich aber wenig Sinn. Bei meinen weiteren Recherchen bin ich auf die Schleife while gestossen und das arbeiten mit Listen. Hat jemand einen Tipp wie ich den Code entsprechend umbauen müsste? Liste: Layer1; Arial25 Layer2; Arial18 Layer3; Arial25 ....
Code: (defun C:Planaufbereitung ()(if (= (type (setq satz (ssget "_X" '((0 . "TEXT,MTEXT") (8 . "Layer1")))) ) 'PICKSET ) (mapcar '(lambda (ent_name) (vla-put-StyleName (vlax-ename->vla-object ent_name) "Arial25" ) ) (vl-remove-if-not '(lambda (dummy) (= (type dummy) 'ENAME)) (mapcar 'cadr (ssnamex satz)) ) ) ) (princ "Texte vom Layer \"Layer1\" angepasst\n") (if (= (type (setq satz (ssget "_X" '((0 . "TEXT,MTEXT") (8 . "Layer2")))) ) 'PICKSET ) (mapcar '(lambda (ent_name) (vla-put-StyleName (vlax-ename->vla-object ent_name) "Arial18" ) ) (vl-remove-if-not '(lambda (dummy) (= (type dummy) 'ENAME)) (mapcar 'cadr (ssnamex satz)) ) ) )
(princ "Texte vom Layer \"Layer2\" angepasst\n") (princ) ); end function
Besten Dank! ------------------ Gruss redfire Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 13. Aug. 2020 17:08 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
While hat eigenlich eine andere Bestimmung, du möchtest ja nicht solange etwas machen bis sich eine Bedingung ändert, sondern ganz stumpf eine Liste abarbeiten, daher würde ich es hier nicht einsetzen. Aber FOREACH sehr gut. Code:
(defun C:Planaufbereitung ( / satz)(foreach DATA '(("Layer1" . "Arial25") ("Layer2" . "Arial18")) (if (setq satz (ssget "_X" (list '(0 . "TEXT,MTEXT") (cons 8 (car DATA))))) (mapcar '(lambda (ent_name) (vla-put-StyleName (vlax-ename->vla-object ent_name) (cdr DATA) ) ) (vl-remove-if-not '(lambda (dummy) (= (type dummy) 'ENAME)) (mapcar 'cadr (ssnamex satz)) ) ) ) ) (princ "\ndone.") (princ) ); end function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
redfire Mitglied
Beiträge: 21 Registriert: 05.03.2008 AutoCAD 2020, MicroStation V8i
|
erstellt am: 13. Aug. 2020 21:09 <-- editieren / zitieren --> Unities abgeben:
Danke für den Tipp mit der Foreach schleife, funktioniert soweit eigentlich auch. Leider ist mir nun noch aufgefallen, dass mit vla-put-StyleNamenur mit dem Textstil die Schriftart angepasst wird, nicht aber die entsprechenden Einstellungen aus dem Textstil übernommen werden (wie Höhe Beschriftung Ja Breitenfaktor, Neigungswinkel). Vermutlich braucht es dazu noch weiter Definitionen? Oder habe ich da was falsch verstanden? ------------------ Gruss redfire Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 13. Aug. 2020 22:32 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
Zitat: Original erstellt von redfire: Leider ist mir nun noch aufgefallen, dass mit vla-put-StyleName nur mit dem Textstil die Schriftart angepasst wird, nicht aber die entsprechenden Einstellungen aus dem Textstil übernommen werden (wie Höhe Beschriftung Ja Breitenfaktor, Neigungswinkel).Das stimmt (fast) zum Glück auffallend, du weist einen anderen Textstil zu, mehr nicht. Alles was vom Textstil referenziert wird spiegelt sich dann in deinem Textobjekt wieder (Schriftart,Auf dem Kopf, Rückwärts(,Senkrecht)), die anderen Dinge nicht, diese dienen nur als Vorgabewert für neue Objekte(Beschriftung,Höhe,Breite,Neigung). Vermutlich braucht es dazu noch weiter Definitionen? Oder habe ich da was falsch verstanden? Das was du geändert haben möchtest, das musst du ändern, von alleine passiert(wieder: zum Glück) nichts.
Gewünschte Daten ermitteln, dann das Objekt entsprechend ändern, wie du es bereits zuvor mit dem Textstil gemacht hast. Herzlich willkommen in der Programmierung, da wird einem dann schnell klar was EigAnpass, Option MTEXT, alles für einen macht. Oder gar eine Text-Wert Änderung in der Eigenschaften-Palette, dort wird ebenso nicht unbedingt nur der entsprechende Wert einer Eigenschaft eines Objektes geändert, sondern ein komplettes Programm startet da welches teilweise sehr viele Schritte dem Nutzer abnimmt (ob der das gerade will oder nicht). Im Fall von TEXT Objekten ändert die Eigenschaften-Palette beim ändern des Stils ALLE im Stil festgelegten Eigenschaften auf den entsprechenden Vorgabewert im Stil. Wenn du einsteigst in das Thema und Lisp spezifische Fragen hast, hier gibt es auch ein Lisp Forum Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
redfire Mitglied
Beiträge: 21 Registriert: 05.03.2008 AutoCAD 2020, MicroStation V8i
|
erstellt am: 14. Aug. 2020 07:46 <-- editieren / zitieren --> Unities abgeben:
Danke cadffm für deine Unterstützung. Ich werde mich noch ein wenig in das Thema einlesen und hoffe ich finde die Lösung. Allenfalls werde ich mich im Lisp Forum nochmals melden. ------------------ Gruss redfire [Diese Nachricht wurde von redfire am 14. Aug. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 381 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 14. Aug. 2020 08:30 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
Hallo du müssest die komplette Formatierung der MTexte entfernen. Teste das mal in deiner mapcar funktion. Code: (if (= (getpropertyvalue ent_name "LocalizedName" "MText")) (setpropertyvalue ent_name "Contents"(getpropertyvalue ent_name "Text") ) )
------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 14. Aug. 2020 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
*editiert* @Meldin Gibt's ja nur für MText und soweit ist er doch noch lange nicht, zudem würde das entfernen zu einem "falschen" Ergebnis führen, denn das Entfernen interner Formatierungen macht kein Befehl/Funktion in ACAD wenn es um einen Textstil wechsel geht (zum Glück) @redfine Die Lösung, konzeptionell, habe ich dir ja geschrieben - für die Umsetzung ohne copy&paste drücke ich dir die Daumen. AutoLisp Anfang: In der Hilfe oder im Stil selbst ermitteln wo/welche Eigenschaften des Stils gespeichert sind http://help.autodesk.com/view/ACD/2021/DEU/?guid=GUID-EF68AF7C-13EF-45A1-8175-ED6CE66C8FC9 In der Hilfe oder am Objekt selbst ermitteln wo/welche Eigenschaft für a) TEXT und b) MText gespeichert werden http://help.autodesk.com/view/ACD/2021/DEU/?guid=GUID-7D07C886-FD1D-4A0C-A7AB-B4D21F18E484 (if (or (and (tblobjname "STYLE" "Arial18") (setq ARIAL18 (entget ARIAL18 '("AcadAnnotative"))) ) <Stil "arial18" erstellen wenn nicht existent> ) (progn jetzt kannst du mit (cdr(assoc <Gruppencode> ARIAL18)) auf die Daten im Stil zugreifen 40,41,50(in Rad) und falls -3 vorhanden ist, dann hast du Beschriftung aktiviert und ob der Spaß am Layout ausgerichtet werden soll siehst du in der -3 Liste ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Manuel486 Mitglied Technischer Zeichner Elektro
Beiträge: 194 Registriert: 31.01.2020
|
erstellt am: 14. Aug. 2020 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
Hallo. Ich habe es so gelöst, siehe Zip-Datei. Habe die chtext.lsp hier aus dem Forum. Die Scripte sind von mir, in Co-Produktion mit CADFFM In dem Script ist immer eine Erklärung was gemacht wird. Ich habe es Teilweise auf deine Bedürfnisse angepasst. Ist aber eigentlich alles selbsterklärend. MFG Manuel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
redfire Mitglied
Beiträge: 21 Registriert: 05.03.2008 AutoCAD 2020, MicroStation V8i
|
erstellt am: 15. Aug. 2020 10:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Manuel, Danke für dein Beispiel mit der Lisp-Script Kombi. Ist auch ein interessanter Ansatz. Meine Lisp Funktion schaue ich als persönliche Challenge an. Mit Deiner Lösung aber zumindest ein alternative falls ich scheitere
------------------ Gruss redfire Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 17. Aug. 2020 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für redfire
Meldin hat hier eine Variante angesprochen welche dir die ganze Arbeit mit der Übertragung abnehmen kann. Schau dir an wie man setpropertyvalue getpropertyvalue verwendet. DumpAllProperties hilft dir die Eigenschaften Namen zu ermitteln. Gruß an Meldin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |