AutoCAD... AutoLISP... VisualLISP...

  [68] Wybory: PickBox

index  

  Do wybierania obiektu przez wskazanie, służy funkcja entsel. Podobna do niej, a dodatkowo umożliwiająca wybranie elementu przez punkt, funkcja entselp tak samo, wybiera tylko jeden element. Zwykle jest to obiekt znajdujący się najbliżej określonego punktu, lub gdy wszystkie obiekty przechodzą przez ten punkt, element ostatnio utworzony. Mechanizm taki w niektórych sytuacjach, może nie w pełni satysfakcjonować programującego. Załóżmy że przez wskazany punkt (lub w jego pobliżu) znajduje się wiecej niż jeden obiekt. Nentselp wybierze obiekt lecz nie musi to być akurat ten obiekt o który nam chodzi.
Na rysunku poniżej widać sytuację przed wyborem obiektów w punkcie ich "przecięcia". Żółty kwadrat to celownik wyboru obiektów:
Ta sama sytuacja, ale już wybór obiektów i w powiększeniu. Czerwony punkt w środku żółtego celownika wyboru obieku, to punkt wskazania, celownik ma wiekość (3x3 piksele) - zmienna systemowa PICKBOX. Jak widać w okienku celownika nie mieszczą się wszystkie obiekty. Pożądaną sytuacją byłoby wybranie wszystkich obiektów przecinających celownik.
Rozwiązaniem tego problemu byłoby wykonanie krawędzią zbioru wskazań w najbliższym otoczeniu wskazanego punktu. Za krawędz można przyjąć ramkę wskaŸnika zbioru wskazań. Rozmiar tej ramki (kwadratu) określa zmienna systemowa PICKBOX. Łącząc możliwość tworzenia zbioru wskazań krawędzią (wybierane są wszystkie obiekty przecinające krawędz, z wielkością celownika zbioru wskazań, mozna utworzyć funkcję do wyboru obiektów

Poniżej prezentuję funkcję realizującą to zadanie. Ponieważ zmienna PICKBOX określa rozmiar ramki w pikselach, a punkty dla funkcji ssget określone są przez współrzędne punktów, na początku obliczany jest rozmiar boku ramki wyboru obiektu, w jednostach rysunkowych. Następnie wyliczane są cztery wierzchołki (współrzędne punktów) celownika. Na koniec tworzony jest zbiór wskazań (opcja _Fence). Funkcja wyglada tak:

; =============================================================== ;
; Funkcja tworzy zbior wskazan okreslony przez krawedz PICKBOX    ;
; wokol punktu Pt                                                 ;
; =============================================================== ;
(defun jk:SSX_SelectByPickBox (Pt / c pts)
  (setq c
    (/
      (*
        (*
          (getvar "PICKBOX")
          (/
            (getvar "VIEWSIZE")
            (cadr (getvar "SCREENSIZE"))
          )
        )
        (sqrt 2)
      ) 2
    )
        pts (mapcar
              (function
                (lambda (%)(trans (polar pt (* % pi) c) 0 1))
              )
              (list 0.25 0.75 1.25 1.75 0.25)
            )
  )
  (ssget "_F" pts)
)
Funkcja zwraca zbiór wskazań lub nil.
      aktualizacja: 18-05-2010