Rekomendowane odpowiedzi

Opublikowano

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

Opublikowano

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

Opublikowano

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

Opublikowano

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...

Opublikowano

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.

Opublikowano

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

Opublikowano

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

Opublikowano

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?

Opublikowano
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

Opublikowano
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.

Opublikowano
(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?

Opublikowano

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.

Opublikowano

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

Opublikowano

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

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