| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Auswahlsatz aus Polylinie erstellen (1705 mal gelesen)
|
mazur-ch Mitglied
Beiträge: 74 Registriert: 31.10.2008 ACAD 2020, Win 10 64Bit
|
erstellt am: 02. Mrz. 2015 13:08 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich habe bei meinem Programm ein Teilproblem. Vielleicht kann mir ja jemand von euch einen Tipp geben. Ich selbst bin leider nur ein Gelegenheits-Programmierer: Das Programm soll für jede Polylinie (müssten geschlossen sein) des Layers "VK_Bedienungsgrene" in einer Zeichnung ausgeführt werden: - Auswahl aller Polylinien:
Code: (SETQ selPolylinien (SSGET "_X" '((0 . "*POLYLINE") (8 . "VK_Bedienungsgrenze")))) ; Alle Polylinien auswählen
In diesem Auswahlsatz soll jede Polylinie einzeln für die Auswahl von Blöcken und Texten (innerhalb der einzelnen Polylinie) genutzt werden: - das durcharbeiten der einzelnen Polylinie (hier und weiter unten stecke ich irgend wie fest):
Code: (setq i 0) (while (< i (sslength selPolylinien)) ; (EinzelnePolylinieVerarbeiten (ssname selPolylinien i)) (setq i (+ i 1)) ); end while
mit dieser Schlaufe würde ich gerne jede einzelne Polylinie durchgehen und bei EinzelnePolylinieVerarbeiten die einzelne Polylinie übergeben. Mit Hilfe der einzelnen Polylinie soll nun ein neuer Auswahlsatz erstellt werden: Code: (defun EinzelnePolylinieVerarbeiten(einzelnePolylinie) ;; (setq object (ssget "_WP" (einzelnePolylinie))) ;Objekte innerhalb einer Polylinie auswählen ;; (setq object (ssget "_WP" (vox-get-lwp-points (einzelnePolylinie)))) ;Objekte innerhalb einer Polylinie auswählen )
egal bei welchem der beiden Varianten ich die Kommentierung weg nehme, erhalte ich einen Fehler wegen dem Objektname. Nun, wie bring ich LISP/AutoCAD dazu einen neuen Auswahlsatz mit Hilfe einer einzelnen Polylinie eines Auswahlsatzes zu erstellen? Muss ich da etwas anderes übergeben, was? Muss ich beim unteren Auswahlsatz etwas ändern, was? Habe jetzt auch schon versucht, das Internet etwas zu durchsuchen, habe aber leider nichts gefunden. Etwas frustriert bin... Naja ------------------ ----------- Auch wenn ich noch so viel Bier trinke, Goethe war dichter... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Mrz. 2015 13:24 <-- editieren / zitieren --> Unities abgeben: Nur für mazur-ch
Acad erwartet natürlich bestimmte Objekttypen, diese mußt du liefern oder das Programm ändern. Diese Variante: (setq object (ssget "_WP" (vox-get-lwp-points (einzelnePolylinie)))) sollte fast funktionieren, nur sind die Klammern um 'einzelnePolylinie' vermutlich überflüssig, (setq object (ssget "_WP" (vox-get-lwp-points einzelnePolylinie))) sollte hingegen funktionieren (ich suche jetzt nicht den originalcode den du da kopiert hast.. In 'object' hast du dann aber einen Auswahlsatz (der Variablenname object könnte dich daher womöglich wieder durcheinander bringen). ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mazur-ch Mitglied
Beiträge: 74 Registriert: 31.10.2008 ACAD 2020, Win 10 64Bit
|
erstellt am: 02. Mrz. 2015 14:23 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm Vielen Dank! Man kann ja irgend wie an einem einzelnen Zeichen untergehen... Ja, es sollten alle Objekte innerhalb dieser einzelnen Polylinie ausgewählt werden. Mit dieser Objektliste möchte ich dann weitere Listen erstellen, die nur noch Text oder Blöcke haben. Habe dies damit versucht:
Code: (sssetfirst nil object) ;Auswahlsatz "object" zum aktuell ausgewählten Auswahlsatz machen (setq VKtextListe (ssget '((0 . "TEXT")))) ;im aktuellen Auswahlsatz nur noch jene mit TEXTen ("TEXT") auswählen
und Code: (sssetfirst nil object) ;Auswahlsatz "object" zum aktuell ausgewählten Auswahlsatz machen (setq selBloecke (ssget '((0 . "INSERT")))) ;im aktuellen Auswahlsatz nur noch jene mit Block ("insert") auswählen
Dabei wählt er mit sssetfirst sauber die Objekte aus, danach möchte er aber, dass ich Objekte im AutoCAD anklicke. Weisst du oder sonst jemand weshalb dies so ist? Weitere Frage: Gibt es eine Möglichkeit das Ganze ohne sssetfirst zu lösen? also direkt eine Kombi aus den beiden ssget (jene mit "_WP" und jener mit '((0. " ? ------------------ ----------- Auch wenn ich noch so viel Bier trinke, Goethe war dichter... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Mrz. 2015 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für mazur-ch
da sssetfirst überhaupt nicht dafür da ist: Ja das geht ohne. Du hast einen Auswahlsatz, dann gehe mit einer Schleife durch den Auswahlsatz und bearbeite nur Objekte die Gruppencode 0 = INSERT oder TEXT haben / je nach Wunsch. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mazur-ch Mitglied
Beiträge: 74 Registriert: 31.10.2008 ACAD 2020, Win 10 64Bit
|
erstellt am: 02. Mrz. 2015 14:40 <-- editieren / zitieren --> Unities abgeben:
kann ich das auch ohne über den Auswahlsatz object machen? evtl. ohne, dass ich eine Schlaufe erstellen müsste? irgend wie auf diese Art (dies funktioniert nicht):
Code: (setq selBloecke (ssget "_WP" (vox-get-lwp-points einzelnePolylinie) '((0 . "INSERT"))))
------------------ ----------- Auch wenn ich noch so viel Bier trinke, Goethe war dichter... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Mrz. 2015 14:56 <-- editieren / zitieren --> Unities abgeben: Nur für mazur-ch
|
mazur-ch Mitglied
Beiträge: 74 Registriert: 31.10.2008 ACAD 2020, Win 10 64Bit
|
erstellt am: 03. Mrz. 2015 12:14 <-- editieren / zitieren --> Unities abgeben:
Ohh, da hab ich doch gerade den Befehlt mit einer Klammer weniger hier hinein kopiert und schwups, war der Fehler weg. Dafür hänge ich an einer neuen Stelle. Was bisher zu funktionieren scheint:
Code: ;Main-Funktion (defun C:NE_Block_Anpassen() (vl-load-com) (BloeckeAendernInAllenPolylinien) );Ende Main-Funktion ;----------------- (defun BloeckeAendernInAllenPolylinien() ; Alle Polylinien auswählen (SETQ selPolylinien (SSGET "_X" '((0 . "*POLYLINE") (8 . "VK_Bedienungsgrenze")))) ;Anzahl der Polylinien innerhalb der Auswahl anzeigen (princ (sslength selPolylinien)) (princ "\n...\n") ;jede einzelne Polylinie in der Liste durcharbeiten. (setq i 0) (while (< i (sslength selPolylinien)) (EinzelnePolylinieVerarbeiten (ssname selPolylinien i)) (setq i (+ i 1)) ); end while ) ;----------------- (defun EinzelnePolylinieVerarbeiten(einzelnePolylinie) (setq selBloecke (ssget "_WP" (vox-get-lwp-points einzelnePolylinie) '((0 . "INSERT")))) (setq VKtextListe (ssget "_WP" (vox-get-lwp-points einzelnePolylinie) '((0 . "TEXT")))) )
Wenn ich nun mit den untersten beiden Listen (selBloecke und VKtextListe) etwas machen will, kommt der Fehler "Fehlerhafter Argumenttyp: lselsetp Nil". Zum Beispiel wenn ich die Länge dieser Listen herausfinden will:
Code: (defun EinzelnePolylinieVerarbeiten(einzelnePolylinie) (setq selBloecke (ssget "_WP" (vox-get-lwp-points einzelnePolylinie) '((0 . "INSERT")))) (setq VKtextListe (ssget "_WP" (vox-get-lwp-points einzelnePolylinie) '((0 . "TEXT")))) (princ (sslength selBloecke)) )
Auch mit Code: (setq VKtext (cdr(assoc 1 (entget VKtextListe)))) ;hier müsste der Text als String in die Variable geschrieben werden
kommt er nicht weiter (hier würde er den ersten Text in VKtext schreiben. Grundsätzlich möchte ich mit der Länge prüfen ob es >0 Blöcke und genau 1 Text in den beiden Listen hat. Danach werden andere Funktionen mit der Blockliste und dem einen Text als Übergabewert aufgerufen. Da aber die Fehlermeldung erscheint, habe ich dies noch nicht eingebaut. sind das keine normalen Listen mehr? wenn innerhalb der Polylinie keine Blöcke oder Texte sind, müsste er doch eine leere Liste erstellen und mit sslength entweder 0 oder Nil zurückgeben? Gruss, Dank und Mahlzeit ------------------ ----------- Auch wenn ich noch so viel Bier trinke, Goethe war dichter... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Mrz. 2015 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für mazur-ch
|