;;; 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)
)
