| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Heavy-Polylinie mit entmod ändern (789 mal gelesen)
|
DerUhrmacher Mitglied Uhrmacher
Beiträge: 177 Registriert: 14.07.2002 Dell Precision 5820 32 GB RAM , SSD Quadro P2000 Bin dabei seit IV 5.3 SpacePilot pro
|
erstellt am: 18. Aug. 2008 01:13 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich möchte einige Stützpunkte eine HW-Polylinie mit entmod ändern. Doch habe ich keine Ahnung wie ich das anstellen soll, da die Punkte nicht einfach in Gruppencodes zu finden sind. Wer hat da eine Idee? Grüsse Andreas ------------------ Andreas Strehler, Der Uhrmacher Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
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: 18. Aug. 2008 07:43 <-- editieren / zitieren --> Unities abgeben: Nur für DerUhrmacher
Hallo Andreas, mit folgender Funktion werden die Stützpunktobjekte(VERTEX'es) der Polylinie wiedergegeben, vielleicht kommst Du damit ja schon weiter. Code:
(defun test:stzpkt (obj / liste) (while (and(setq obj(entnext obj))(/=(cdr(assoc 0 (entget obj)))"SEQEND")) (setq liste (cons obj))liste))) (reverse liste))
[edit] Aufrufen mit (test:stzpkt (car(entsel))) [/edit] ------------------ viele Grüße
Jörn http://www.bosse-engineering.com [Diese Nachricht wurde von joern bosse am 18. Aug. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerUhrmacher Mitglied Uhrmacher
Beiträge: 177 Registriert: 14.07.2002
|
erstellt am: 18. Aug. 2008 10:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn Besten Dank, doch so weit so gut. Ich hab mal noch ein bisschen angepasst (Klammeranzahl korrigiert) Code:
(defun test:stzpkt (obj / liste) (while (and (setq obj(entnext obj)) (/= (cdr(assoc 0 (entget obj))) "SEQEND" )) (setq liste (cons obj liste)) ) (reverse liste) )
Jetzt muss ich mich nur noch über das entmod gedanken machen. Grüsse Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerUhrmacher Mitglied Uhrmacher
Beiträge: 177 Registriert: 14.07.2002 Dell Precision 5820 32 GB RAM , SSD Quadro P2000 Bin dabei seit IV 5.3 SpacePilot pro
|
erstellt am: 18. Aug. 2008 22:10 <-- editieren / zitieren --> Unities abgeben:
Hier noch meine Lösung: Code:
(defun test_Punkteersetzen(obj Punkte / infoliste liste original zlr) (setq zlr 0) (while (and (setq obj(entnext obj)) (/= (cdr(assoc 0 (entget obj))) "SEQEND" )) (setq liste (cons obj liste)) (reverse liste) ) (repeat (length punkte) (setq original (entget (nth zlr liste))) (entmod infoliste (subst (cons 10 (nth zlr punkte)) (assoc 10 original) original)) (entupd (nth zlr liste)) (setq zlr (+ 1 zlr)) ) )
Ich weiss es geht auch viel kompakter, aber ich mags so. ;-) Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 22. Aug. 2008 10:04 <-- editieren / zitieren --> Unities abgeben: Nur für DerUhrmacher
Tag zusammen. Ein paar kleine Anmerkungen hätte ich da dann doch zu machen: - 1 -
Code:
(while (and (setq obj(entnext obj)) (/= (cdr(assoc 0 (entget obj))) "SEQEND" )) ... )
ist ziemlich sportlich, weil die Routine fleißig in der Zeichnung herumwerkelt, wenn du mal nicht ein 3D-Polylinie erwischt hast. Meinem Geschmack nach funktioniert das so besser:
Code:
(while (and (setq obj(entnext obj)) (= (cdr(assoc 0 (entget obj))) "VERTEX" )) ... )
- 2 - Wenn du sowieso schon in einer Schleife über die Vertex-Punkte der Polylinie iterierst, dann lohnt es sich nur die Vertexliste zu speichern, wenn du relativ viel mit den Vertexen anfangen willst. Willst du nur deren Punkte auszutauschen, dann lässt sich das auch gleich in der Schleife erledigen und spart Zeit und Speicher. - 3 - BEACHTE: nth ist der letzte Notnagel, vermeide die Funktion, wenn möglich. Vergleiche mal die Laufzeit zwischen
Code: (foreach x grosse-liste (mach-was-mit x))
und Code:
(repeat(length grosse-liste) (mach-was-mit(nth i liste)) (setq i(1+ i)) )
da wird dir schwindelig - mir jedenfalls. Darüber hinaus ist's auch keine schlechte Idee, zu gucken, ob überhaupt genug Vertexe vorhanden sind, um all deine Punkte zu verabeiten. Meiner Meinung nach besser wäre also:
Code:
(foreaach p punkte (if(car liste);** noch ein Vertex in der liste? (progn (setq original(entget (car liste))) ;** infoliste habe ich entfernt, konnte nicht erkennen, wofür das gut war (entmod (subst (cons 10 p) (assoc 10 original) original)) (entupd (car liste));** OK, kann man machen (setq liste (cdr liste)) ) ) )
oder, um die if-Abfrage und die vielen setq's zu sparen gleich mit dem wunderbaren mapcar:
Code:
(mapcar (function(lambda(p vertex / original) (setq original(entget vertex)) (entmod (subst (cons 10 p) (assoc 10 original) original)) (entupd vertex) )) punkte liste )
Für Mecker und Verbesserungs-Vorschläge bin ich - wie immer offen. Achim Dabrunz ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
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. Aug. 2008 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für DerUhrmacher
Hallo Achim, mit dem (= (cdr(assoc 0 (entget obj))) "VERTEX" ) anstelle (/= (cdr(assoc 0 (entget obj))) "SEQEND" ) hast Du natürlich völlig recht, wobei man aber auch im Vorfelde nur 3D-Polylinien in der Auswahl der Objekte zulassen könnte. Folgender Test in nur Spielerei, aber vielleicht kannst Du ja noch Deinen Kommentar zu dem Konstrukt abgeben:
Code:
(defun c:test ( / ) (mapcar '(lambda(A) (princ (strcat "\nVertex \""(cdr(assoc 5(entget A)))"\" entmoden."))) (test:entnext (car(entsel))nil)) (princ))(defun test:entnext (obj liste / ) (if(and (setq obj(entnext obj)) (= (cdr(assoc 0 (entget obj))) "VERTEX" )) (setq liste(test:entnext obj (cons obj liste))) liste))
------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |