| |
| 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: command-Befehl mit variabler Länge (1197 mal gelesen)
|
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 29. Feb. 2008 11:30 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum! Folgende Frage: Wie kann mann einen command-Befehl mit variabler Länge gestalten? Und zwar möchte ich über einen command Befehl Blöcke mit unterschiedlich vielen Attributen einlesen. Codefragment: (command "_-insert" blockname "z" zskal "y" yskal "x" xskal "d" rotat koord "att-inhalt1" "att-inhalt2")) obiger Code paßt also für einen Block mit 2 Attributen. Ich möchte aber über die gleiche Zeile (die dann eben [vom Programm selbst] anders gestaltet werden muß Blöcke mit 1, 3 oder beliebig vielen Attributen einlesen. Hat jemand eine Idee? Gruß, Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 29. Feb. 2008 11:34 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 29. Feb. 2008 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Hallo Roman, ich mache das so, dass vor dem Einfügen des Blockes die Sysvar ATTREQ auf 0 gesetzt wird. Damit wird das Abfragen der Attribute unterbunden. Im zweiten Step fülle ich dann die Attribute des eingefügten Blockes. Dabei arbeite ich mit Assoziationslisten: '(("ATT1" . "Wert1")("ATT2" . "Wert2") ... ("ATTX" . "WertX")) Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 29. Feb. 2008 11:42 <-- editieren / zitieren --> Unities abgeben:
Hi tunnelbauer! Danke für den Tipp, aber ich schnipsle jetzt mittlerweile ca. 3 Tage an dem lisp zum Blöcke einlesen, und möchte nicht so kurz vor dem Ziel aufgeben. Ist ja auch egal für was ich's brauche, die Frage lautet: wie kann ich die command-Zeile so gestalten bzw. gestalten lassen (z. B. mit strcat ... aber der schluckt keine Strings, die Anführungszeichen enthalten), das sie mit einer variablen Anzahl von Attributen fertig wird? Gruß, Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 29. Feb. 2008 11:50 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 29. Feb. 2008 11:53 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
ja klar, das ist eine eigene SUB. durchlaufe mal mit einer (while ..) die Elemente, die nach der Blockreferenz kommen. (setq ename insert) (while (setq ename (entnex ename)) (entget ename) ... ) so kommst du an die Attribute(Elemente), die du dann ja mit entmod entsprechend aktualisieren kannst. (ist zumindest ein Weg) Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 29. Feb. 2008 11:55 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 29. Feb. 2008 11:57 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Zitat: Original erstellt von romi1: Hi tunnelbauer! Danke für den Tipp, aber ich schnipsle jetzt mittlerweile ca. 3 Tage an dem lisp zum Blöcke einlesen, und möchte nicht so kurz vor dem Ziel aufgeben. Ist ja auch egal für was ich's brauche, die Frage lautet: wie kann ich die command-Zeile so gestalten bzw. gestalten lassen (z. B. mit strcat ... aber der schluckt keine Strings, die Anführungszeichen enthalten), das sie mit einer variablen Anzahl von Attributen fertig wird? Gruß, Roman
In dem Fall wohl gar nicht. Commands kann man sehr wohl dynamisch aufbauen. Das Command kann auch in mehreren Commands enthalten sein (setq pkt_liste (list (list 0 0) (list 1 0) (list 1 1) (list 0 1))) (command "._pline") (foreach pkt pkt_liste (command pkt) ) (command "_close") Da du aber nicht weisst, wieviele Attribute dein Block hat, geht das so nicht.
Also wirklich die einzige Möglichkeit mittels Systemvariable ATTREQ das Abfragen der Attribusteingabe unterdrücken. , dann den Blockeinfügen, und dann den eingefügten Block die Attribute abarbeiten ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC 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: 29. Feb. 2008 12:11 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Hallo nochmal, klar geht das auch ohne ATTREQ man muss eben nur die Attwerte in eine Liste packen und dann das INSERT-command ''offen'' lassen. (command "_-insert" blockname "z" zskal "y" yskal "x" xskal "d" rotat koord) (mapcar 'command '("att-inhalt1" "att-inhalt2")) das geht dann auch mit variabler Anzahl: (mapcar 'command '("att-inhalt1" "att-inhalt2" "att-inhalt3" "att-inhalt4" ... "att-inhaltX")) ich habe diese Möglichkeit nicht erwähnt, weil mir diese sehr unsympatisch ist .. ist der Block aus welchen Gründen auch immer, nicht so, wie er vom Programm erwartet wird, dann erzeugt man absolut falsche Eintragungen oder das Tool fährt gegen die Wand. Deshalb, Roman, geh den langen Weg mit ATTREQ=0 und fülle dann die ATTRIBS - du wirst diese SUB öfter brauchen können. Bei Fragen ... Grüße Holger Bei Fragen ... ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 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: 29. Feb. 2008 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Hallo, eins vorweg, Holger's Weg finde ich besser und mache es eigentlich auch selber so. Folgendes wäre aber auch noch möglich: 1. Über (tblobjname "BLOCK" Blockname) die Anzahl der definierten Attribute aus der Blockdefinition abfragen 2. Einen Command Befehl in eine LISP-Datei schreiben 3. Diese LISP Datei laden z.B.
Code:
(command "_.insert" "BOFKP" "-153.275000000000,-18.187000000000,0.0" 0.250000000000 0.250000000000 0 "Attwert1" "Attwert2" )
Ich bin der Meinung, daß ich irgendwann mal einen guten Grund hatte so zu verfahren, habe ich aber leider vergessen ------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 29. Feb. 2008 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Anbei 2 ganz praktische Routinen, um Attribute zu lesen, schreiben
Code: ; ; schreibt in einen Block ein Attribut ; (defun pltSchreibeAttribute (ename daten / edate name ename0) (setq ename0 ename) (while (and (setq ename (entnext ename)) (setq edate (entget ename)) (= (cdr (assoc 0 edate)) "ATTRIB") ) (setq name (cdr (assoc 2 edate))) (if (and (assoc name daten)(cdr (assoc name daten))) (entmod (subst (cons 1 (cdr (assoc name daten))) (assoc 1 edate) edate))) ) (entupd ename0) ) ; ; gibt alle Attribute eines Blockes als Assoc liste zurück ; (defun pltLeseAttribute (ename / edate daten) (while (and (setq ename (entnext ename)) (setq edate (entget ename)) (= (cdr (assoc 0 edate)) "ATTRIB") ) (setq daten (cons (cons (cdr (assoc 2 edate)) (cdr (assoc 1 edate))) daten)) ) daten )
Damit kann man das jetzt sehr einfach machen (setq svAttReq (getvar "ATTREQ")) (setvar "ATTREQ" 0) (command "_-insert" blockname "z" zskal "y" yskal "x" xskal "d" rotat koord) (setvar "ATTREQ" svAttReq) (pltSchreibeAttribute (entlast) (list (cons "ATTNAME1" "ATTWERT1") (cons "ATTNAME2" "ATTWERT2") ...))
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 29. Feb. 2008 13:08 <-- editieren / zitieren --> Unities abgeben:
Hallo! Danke euch für die vielen Tipps!! Ich werd's auf Holger's Anraten auf seine Weise probieren ("den langen Weg"). Wenn ich's nicht schaffe, probier ich's mit dem dynamischen command-Befehl lt. fuchsi. Danke, Roman 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: 29. Feb. 2008 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
|
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 29. Feb. 2008 13:18 <-- editieren / zitieren --> Unities abgeben:
|