| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Auwahl Blöcke in lsp (2153 mal gelesen)
|
Bauvermesser Mitglied Vermesser
Beiträge: 460 Registriert: 18.03.2006 AMD 2600, 2024RAM ,WIN XP PROF-SP3, ACAD 2005, Firmenrechner,
|
erstellt am: 16. Feb. 2013 18:00 <-- editieren / zitieren --> Unities abgeben:
hallo, Frage ich lese über (if (setq AUSWAHL (ssget "_X" '((0 . "Insert")(2 . "cod-050, cod-150, cod-166,............ " )) ) Blöcke für weitere Funktion in der lsp aus. Da es aber sehr viele Blöcke werden, würde ich gern die Blöcke untereinander auflisten um diese besser sortieren zu können. So etwa .. (if (setq AUSWAHL (ssget "_X" '((0 . "Insert")(2 . "cod-050, cod-150, cod-166, ................. " )) ) wie muss ich es schreiben, das die Blöcke auch in dieser übersichtlichen Schreibweise in der lsp verarbeitet werden. Kann mir bitte jemand einen Hinweis geben. ------------------ Gruß vom Bauvermesser; Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 16. Feb. 2013 18:29 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 18. Feb. 2013 06:48 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
... die Zeichenfolgen in (ssget unterstützen auch Wildcard's. Code:
(ssget "_X" (list '(0 . "Insert") (cons 2 "cod-###")))
Die Zeile sammelt dir alle Inserts ein, die mit cod- gefolgt von 3 Ziffern benannt sind.Grüße! Holger ------------------ Holger Brischke FREIE SCHULUNGSPLÄTZE -- C#.NET-Schulung im Mai 2013 Bei Interesse bitte melden! CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 18. Feb. 2013 08:54 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
Hi, oder du entkoppelst die Namensliste der Übersichtlichkeit halber vom ssget-Aufruf und lässt sie mit einer Funktion ssget-konform zusammenbasteln. Hat den Vorteil, dass die Liste ganz oben stehen kann und nicht im Code gesucht werden muss: Code: (setq l '( "cod-050" "cod-150" "cod-166" ) );;;str-untok by Axel (defun str-untok (ls c) (strcat (car ls) (apply 'strcat (mapcar '(lambda (s) (strcat c s) ) (cdr ls) ) ) ) ) (ssget "_X" (list '(0 . "INSERT") (cons 2 (str-untok l ","))))
Auch hier würden Wildcards funktionieren. Gruß CADchup
------------------ CADmaro.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bauvermesser Mitglied Vermesser
Beiträge: 460 Registriert: 18.03.2006 AMD 2600, 2024RAM ,WIN XP PROF-SP3, ACAD 2005, Firmenrechner,
|
erstellt am: 18. Feb. 2013 20:51 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 19. Feb. 2013 07:35 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 21. Feb. 2013 15:03 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
Zitat: Original erstellt von CADmium:
Die Funktion hat dir keinen Auswahlsatz zurückgeliefert ( weil nix gefunden) und wendest Funktionen wie sslength im Nachhineine darauf an. Deshalb würde mein Konstrukt immer ähnlich so aussehen (if (setq AWS(ssget ...)) machwas mit.
... ich wandle Auswahlsätze grundsätzlich in Listen von Enamen um. Man kann allerbestens mit allen bewährten Listenfunktionen darauf zugreifen, ohne irgend welche Seiteneffekte befürchten zu müssen. Und ein leerer Auswahlsatz ist dann einfach NIL. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 21. Feb. 2013 15:16 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 21. Feb. 2013 16:28 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
Zitat: Original erstellt von CADmium: ja , aber ssnamex oder ssname .... oder sowas , was man einmal braucht, um ne Objektliste aus einem Auswahlsatz zu erzeugen, erwartet auch einen Auswahlsatz und kein nil ! .... das man danach besser mit Listen und den dazugehörigen Funktionen weiterarbeitet, steht auf nem anderen Blatt.
Mein Einwand macht überhaupt nur Sinn, wenn man von Auswahlsätzen spricht. AutoCAD erzeugt durch diverse Funktionen PICKSETs, und diese wandle ich zur Bearbeitung grundsätzlich in Listen um. Es gibt dabei nur eine einzige zentrale Funktion, und das ist die Umwandlungsfunktion. Diese erwartet als Übergabeparameter ein Pickset, und wenn dieses entweder leer ist oder nil, dann wird gleichermaßen NIL zurück gegeben. Ich muss dann also bei Funktionen zum bearbeiten niemals unterscheiden, ob ein leerer Auswahlsatz oder Nil gekommen ist. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 21. Feb. 2013 19:32 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
|
Bauvermesser Mitglied Vermesser
Beiträge: 460 Registriert: 18.03.2006 AMD 2600, 2024RAM ,WIN XP PROF-SP3, ACAD 2005, Firmenrechner,
|
erstellt am: 21. Feb. 2013 21:29 <-- editieren / zitieren --> Unities abgeben:
also mit dem Fachsimpel kann ich ja nicht mitreden anbei die lsp welche bei mir geht, danke für die Hilfe läuft -->> (defun C:INSSCALE (/ AUSWAHL BlkObj INDEX X Y Z) (if (setq AUSWAHL (ssget "_X" (list '(0 . "Insert")(cons 2 (strcat "cod-045," "cod-050," "cod-051," ........... ..... "cod-167," "cod-168," "cod-295"))) ) X 1 Y 1 Z 1 ) (progn ;;------- (prompt "\n_") (prompt "\n_") (prompt "\n- - - - - - - Scalierung Blöcke von 1/250 auf 1/500 = x1.2 oder zurück x0.83333") (setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) (setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) ;;------- (setq INDEX -1) (repeat (sslength AUSWAHL) (setq BlkObj (vlax-ename->vla-object (ssname AUSWAHL (setq INDEX (1+ INDEX))) ) ) (vla-put-XScaleFactor BlkObj x) (vla-put-YScaleFactor BlkObj y) (vla-put-ZScaleFactor BlkObj z) ) ) ) (princ) ) .. >> --- läuft nicht ------------------------------------------------------------- (defun C:INSSCAL (/ AUSWAHL BlkObj INDEX X Y Z) (setq l '( " cod-050 " " cod-150 " " cod-166 " ) ) ;;;str-untok by Axel (defun str-untok (ls c) (strcat (car ls) (apply 'strcat (mapcar '(lambda (s) (strcat c s) ) (cdr ls) ) ) ) ) ;; (ssget "_X" (list '(0 . "INSERT")(cons 2 (str-untok l ","))) (if (setq AUSWAHL (ssget "_X" (list '(0 . "Insert")(cons 2 (str-untok l ","))) ) X 1 Y 1 Z 1 ) (progn ;;------- (prompt "\n_") (prompt "\n_") (prompt "\n- - - - - - - Scalierung Blöcke von 1/250 auf 1/500 = x1.2 oder zurück x0.83333") (setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) (setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) ;;------- (setq INDEX -1) (repeat (sslength AUSWAHL) (setq BlkObj (vlax-ename->vla-object (ssname AUSWAHL (setq INDEX (1+ INDEX))) ) ) (vla-put-XScaleFactor BlkObj x) (vla-put-YScaleFactor BlkObj y) (vla-put-ZScaleFactor BlkObj z) ) ) ) (princ) ) ------------------ Gruß vom Bauvermesser; Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 21. Feb. 2013 22:10 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 21. Feb. 2013 22:16 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
Zitat: Original erstellt von Bauvermesser: also mit dem Fachsimpel kann ich ja nicht mitreden anbei die lsp welche bei mir geht,
Fremden Code sehe ich mir nur an, wenn er leserlich formatiert ist. Als allgemeiner Hinweis: man programmiert in Lisp nicht, indem man für eine Problemlösung alles in eine Funktion packt, sondern man unterteilt sein Problem in eine Reihe kleinerer, möglichst allgemeiner Probleme (diese allgemein verwendbaren Funktionen sammelt man in einer Toolbox). Es kommt nur selten vor, dass Lisp-Funktionen mehr als 5 oder 6 Zeilen Code umfassen. Hier was, womit Deine Aufgabe gelöst werden kann (und viele andere auch): Code:
(defun modent (ename dxf val / old) (entmod (my-subst (cons dxf val) (entget ename) ) ) )(defun my-subst (newpair inlist / temp) (cond ((not inlist) (list newpair) ; inlist existiert nicht ) ((setq temp (assoc (car newpair) inlist)) (subst newpair temp inlist) ; existiert schon, ersetzen ) ('T (reverse (cons newpair (reverse inlist))) ; hinten dran ) ) ) (defun ss->list (sset / eset counter) (setq counter 0) (if (= 'PICKSET (type sset)) (repeat (sslength sset) (setq eset (cons (ssname sset counter) eset) counter (1+ counter) ) ) ) eset ) (defun list->ss (eset / sset x) (setq sset (ssadd)) (if (= 'LIST (type eset)) (mapcar '(lambda (x) (if (= 'ENAME (type x)) (setq sset (ssadd x sset)) ) ) eset ) ) sset )
Die Funktionen sollten weitgehend selbsterklärend sein. Mit MODENT modifizierst Du ein einzelnes Entity, indem Du einen DXF-Gruppencode mitgibst, und einen neuen Wert für diesen Gruppencode. Wenn en der Ename eines Entities ist, kannst Du also mit (modent en 8 "NEUERLAYER") dem Entity einen neuen Layer (Gruppencode 8) zuweisen. Wenn en ein Insert-Entity ist, kannst Du mit (modent en 41 1.2) der Blockreferenz die X-Skalierung (DXF-Gruppencode 41) den Wert 1.2 zuweisen. Mit (modent en 2 "ANDERERBLOCKNAME") weist Du dem Insert-Entity eine Referenz auf einen anderen Block zu (d.h. Du tauschst den Block aus, wobei das Insert alle anderen Eigenschaften wie Layer, Skalierung usw behält). Mit folgendem Code kannst Du allen Referenzen des Blocks "ABC" die Skalierung X=2, Y=3 zuweisen: (foreach en (ss->list (ssget "X" '((0 . "INSERT")(2 . "ABC")))) (modent en 41 2.0) (modent en 42 3.0) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bauvermesser Mitglied Vermesser
Beiträge: 460 Registriert: 18.03.2006 AMD 2600, 2024RAM ,WIN XP PROF-SP3, ACAD 2005, Firmenrechner,
|
erstellt am: 26. Feb. 2013 11:54 <-- editieren / zitieren --> Unities abgeben:
Danke für die Erläuterungen, natürlich war mir in der zweiten Version mit der entkoppelten Namensliste ein Fehler unterlaufen( Leerzeichen und Komma) . Für mich wäre noch interessant inweiweit ich mit der Angabe einer Scalierungsgöße (für Xund Y) beide Werte erreiche. Meine einfachen Versuche >> (setq X,Y (getreal "\nRelativen Vergrößerungsfaktor X;Y : "))(> X 0, > Y 0) sind natürlch laienhaft und erfolglos, wobei keine feste Größe vorgegeben werden soll. Vielleicht kann ich da noch einen Hinweis erhalten? ------------------ Gruß vom Bauvermesser; 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: 26. Feb. 2013 12:13 <-- editieren / zitieren --> Unities abgeben: Nur für Bauvermesser
Zitat: Original erstellt von Bauvermesser: Für mich wäre noch interessant inweiweit ich mit der Angabe einer Scalierungsgöße (für Xund Y) beide Werte erreiche. Meine einfachen Versuche >> (setq X,Y (getreal "\nRelativen Vergrößerungsfaktor X;Y : "))(> X 0, > Y 0) sind natürlch laienhaft und erfolglos, wobei keine feste Größe vorgegeben werden soll. Vielleicht kann ich da noch einen Hinweis erhalten?
Verwende doch einfach GETPOINT und verlange einen Punkt als Eingabe. Der enthält x- und y-Werte, und den kann der Anwender einfach mit "x,y" am Command-Prompt eingeben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |