| |
| 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: region2pl (1725 mal gelesen)
|
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 20. Jun. 2007 11:50 <-- editieren / zitieren --> Unities abgeben:
hallo! ich verwende untenstehendes lisp um eine region in eine geschlossene polylinie umzuwandeln. wenn aber die region aus zwei voneinander getrennten bereichen besteht, (beispielsweise durch eine vorhergehende subtraktion), scheitert die routine. wie koennte ich die funktion erweitern, dass dieser fall auch bewaeltigt wird? gruss aus wien peter (defun c:reg2pl ( / reg last_obj aws_temp) (setq reg (car(entsel "\nRegion auswählen:")) last_obj (ENTLAST) ; reg aws_temp (ssadd)) (command "_.explode" reg) (setq oldpeditaccept (getvar "peditaccept")) (setvar "peditaccept" 0) (while (setq last_obj(entnext last_obj)) (ssadd last_obj aws_temp)) (command "_.pedit" (ssname aws_temp 0) "_Y" "_J" aws_temp "" "")) (setvar "peditaccept" oldpeditaccept) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 20. Jun. 2007 12:05 <-- editieren / zitieren --> Unities abgeben: Nur für petrov9
Hallo, tausch mal die Zeile Code: (command "_.pedit" (ssname aws_temp 0) "_Y" "_J" aws_temp "" ""))
aus durch Code: (command "_.pedit" "_M" aws_temp "" "_Y" "_J" "" ""))
Grüsse, HenningPS: geht erst ab 2005! ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de [Diese Nachricht wurde von wronzky am 20. Jun. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 20. Jun. 2007 12:27 <-- editieren / zitieren --> Unities abgeben:
danke fuer die antwort, aber das funktioniert nicht. allerdings habe ich mich wohl unklar ausgedrueckt. wenn bei einer subtraktion zweier regionen/solids das abzuziehende jenes von dem abgezogen wird ganz durchschneidet, ist das ergebnis wieder eine region/solid aber halt mit zwei bereichen die nicht zusammenhaengen aber doch ein objekt bilden. und genau hier liegt das problem, das einmalige explodieren ergibt zwei regionen und an denen scheitert 'pedit'. es muessten also die beiden letzten objekte nochmal ausgewaehlt und explodiert werden und dann zweimal der 'pedit' befehl ausgefuehrt werden. und wie ich das hinkriege weiss ich nicht. peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 20. Jun. 2007 20:12 <-- editieren / zitieren --> Unities abgeben: Nur für petrov9
... richtig: Wenn eine Region explodiert wird, dann entstehen entweder Linien oder wiederum Regionen - aber nicht Linien und Regionen. Wenn du nach dem Explode einen Auswahlsatz VORHER bildest, dann hast du die Elemente, welche beim Explode entstanden sind. Diese prüfst du auf den Elementty und entscheidest dann, ob du mit pedit oder wiederum mit einem Explode weiter machen musst. Alles klar? Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 21. Jun. 2007 09:16 <-- editieren / zitieren --> Unities abgeben: Nur für petrov9
Hi Peter, hab' mal in der "Routinekiste" gekramt und das hier gefunden: deep-explodedamit wird alles (zur Not Mehrfach) zerlegt, bis nur noch Grundbausteine vorhanden sind: Code: (defun deep-explode (aws / n-aws) (setq n-aws (ssadd)) (while (setq aws (m-explode aws)) (setq n-aws (ssmerge n-aws aws))) n-aws )(defun m-explode (aws / z l n-aws ele) (setq z -1 l (entlast) n-aws (ssadd)) (repeat (sslength aws) (setq ele (ssname aws (setq z (1+ z)))) (if (member (cdr (assoc 0 (entget ele))) '("HATCH" "REGION" "POLYLINE" "LWPOLYLINE" "3DSOLID" "BODDY" "INSERT" "MTEXT" "MLINE" "TABLE" "DIMENSION")) (command "_.explode" ele) ) ) (while (setq l (entnext l)) (ssadd l n-aws)) ) (defun ssmerge (aws1 aws2 / n-aws z) (setq n-aws (ssadd) z -1) (if aws1 (repeat (sslength aws1) (ssadd (ssname aws1 (setq z (1+ z))) n-aws))) (setq z -1) (if aws2 (repeat (sslength aws2) (ssadd (ssname aws2 (setq z (1+ z))) n-aws))) n-aws )
Das sollte zur Lösung reichen. Rückgabe der Funktion sind übrigens die zerlegten Elemente.Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 21. Jun. 2007 12:36 <-- editieren / zitieren --> Unities abgeben:
hallo! @Briscke ja danke eigentlich alles klar. nun versuche ich die abfrage zu machen ob es sich beim letzten objekt um eine region handelt: (IF ((cdr(assoc 0 (entget(entlast)))) = "region")) und das produziert die meldung 'syntaxfehler'. warum? @Henning wenn ich versuche deep-explode auszufuehren erhalte ich die meldung: 'zu wenig argumente' danke fuer eure antworten! peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 21. Jun. 2007 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für petrov9
deep-explode ist eine Funktion, die einen Auswahlsatz übergeben bekommt! Also in etwa so: Code: (setq aws (ssget '((0 . "REGION")))) (setq aws (deep-explode aws)) (setvar "peditaccept" 0) (command "_.pedit" "_M" aws "" "_Y" "_J" "" "")
Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 21. Jun. 2007 12:49 <-- editieren / zitieren --> Unities abgeben: Nur für petrov9
Zitat: Original erstellt von petrov9: ...(IF ((cdr(assoc 0 (entget(entlast)))) = "region")) und das produziert die meldung 'syntaxfehler'. warum? ...
... Weil die Syntax wirklich nicht passt. (FUNC PARA_1 PARA_ ... ) ist die korrekte Syntax. und (IF ((cdr(assoc 0 (entget(entlast)))) = "region")) entspricht dem nicht: (IF (= (cdr(assoc 0 (entget(entlast)))) "REGION") (alert "JA - ich bin eine Region.") (alert "NEIN - ich bin KEINE Region.") ) wäre richtig. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 21. Jun. 2007 13:09 <-- editieren / zitieren --> Unities abgeben:
|
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 22. Jun. 2007 09:13 <-- editieren / zitieren --> Unities abgeben:
@Henning ich krieg's nicht hin. (defun c:test(/ aws)
(setq aws (ssget '((0 . "REGION")))) (setq aws (deep-explode aws)) (setvar "peditaccept" 0) (command "_.pedit" "_M" aws "" "_Y" "_J" "" "") (defun deep-explode (aws / n-aws) (setq n-aws (ssadd)) (while (setq aws (m-explode aws)) (setq n-aws (ssmerge n-aws aws))) n-aws ) (defun m-explode (aws / z l n-aws ele) (setq z -1 l (entlast) n-aws (ssadd)) (repeat (sslength aws) (setq ele (ssname aws (setq z (1+ z)))) (if (member (cdr (assoc 0 (entget ele))) '("HATCH" "REGION" "POLYLINE" "LWPOLYLINE" "3DSOLID" "BODDY" "INSERT" "MTEXT" "MLINE" "TABLE" "DIMENSION")) (command "_.explode" ele) ) ) (while (setq l (entnext l)) (ssadd l n-aws)) ) (defun ssmerge (aws1 aws2 / n-aws z) (setq n-aws (ssadd) z -1) (if aws1 (repeat (sslength aws1) (ssadd (ssname aws1 (setq z (1+ z))) n-aws))) (setq z -1) (if aws2 (repeat (sslength aws2) (ssadd (ssname aws2 (setq z (1+ z))) n-aws))) n-aws ) ) objektwahl funktioniert, aber dann fehlermeldung: no function definition: DEEP-EXPLODE Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 22. Jun. 2007 09:21 <-- editieren / zitieren --> Unities abgeben:
bin doch noch draufgekommen! klammer an falscher stelle. jetz' funktioniert's! (defun c:test(/ aws)
(setq aws (ssget '((0 . "REGION")))) (setq aws (deep-explode aws)) (setvar "peditaccept" 0) (command "_.pedit" "_M" aws "" "_Y" "_J" "" "") ) (defun deep-explode (aws / n-aws) (setq n-aws (ssadd)) (while (setq aws (m-explode aws)) (setq n-aws (ssmerge n-aws aws))) n-aws ) (defun m-explode (aws / z l n-aws ele) (setq z -1 l (entlast) n-aws (ssadd)) (repeat (sslength aws) (setq ele (ssname aws (setq z (1+ z)))) (if (member (cdr (assoc 0 (entget ele))) '("HATCH" "REGION" "POLYLINE" "LWPOLYLINE" "3DSOLID" "BODDY" "INSERT" "MTEXT" "MLINE" "TABLE" "DIMENSION")) (command "_.explode" ele) ) ) (while (setq l (entnext l)) (ssadd l n-aws)) ) (defun ssmerge (aws1 aws2 / n-aws z) (setq n-aws (ssadd) z -1) (if aws1 (repeat (sslength aws1) (ssadd (ssname aws1 (setq z (1+ z))) n-aws))) (setq z -1) (if aws2 (repeat (sslength aws2) (ssadd (ssname aws2 (setq z (1+ z))) n-aws))) n-aws ) die klammer war falsch, die gehoert oben als abschluss von (defun C:...) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 22. Jun. 2007 10:25 <-- editieren / zitieren --> Unities abgeben:
so und hier das was ich eigentlich haben wollte. Code: ;;pls ;;subtrahiert einen satz von geschlossenen polylinien von einem anderen solchen ;;das ergebnis sind wieder gechlossene polylinien ;;auswahl jeweils mit 'enter' abschliessen. (DEFUN c ls (/ awspl1 awspl2 len1 len2 n1 n2 elempl1 elempl2 awsreg1 awsreg2 aws) (COMMAND "_UNDO" "_Group") (setq oldpeditaccept (getvar "peditaccept")) (setvar "peditaccept" 0) (SETQ awspl1 (SSGET '((0 . "LWPOLYLINE")))) (SETQ len1 (SSLENGTH awspl1)) (SETQ n1 0) (WHILE (< n1 len1) (SETQ elempl1 (SSNAME awspl1 n1)) (SETQ n1 (1+ n1)) (COMMAND "_.REGION" elempl1 "") (SETQ awsreg1 (IF awsreg1 (SSADD (ENTLAST) awsreg1) (SSADD (ENTLAST)))) )
(SETQ awspl2 (SSGET '((0 . "LWPOLYLINE")))) (SETQ len2 (SSLENGTH awspl2)) (SETQ n2 0) (WHILE (< n2 len2) (SETQ elempl2 (SSNAME awspl2 n2)) (SETQ n2 (1+ n2)) (COMMAND "_.REGION" elempl2 "") (SETQ awsreg2 (IF awsreg2 (SSADD (ENTLAST) awsreg2) (SSADD (ENTLAST)))) )
(COMMAND "_.subtract" awsreg1 "" awsreg2 "")
(setq aws (ssget "L")) (setq aws (deep-explode aws)) (command "_.pedit" "_M" aws "" "_Y" "_J" "" "")
(setvar "peditaccept" oldpeditaccept) (COMMAND "_UNDO" "_END") (PRINC) ) (defun deep-explode (aws / n-aws) (setq n-aws (ssadd)) (while (setq aws (m-explode aws)) (setq n-aws (ssmerge n-aws aws))) n-aws ) (defun m-explode (aws / z l n-aws ele) (setq z -1 l (entlast) n-aws (ssadd)) (repeat (sslength aws) (setq ele (ssname aws (setq z (1+ z)))) (if (member (cdr (assoc 0 (entget ele))) '("HATCH" "REGION" "POLYLINE" "LWPOLYLINE" "3DSOLID" "BODDY" "INSERT" "MTEXT" "MLINE" "TABLE" "DIMENSION")) (command "_.explode" ele) ) ) (while (setq l (entnext l)) (ssadd l n-aws)) ) (defun ssmerge (aws1 aws2 / n-aws z) (setq n-aws (ssadd) z -1) (if aws1 (repeat (sslength aws1) (ssadd (ssname aws1 (setq z (1+ z))) n-aws))) (setq z -1) (if aws2 (repeat (sslength aws2) (ssadd (ssname aws2 (setq z (1+ z))) n-aws))) n-aws )
eine eingabeaufforderung habe ich nicht geschafft: z.bsp. 'ersten polyliniensatz waehlen:'.... bei den 'get...'-befehlen weiss ich wie's geht, aber in zusammenhang mit 'ssget' nicht. vielleicht kann mir das noch wer sagen. jedenfalls vielen dank fuer eure hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 22. Jun. 2007 11:37 <-- editieren / zitieren --> Unities abgeben: Nur für petrov9
Hallo Peter, Zitat: Original erstellt von petrov9:
eine eingabeaufforderung habe ich nicht geschafft: z.bsp. 'ersten polyliniensatz waehlen:'....bei den 'get...'-befehlen weiss ich wie's geht, aber in zusammenhang mit 'ssget' nicht.
Du setzt einfach ein (prompt "\nwählen Sie jetzt die Polylinien:") vor den ssget-Aufruf. Ansonsten: Schönes Programm! Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
petrov9 Mitglied Architekt
Beiträge: 106 Registriert: 06.10.2004 ADT2006 ADT2007
|
erstellt am: 22. Jun. 2007 12:09 <-- editieren / zitieren --> Unities abgeben:
|