| |
| 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, eine Pressemitteilung
|
Autor
|
Thema: kreuzendes Auswahlfenster außerhalb des Bildschirmausschnittes (1130 mal gelesen)
|
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1217 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 04. Dez. 2013 15:43 <-- editieren / zitieren --> Unities abgeben:
Moin! ich weiß ja noch aus alten Zeiten das es Probleme gab mit der Punktauswahl beim Schraffieren - der zu schraffierende Bereich sollte auf dem Bildschirm sichtbar sein. Nun habe ich eine kreuzende Auswahl erstellt die unter umständen auch außerhalb des aktuellen Bildschirmausschnittes liegen kann: Code: (setq aws_search (ssget "_CP" (list pkt_1 pkt_2 pkt_3 pkt_4 );end-list filter_liste );end-ssget );end-setq
Nun ist mir aufgefallen das keine Elemente gefunden werden diese Auswahl außerhalb des Bildschirmausschnittes liegt. Denke ich richtig oder renne ich unter Umständen einem falschen Gedanken nach? ... und gibt es unter LISP eine Möglichkeit der kreuzenden Auswahl außerhalb des Bildschirms - sonst muss ich den betreffenden Bereich zwangsläufig aufzoomen. Gruß Jan :-) ------------------ jan :-) 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. Dez. 2013 15:55 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
Nun ist mir aufgefallen das keine Elemente gefunden werden diese Auswahl außerhalb des Bildschirmausschnittes liegt. Auch dieses Mal wieder: Gratulation. Zur Frage: Man kann berechnen ob ein Element zur Auswahl gehört oder nicht. Genau das macht ja ssget/die AutoCAD-Objektwahl - mit einer Einschränkung eben.. Also müßze man dies nachprogrammieren, ohne diese Einschränkung. Freue mich über die Resultate ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 04. Dez. 2013 15:56 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
Hallo Jan, Zitat: Original erstellt von tappenbeck: ... und gibt es unter LISP eine Möglichkeit der kreuzenden Auswahl außerhalb des Bildschirms
m. E. Nein! /edit/ oder siehe Beitrag von cadffm /edit/ ACAD arbeitet auch unter Lisp "Bildschirmorientiert", finden sich hier in den Tiefen der Themen auch genügend Beispiele, wenn ich mich recht erinnere. Zitat: Original erstellt von tappenbeck: ... sonst muss ich den betreffenden Bereich zwangsläufig aufzoomen.
Ja, das musst Du dann. Ein Zoom auf einen Bereich etwas größer als Dein Auswahlfenster sollte dann Erfolgt bringen. HTH Gruß Thomas [Diese Nachricht wurde von spider_dd am 04. Dez. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1217 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 04. Dez. 2013 16:12 <-- editieren / zitieren --> Unities abgeben:
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 05. Dez. 2013 15:51 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
Zitat: Original erstellt von tappenbeck: danke !
Die Fenster-Auswahlmodi bei SSGET arbeiten der Performance wegen mit der Displayliste. Du kannst aber mit wenig Aufwand ein eigenes SSGET-W oder SSGET-C programmieren, das alle Elemente, selbst die auf gefrorenen Layern findet. Der Schlüssel dazu liegt in der Methode IntersectWith, die Du mittels VLAX-INVOKE-METHOD auf das Fensterrechteck und jedes einzelne Element der Datenbank anwendest. Du brauchst bei den einzelnen Entities nur nach jeweils einem relevanten Punkt zu suchen, den Du darauf hin überprüfst, ob der innerhalb oder außerhalb des Fensters liegt. Ja nachdem was IntersectWith dann zurück gibt, liegt das Objhekt entweder vollständig innerhalb, vollständig außerhalb, oder nur teilweise außerhalb des Fensters. Damit kannst Du also bequem (ssget "_w" ...) und (ssget "_c" ...) und auch (ssget "_cp" ...) nachprogrammieren. Und einen Filter für Objekteigenschaften und/oder Xdata und sogar Xdictionaries kannst Du da auch leicht implementieren. Nur Blockreferenzen machen da ziemlich Schwierigkeiten, aber auch das lässt sich lösen. Wenn Du in einer DWG nicht allzuviele Entities hast, dann ist diese Auswahl auch von der Performance her einigermaßen OK. Als Bonbon gibt's hier die Funktion zum finden der Schnittpunkte zweier Entities: Code:
;; Schnittpunkt zweier Objekte ;; extend=0 -> keine Verlängerung ;; extend=1 -> Verlängerung nur erstes ;; extend=2 -> Verlängerung nur zweites ;; extend=3 -> Verlängerung beide (defun at-intersect (ent1 ent2 extend / ar) (cond ((or (= 0 extend) (null extend)) (setq extend acExtendNone) ) ((or (= 1 extend) (= 'FIRST extend) (= "FIRST" extend)) (setq extend acExtendThisEntity) ) ((or (= 2 extend) (= 'SECOND extend) (= "SECOND" extend)) (setq extend acExtendOtherEntity) ) ((or (= 3 extend) (= 'BOTH extend) (= "BOTH" extend)) (setq extend acExtendBoth) ) ('T (setq extend acExtendNone)) ) (if (= 'ENAME (type ent1)) (setq ent1 (vlax-ename->vla-object ent1)) ) (if (= 'ENAME (type ent2)) (setq ent2 (vlax-ename->vla-object ent2)) ) (if (setq ar (vlax-invoke-method ent1 'IntersectWith ent2 extend ) ) (if (/= -1 (vlax-safearray-get-u-bound (vlax-variant-value ar) 1 ) ) (at-gather (vlax-safearray->list (vlax-variant-value ar) ) 3 ) ) nil ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |