| |
| 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 – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: backgroundfill - textbackgroundfill (1645 mal gelesen)
|
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008
|
erstellt am: 21. Apr. 2015 17:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, mit diesen Code kann ich einen Texthintergrund für MText und Bemaßung erstellen. Jetzt möchte ich noch Multileader-Texte mit dazu nehmen, was auch funktioniert wenn ich bei allen "backgroundfill" -> "textbackgroundfill" einfüge. Dann funktioniert es aber nur noch bei Multileader-Texten. Wie bekommt man diese zwei zusammen in einen Code?
Code: (defun c:TextFill (/ ent) (setq ent (nentsel));mtext,dimension (if (= (vla-get-backgroundfill (vlax-ename->vla-object (car ent))) :vlax-false) (progn (vla-put-backgroundfill (vlax-ename->vla-object (car ent)) :vlax-true) (entmod (subst (cons 45 1.1) (assoc 45 (entget (car ent))) (entget (car ent)))) ) (vla-put-backgroundfill (vlax-ename->vla-object (car ent)) :vlax-false) ) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acActiveViewport) (princ) )
------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 21. Apr. 2015 17:32 <-- editieren / zitieren --> Unities abgeben: Nur für xem
|
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008
|
erstellt am: 22. Apr. 2015 12:02 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe es jetzt so gemacht:
Code: (defun c:th (/ text) (vl-load-com) (setq text (vlax-ename->vla-object (car (entsel "\nText auswählten: ")))) (cond ((= (vla-get-objectname text) "AcDbMLeader") (if (= (vla-get-TextBackgroundFill text) :vlax-true) (vla-put-TextBackgroundFill text :vlax-false) (vla-put-TextBackgroundFill text :vlax-true) ) ) ((= (vla-get-objectname text) "AcDbMText") (if (= (vla-get-BackgroundFill text) :vlax-true) (vla-put-BackgroundFill text :vlax-false) (vla-put-BackgroundFill text :vlax-true) ) ) (t(alert "\nkein Mtext oder MLeader")) ) (princ) )
Dann habe ich mal versucht den Bemaßungstext auch noch mit einzubinden und einfach mal "AcDbMText" durch "AcDbDimension" ersetzt. Leider kommt dann die Fehlermeldung Warum funktioniert es nicht bei der Bemaßung? Im ersten Code funktionierte es doch auch mit "vla-put-BackgroundFill". Danke ------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 22. Apr. 2015 12:15 <-- editieren / zitieren --> Unities abgeben: Nur für xem
... du programmierst nicht in der VLIDE? In dieser kannst du deinen Code debuggen und dir die Funktionsrückgaben und Variablenwerte anzeigen lassen. Das hilft bei der Fehlersuche extrem. Versuchs mal dort, dann wirst du wahrscheinlich feststellen, dass die Bemaßungen unterschiedlichste ObjektNamen haben. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008
|
erstellt am: 22. Apr. 2015 13:42 <-- editieren / zitieren --> Unities abgeben:
Danke für den Tip mit VLIDE. Habe es immer in Editor gebastelt. Ich habe mal in VLIDE ein Überwachungsfenster geöffnet und da werden auch einige Sachen angezeigt. Leider etwas zu schnell hintereinander. Kann man das auch protokollieren lassen? Die Objekteigenschaften habe ich mir immer mit "(entget(car(entsel)))" anzeigen lassen und da seht eben "AcDbDimension". ------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 22. Apr. 2015 13:56 <-- editieren / zitieren --> Unities abgeben: Nur für xem
... hier im Forum findest du irgwndwo (ich denke es war Jörn Bosse) eine VLIDE-Anleitung. Dort kann man auch Haltepunkte setzen und im Einzelschritt durch die Anwendung debuggen. Wenn du mit (entget(car(entsel))) den Wert abrufst, muss das nicht zwangsläufig der gleiche Wert sein, den du mit (vla-get-objectname text) abrufst. Du solltest dann entweder bei Lisp oder VLisp bleiben. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008
|
erstellt am: 22. Apr. 2015 14:58 <-- editieren / zitieren --> Unities abgeben:
Also wenn ich die Variable "text" überwache gibt er mit "AcadDimRotated" aus. Wenn ich das aber einfüge funktioniert es nicht. Ist es richtig die Variable "text" zu überwachen? ------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 23. Apr. 2015 16:40 <-- editieren / zitieren --> Unities abgeben: Nur für xem
Hallo xem, ich habe das jetzt einmal so herunter getippt (nicht getestet!), wie ich das auf die Schnelle machen würde. Kern des Unterschiedes ist, dass ich nicht die Unterscheidung des Funktionsaufrufs nach ObjektTyp mache, sondern vielmehr danach entscheide, ob das Objekt selbst diese Eigenschaft besitzt. --> vlax-property-available-p Ich habe den Code zudem so strukturiert, dass die Subroutine wiederverwendbar ist und unnötige Tipparbeit vermieden wird (Programmierer sind faul)
Code:
(defun c:th (/ text) (vl-load-com) (setq el(car (entsel "\nText auswählten: ")) text (vlax-ename->vla-object el) ) (if(not(TextBackgroundFill text)) (alert "Nix zum Texthintergrund ändern gewählt!") ) (princ) ) (defun TextBackgroundFill(VLobj) (setq return nil) (if (vlax-property-available-p VLobj 'TextBackgroundFill) (progn (vla-put-TextBackgroundFill VLobj (if (= (vla-get-TextBackgroundFill VLobj) :vlax-true) :vlax-false :vlax-true ) ) (setq return T) ) ) (if (vlax-property-available-p VLobj 'BackgroundFill) (progn (vla-put-BackgroundFill VLobj (if (= (vla-get-BackgroundFill VLobj) :vlax-true) :vlax-false :vlax-true ) ) (setq return T) ) ) return )
Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008
|
erstellt am: 23. Apr. 2015 17:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger und vielen Dank für deine Mühen! Beim Test bekomme ich als Ausgabe: Text auswählten: ; Fehler: Fehlerhafter Argumenttyp: VLA-OBJECT :vlax-false Fehlerhafter Argumenttyp: VLA-OBJECT :vlax-false Wenn ich den Code richtig verstehe wird das Objekt in der Variablen "text" gespeichert. Im zweiten Teil hast du einen Befehl "TextBackgroundFill" erstellt, der dann oben mit der Varialen "text" ausgeführt werden soll. Mit "vlax-property-available-p" wird überprüft ob "TextBackgroundFill" oder "BackgroundFill" auf das Objekt angewendet wird. Für VLobj soll dann die Variable "text" eingesetzt werden. Habe ich das so im groben schon mal richtig Verstanden? ------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 23. Apr. 2015 17:41 <-- editieren / zitieren --> Unities abgeben: Nur für xem
|
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008
|
erstellt am: 24. Apr. 2015 09:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, MText und MLeader funktionieren, nur die Bemaßung noch nicht. Ich habe mal versucht raus zu bekommen warum im ersten Code ganz oben es mit Bemaßung funktioniert und bei den Anderen nicht. Im ersten Code wird das Objekt mit seiner ID direkt für eine Prüfung genommen. In den Anderen Codes wird aber immer eine Eigenschaft verglichen. Das Problem wird die Bemaßung als ganzes sein, denn in den Eigenschaften einer Bemaßung kann man keinen Texthintergrund auswählten. Da der erste Code aber das Objekt als MText und nicht als Bemaßung händelt funktioniert es dort. Die Prüfung müsste also mit der Objekt ID (nur der MText) und nicht mit dem Objektnamen (ganze Bemaßung) erfolgen. Könnte man das ganze nicht auch ohne Prüfung ablaufen lassen? Einmal mit "backgroundfill" und einmal mit "textbackgroundfill". Dann würde es zwar immer einen Fehler geben, aber kann man den dann nicht einfach weiter laufen lassen? ------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 24. Apr. 2015 10:01 <-- editieren / zitieren --> Unities abgeben: Nur für xem
Die Variante mit "Prüf auf die Eigenschaft" ist schon ganz richtig gewählt von Holger, Nur wird hier das Bemaßungsobjekt gewählt, welches natürlich diese Eigenschaft nicht hat, würdest du den MText im Bemaßungsblock wählen, dann würde es passen. (Objekte mit Nentsel auswählen, nicht mit entsel) In der Praxis würde man aber wohl ZUSÄTZLICH zum "Prüfe auf Eigenschaft", im Fehlerfall nach Objekttyp unterscheiden und weitergehen. So würde man mit SSGET zur Objektwahl arbeiten können, man muß die Objekte nicht an bestimmter Stelle wählen usw. Auch könnte man aus einem TEXT einen MTEXT(mit Hintergrund) machen usw.
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008
|
erstellt am: 24. Apr. 2015 11:14 <-- editieren / zitieren --> Unities abgeben:
Hallo, so funktioniert es auch mit der Bemaßung:
Code: (defun c:th (/ text) (vl-load-com) (setq el(car (nentsel "\nText auswählten: ")) text (vlax-ename->vla-object el) ) (if(not(TextBackgroundFill text)) (alert "Nix zum Texthintergrund ändern gewählt!") ) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acActiveViewport) (princ) ) (defun TextBackgroundFill(VLobj) (setq return nil) (if (vlax-property-available-p VLobj 'TextBackgroundFill) (progn (vla-put-TextBackgroundFill VLobj (if (= (vla-get-TextBackgroundFill VLobj) :vlax-true) :vlax-false :vlax-true ) ) (setq return T) ) ) (if (vlax-property-available-p VLobj 'BackgroundFill) (progn (vla-put-BackgroundFill VLobj (if (= (vla-get-BackgroundFill VLobj) :vlax-true) :vlax-false :vlax-true ) ) (setq return T) ) ) return )
Mit der Zeile:
Code: (entmod (subst (cons 45 1.1) (assoc 45 (entget (car ent))) (entget (car ent))))
kann man dann noch die Größe vom Hintergrund verändern. Wo muss ich die Zeile rein schieben damit es funktioniert? ------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008 Software: AutoCAD 2015 - 64bit Windows 10 - 64bit PDFCreator 1.0.2 - 32bit Ghostscript 9.0 - 64bit PDF-XChange Viewer - 64bit GIMP 2.6.8 - 64bit MS Office 2010 - 32bit Opera 12 - 32bit MacroX - 32bit 7-zip - 64bit ----------------------- Hardware: Intel i5 680 3,6GHz @ 4GHz 8GB RAM 1333MHz nVidia GTX 460 1024MB Intel SSD 2.5 80GB X25-M Samsung SyncMaster 245B+ Iiyama ProLite E1900s Logitech mx518 Logitech G11 Roccat Sense Glacier Blue
|
erstellt am: 27. Apr. 2015 11:53 <-- editieren / zitieren --> Unities abgeben:
Hallo, habe es jetzt so gemacht. Da ist dann aber das Problem, dass der Textabstands-Faltor immer mit auf 1 gesetzt wird. Wie kann ich den vom ausgewählten Text auslesen und in einer Variablen ablegen? Code: (defun c:th2 (/ text) (vl-load-com) (setq el(car (nentsel "\nText auswählten: ")) text (vlax-ename->vla-object el) ) (if(not(TextBackgroundFill text)) (alert "Nix zum Texthintergrund ändern gewählt!") ) (entmod(append(entget el)(LIST(cons 45 1.1)))) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acActiveViewport) (princ) ) (defun TextBackgroundFill(VLobj) (setq return nil) (if (vlax-property-available-p VLobj 'TextBackgroundFill) (progn (vla-put-TextBackgroundFill VLobj (if (= (vla-get-TextBackgroundFill VLobj) :vlax-true) :vlax-false :vlax-true ) ) (setq return T) ) ) (if (vlax-property-available-p VLobj 'BackgroundFill) (progn (vla-put-BackgroundFill VLobj (if (= (vla-get-BackgroundFill VLobj) :vlax-true) :vlax-false :vlax-true ) ) (setq return T) ) ) return )
------------------ Error in Layer 8 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |