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