Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Subentitäten aus Blöcken auslesen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Subentitäten aus Blöcken auslesen (1249 mal gelesen)
S.Langhammer
Mitglied


Sehen Sie sich das Profil von S.Langhammer an!   Senden Sie eine Private Message an S.Langhammer  Schreiben Sie einen Gästebucheintrag für S.Langhammer

Beiträge: 8
Registriert: 22.01.2013

erstellt am: 22. Jan. 2013 15:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von joern bosse an!   Senden Sie eine Private Message an joern bosse  Schreiben Sie einen Gästebucheintrag für joern bosse

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 22. Jan. 2013 19:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für S.Langhammer 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von S.Langhammer an!   Senden Sie eine Private Message an S.Langhammer  Schreiben Sie einen Gästebucheintrag für S.Langhammer

Beiträge: 8
Registriert: 22.01.2013

erstellt am: 23. Jan. 2013 17:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von joern bosse an!   Senden Sie eine Private Message an joern bosse  Schreiben Sie einen Gästebucheintrag für joern bosse

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 24. Jan. 2013 07:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für S.Langhammer 10 Unities + Antwort hilfreich

Hallo S.,

Zitat:
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!

Wieso Geständnis? Ist doch in Ordnung. Den einzigen Nachteil, den ich daran sehe, daß Du dann keine Visual-Lisp-Umgebung (VLIDE) zur Verfügung hast, so wie in AutoCAD. Damit läßt sich vieles einfacher programmieren, weil Du über einen Debug-Modus jederzeit Variablen und Programmabläufe zur Laufzeit genau beobachten kannst. Und gerade wenn man am Anfang noch ein bißchen am probieren ist, dann ist das besonders hilfreich.

http://www.bosse-engineering.com/downloads/090501_VisualLISP-Editor.pdf


viele Grüße

Jörn
http://www.bosse-engineering.com

Böschungsschraffen Youtube

[Diese Nachricht wurde von joern bosse am 24. Jan. 2013 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

S.Langhammer
Mitglied


Sehen Sie sich das Profil von S.Langhammer an!   Senden Sie eine Private Message an S.Langhammer  Schreiben Sie einen Gästebucheintrag für S.Langhammer

Beiträge: 8
Registriert: 22.01.2013

erstellt am: 24. Jan. 2013 08:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 24. Jan. 2013 23:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für S.Langhammer 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz