| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Layer von Vertex und Seqend ändern (1934 mal gelesen)
|
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 06. Nov. 2006 07:50 <-- editieren / zitieren --> Unities abgeben:
Servus Eigentlich gibts ja sowas bereits (http://www.cad-od.de/downloads.html - Nr.24), aber das scannt anscheinend die ganze Zeichnung (und meine hat jetzt 15MB). Drum hab ich mir selber was geschrieben, wo ich vorher Objekte wählen kann. Im Prinzip "funktionierts" - (subst) liefert richtige #elist, aber (entmod) schreibt offensichtlich nix zurück (liefert nil)! Was ist da falsch? Code:
(defun c:cleanpoly ( / #aws #awslist #ename #elist #layer) (setq #aws (ssget "X" '((0 . "Polyline")))) (setq #awslist (f#aws>liste #aws)) (foreach #ename #awslist (print #ename) (setq #elist (entget #ename)) (setq #layer (cdr (assoc 8 #elist))) (setq #ename (entnext #ename)) (while #ename (setq #elist (entget #ename)) (cond ( (= "VERTEX" (cdr (assoc 0 #elist))) (entmod (subst (cons 8 #layer) (assoc 8 #elist) #elist)) (setq #ename (entnext #ename)) ) ( (= "SEQEND" (cdr (assoc 0 #elist))) (entmod (subst (cons 8 #layer) (assoc 8 #elist) #elist)) (setq #ename nil) ) );cond );while );foreach );defun ;-------------------------------------------------------------- (defun f#aws>liste (#aws / #index #awsliste) ;einen Auswahlsatz in eine Liste mit E-Names umwandeln (if #aws (progn (if (/= (type #aws) 'PICKSET) (exit) ) (setq #awsliste nil #index -1 ) (repeat (sslength #aws) (progn (setq #index (1+ #index)) (setq #awsliste (append #awsliste (list (ssname #aws #index)))) );progn );repeat );progn nil ) ;if );defun ;-------------------------------------------------------------- (defun c:cleaninsert ( / #aws #awsliste #ename #layer #elist) (princ "\nBlockreferenzen auswählen: ") (setq #aws (ssget '((0 . "INSERT")))) (if #aws (progn (setq #awsliste (f#aws>liste #aws)) (foreach #ename #awsliste (setq #layer (cdr (assoc 8 (entget #ename)))) (while (/= "SEQEND" (cdr (assoc 0 (entget #ename)))) (setq #ename (entnext #ename)) );while (setq #elist (entget #ename)) (entmod (subst (cons 8 #layer) (assoc 8 #elist) #elist)) );foreach );progn );if );defun
------------------ Schöne Grüße Ernst Meine Homepage 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: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 06. Nov. 2006 08:39 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
Ich habe jetzt keinen Datensatz parat, wo die Layer an den Vertexen unterschiedlich sind, deshalb teste ich das Programm jetzt nicht. Nur ein paaar überlegungen: Bei Veränderungen an komplexen Objekten (wie z.B. Polyllinien, solltest du am Eende ein (ENTUPD ename) durchführen (für die Bildschirmaktualisierung). Ich würde den Vertex auch nur ändern, wenn die Layer unterschiedlich sind (vielleicht noch einen Vergleich einbauen). Alternativ kann man die Polylinien auch mit _CONVERTPOLY in LW-Polylinien umwandeln (erst hin, dann bei Bedarf wieder zurück - vermutlich sind dann die Vertexüberschreibungen auch weg) ------------------ Mit freundlichem Gruß Udo Hübner [Diese Nachricht wurde von CAD-Huebner am 06. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 06. Nov. 2006 09:04 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
oder nutz statt (entmod (subst (cons 8 #layer) (assoc 8 #elist) #elist)) die ActivX-Variante .. wirkt manchmal wunder (not(vl-catch-all-error-p (vl-catch-all-apply 'vla-put-layer (list (vlax-ename->vla-object (cdr(assoc -1 #elist))) #lAYER) ) ) ) ------------------ - 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 |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 06. Nov. 2006 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
Hallo Ernst, ich hatte genau dasselbe Problem, warum es so ist, weiß ich nicht, aber ich bin mit "vla-put-layer" zum Erfolg gekommen. Ich habe das in Deinen Code eingebaut. Code:
(defun c:cleanpoly ( / #aws #awslist #ename #elist #layer) (vl-load-com) (setq #aws (ssget "X" '((0 . "Polyline")))) (setq #awslist (f#aws>liste #aws)) (foreach #ename #awslist (print #ename) (setq #elist (entget #ename)) (setq #layer (cdr (assoc 8 #elist))) (setq #ename (entnext #ename)) (while #ename (setq #elist (entget #ename)) (cond ( (= "VERTEX" (cdr (assoc 0 #elist))) (vla-put-layer (vlax-ename->vla-object #ename) #layer) (setq #ename (entnext #ename)) ) ( (= "SEQEND" (cdr (assoc 0 #elist))) (vla-put-layer (vlax-ename->vla-object #ename) #layer) (setq #ename nil) ) );cond );while );foreach )
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 06. Nov. 2006 09:42 <-- editieren / zitieren --> Unities abgeben:
Danke Euch - mit vla-put-layer gehts. Hab grad Thomas' Code eingebaut und getestet. @Udo entupd hatte ich auch probiert Auf den Vergleich hab ich verzichtet, weil ich die fehlerhaften Objekte meist schon vorher isoliert habe. Convert: das sind meist ausgerundete Polylines Hier noch der korrigierte Code: Code:
(defun c:cleanpoly ( / #aws #awslist #ename #elist #layer) (setq #aws (ssget '((0 . "Polyline")))) (setq #awslist (f#aws>liste #aws)) (foreach #ename #awslist (print #ename) (setq #elist (entget #ename)) (setq #layer (cdr (assoc 8 #elist))) (setq #ename (entnext #ename)) (while #ename (setq #elist (entget #ename)) (cond ( (= "VERTEX" (cdr (assoc 0 #elist))) (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-layer (list (vlax-ename->vla-object (cdr(assoc -1 #elist))) #layer) ) ) ) (setq #ename (entnext #ename)) ) ( (= "SEQEND" (cdr (assoc 0 #elist))) (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-layer (list (vlax-ename->vla-object (cdr(assoc -1 #elist))) #layer) ) ) ) (setq #ename nil) ) );cond );while );foreach );defun ;-------------------------------------------------------------- (defun f#aws>liste (#aws / #index #awsliste) ;einen Auswahlsatz in eine Liste mit E-Names umwandeln (if #aws (progn (if (/= (type #aws) 'PICKSET) (exit) ) (setq #awsliste nil #index -1 ) (repeat (sslength #aws) (progn (setq #index (1+ #index)) (setq #awsliste (append #awsliste (list (ssname #aws #index)))) );progn );repeat );progn nil ) ;if );defun ;-------------------------------------------------------------- (defun c:cleaninsert ( / #aws #awsliste #ename #layer #elist) (princ "\nBlockreferenzen auswählen: ") (setq #aws (ssget '((0 . "INSERT")))) (if #aws (progn (setq #awsliste (f#aws>liste #aws)) (foreach #ename #awsliste (setq #layer (cdr (assoc 8 (entget #ename)))) (while (/= "SEQEND" (cdr (assoc 0 (entget #ename)))) (setq #ename (entnext #ename)) );while (setq #elist (entget #ename)) (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-layer (list (vlax-ename->vla-object (cdr(assoc -1 #elist))) #layer) ) ) ) );foreach );progn );if );defun
------------------ Schöne Grüße Ernst Meine Homepage Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003
|
erstellt am: 20. Dez. 2006 22:19 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
Vielleicht habe ich hier das grundlegende verpasst, aber es geht hier um Polylinien, deren Vertizes verschiedene Layer haben, aber auf einen Layer geändert werden sollen - oder? Wenn ja, fallen mir da die R14-Zeiten ein: Da gab es ein Programm, dass auch das SEQEND der Polylinie auf falschen Layer setzte. Das konnte man leicht ändern, indem man die Poly auf irgendeinen Layer (z.B. 0 oder Test oder ..) setzte und dann auf den gewünschten Layer wieder zurück. Damit war die Poly sauber. Wenn nein, dann vergesst meinen Beitrag wieder. Zu Blöcken kann ich nichts beitragen. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) [Diese Nachricht wurde von Peter2 am 20. Dez. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 21. Dez. 2006 07:35 <-- editieren / zitieren --> Unities abgeben:
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003
|
erstellt am: 21. Dez. 2006 08:58 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
In meinem Fall (damals bei AC14) war es so, dass eine Applikation Polylinien mit ENTMAKE erstellt hat, aber dem SEQEND keinen Layer mitgab. Damit lag die Polylinie immer auf dem Layer der Applikation, SEQEND am jeweils aktuellen Layer. 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 |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 21. Dez. 2006 09:13 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003
|
erstellt am: 21. Dez. 2006 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
Zitat: Original erstellt von CADmium: @Peter2: das geht immer noch
Die Problemlösung oder die Problemverursachung? 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 |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 21. Dez. 2006 09:17 <-- editieren / zitieren --> Unities abgeben: Nur für Geos
bei der Verursachung ... die Beseitigung kann man aber ähnlich (durch neudefinition) angehen ------------------ - 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 |