|  |  | 
|  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | 
|  |  | 
|  | Jetzt verfügbar: NVIDIA RTX PRO 6000 Blackwell Server Edition, eine Pressemitteilung 
 | 
| Autor | Thema:  kreuzendes Auswahlfenster außerhalb des Bildschirmausschnittes (1390 mal gelesen) | 
 | tappenbeck Mitglied
 Vermessungsingenieur
 
     
 
      Beiträge: 1222Registriert: 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: 22689Registriert: 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: 1163Registriert: 27.11.2003
 Win 10ProIntel(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: 1222Registriert: 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: 1059Registriert: 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 |