Przykład prazy z oknami dialogowymi. W LISP okna dialogowe można tworzyć korzystając z mechanizmów DCL. Do wyświetlenie okna konieczne jest utworzenie dwóch plików. pierwszy z rozszerzeniem DCL zawiera strukturę okna. W drugim, czyli pliku LSP zdefiniowana jest cała obsługa okna.

Przykład, którym się posłużę zawierał będzie przycisk, pozwalający na wskazanie pliku tekstowego, listę, do której zapisywany będzie wskazany plik wiersz po wierszu. Drugi przycisk wstawi do rysunku treść zaznaczonego wiersza. Ostatni przycisk zamyka okno.

 

Okna dialogowe

 

Polecenie do uruchomienia skryptu LISP: testDCL

 

Kod źródłowy z opisem

  

;;; Okna dialogowe
;;; zwcad.pl
;;; Polecenie do uruchomienia skryptu LISP: testDCL
;;; Opis: https://www.zwcad.pl/materialy-edukacyjne/kurs-lisp/przyklady-lisp/192-okna-dialogowe-dcl-cz-1.html
(vl-load-com)
(setq *ZWCAD* (vlax-get-acad-object))
(setq *Rysunek* (vla-get-activedocument *ZWCAD* ))
(setq *Model* (vla-get-Modelspace *Rysunek* ))
(defun c:testDCL( / sciezkaprogramu DCLPath OutVal dcl_id Loop )
(setq sciezkaprogramu "c:\\" ) ; należy tu wpisać śceżkę dostępu do katalogu, gdzie znajduje się właściwy plik z definicją okna czyli plik DCL
; Jeśli ścieżka ta pozostanie pusta, plik DCL musi znajdować się w katalogu widocznym przez ZWCAD. w innym przypadku praca z knem nie będzie możliwa
(setq DCLPath (strcat sciezkaprogramu "test.DCL" ))
(setq dcl_id(load_dialog DCLPath )) ; wczytanie pliku definicji okien dialogowych. Jeden plik może definiować wiele okien
(if dcl_id (progn
(setq OutVal 1 )
(while (> OutVal 0)
(new_dialog "PrzykladoweOkno" dcl_id) ; Utworzenie określonego okna, okno nie jest jeszcze widoczne na ekranie
(action_tile "zapisz" "(setq wybrany(get_tile \"wartosc\" )) (done_dialog 3) ") ;przypisanie działania do przycisku "zapisz" (done_dialog )zamyka okno, parametr funkcji jest zwracany przez funkcję start_dialog
(action_tile "koniec" "(done_dialog 0)") ;przypisanie działania do przycisku "koniec"
(if trescpliku (progn;
(start_list "wartosc" ) ; wypełnienie listy musi być poprzedzone otwarciem listy do zapisu
(foreach  % trescpliku (add_list % ) ) ; dodanie wiersza do listy
(end_list) ; zamknięcie listy 
))
(setq OutVal(start_dialog)) ; wyświetlenie okna. Zwracana wartość zależna jest od parametru done_dialog
(cond 
((= OutVal 3) (zapisz wybrany))
)
)
(unload_dialog dcl_id) ; rozładowanie pliku z definicjami okien
))
)
(defun XGetpoint (tresc P0 domyslny /  Px  Wynik )
;----------------------------------------------------------
;Funkcja prosi Użytkownika o podanie punktu, jeśli Użytkownik wciśnie na klawiaturze spację lub enter, funkcja zwróci współrzędne punku domyślnego przekazane jako argument funkcji
;Argumenty: komunikat, zachętę, który sie wyświetli w  linii poleceń w chwili uruchomienia funkcji
;Wynik: współrzędne punku - jeśli Użytkownik je poda
; współrzędne punku domyślnego - jeśli Użytkownik na klawiaturze wciśnie [ENTER] [SPACJA]
; nil - jeśli Użytkownik na klawiaturze wciśnie [ESC]
;----------------------------------------------------------
(if (not(null P0))
(setq Px(vl-catch-all-apply 'getpoint (list P0 tresc ))) ;wykonanie funkcji getpoint proszącej o wskazanie punktu) zwraca współrzędne punktu lub obiekt błędu
(setq Px(vl-catch-all-apply 'getpoint (list  tresc )))
)
(if (vl-catch-all-error-p Px) ; sprawdzenie czy zwrócony został obiekt błędu
(progn ; wystąpił błąd
(prompt (vl-catch-all-error-message Px)) ;wyświetla w pasku poleceń komumikat błędu
(setq Wynik nil )
)
(progn ; Użytkownik wskazał punkt lub [ENTER]/[SPACE]
  (if (null Px) 
(setq Wynik domyslny )
(setq Wynik Px)
  )
)
  )
  Wynik
)
(defun wczytaj_fun ( / wskazanyplik File_Exist  )
(setq wskazanyplik(getfiled "Wskaz plik do wczytania" "" "txt" 2))
(setq File_Exist (findfile wskazanyplik))
(if File_Exist (progn
(setq trescpliku (wczytajPlik wskazanyplik))
(start_list "wartosc" )
(foreach  % trescpliku
(add_list % )
)
(end_list)
))
)
(defun zapisz (wybrany / SetPt wybrany_txt )
(print wybrany )
(setq wybrany_txt (nth (atoi wybrany) trescpliku))
(setq SetPt (XGetpoint "Wskaż punkt wstawienia" nil nil  ))  ; (setq SetPt (list 0 0 0 ) )
(if SetPt (progn
(vlax-invoke-method *Model* 'AddMText (vlax-3d-point SetPt ) 1 wybrany_txt )
))
(command "_regen")
)
(defun wczytajPlik (sciezka / filedesc linia OutList )
(setq filedesc (open sciezka "r"))
(setq linia(read-line filedesc ))
(while linia
(setq OutList (append OutList (list linia)))
(setq linia(read-line filedesc))
)
(close filedesc )
OutList 
)

;-----------------------------------------------------------------------

plik DCL


PrzykladoweOkno : dialog { 
label = "Edytor tekstu";
width = 50;
height = 20;
:list_box {key="wartosc";
width=36; 
height=14;
multiple_select = false;
allow_accept = false;
}
:button{
key="wczytaj";
label = "wczytaj";
action = "(wczytaj_fun)";
}
:button{
key="zapisz";
label = "zapisz";
}
:button{
key="koniec";
label = "Zakończ";
is_cancel = true;
}
 }

 

Wykonanie w ZWCAD 2023

okna dialogowe