Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Auswahlsatz aus Polylinie erstellen

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:  Auswahlsatz aus Polylinie erstellen (1618 mal gelesen)
mazur-ch
Mitglied



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

Beiträge: 73
Registriert: 31.10.2008

ACAD 2014, Win 7 64Bit

erstellt am: 02. Mrz. 2015 13:08    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

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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 02. Mrz. 2015 13:24    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 mazur-ch 10 Unities + Antwort hilfreich

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



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

Beiträge: 73
Registriert: 31.10.2008

ACAD 2014, Win 7 64Bit

erstellt am: 02. Mrz. 2015 14:23    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

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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 02. Mrz. 2015 14:32    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 mazur-ch 10 Unities + Antwort hilfreich

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



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

Beiträge: 73
Registriert: 31.10.2008

ACAD 2014, Win 7 64Bit

erstellt am: 02. Mrz. 2015 14:40    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

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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 02. Mrz. 2015 14:56    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 mazur-ch 10 Unities + Antwort hilfreich

Der Code ist so RICHTIG!

Teste es bitte noch einmal wärend du wirklich darauf achtest das die Objekte auch am Monitor gut sichtbar sind.

------------------
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



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

Beiträge: 73
Registriert: 31.10.2008

ACAD 2014, Win 7 64Bit

erstellt am: 03. Mrz. 2015 12: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

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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 03. Mrz. 2015 13:06    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 mazur-ch 10 Unities + Antwort hilfreich

Sslength will einen Auswahlsatz, du hast aber keinen (kein insert gefunden)

(if (setq aws (ssget))
(sslength aws)
(alert "nadda")
)

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

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