| |
| 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: Subentitäten aus Blöcken auslesen (1272 mal gelesen)
|
S.Langhammer Mitglied
Beiträge: 8 Registriert: 22.01.2013
|
erstellt am: 22. Jan. 2013 15:14 <-- editieren / zitieren --> Unities abgeben:
Grüße! Ich bin blutiger Lisp-Anfänger und muss nun einzelne Subentitäten (Linien, Polylinien, Kreise usw.) aus einem Block auslesen und in eine Datei schreiben. Die Werte für jeweils einzelne Entitäten herauszufinden hat sich als nicht so~ schwierig herausgestellt (zumindest nachdem ich die einzelnen Codeblöcke aus Jeffery P. Sanders Cad2File herausgeschnibbelt hatte). Einen groben Gedankenansatz habe ich schon nur der ist arg dürftig: Variablen: cntr (Zähler) aSubEnt (alte Subentität) nSubEnt (neue Subentität) subEntList (Liste der Subentitäten) (setq subEntList(list)) ; Liste der Subentitäten leer erstellen (while (< cntr (sslength [Anzahl der Subentitäten])) ; so lang durchlaufen, bis alle Subentitäten abgearbeitet sind (setq nSubEnt (entget (cdr(car aSubEnt))))) [nSubEnt an subEntList anhängen] (setq cntr(+ cntr 1)) (setq aSubEnt nSubEnt) ) Zu allem, was in eckigen Klammern steht fehlt mir noch der Ansatz bzw. der konkrete Code. Danke im Voraus für jede Hilfe! 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: 22. Jan. 2013 19:10 <-- editieren / zitieren --> Unities abgeben: Nur für S.Langhammer
Hallo S., ich würde das folgendermaßen machen: Code:
(defun BlockEntList (BlockName / ENT ENTLIST) (if (setq Ent(tblobjname "BLOCK" BlockName)) (while (and (setq Ent (entnext Ent)) (/=(cdr(assoc 0 (entget Ent)))"SEQEND")) (setq EntList (cons (entget Ent)EntList))) ) (reverse EntList))
1. fragen ob der Blockname in der Blocktabelle vorhanden ist => Gibt Dir das Entity des Blockdefinition zurück. 2. mit ENTNEXT geht es dann immer zum nächsten Entity innerhalb der Blockdefinition, bis das Objekt "SEQEND" erreicht ist. 3. Innerhalb der Schleife die entgetteten Entities mit CONS in eine Liste packen. 4. Die Liste ist die Rückgabe der Funktion, wenn nicht, dann NIL.
------------------ viele Grüße Jörn http://www.bosse-engineering.com Böschungsschraffen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
S.Langhammer Mitglied
Beiträge: 8 Registriert: 22.01.2013
|
erstellt am: 23. Jan. 2013 17:09 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank schonmal, jetzt muss ich nur noch herausfinden wie ich das ganze effektivst möglich in mein Lisp-Konstrukt einhäkel. Hier noch ein kleines Geständnis: Ich werkel heute den zweiten Tag mit Lisp in BricsCAD. NOCH wirkt es ein wenig kryptisch auf mich aber ich komm schon noch dahinter! 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: 24. Jan. 2013 07:26 <-- editieren / zitieren --> Unities abgeben: Nur für S.Langhammer
|
S.Langhammer Mitglied
Beiträge: 8 Registriert: 22.01.2013
|
erstellt am: 24. Jan. 2013 08:12 <-- editieren / zitieren --> Unities abgeben:
Ja das Problem mit dem Debug ist mir bereits aufgefallen, ebenso der Vorteil, den AutoCAD gegenüber. Zumindest die Verfolgung konnte ich relativ einfach lösen, indem ich sie mir mit prinq über die Kommandozeile ausgeben lasse. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 24. Jan. 2013 23:42 <-- editieren / zitieren --> Unities abgeben: Nur für S.Langhammer
Zitat: Original erstellt von S.Langhammer: Ja das Problem mit dem Debug ist mir bereits aufgefallen, ebenso der Vorteil, den AutoCAD gegenüber. Zumindest die Verfolgung konnte ich relativ einfach lösen, indem ich sie mir mit prinq über die Kommandozeile ausgeben lasse.
Hier kriegst Du eine Funktion, die Du statt PRINT o.ä. verwenden kannst. In BricsCAD ist das schon eine echte Debug-Hilfe. Diese Funktion hält mit eigenem Befehlsprompt an, und solange Du keine Leereingabe machst, kannst Du beispielsweise die Werte lokaler Variablen an der Unterbrechungsstelle abfragen (einfach wie am AutoCAD-Befehlsprompt ein "!" vor den Variablennamen schreiben) und jede beliebige Lisp-Funktion ausühren lassen (alle Eingaben mit einem "(" als erstem Zeichen werden als Lisp evaluiert). Du fügst einfach am gewünschten Brechpunkt in Deinen Lisp-Code diese Funktion ein: (LispBreak "\nmein Prompt: ") Code:
(defun LispBreak (myprompt / texteval input) (setq texteval (getvar "texteval")) (setvar "texteval" 1) (while (/= input "") (prompt myprompt) (setq input (getstring T ": ")) (cond ((= (substr input 1 1) "!") (prin1 (eval (read (substr input 2)))) ) ((= (substr input 1 1) "(" ) (prin1 (eval (read input))) ) ) (princ "\n") ) (setvar "texteval" texteval) (princ) )
[Diese Nachricht wurde von archtools am 24. Jan. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |