Przykład ten będzie kontynuacją poprzedniego, w którym przedstawiłem zliczanie elementów zaznaczonych w rysunku. Teraz takie dane wyświetlimy w oknie.

Obsługa okien dialogowych w LISP oparta jest na języku DCL. Ogólnie koncepcja jest taka, że definicje okna dialogowego tworzone są w zewnętrznych plikach tekstowych z rozszeżeniem DCL. W kodzie lisp można przypisywać funkcje do poszczególnych przycisków, wypełniać treścią np listy i obrazy, natomiast w plikach dcl znajduje się np rozmieszczenie elementów w oknie, wielkości poszczególnych przycisków i innych elementów. Prosty przykład poniżej.

 

Zestawienie zaznaczonych elementów

 

Polecenie do uruchomienia skryptu LISP: Sumaelementow

 

Kod źródłowy z opisem

 

;;; Zestawienie zaznaczonych elementów 2
;;; zwcad.pl
;;; Polecenie do uruchomienia skryptu LISP: Sumaelementow
;;; Opis: https://www.zwcad.pl/materialy-edukacyjne/kurs-lisp/przyklady-lisp/319-zestawienie-zaznaczonych-elementow-cz-2.html
(vl-load-com)
(setq *ZWCAD* (vlax-get-acad-object))
(setq *Rysunek* (vla-get-activedocument *ZWCAD* ))
(setq *Model* (vla-get-Modelspace *Rysunek* ))
(defun XSSGet (tresc / selElems elementy )
(setq selElems(ssgetfirst ))
(if (car selElems)
(setq elementy (sel2list (car selElems)))
(progn
(setq elementy(vl-catch-all-apply 'ssget (list )))
(if (not(vl-catch-all-error-p elementy))
  (progn
(setq elementy (sel2list elementy ))
  )
)
)
)
elementy
)
(defun sel2list (selset / Wynik ileelementow i)
(setq ileelementow(sslength selset) )
(setq i 0 )
(repeat ileelementow
(setq Wynik (append Wynik (list (vlax-ename->vla-object(ssname selset i) ) )))
(setq i (1+ i ))
)
Wynik
)
(defun Dodaj (nazwa Wynik / wybrany element)
(setq wybrany(assoc nazwa Wynik ))
(if wybrany
  (progn
(setq Wynik (subst (cons nazwa (1+(cdr wybrany))) wybrany Wynik))
  )
  (progn
(setq element (cons nazwa 1))
(setq Wynik (append Wynik(list element )))
  )
)
Wynik
)
(defun Zlicz (elems / wynik % nazwa)
(setq wynik (list))
(foreach % elems
(setq nazwa(vlax-get-property % 'ObjectName))
(if (eq nazwa "AcDbBlockReference") 
(setq nazwa (vlax-get-property % 'Name )))
(setq wynik (Dodaj nazwa wynik))
)
)
(defun C:Sumaelementow ( / elementy zliczone)
(setq elementy (XSSGet "Wskaż elementy do zestawienia" ))
(setq zliczone (Zlicz elementy))
(WyswietlWOknie zliczone)
)
(defun InsertReport ( zestawienie / text
*error* ) (defun *error* ( msg / ) 
(if (not (null msg ) ) (progn (princ "\nInsertReport:*error*: " ) (princ msg ) (princ "\n") ) )
)
(setq text "" )
(foreach % zestawienie (setq text (strcat text (car %) "\t" (itoa(cdr %)) "\n" ) ) )
(setq px (vlax-3d-point (getpoint "Gdzie wstawić") ) )
(vla-addMText *Model* px 1 text )
)
(defun WyswietlWOknie (zestawienie / dcl_id % DLG_result )
(setq dcl_id (load_dialog "C:\\Okno.dcl")) ; wczytanie pliku definicji okna
(setq DLG_result 1 )
(while (> DLG_result 0)
(if(not(new_dialog "Zestawienie" dcl_id))(exit)) ; jeden plik dcl może zawierać definicje wielu okien,
; tutaj tworzona jest definicja określonego okna
(start_list "Tabela" 3) ; rozpoczęcie wypełniania listy
(foreach % zestawienie (add_list (strcat (car %) "\t" (itoa(cdr %)) )) )
; Wypełnienie listy, kolejne wiersze muszą być jedną linią tekstu kolumny muszą być oddzielane znakiem tabulatora :\t
(end_list)
(action_tile "cancel" "(done_dialog 0)" )
(action_tile "WstawDoDWG" "(done_dialog 1) " )
; okno wyświetlone ale jeszcze nie aktywne, Nie jest możliwe używanie przycisków, ani nawet zamknięcie tego okna.
(setq DLG_result(start_dialog)) ; aktywacja okna. Po uruchomieniu tej funkcji kontrola nad ZWCADem zostaje przekazana do okna,
(if (= DLG_result 1 ) (InsertReport zestawienie ) )
)
; więc nie będzie możliwe uzywanie poleceń ZWCADA, jedynie możliwa jest praca w oknie. Zatrzymane jest również
; wykonanie kodu LISP, więc kolejne linie kodu, zostaną wykonane dopiero po zamknięciu okna.
(unload_dialog dcl_id) ; rozładowanie okna, zwolnienie pliku DCL,
(princ)
)

Potrzeby będzie również plik DCL. jego postać jest następująca:

Zestawienie : dialog { // rozpoczęcie definicji okna
label = "Zestawienie elementów"; // etykieta - napis na belce tytułowej
:list_box { // lista
key = "Tabela"; // każdy element, do którego w jakikolwiek sposób będzie się odnosił kod LISP wymaga zdefiniowanego
label = "Element Ilość"; // etykiety kolumn
tabs = "30 10"; // szerokości poszczególnych kolumn w liście
width = 40; // szerokość całej listy
multiple_select = true; // można wybierać więcej niż jeden wiersz
}
: button { // definicja przycisku
key = "WstawDoDWG"; // nadanie identyfikatora
label = "Wstaw do rysunku"; // napis wyświetlający sie na przycisku
}
: button {
key = "cancel";
is_cancel = true; // każde okno powinno mieć jeden przycisk oznaczony jako anuluj.
label = "Zamknij"; // napis wyświetlający sie na przycisku
}
}

 

Wykonanie w ZWCAD 2023

suma elementow do wstawienia

 

Wykonanie w ZWCAD 2015

LISP SumaElementow2 2015

 

Wykonanie w ZWCAD Classic

LISP SumaElementow2 Classic