DCL - obsługa okien


gruzin

Rekomendowane odpowiedzi

Zaczynam się uczyć DCLa i jak to na początku nauki nowych rzeczy mam problem z podstawami.

Jak mam odczytać które wartości w oknie są pozaznaczane? Próbowałem to zrobić samemu ale poddałem się.

ideałem byłoby zapisanie w lispie zaznaczonego LABEL gazomierza do jednej zmiennej a LABEL widoku do drugiej.

dcl:

metrixgaz : dialog {
label = "Gazomierze METRIX";

			:boxed_radio_column {
			  label = "Gazomierz" ;
			  : radio_button {
				key = "gm1" ;
				label = "Gazomierz - UG (G1,6 G2,5 G4)" ;
			  }
			  :radio_button {
				key = "gm2" ;
				label = "Gazomierz - 6G4, 6G6" ;
				value = "1" ;
			  }
			  :radio_button {
				key = "gm3" ;
				label = "Gazomierz - 6G4-250" ;
			  }
			  :radio_button {
				key = "gm4" ;
				label = "Gazomierz - G10" ;
			  }
			  :radio_button {
				key = "gm5" ;
				label = "Gazomierz - G16, G25" ;
			  }
			  :radio_button {
				key = "gm6" ;
				label = "Gazomierz - G40, G65" ;
			  }
			}

	:boxed_radio_column {
	  label = "Widok" ;
	  : radio_button {
		key = "ww1" ;
		label = "Widok z przodu" ;
		value = "1" ;
	  }
	  :radio_button {
		key = "ww2" ;
		label = "Widok z boku" ;
	  }
	}


   :button {
label = "Wstaw";
key = "Wstaw";
is_cancel = true;
width = 20;
fixed_width = true;
  }


 }

lisp:

(defun c:metrix_gaz()
  (setq dcl_id(load_dialog "profilek.dcl"))
  (new_dialog "metrixgaz" dcl_id)
  (start_dialog)
  (unload_dialog dcl_id)
)

Odnośnik do komentarza
Udostępnij na innych stronach

Proszę ściągnąć sobie ten plik w zip-ie.

http://www.tomaszjankowski.webpark.pl/strony.zip

Tam znajdzie Pan odpowiedź, zeskanowałem przykład z książki do tego przypadku

A tu mała pomoc do projektowania okienek "tester okienek DCL" może się przydać:

;;; TESTDCL.LSP .... by M.P.Saju.
;;; This is a freeware. License for use of this application is granted for
;;; distribution, provided it is not mutilated. If there are problems please
;;; feel free to contact the author at mpsaju@yahoo.com
;;;
;;; Testing *.DCL files becomes a necessity when developing a good sized lisp
;;; application for easy input and understanding. This routine in lisp was
;;; written for just such a necessity.
;;;
;;; Usage is very simple... Just type "Testdcl" in Autocad text screen and press
;;; "enter". A file selection dialog box will open up to select the DCL file.
;;; On entering, the DCL under test will open. This application works under
;;; the assumption that there is an active "accept" or "cancel" button.
;;;
;;; I have tried to solve all problems that I have encountered. However if there
;;; are any further issues please feel free to contact me.


(defun c:testdcl (/ nam$ nam id loop)
;;; lisp for checking dialogboxes at the beginning of their design
 (setq nam$ (getfiled "Select a DCL file" "" "dcl" 0))
 (setq nam (identify nam$))
)
(defun identify	(nam$ / file x dd dd$)
 (setq	file (open nam$ "r")
dd$  nil
dd   nil
x    0
 )
 (while (setq dd (read-line file))
   (if	(wcmatch dd "*: dialog {")
     (progn
(setq dd$ (substr dd 1 (- (strlen dd) 11)))
(if (wcmatch dd$ " *")
  (setq dd$ (substr dd$ 2 (strlen dd$)))
  ;; added for eliminating blank
)
(rundcl nam$ dd$)
     )


   )

 )
 (close file)
 dd$
)
(defun rundcl (nam$ nam)
 (setq id (load_dialog nam$))
 (if (not (new_dialog nam id))
   (exit)
 )
 (action_tile "cancel" "(done_dialog 0)")
;;; cancel button dialog.. normally in all DCLs
 (action_tile "accept" "(done_dialog 0)")
;;; accept button dialog.. normally in all DCLs
 (setq loop (start_dialog))
)  

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

ten skan mi wszystko wyjaśnił. dzięki

podejrzewam, że to z tej książki:

http://helion.magazyn.pl/AutoCAD-LSP-i-DCL-Programowanie-okien-dialogowych-w-przykladach/LSPDCL/ksiazka.html

wie ktoś może czy można gdzieś zdobyć ta książkę (drukowaną, pdf lub jpg).

Odnośnik do komentarza
Udostępnij na innych stronach

Książka praktycznie nie do zdobycia.

Chyba że po znajomościach lub allegro.

Ja do zdobycia tej książki 2 lata temu zatrudniłem żonę, wiedząc że jej nigdzie w żadnym sklepie (internetowym lub w księgarni) nie kupi obiecałem jej za nią :mrgreen: srebrny zegarek . I któregoś pięknego dnia przyszła paczka do mnie z książką z fakturą z jakiejś księgarni internetowej. Ale co było najśmieszniejsze w tym wszystkim że ta książka miała na okładce ślady po butach, jakby ktoś po niej chodził i trochę zmiętolona była, tak jakby leżała gdzieś długo i czekała na mnie. Więc od tamtej pory ta książka jest bardzo cenna dla mnie, bo kosztowała mnie 40zł + srebrny zegarek :lol: .

A to strona, która może coś ci pomoże.

http://www.afralisp.net/dialog-control-language/tutorials/dialog-boxes-and-autolisp-part-2.php

A tu jakieś przykłady z jedne książki z Helionu.

http://www.tomaszjankowski.webpark.pl/przyklady_dlc.zip

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Stronę afralisp.net znam (wiem że istnieje).

Zastanawiam się, czy moja ślubna też zacznie węszyć po necie jak jej coś obiecam w nagrodę... Trzeźwo myśląc, chyba jednak czeka mnie wycieczka do czytelni na politechnice. Tak będzie szybciej...

Odnośnik do komentarza
Udostępnij na innych stronach

rzucilem sobie znowu okiem na twoj PROFILEk (metrix). pare zmian w kodzie plus zapamietanie ostatnich pozycji w okienku. kod ponizej jesli zainteresowany:

(defun C:METRIX_GAZ (/ DCL ACT NAZWA WIDOK PT)
 (setq DCL (load_dialog "profilek-gaz.dcl"))
 (if (not (new_dialog "metrixgaz" DCL))
   (alert "Nie znaleziono pliku profilek-gaz.dcl")
   (progn
     (if (not *metrix_gaz*)
       (setq *metrix_gaz* (list "gazomierz_1" "front"))
     )
     (setq NAZWA (car *metrix_gaz*)
           WIDOK (last *metrix_gaz*)
     )
     (foreach % (list "NAZWA" "WIDOK")
       (set_tile % (eval (read %)))
       (action_tile % (strcat "(setq " % " $value)"))
     )
     (action_tile "accept" "(done_dialog 1)")
     (action_tile "cancel" "(done_dialog 0)")
     (setq ACT (start_dialog))
     (unload_dialog DCL)
     (if (zerop ACT)
       (princ "\nAnulowano. ")
       (progn
         (if (setq PT (getpoint "\nPodaj punkt wstawienia gazomierza: "))
           (progn
             (kr:BLK_InsertBlock
             PT
             (strcat "Profilek-metrix_" NAZWA "_" WIDOK)
              1 1 1 0
             )
             (setq *metrix_gaz* (list NAZWA WIDOK))
           )
           (princ "\nNiepoprawny punkt. ")
         )
       )
     )
   )
 )
 (princ)
)
; ============================================================ ;
; Insert block                                                 ;
;   InPt  [list] - insertion point (3D point)                  ;
;   Name   [sTR] - block name or drawing name (support path)   ;
;   X     [REAL] - X scale factor                              ;
;   Y     [REAL] - Y scale factor                              ;
;   Z     [REAL] - Z scale factor                              ;
;   Rot   [REAL] - angle of rotation in radians                ;
; ------------------------------------------------------------ ;
; (kr:BLK_InsertBlock '(0 0 0) "ldef" 1 1 1 0)                 ;
; ============================================================ ;
(defun kr:BLK_InsertBlock (InPt Name X Y Z Rot)
 (vl-catch-all-apply
  'vla-InsertBlock
   (list
     (vlax-get-property
       (vla-get-ActiveDocument
         (vlax-get-acad-object)
       )
       (if (= 1 (getvar 'CVPORT))
         'PaperSpace
         'ModelSpace
       )
     )
     (vlax-3d-point InPt)
     (if (tblsearch "BLOCK" Name)
       Name
       (findfile (strcat Name ".dwg"))
     )
     X Y Z Rot
   )
 )
)

metrixgaz : dialog {
 label = "Gazomierze METRIX";
 :boxed_radio_column {
   key = "NAZWA";
   label = "Gazomierz" ;
   : radio_button {
     key = "gazomierz_1" ;
     label = "Gazomierz - UG (G1,6 G2,5 G4)" ;
   }
   :radio_button {
     key = "gazomierz_2" ;
     label = "Gazomierz - 6G4, 6G6" ;
   }
   :radio_button {
     key = "gazomierz_3" ;
     label = "Gazomierz - 6G4-250" ;
   }
   :radio_button {
     key = "gazomierz_4" ;
     label = "Gazomierz - G10" ;
   }
   :radio_button {
     key = "gazomierz_5" ;
     label = "Gazomierz - G16, G25" ;
   }
   :radio_button {
     key = "gazomierz_6" ;
     label = "Gazomierz - G40, G65" ;
   }
 }
 : boxed_radio_column {
   label = "Widok" ;
   key = "WIDOK";
   : radio_button {
     key = "front" ;
     label = "Widok z przodu" ;
   }
   :radio_button {
     key = "bok" ;
     label = "Widok z boku" ;
   }
 }
 ok_cancel;
}

jakies pytania, wal smialo

j.

Odnośnik do komentarza
Udostępnij na innych stronach

Zapamiętanie ustawień okna DCL w liście bardzo mi się spodobało. Co prawda nie jest to w tym przypadku funkcjonalność niezbędna, ale przeanalizowałem i zaadoptowałem twoją część kodu.

Zrobiłem w Profilku kolejne okienko, tym razem do starego polecenia "pks" i tu zapamiętanie ustawień jest bardzo przydatne.

DCL_pks.png

Odnośnik do komentarza
Udostępnij na innych stronach

widze ze dochodza kolejne okienka, fajne :)

te radio sprawiaja ze okno jest troche rozlazle (moim zdaniem)

moze jakby jakos tak zakombinowac:

//// MAIN ////
profil : dialog {
 label = "Opisywanie profili podłużnych";
 : boxed_column {
   label = "Dane:";
   : EDIT_BOX_10 {
     key = "DCL_POZIOM";
     label = "Wpisz wartość poziomu por. [m]: ";
   }
   : EDIT_BOX_10 {
     key = "DCL_odl0";
     label = "Odległość dla punktu \"0\" [m]: ";
   }
   : EDIT_BOX_10 {
     key = "DCL_srednica";
     label = "Średnica rurociągu [mm]: ";
   }
   : EDIT_BOX_10 {
     key = "DCL_skalapoziom";
     label = "Skala pozioma <1:xxx>: ";
   }
   : EDIT_BOX_10 {
     key = "DCL_skalapion";
     label = "Skala pionowa <1:yyy>: ";
   }
   : EDIT_BOX_10 {
     key = "DCL_nrwezla";
     label = "Numer pierwszego węzła: ";
   }
   spacer;
 }
 : boxed_column {
   label = "Ustawienia:";
   : POP_UP_10 {
     label = "Opisywanie kolizji:";
     list = "Opisywanie kolizji";
   }
   : POP_UP_10 {
     list = "Rysuj metrykę tabeli:" ;
     label = "Metryka tabelki";
   }
   : POP_UP_10 {
     list = "Spód" ;
     label = "Sposób rysowania sieci:";
   }
   : POP_UP_10 {
     list = "PVC" ;
     label = "Materiał rurociągu:";
   }
   : POP_UP_10 {
     list = "S" ;
     label = "Oznaczenie węzłów:";
   }
   spacer;
 }
 ok_cancel;
}
//// SUB ////
EDIT_BOX_10
 : edit_box {
   edit_limit = 10;
   edit_width = 10;
 }
POP_UP_10
 : popup_list {
   edit_width = 20;
 }

post-564-1348487300,0522_thumb.png

Odnośnik do komentarza
Udostępnij na innych stronach

Masz rację. Twój wzór okienka wygląda lepiej od mojego. Nie pozostaje mi zatem nic innego tylko opanować ":popup_list".

Mam też pytanie: co to jest :POP_UP_10 i czy różni się czymś od :popup_list?

POP_UP_10 to zdefiniowana pod_funkcja. jesli cos sie powtarza kilka razy w tym samym wycinku to mozna to zgrupowac. w moim wypadku jest edit_width = 20. zamiast zmieniac wartosc 20 w 5 miejscach robisz tylko podmiane w jedym.

POP_UP_10
 : popup_list {
   edit_width = 20;
 }

jesli gdzies to chcesz uzyc to robisz:

    : POP_UP_10 {
     list = "S" ;
     label = "Oznaczenie węzłów:";
   } 

i jest to pop_up z list, label i pobiera edit_width z POP_UP_10

chyba nie zamieszalem. w zalaczniku pliczek jak mozna wykorzystywac pod_funkcje (zmien rozsz. z zip na dcl bo chyba nie mozna dodawac dcl)

j.

Atx.zip

Odnośnik do komentarza
Udostępnij na innych stronach

Masz rację. Twój wzór okienka wygląda lepiej od mojego. Nie pozostaje mi zatem nic innego tylko opanować ":popup_list".

Mam też pytanie: co to jest :POP_UP_10 i czy różni się czymś od :popup_list?

jakiegos szalenstwa nie ma. wiekszosc wycinkow opeira sie na tym samym.

- wypelnianie wycinka

  (start_list "TU NAZWA WYCINKA")
 (mapcar 'add_list TUTUAJLISTA)
 (end_list)

- i obsluga

  (action_tile "POPUP" "(setq POS $value)") - zwraca numer pozycjii jako string "0" "1" itd
 (action_tile "POPUP" "(setq POS (nth $value LISTA))") - zwraca wartosc z pozycji jako string "cos na pozycji 0" "cos na pozycji 0" itd

j.

Odnośnik do komentarza
Udostępnij na innych stronach

(action_tile "POPUP" "(setq POS (nth $value LISTA))") - zwraca wartość z pozycji jako string "cos na pozycji 0" "cos na pozycji 1" itd

trochę przysypiam ale chyba powinno być tak: (chyba atoi i atof będą dobrze działać): :-)

(action_tile "POPUP" "(setq POS (nth (atoi $value) LISTA))")

a czy jest jakaś funkcja do odczytania na której pozycji w liście jest znany element?

Odnośnik do komentarza
Udostępnij na innych stronach

oczywiscie ze atoi powinno byc, maly babol sie wkradl :grin:

(setq L (list "a" "b" "c" "d"))

najkrocej

(vl-position "b" L)

bez vl:

(setq C 0)
(foreach % L
 (if (= "b" %)
   (setq P C)
 )
 (setq C (1+ C))
)
(princ P)

atof nie moze byc gdyz nth nie przyjmuje real

(nth 1.0 (list "a" "b")) -> bad argument
(nth 1 (list "a" "b")) -> "b"

j.

Odnośnik do komentarza
Udostępnij na innych stronach

mam plik dcl oraz do tego plik sld i lsp (wszytko w katalogu głównym Zwcada)

Nie wiem czemu w oknie dialogowym nie wyświetla mi sie obrazek. Co robię nie tak?

///////////////////////////////////
//  okno główne komendy STUDNIA  //
///////////////////////////////////
studnia : dialog {
 label = "Studnia w przekroju";
 : boxed_column {
   label = "Dane:";
   : edit_box {
  edit_limit = 10;
     edit_width = 10;
     key = "DCL_srednica_studni";
     label = "Średnica studni [cm]: ";
   }
   : edit_box {
  edit_limit = 10;
     edit_width = 10;
     key = "DCL_osadnik";
     label = "Głębokość osadnika [cm]: ";
   }
   spacer;
 }
 : image {
 height = 20 ;
 width = 20 ;
 key = "profilek_studnia" ;
 value = "profilek_studnia.sld" ;
 color = 0 ;
 }
   ok_cancel;
}

Odnośnik do komentarza
Udostępnij na innych stronach

slide wypelniasz z lispa. ponizszy kod z kursy zwcad\lisp\dcl

   1. (defun DCL_WriteToImage (slide Key / War width height)
  2.   (setq width (dimx_tile Key))
  3.   (setq height (dimy_tile Key))
  4.   (start_image Key)
  5.   (fill_image 0 0 width height 0)
  6.   (slide_image 0 0 width height slide)
  7.   (end_image)
  8. )

jason

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.