| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Selection-Set über Zaunauswahl (1134 / mal gelesen)
|
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 04. Jan. 2020 08:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum und Prosit Neujahr noch allen! Ich suche eine Lösung für die (oder entsprechend der) Selection-Set-Auswahl mit der "Zaunoption", also (ssget "_F" ...), nur mit der zusätzlichen Anforderung, daß die Zaunlinie auch Kreisbögen enthalten kann bzw. auch ein Kreis sein kann. Meines Wissens kann man ja bei dieser "Zaunoption" nur eine Liste von Polygonstützpunkten übergeben, aber keine Bögen. Warum die Bögen benötigt werden: der User soll eine vorhandenen POLYLINE oder LWPOLYLINE (die auch Bögen enthalten kann) oder auch einen Kreis anwählen. Dieses Element (bzw. die Daten davon) werden dann zur Zaunauswahl verwendet, um Objekte, die eben von dieser Linie (echt oder scheinbar) geschnitten werden zu finden. Leider weiß ich nicht wie man das mit den Bögen in ssget hinbekommt oder wie man das sonst lösen kann. Gruß, Roman [Diese Nachricht wurde von romi1 am 04. Jan. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 04. Jan. 2020 12:20 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Zunächst mal: Die Objektwahlmethode Zaun ist auf Liniensegmente begrenzt, dementsprechend lässt auch auch die Lispfunktion SSGET bei der Methode nur Liniensegmente zu. Es gibt nunmal keine Objektwahlmethode mit Bögen, ausser vielleicht das neuere Lasso (ungeprüft und unrelevant in deinem Fall). Also bleibt dir nichts anderes übrig selbst die Objekte zu suchen die gewählt werden sollen. Es gibt dafür einige Beispiele im Forum, für gewöhnlich geht es um "ssget polygon" oder trace - die Verfolgung eines Objektes zum nächsten anschließenden. In deinem Fall ist es recht simple und du könntest wie folgt vorgehen: 1. Wähle Pfadobjekt 2. Programm wählt alle Objekte per Kreuzenpolygon mit den Koordinaten der Boundingbox(vom Pfadobjekt) 3. Jedes Objekt auf Überschneidungen mit Pfadobjekt prüfen Falls Ja, ab in die Trefferliste oder Auswahlsatz. Das Stichwort ist also: IntersectWith Reicht das? Habe gerade nicht mehr Zeit..
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: 07. Jan. 2020 07:16 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Zitat: Original erstellt von romi1: ... Leider weiß ich nicht wie man das mit den Bögen in ssget hinbekommt oder wie man das sonst lösen kann.
.. du musst die Kreise und Bögen in ein angenähertes Polygon, bestehend aus Liniensegmenten, umrechnen - also eine dementsprechende Koordinatenliste berechnen. Am einfachsten ist das, wenn du dafür die vlax-curve-* Funktionen nutzt. Damit kannst du die Koordinaten des Parameters oder Abstand vom Anfangspunkt ermitteln. Wenn du also Start & End Parameter des Bogensegments hast, kannst du mehrere Koordinaten auf dem Bogen ermitteln, indem du vlax-curve-getPointAtParam mit mehreren Parametern zwischen Start- und Endparameter des Bogensegments anwendest. Somit kannst du die Koordinatenliste für SSGET mit hinreichender Genauigkeit an die Bogenkontur erstellen. Die Genauigkeit kannst du durch die Anzahl der Zwischenpunkte auf dem Bogen bestimmen. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 08. Jan. 2020 07:54 <-- editieren / zitieren --> Unities abgeben:
Hallo! Habs's jetzt hinbekommen, und zwar entspechend dem Vorschlag von cadffm: - Boundingbox vom Pfadobjekt - ssget per Kreuzen-Rechteck entsprechend den Eckpunkten der Boundingbox - diesen Auswahlsatz jetzt auf Schnittpunkte mit dem Pfadobjekt prüfen per IntersetWith ... @ Holger: Danke für den 2. Lösungsvorschlag - kann ich ev. noch in einem anderen Zusammenhang gebrauchen. Vielen Dank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 09. Jan. 2020 16:47 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Zitat: Original erstellt von romi1:
@ Holger: Danke für den 2. Lösungsvorschlag - kann ich ev. noch in einem anderen Zusammenhang gebrauchen.
Da hilft dann diese Funktion, die für Entities eine Punktliste ausgibt, die die Geometrie des Entity als Polygon darstellt. Das funktioniert mit Polylinien, Bögen, Kreisen, Ellipsen und Splines. Die Auflösung ist über die globale Variable ::CURVE->POLY-ACCURACY einstellbar: Code:
(defun ff-curve->vertexlist (en / lastent len vertexnumber vertexlist stparam endparam diffparam startpt endpt) (if (not ::CURVE->POLY-ACCURACY) (setq ::CURVE->POLY-ACCURACY 25.0) ) (if (= 'ENAME (type en)) (setq en (vlax-ename->vla-object en)) ) (setq lastent (entlast)) (ff-deactivate-osmode) (if (vlax-property-available-p en 'Length) (setq len (vlax-get-property en 'Length)) (setq len (vlax-curve-getDistAtPoint en (vlax-curve-getEndPoint en))) ) (setq vertexnumber (fix (/ len ::CURVE->POLY-ACCURACY))) (if (= 0 vertexnumber) (setq vertexnumber 1) ) (setq stparam (vlax-curve-getstartparam en) endparam (vlax-curve-getendparam en) diffparam (/ (- endparam stparam) (float vertexnumber)) startpt (trans (vlax-curve-getStartPoint en) 0 1) endpt (trans (vlax-curve-getEndPoint en) 0 1) ) (setq vertexlist (list startpt)) (while (< (+ stparam diffparam) endparam) (setq stparam (+ stparam diffparam)) (setq startpt (vlax-curve-getPointAtParam en stparam)) (setq vertexlist (cons (trans startpt 0 1) vertexlist)) ) (reverse (cons (trans endpt 0 1) vertexlist)) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |