| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Symboltabellen und das Ende! (563 mal gelesen)
|
Big Sven Mitglied Techn. Angestellter
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: 14. Sep. 2005 16:26 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum! Ich bin hier neu angemeldet und komme gleich mit einem kleinen Problem. Ich habe in einer DWG mehrere Blöcke, in denen ich die Farbe von Rechtecken (LWPolylinien) abändern muss. Ich bin mit tblnext jeweils in den ersten Eintrag der Datenbank gegangen und hangel mich dann mit (setq x (entget (entnext (cdr (assoc -1 xy))))) im Block nach unten, bis ich die richtigen Polylinien finde. Leider gibt mir ACAD aber auf diesem Weg kein Ende (z. B. SEQEND) wieder, so das mein Programm am Ende einen Fehler bekommt. Gibt es bei diesem Weg kein zu erwartenes Ende? Ich hoffe es hat jemand einen Tipp für mich! Vielen Dank! Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 14. Sep. 2005 16:40 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
guck dir mal folgenden Konstrukt an: (if(setq BLOCKDEF (tblsearch "BLOCK" BLOCKNAME)) ; Blockdefinition zum Blocknamen auslesen (progn (setq BLOCKELEMENT (cdr (assoc -2 BLOCKDEF))) ; Adresse der Blockelemente holen (while BLOCKELEMENT ; und solange nicht alle Blockelemente abgearbeitet sind ... ; Mache was ) ) ) da wird mittels while auf ein Vorhandensein des Elementes getestet.
------------------ - 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 |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 15. Sep. 2005 08:58 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
@cadmium (setq BLOCKELEMENT (entnext BLOCKELEMENT )) nicht vergessen, sonst wunderst dich, warum das Programm nach 5 Tassen Kaffee noch immer läuft @big sven (setq block (tblnext "BLOCK" t)) (while block (setq blockelem (tblobjname "BLOCK" (cdr (assoc 2 block)))) (while (setq blockelem (entnext blockelem)) ; mach was mit blockelem ) (setq block (tblnext "BLOCK")) ) ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 15. Sep. 2005 09:02 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
|
Big Sven Mitglied Techn. Angestellter
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. Sep. 2005 14:44 <-- editieren / zitieren --> Unities abgeben:
Hallo Ihr Beiden! Der Ansatz ist ja schon mal in Ordnung. Vielen Dank soweit. Aber jetzt kommt ja mein Problem! Wenn ich mich mit: SETQ BLOCKELEM (ENTGET (ENTNEXT (CDR (ASSOC -1 BLOCKELEM)))) im Block nach unten begebe, dann bekomme ich kein SEQEND zurück, wenn ich am Ende bin. Habt Ihr dafür eine Lösung? Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 15. Sep. 2005 14:45 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
aber ein "nil" am Blockende und das kannste doch genausogut auswerten -> while ------------------ - 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 |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 15. Sep. 2005 15:17 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Zitat: Original erstellt von Big Sven: Hallo Ihr Beiden! Der Ansatz ist ja schon mal in Ordnung. Vielen Dank soweit. Aber jetzt kommt ja mein Problem! Wenn ich mich mit: SETQ BLOCKELEM (ENTGET (ENTNEXT (CDR (ASSOC -1 BLOCKELEM)))) im Block nach unten begebe, dann bekomme ich kein SEQEND zurück, wenn ich am Ende bin. Habt Ihr dafür eine Lösung?Gruß Sven
was ist denn das überhaupt fürn ein Konstrukt SETQ BLOCKELEM (ENTGET (ENTNEXT (CDR (ASSOC -1 BLOCKELEM)))) der GC -1 ist sowieso immer der ename des eigenen Objektes, wenns hier mit entnext weitertust, bekommst du nur dann eine sequend, wenn die EINFÜGUNG Attribute haben ! du musst, wenn du eine EINFÜGUNGS hast, mit (tblobjname "BLOCK" blockname) erst auf die Blockdefinitions gehen, und hier ein while schleife drüberbauen, solange du elemente erhälst Verwechsle NIE Ein EINFÜGUNG und eine BLOCKDEFINITION
poste doch mal ein bisserl mehr Code ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC
[Diese Nachricht wurde von fuchsi am 15. Sep. 2005 editiert.] 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: 15. Sep. 2005 15:19 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Deutschbuch hat mir sehr gehilft ! Also soviele Rechtschreibfehler hatte ich noch nie in einem Posting. [EDIT] jetzt bin ich schon relativ lange in diesem Forum, und sehe heute das erste mal, dass man Beiträge editieren kann. Schäm
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC [Diese Nachricht wurde von fuchsi am 15. Sep. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Big Sven Mitglied Techn. Angestellter
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. Sep. 2005 16:10 <-- editieren / zitieren --> Unities abgeben:
Hallo fuchsi! Anscheinend sitzt ich gerade auf irrgendwelchen Körperteilen, die deswegen schlecht durchblutet werden. Also mein Code sieht ungefähr so aus: (setq block (tblnext "BLOCK" t)) (while block (setq blk (tblobjname "BLOCK" (cdr (assoc 2 block)))) (while (setq blk (entnext blk)) (setq blk (entget blk)) (setq typenpruef (cdr (assoc 0 blk))) (if (= typenpruef "LWPOLYLINE") (jetzt setze ich die Farbe um) );if );while (setq block (tblnext "BLOCK")) );while Mit diesem Gebilde geht er bis zum ersten Eintrag des Blockes (ein Attribut, er besteht aber aus Attributen und Grafik) und hängt sich dann auf, weil er nicht weiter in der Definition nach unten geht !?!? Gruß Sven [Diese Nachricht wurde von Big Sven am 15. Sep. 2005 editiert.] 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: 16. Sep. 2005 10:44 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
Zitat: Original erstellt von Big Sven: Hallo fuchsi!Anscheinend sitzt ich gerade auf irrgendwelchen Körperteilen, die deswegen schlecht durchblutet werden. Also mein Code sieht ungefähr so aus: (setq block (tblnext "BLOCK" t)) (while block (setq blk (tblobjname "BLOCK" (cdr (assoc 2 block)))) (while (setq blk (entnext blk)) (setq blk (entget blk)) (setq typenpruef (cdr (assoc 0 blk))) (if (= typenpruef "LWPOLYLINE") (jetzt setze ich die Farbe um) );if );while (setq block (tblnext "BLOCK")) );while Mit diesem Gebilde geht er bis zum ersten Eintrag des Blockes (ein Attribut, er besteht aber aus Attributen und Grafik) und hängt sich dann auf, weil er nicht weiter in der Definition nach unten geht !?!? Gruß Sven [Diese Nachricht wurde von Big Sven am 15. Sep. 2005 editiert.]
der Fehler liegt hier (setq blk (entget blk))
zuerst ist blk ein ELEMENTNAME nach dieser Anweisung eine ASSOCLISTE mit den Elementdaten. In der zweiten Schleife (while (setq blk (entnext blk)) birnts ihn natürlich weil hier blk nunmal kein ELEMENTNAME mehr ist, und entnext verlangt einen solchen also: (setq block (tblnext "BLOCK" t)) (while block (setq blk (tblobjname "BLOCK" (cdr (assoc 2 block)))) (while (setq blk (entnext blk)) (setq blkdaten (entget blk)) (setq typenpruef (cdr (assoc 0 blkdaten))) (if (= typenpruef "LWPOLYLINE") (jetzt setze ich die Farbe um) );if );while (setq block (tblnext "BLOCK")) );while
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Big Sven Mitglied Techn. Angestellter
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. Sep. 2005 12:00 <-- editieren / zitieren --> Unities abgeben:
|