Wskaż punkt: getpoint, getcorner

(getpoint [Punkt] [Wiadomość])
(getcorner [Punkt] [Wiadomość])

Funkcja getpoint pozwala użytkownikowi na wskazanie punktu. Może on być podany klikając myszką w punkt, lub wpisując na klawiaturze współrzędne.
Istnieje też możliwość, że wyświetlona będzie dodatkowo pomocnicza linia łącząca inny punkt z aktualnym położeniem myszki.
Ostatni parametr to podpowiedź. Jest ona wyświetlana w linii poleceń i pod wskaźnikiem myszki jeśli włączona jest opcja [DYN]
Przykłady:

(setq P1 (getpoint "Wskaż punkt"))
(setq P2 (getpoint P1 "Wskaż drugi punkt"))

getcorner Jest to funkcja podobna do getpoint z tą różnicą, że jako linię pomocniczą nie rysuje linii od punktu początkowego do wskaźnika myszki, a prostokąt, gdzie punkty początkowy i wskaźnik myszki są narożnikami tymczasowego prostokąta.

(setq Pc (getcorner P1 "Wskaż narożnik"))

Podaj liczbę - getreal, getint, getdist

(getreal [Wiadomość])
(getint [Wiadomość])
(getdist [Wiadomość])

Wszystkie te funkcje są do siebie bardzo podobne. Proszą użytkownika o podanie liczby.
getint - Użytkownik podać musi liczbę naturalną z zakresu -32768 do 32767
getreal - Użytkownik może podać dowolną liczbę rzeczywistą
getdist - Użytkownik może podać dowolną liczbę rzeczywistą, ale w odróżnieniu do getreal może ją podać nie tylko wpisując z klawiatury, ale również klikając dwa punkty, zwrócona zostanie odległość pomiędzy tymi punktami.

Jako ciekawy przykład możemy posłużyć się funkcją której zadaniem jest poproszenie użytkownika o podanie odległości. Jeśli użytkownik wciśnie [ENTER] zwrócona zostanie wartość domyślna podana jako parametr. Gdyby to jakoś ładnie opakować w funkcję można mieć całkiem przydatną funkcję, która zapamiętuje poprzednie wpisaną odległość i traktuje ją jako podopowiedź (wartość domyślną) w kolejnym wywołaniu funkcji. Ambitni czytelnicy mogą to potraktować jako zadanie domowe.

(setq DefVal 20)
(setq SelDist(getdist (strcat "Wskaż odległość" "[" (rtos DefVal ) "]:")))
(if SelDist
(setq OutVal SelDist )
(setq OutVal DefVal )
)

Podaj tekst - getstring

(getstring [Wiadomość])

Prosi użytkownika o wpisanie tekstu. Np. może to być nazwa warstwy, bloku, wartość atrybutu, jakikolwiek tekst. Nawet jeśli użytkownik wciśnie [ENTER], funkcja zwróci tekst. co prawda pusty = "" ale tekst nie jak np. (getint), ten jeśli wciśniemy [ENTER] zwróci nil.

Podaj kąt - getangle, getorient

(getangle [punkt][Wiadomość])

Funkcja prosi użytkownika o podanie kąta nachylenia przez wskazanie dwu punktów. Jest to kąt względem osi OX z uwzględnieniem zmiennych ANGDIR i ANGBASE
Zwraca wartość podaną w radianach Opcjonalnie można podać parametr punkt początkowy z którego kąt ma być odmierzany. Punkt musi być podany jako lista współrzędnych

(setq PA (getangle(list 10 10) "Wskaż kąt")) 

(getorient [punkt][Wiadomość])

W zasadzie getorient działa zupełnie podobnie jak getangle. Z jedną tylko różnicą. getorient nie uwzględnia zmiennych systemowych ANGDIR i ANGBASE.

Ograniczenia fantazji użytkownika - initget getkword

(initget [Ustawienia ] [Wiadomość])
(getkword [Wiadomość])

Jak wiadomo Użytkownicy programów mają wyjątkową fantazję. Zwłaszcza kiedy nam, twórcom programów zależy na tym, żeby Użytkownik wpisał coś sensownego. Nawet więcej, są tacy, którzy po prostu lubią wpisywać niewłaściwe dane tylko dlatego, żeby sprawdzić co zrobi program, "jeśli np. wpiszemy skalę 0 albo -12 albo jakiś tekst wpiszemy (tam gdzie ma być liczba). A może się wywali i zobaczymy coś więcej niż powinniśmy?" Takie zapędy możemy w pewnym stopniu ograniczyć właśnie przez funkcję initget
Inne zastosowanie tej funkcji to podanie opcji do wyboru.
Pozwala Użyszkodnikowi na wybranie opcji. Jednej z dostępnych i ograniczonych Przez nas np.: Tak/Nie. Można to zrobić w sposób następujący.

(initget 2 "Tak Nie")
(getkword "Jesteś pewien? ")

Niby nic, możnaby pomyśleć że tu nic się nie dzieje. Ale teraz Użytkownik będzie mógł wpisać jedynie Tak/Nie wystarczy T/N. Jeśli wpisze jakąś inną wartość, to wyświetli się komunikat "Nie mogę rozpoznać wpisu. Spróbuj ponownie." Jeśli wpisze "T", getkword i tak zwróci "Tak". Możemy posunąć się dalej. Możemy zakazać wpisania pustego tekstu czyli tylko [ENTER] bez podania opcji, lub w przypadku getreal ograniczyć do wartości dodatnich.
initget ma dwa parametry Ustawienia i podpowiedź.
Ustawienia mają ograniczone dostępne wartości. Ich zestawienie poniżej

Uwaga
Ustawienia te można sumować. Jeśli 2 nie pozwala wpisane 0 a 4 ujemnej wartości, to 6 ogranicza oba te przypadki.
Nie wszystkie z ustawień mają zastosowanie w każdej z funkcji. Łatwo to rozumieć, bo jeśli chcemy wskazać punkt, to nie ma sensu ograniczać wartości do dodatnich, i tak samo, jeśli chcemy liczbę, to nie jest istotne czy linia pomocnicza będzie ciągła czy przerywana - i tak się nie wyświetli, bo wyświetla się przy innych funkcjach.

 

Opcje funkcji initget

BitZnaczenieZastosowanie
1 Nie pozwala na zakończenie przez [ENTER] Użytkownik musi wybrać jedną z opcji getnt
getreal
getdist
getangle
getorient
getpoint
getcorner
getkword
2 Nie pozwala na wpisanie 0 (Przydatne np. jeśli pozwalamy Użytkownikowi wpisać skalę) getint
getreal
getdist
getangle
getorient
getpoint
4 Nie pozwala na wpisanie ujemnej wartości getint
getreal
getdist
8 Nie sprawdza granic rysunku getcorner
16 Nie używane (zarezerwowane na przyszłe zastosowania)
32 Linia pomocnicza jest wyświetlana jako przerywana getdist
getangle
getorient
getpoint
getcorner
64 Nie pozwala na wpisanie współrzędnej wysokości getpoint
getdist
128 Ignoruje powyższe ustawienia. pozwala na dowolną wartość getint
getreal
getdist
getangle
getorient
getpoint
getcorner
getkword
Funkcje ignorujące initget getstring
entsel
nentsel
nentselp

Wskaż obiekt - entsel

(entsel [Wiadomość])


Prosi Użytkownika o wskazanie pojedynczego elementu i zwraca dwuelementową listę, gdzie pierwszym elementem jest wskazany obiekt, drugim punkt w którym użytkownik kliknął aby wskazać ten element.
Np. ( Entity name: 8838d90 (6.93850 12.9275 0.000000)) czyli pobierając pierwszy element z tej listy przez car, mamy nazwę obiektu, na którym możemy przeprowadzać modyfikacje.

Odczytaj informacje o wskazanym obiekcie - entget

(entget NazwaObiektu [aplikacja])

Jako parametr funkcji używamy nazwę obiektu. Może to być nazwa zwrócone np. przez entsel, entlast lub ssname.
Zwraca listę definicję obiektu. Z niego w łatwy sposób możemy odczytać wszystkie informacje o wybranym obiekcie.
Np.

(entget(car(entsel)))

Zwróci nam:

((-1 . Entity name: 7f5f840) (0 . "INSERT") (5 . "1DF") (67 . 0) (8 . "0") (410 . "Model") (62 . 256) (6 . "ByLayer") (370 . -1) (48 . 1.00000) (60 . 0) (2 . "qwe") (210 0.000000 0.000000 1.00000) (10 0.000000 0.000000 0.000000) (41 . 1.00000) (42 . 1.00000) (43 . 1.00000) (50 . 0.000000) (70 . 1) (71 . 1) (44 . 0.000000) (45 . 0.000000))

ssget - Wskaż obiekty

(ssget [tryb] [punkt1 [punkt2]] [lista_punktów] [lista filtrów]))


Pozwala na wybranie wielu elementów. Funkcja ta jest bardzo rozbudowana i pozwala na wybór na wiele różnych sposobów. Sposobem wybierania sterują tryby i filtry.
ssget zwraca grupę obiektów. Grupa ta nazywana jest zbiorem wskazań, jest to oddzielny typ obiektu i do jego obsługi używane są inne funkcje, jednak wyobrazić to sobie można jako coś podobnego do listy.

Tryby.
- Jeśl zostawimy puste pole tryb, program pozwoli Użytkownikowi na wybór dowolnego obiektu
"X" - Automatycznie (bez akcji Użytkownika) wybiera wszystkie elementy z rysunku
":S" - Pozwala na wybranie tylko jednego obiektu
"L" - Automatycznie wybiera ostatnio utworzony obiekt
"P" - Automatycznie powtarza poprzedni zbiór wskazań
"C" - Automatycznie wybiera obiekty przecinające okno zdefiniowane przez dwa punkty
"CP" - Automatycznie wybiera obiekty przecinające obrys, Jako kolejny parametr podajemy listę punktów,
"W" - Wybiera wszystkie elementy wewnątrz okna zdefiniowanego przez dwa punkty
"WP" - Wybiera wszystkie elementy będące wewnątrz obrysu zdefiniowanego przez listę punktów

(sslength ZbiórWskazan )
Zwraca nam ilość wybranych elementów

Dla zobrazowania proszę narysować kilka różnych elementów: kółek, kresek, punktów, linii itp. A następnie sprawdzić działanie następujących funkcji.

(setq ss(ssget)) ; pozwala użytkownikowi na dokonanie wyboru
(print (sslength ss)) ; wyświetla ilość wskazanych elementów
(setq ss (ssget "x")) ; wybiera wszystko z rysunku
(setq ss (ssget "W" (setq P1(getpoint "Pierwszy punkt")) (setq P2(getcorner P1 "Przeciwległy narożnik") )))
(setq ss (ssget "C" (setq P1(getpoint "Pierwszy punkt")) (setq P2(getcorner P1 "Przeciwległy narożnik") )))
(setq PtsList (list(setq P1(getpoint "P1"))(setq p2(getpoint P1 "P2")))) ; wskazujemy dwa punkty
(setq ss (ssget "CP" PtsList)) ; zwraca obiekty przecinające linię

Filtry
Filtry służą do nakładania ograniczeń na to, co będzie w zaznaczone. Jeśli chcemy wybrać np. Wszystkie elementy leżące na określonej warstwie lub wszystko określonego koloru, typu itp. Można to zrobić właśnie przez fltry, co więcej filtry takie można sumować odejmować itp. Więc w łatwy sposób możemy znaleźć wszystkie elementy danego typu będące na określonej warstwie, ale mające kolor inny niż np. JakWarstwa.

Proszę dostosować wartości, do testowanego rysunku.

(setq sel1 (ssget "x" '((0 . "ARC")(8 . "0")))) ;zwraca nam wszystkie łuki z warstwy 0
(sssetfirst sel1 sel1 ) ; dla tych, którzy mają wątpliwości
(command "regen" ) ; przydaje się do odświeżenia rysunku
(setq sel2 (ssget '((-4 . "")))) ; pozwoli użytkownikowi na wybranie dowolnej liczby obiektów, ale tylko spośród tych, które leżą na warstwie 0 lub Warstwa1
(setq sel3 (ssget '((0 . "ARC") (-4 . ">=")(40 . 250)))) ; a teraz możemy wybrać tylko łuki o promieniu większym niż 250
(setq sel4(ssget '((-4 . "") ))) ; wybieramy wszystko, co NIE jest linią

Tworzenia zbioru wskazań, nie powoduje zaznaczenia obiektów w rysunku. Mamy zbiór elementów i dostęp do wszystkich z nich, ale w rysunku nie są one podświetlone. Aby obiekty były podświetlone proszę zapoznać się z funkcją: sssetfirst

Odczytanie element ze zbioru wskazań - ssname

(ssname Wskazanie Indeks)

Funkcja ssname zwraca nazwę obiektu o określonym indeksie ze zbioru wskazań. Jeśli w poprzednim punkcie utworzyliśmy jakiś zbiór wskazań i zmienne, do której jest przypisany nazwana została ss, możemy pobrać określony element z tego zbioru. np.:

(ssname ss 0) ; wyświetla nazwę pierwszego wybranego obiektu

Dodanie elementu do zbioru wskazań - ssadd

(ssadd [[NazwaObiektu] Wskazanie ] )
Funkcja ssadd występuje w trzech przypadkach
(ssadd) bez argumentów - tworzy nowy zbiór wskazań
(ssadd Element) - Jeśli jako adgument wywołamy Nazwę obiektu np. Zostanie utworzony nowy zbiór wskazań zawierający ten obiekt
(ssname Element Wskazanie) - Element to Nazwa obiektu. Wskazanie - Zbiór wskazań, do którego ma być dodany element.

Ustawianie i odczytywanie aktualnej selekcji - ssgetfirst sssetfirst

(ssgetfirst elementy [uchwyty])


Jest to ciekawa funkcja pozwalająca na sprawdzenie czy jakieś obiekty są wybrane. Czyli w momencie wywołania naszej funkcji nie musimy prosić użytkownika o wskazanie elementów, ale sprawdzić czy wcześniej zostało coś wybrane. Porównywalnym przykładem może tu być możliwość, którą daje ZWCAD. Jeśli chcemy np. przesunąć dowolny obiekt, to możemy najpierw uruchomić funkcję, a później zaznaczyć obiekt, a możemy też najpierw zaznaczyć obiekty, a później uruchomić funkcję. To samo można zrobić w naszych funkcjach. Wewnątrz funkcji sprawdzając czy jest aktywna selekcja i wykonując operacje na tych obiektach.
ssgetfirst zawsze zwraca listę dwuelementową. np.:

(nil Selection set: 123821600)

Pierwszym elementem jest zbiór wskazań elementów, których uchwyty są podświetlone
Drugim, zbiór wskazań elementów, które są wybrane.
Przyznam, że nie wiem jak można osiągnąć podświetlenie uchwytów bez zaznaczania elementów. Więc nie wiem jak można praktycznie użyć tej pierwszej opcji. Jeśli ktoś odkryje sens tej opcji proszę mnie oświecić.

Ciekawostką jest, że nawet jeśli nic nie jest zaznaczone, zwrócona będzie lista. Czyli w warunku sprawdzenia czy jest aktywna selekcja nie wystarczy sprawdzić czy zwrócona wartość jest nil. musimy się odnieść do drugiego elemenu listy np.:

(defun C:test ( / )
(setq ActiveSel (ssgetfirst))
(if (cadr ActiveSel)
(print (strcat "wybrano "(itoa(sslength (cadr ActiveSel))) " elementów"))
(print "Nic nie wybrano")
)
)

(sssetfirst elementy [uchwyty])

Funkcja ta zaznacza elementy w rysunku. czyli zbiór staje się aktywną selekcją. Obiekty są w rysunku stają podświetlone, tak, jakby Użytkownik zaznaczył je myszką.
Parametrami wywołania funkcji mogą być jedynie zbiory wskazań lub nil.