| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ENTUPD mit Linienkoordinaten (1230 mal gelesen)
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 09. Mrz. 2009 18:00 <-- editieren / zitieren --> Unities abgeben:
Wie anscheinend kleine Dinger nerven können ... Wir haben Objekte, die auf irgendwelchen sehr unrunden Dezimalen sitzen. Dazu möchte ich die Koordinaten (DXF 10 und 11) auslesen, runden und damit die Linien modifizieren. Dazu habe ich was gebastelt, was schön langsam und ausführlich durch die DXF-Codes läuft - für 10er und 11er nahezu identisch, Ausgaben etc. Jetzt ist das ENTUPD aber sehr bockig - im beiliegenden Code wird nur der 11er angepasst, der 10er nicht (obwohl protokolliert und berechnet). Trotz REGEN und mehrfach-ENTUPD und doppleter Elementliste - es geht nicht. Warum?? Peter Code: (setq aws (entsel "\nLinie oder Block wählen: ")) (if aws (progn (setq objekt (car aws) elem_liste10 (entget (car aws)) elem_liste11 (entget (car aws)) elem_typ (cdr (assoc 0 elem_liste10))) (if (or (= elem_typ "LINE") (= elem_typ "INSERT")) (progn ; ********************************* (setq zehner (cdr (assoc 10 elem_liste10)) zehn_x (cadr (assoc 10 elem_liste10)) zehn_y (caddr (assoc 10 elem_liste10))) ; wenn die Differenz zur nächsten vollen Zahl kleinergleich 0.1, dann verschiebe auf volle Zahl. ; sonst auf gerundetes Zehntel (if (<= (abs (- (atof (rtos zehn_x 2 0)) (atof (rtos zehn_x 2 1)))) 0.1) (setq zehn_x (atof (rtos zehn_x 2 0))) (setq zehn_x (atof (rtos zehn_x 2 1))) ) (if (<= (abs (- (atof (rtos zehn_y 2 0)) (atof (rtos zehn_y 2 1)))) 0.1) (setq zehn_y (atof (rtos zehn_y 2 0))) (setq zehn_y (atof (rtos zehn_y 2 1))) ) (entmod (subst (cons 10 (list zehn_x zehn_y 0.0)) (cons 10 zehner) elem_liste10)) (entupd objekt) (command "_regen") (princ (strcat "\n 10er verschoben von \n" (rtos (car zehner) 2) " / " (rtos (cadr zehner) 2) " nach \n" (rtos zehn_x 2) " / " (rtos zehn_y 2)) ) ; ********************************* (if (= elem_typ "LINE") (progn (setq elfer (cdr (assoc 11 elem_liste11)) elf_x (cadr (assoc 11 elem_liste11)) elf_y (caddr (assoc 11 elem_liste11))) ; wenn die Differenz zur nächsten vollen Zahl kleinergleich 0.1, dann verschiebe auf volle Zahl. ; sonst auf gerundetes elftel (if (<= (abs (- (atof (rtos elf_x 2 0)) (atof (rtos elf_x 2 1)))) 0.1) (setq elf_x (atof (rtos elf_x 2 0))) (setq elf_x (atof (rtos elf_x 2 1))) ) (if (<= (abs (- (atof (rtos elf_y 2 0)) (atof (rtos elf_y 2 1)))) 0.1) (setq elf_y (atof (rtos elf_y 2 0))) (setq elf_y (atof (rtos elf_y 2 1))) ) (entmod (subst (cons 11 (list elf_x elf_y 0.0)) (cons 11 elfer) elem_liste11)) (entupd objekt) (command "_regen") (princ (strcat "\n 11er verschoben von \n" (rtos (car elfer) 2) " / " (rtos (cadr elfer) 2) " nach \n" (rtos elf_x 2) " / " (rtos elf_y 2)) ) ) ) ) (progn (princ (strcat "\nDas ist ein(e) " elem_typ ".")) ) ) ) (princ "\nNichts gewählt.") )
------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) [Diese Nachricht wurde von Peter2 am 09. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 09. Mrz. 2009 18:12 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Teil das erstmal in 2 Funktionen .. eine zum Runden und eine zur Objektdatenbehandlung. .. so sieht der Code ja bloß gruselig aus ... sorry, aber da hab ich dann keine Lust zum rübergucken. ansonsten braucht du dein entupd nicht.. nur bei komplexen Objekten wie Blöcken der 2D-Polys.. es reicht entmod. Denke du hast irgendwo bei den Variablen Schrott gebaut ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 09. Mrz. 2009 18:14 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Peter2: [B]...geht nicht. Warum?? Peter
Nix BOCKIG - Programmierfehler elem_liste11 wird am Anfang gesetzt und enthält doch noch die ungerundeten Koordinaten des Zehner Eintrags. Dann leidet das Programm an zu vielen Variablen. ------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 09. Mrz. 2009 18:19 <-- editieren / zitieren --> Unities abgeben:
Nachtrag: Ich vermute, dass sich die zwei ENTUPD hintereinander nicht vertragen. denn wenn oich den Code Zeile für Zeile abarbeite, dann wird der 10er schon angepasst .. Zitat: Original erstellt von CAD-Huebner: ...elem_liste11 wird am Anfang gesetzt und enthält doch noch die ungerundeten Koordinaten des Zehner Eintrags....
??? Stehe auf dem Schlauch - gerade der 11er funktioniert eigentlich. Und die Anzahl der Variablen - tja, da bin ich eher grosszügig, und hier habe ich beim Testen noch ein paar Extrarunden gedreht. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) [Diese Nachricht wurde von Peter2 am 09. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 09. Mrz. 2009 18:21 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CADmium: ...ansonsten braucht du dein entupd nicht..
Werde ich mir anschauen. Interessanterweise hat sich die Linie manchmal doch noch plangemäss verändert, wenn ich inj der Befehlszeile ein ENTUPD nachgeschoben habe .. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 09. Mrz. 2009 18:45 <-- editieren / zitieren --> Unities abgeben:
Danke, ich habs.. Zitat: Original erstellt von Peter2: Nachtrag: Ich vermute, dass sich die zwei ENTUPD hintereinander nicht vertragen. Denn wenn ich den Code Zeile für Zeile abarbeite, dann wird der 10er schon angepasst ..[QUOTE]Original erstellt von CAD-Huebner: ...elem_liste11 wird am Anfang gesetzt und enthält doch noch die ungerundeten Koordinaten des Zehner Eintrags....
??? Stehe auf dem Schlauch - gerade der 11er funktioniert eigentlich.[/QUOTE] Das entmod im 10er hat "Änderung1" erzeugt, das entmod im 11er die "Änderung2" auf alter Basis - und damit die Änderung 1 hinfällig gemacht. Schönen Abend Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) [Diese Nachricht wurde von Peter2 am 09. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied | |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 09. Mrz. 2009 18:47 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Ändere/ergänze die Zeile (entmod (subst (cons 10 (list zehn_x zehn_y 0.0)) (cons 10 zehner) elem_liste10)) mit (entmod (setq elem_liste11 (subst (cons 10 (list zehn_x zehn_y 0.0)) (cons 10 zehner) elem_liste10)) )und es funktioniert wie vorgesehen. ------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 09. Mrz. 2009 20:38 <-- editieren / zitieren --> Unities abgeben:
@ Rabbit007Diese kurzen Codes sind grundsätzlich schön, aber ich baue immer wieder "stückweise" auf. Da ich vielleicht auch noch Texte dazunehme, muss ich dort mit den diversen anderen Codes herumschaufeln. Deshalb mein segmentweiser Code. @CAD-Huebner Ja, ich habe jetzt den Aufbau der Elementliste ans Ende gesetzt und mit einem entmod erledigt. Jetzt läuft es. Danke nochmals an alle. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 823 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 09. Mrz. 2009 21:38 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von CAD-Huebner: [/i]
Code:
(setq elem_liste11 (subst (cons 10 (list zehn_x zehn_y 0.0)) (cons 10 zehner) elem_liste10 ) )
[/i]
Da steckt noch eine allgemeine Fehlerquelle drin, die sich allerdings im Beispiel hier nicht auswirkt, weil die Variable "zehner" hoffentlich den richtigen Wert enthält. Falls mit "zehner" aber irgend wie gerechnet wird, dann kommen da unweigerlich Rundungsfehler an der 15. oder 16. Nachkommastelle rein, womit in der Liste das auszutauschende Altelement (cons 10 zehner) nicht mehr gefunden wird. Der Fehler ist also derselbe wie der, Realzahlen mit (= a b) anstatt mit (equal a b fuzzy) auf Gleichheit zu vergleichen. Anstatt das Altelement mit (cons 10 zehner) anzugeben, wäre es korrekt, es mit (assoc 10 elem_liste10) anzugeben. Hier ist eine Variation von SUBST, die ich fast ausschließlich verwende. In der muss man das Altelement nicht angeben, denn es wird anhand des Assoc-Begriffs des neuen Elemente gesucht. Falls es nicht vorhanden ist (wie z.B. bei DXF-Listen von Entities die Farbe bei "VonLayer"), dann wird das neue Element einfach an die Assoc-Liste angehängt. Voraussetzung ist, dass man es mit einer richtigen Assoc-Liste zu tun hat. Code:
(defun mysubst (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 ) ) )
Der Aufruf wird also kürzer und übersichtlicher als bei SUBST, und die Falle mit den nur fast gleichen Realzahlen gibt's auch nicht mehr. Obige DXF-Liste wird also so konstruiert: Code:
(setq elem_liste11 (mysubst (cons 10 (list zehn_x zehn_y 0.0)) elem_liste10 ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 10. Mrz. 2009 08:58 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Hallo Peter, sowas hab ich auch mal gemacht. Ich hab die Objektwahl mal mit reingeschrieben und das Ganze auf GC10 und 11 gekürzt, eigentlich übergeb ich den Auswahlsatz und behandle auch Kreise, Bögen, Texte, ... Schaus dir einfach mal an: (defun koord_rnd (genauigkeit / n satz) (if (setq satz (ssget '((-4 . "<OR") (0 . "LINE") (0 . "INSERT") (-4 . "OR>") ) ) ) (progn (setq n (1- (sslength satz))) (repeat (sslength satz) (entmod (mapcar '(lambda (data) (if (or (= (car data) 10) (= (car data) 11)) (cons (car data) (mapcar '(lambda (wert) (atof (rtos wert 2 genauigkeit)) ) (cdr data) ) ) data ) ) (entget (ssname satz n)) ) ) (setq n (1- n)) ) ) ) (princ) ) Gruß Andreas ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 10. Mrz. 2009 12:14 <-- editieren / zitieren --> Unities abgeben:
@archtools:Deine Routine werde ich mir mal zur Seite legen, danke. Konkret in dem Fall sehe ich aber kein Problem, weil die Variable "Zehner" gezielt den Altwert speichert und unverändert bleibt (was eben mit ein Grund für die vielen Variablen ist). @Andreas Kraus: Eine überaus schlanke Lösung (wobei natürlich mein Hang zu Rückmeldungen diverse princ und rtos etc. auf jeden Fall braucht.). Bei Texten ist natürlich zu beachten, dass bei nicht linksbündigen Werten der 11er Code eigentlich das Mass aller Dinge ist und der 10er dann nur ein rechnerisches Ergebnis der 11er ist. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied | |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 10. Mrz. 2009 13:06 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Rabbit 007: ...Denn unser aller Vorschläge wurden ja von dir zunichte gemacht...
Nein, das siehst du nicht richtig. Ich hatte aufgrund eines Denkfehlers ein Problem, dass ich gestern schon lösen konnte und das ich hier im Forum auch angegeben habe. Zitat: Original erstellt von Peter2: Danke, ich habs.. Das entmod im 10er hat "Änderung1" erzeugt, das entmod im 11er die "Änderung2" auf alter Basis - und damit die Änderung 1 hinfällig gemacht...
Anscheinend ist das aber nicht so eindeutig rübergekommen - das war nicht Absicht. Die weiteren Beiträge von heute sind sicher auch bei anderen Themen wertvoll und nutzbar, aber das konkrete Thema ist derzeit abgeschlossen. Nochmals danke für die Beiträge. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |