Przykłąd ten będize 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.

Dla przypomninia kod z poprzedniego przykładu:

(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
;(princ tresc )
(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))
)
)


W głównej funkcji dodamy funckję wyświetlającą dane w oknie.

(defun C:Sumaelementow ( / elementy zliczone)
(setq elementy (XSSGet "Wskaż elementy do zestawienia" ))
(setq zliczone (Zlicz elementy))
(WyswietlWOknie zliczone)
)

(defun WyswietlWOknie (zestawienie / dcl_id % )
(setq dcl_id (load_dialog "C:\\KursLisp\\ZestawienieBlokow\\Okno.dcl")) ; wczytanie pliku definicji okna
(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)
; okno wyświetlone ale jeszcze nie aktywne, Nie jest możliwe używanie przycisków, ani nawet zamknięcie tego okna.
(start_dialog) ; aktywacja okna. Po uruchomieniu tej funkcji kontrola nad ZWCADem zostaje przekazana do okna, 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 klucza "key", po nim element jest identyfikowany w oknie
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 2015+LISP SumaElementow2 2015

 

Wykonanie w ZWCAD ClassicLISP SumaElementow2 Classic