Hi Andrea,
eine "explodierte" Region zerfällt in LINEs, CIRCLEs, ARCs, ELLIPSEs und SPLINEs. Eine Polylinie darf aber nur Linien und Bögen enthalten - deswegen ist dieser Ansatz eigentlich von vornherein zum Scheitern verurteilt. Eine 3DPOLY darf sogar nur aus Linien bestehen. Da aber eine Region immer planar ist, ist der Ansatz '3DPOLY' Unsinn.
Natürlich kann man auch von gegebenen Umständen ausgehen, z.B. dass die vorhandene Geometrie nur aus ungekrümmten Oberflächen besteht. Dann kann man folgendermassen vorgehen:
1 letztes Entity in Variable speichen (setq letztes_element(entlast))
2 Schnitt erzeugen (command"_section"...)
3 '_explode' aufrufen (command "_explode"...)
4 Auswahlsatz mit allen Elementen nach 'letztes-element' bilden
5 den Auswahlsatz durchsuchen, ob CIRCLEs, ELLIPSEs oder SPLINEs drin sind
6 Da man Polylinien nur in der XY-Ebene erzeugen kann, muss ein BKS erzeugt werden. Eine Region kann aber für (command "_ucs""_object"...) nicht verwendet werden, also benötigst du dafür deine Punkte p1, p2, p3
7 Wenn nur Linien und Bögen drin sind, PEDIT anwenden, anderenfalls geht's nicht
8 BKS zurücksetzen
Hier eine Funktion, die das in etwa macht (weicht in Details von dem beschriebenen Weg ab, und natürlich ist sie mit den genannten Einschränkungen zu geniessen!):
(defun region->polyline(region p1 p2 p3 / ents tmp)
(command"_ucs""_3p"p1 p2 p3)
;duplizieren, damit eine Region als 'landmark' stehenbleibt
(entmake(entget region))
(command"_explode"(entlast))
;Liste (nicht SS) der Elemente erzeugen
(setq tmp region)
(while(setq tmp(entnext tmp))
(setq ents(cons tmp ents))
)
;testen, ob möglich
(if
(/=
(length ents)
(vl-remove-if-not
(function
(lambda(e / )
(member
(cdr(assoc 0(entget e)))
'("ARC" "LINE")
)
)
)
ents
)
)
;LWPOLYLINE erzeugen
(progn
;Erstes Element in Polyline umwandeln
(command"_pedit"(car ents)"_yes""_join")
;Rest hinzufügen
(mapcar'command(cdr ents))
;Defehl beenden
(command"""")
;landmark in die Tonne
(entdel region)
)
)
;BKS zurücksetzen
(command"_ucs""_previous")
)
So etwa könnte dein Programm jetzt aussehen (ungetestet!):
(defun c:schnitt ( / p1 p2 p3)
(setq p1 '(0 700 -250))
(setq p2 '(250 -700 -250))
(setq p3 '(150 -670 -250))
(command "_section" (car(entsel))"" "_3p" p1 p2 p3)
(region->polyline(entlast)p1 p2 p3)
(if(=(cdr(assoc 0(entget(entlast))))"LWPOLYLINE")
... ; proceed
(princ"\nWar wohl nix!")
)
)
Gruss, Axel
------------------
http://www.autolisp.mapcar.net
http://www.autolisp-tutorial.mapcar.net
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP