Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Heavy-Polylinie mit entmod ändern

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:  Heavy-Polylinie mit entmod ändern (789 mal gelesen)
DerUhrmacher
Mitglied
Uhrmacher


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

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


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: 18. Aug. 2008 07:43    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 DerUhrmacher 10 Unities + Antwort hilfreich

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


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

Beiträge: 177
Registriert: 14.07.2002

erstellt am: 18. Aug. 2008 10:35    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 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


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

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

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



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

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 22. Aug. 2008 10:04    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 DerUhrmacher 10 Unities + Antwort hilfreich

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


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. Aug. 2008 10:33    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 DerUhrmacher 10 Unities + Antwort hilfreich

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

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