_

[LISP] Polecenie z wyborem opcji

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

[LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 05, 2017 13:39

Jak napisać kod programu który ma możliwość w razie konieczności otwarcia i wyboru opcji w oknie dialogowym.
Mam kod programu w którym wybieram blok z którego pobieram domyślne jego właściwości. Chciałbym po wybraniu bloku mieć możliwość otwarcia okna dialogowego tylko wtedy gdy te właściwości domyślne chcę zmienić.
Taraz mam że po wybraniu bloku od razu otwiera się okno dialogowe.
Kod: Zaznacz cały
(if (setq srcblk (car (entsel "\nWybierz blok: ")))
   (setq srcobj (vlax-ename->vla-object srcblk)
         x-scale (vla-get-xscalefactor srcobj)
         itd...
   )
)
(setq dcl_id (load_dialog "Match Block.dcl")
)
    (if (not (new_dialog "CopyBlockProp" dcl_id))
        (exit)
        (progn
         (action_tile "accept" "(getValues)")
         (action_tile "accept" "(getValues)")
         (action_tile "cancel" "(done_dialog 1)")
         (setq an (start_dialog))
         )                                                 ;end progn
     )                                                    ;end if
(unload_dialog dcl_id))

Chciałbym żeby to działało tak jak np w poleceniu matchprop
Załączniki
dialog opcje.gif
wilda
 
Posty: 167
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] Polecenie z wyborem opcji

Postprzez kojacek » sie 05, 2017 15:19

wilda napisał(a):Jak napisać kod programu który ma możliwość w razie konieczności otwarcia i wyboru opcji w oknie dialogowym.
Mam kod programu w którym wybieram blok z którego pobieram domyślne jego właściwości. Chciałbym po wybraniu bloku mieć możliwość otwarcia okna dialogowego tylko wtedy gdy te właściwości domyślne chcę zmienić.
Taraz mam że po wybraniu bloku od razu otwiera się okno dialogowe.
Kod: Zaznacz cały
(if (setq srcblk (car (entsel "\nWybierz blok: ")))
   (setq srcobj (vlax-ename->vla-object srcblk)
         x-scale (vla-get-xscalefactor srcobj)
         itd...
   )
)
(setq dcl_id (load_dialog "Match Block.dcl")
)
    (if (not (new_dialog "CopyBlockProp" dcl_id))
        (exit)
        (progn
         (action_tile "accept" "(getValues)")
         (action_tile "accept" "(getValues)")
         (action_tile "cancel" "(done_dialog 1)")
         (setq an (start_dialog))
         )                                                 ;end progn
     )                                                    ;end if
(unload_dialog dcl_id))

Chciałbym żeby to działało tak jak np w poleceniu matchprop


Poznaj funkcję getkword, ogólnie. Gotowiec jest już w CADPL-Pack'u. Nazywa się cd:USR_GetKeyWord - Pobranie słowa kluczowego od użytkownika
Avatar użytkownika
kojacek
 
Posty: 5245
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 05, 2017 22:40

Problem w tym, że już zapoznawałem się z funkcją getkword i próbowałem na różne sposoby i nic.
Na forum piszę gdy sam jestem już bezsilny.
Chciałbym żeby możliwość zmiany opcji pojawiała się przy komunikacie wyboru docelowego bloku ("Wybierz obiekty") do zmiany właściwości, ale nie mogę nawet zmusić programu żeby pojawiła się przy komunikacie strzałka z rozwijaną opcją do wyboru zmiany.
Może w tak napisanym kodzie tego nie da się zrobić? (kod skróciłem ile się dało)
Kod: Zaznacz cały
(defun c:cbp (/ srcblk ensel srcobj prop blkobj blk x-scale an dcl_id)

(if (setq srcblk (car (entsel "\nWybierz blok: ")))
   (setq srcobj (vlax-ename->vla-object srcblk)
         x-scale (vla-get-xscalefactor srcobj)
   )
)
(setq dcl_id (load_dialog "cbp.dcl")
)
    (if (not (new_dialog "CopyBlockProp" dcl_id))
        (exit)
        (progn
         (action_tile "accept" "(getValues)")
         (action_tile "cancel" "(done_dialog 1)")
         (setq an (start_dialog))
         )                                                 ;end progn
     )                                                    ;end if
(unload_dialog dcl_id)

(while
(setq blk (ssget "_+.:E:S"))
(setq blkobj (vlax-ename->vla-object (ssname blk 0)))

(prompt "\*** Got one. ***")
(if (= answer1 "1")
   (vla-put-xscalefactor blkobj x-scale)
   )
)   ;end while
(princ)
)   ;end defun
(princ)
;*********************************************************************
(defun getValues ()
 (setq answer1 (get_tile "key_XY")
      )
 (done_dialog 1)
 )

dcl
Kod: Zaznacz cały
dcl_settings : default_dcl_settings
   { audit_level = 3       ;}
CopyBlockProp: dialog {
      : toggle { key = "key_XY"; label = "X scala"; value = "1"; }

    ok_cancel;
}
Załączniki
test CBP.gif
test CBP.gif (105.84 KiB) Przeglądane 141 razy
wilda
 
Posty: 167
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] Polecenie z wyborem opcji

Postprzez kojacek » sie 06, 2017 15:39

wilda napisał(a):Problem w tym, że już zapoznawałem się z funkcją getkword i próbowałem na różne sposoby i nic.
Na forum piszę gdy sam jestem już bezsilny. (...)


Postaramy się pomóc :)
Popatrz na to. To ma być coś takiego?

Kod: Zaznacz cały
(defun C:TESTUJ (/ e d o x y z n r)
  (if
    (and
      (setq e (car (entsel "\nWybierz blok źródłowy: ")))
      (= "INSERT" (cdr (assoc 0 (setq d (entget e)))))
    )
    (progn
      (setq x (cdr (assoc 41 d))
            y (cdr (assoc 42 d))
            z (cdr (assoc 43 d))
      )
      (if
        (and
          (setq n (car (entsel "\nWybierz blok docelowy: ")))
          (= "INSERT" (cdr (assoc 0 (entget n))))
        )
        (if
          (setq r
            (cd:USR_GetKeyWord
              "\nZmień skale bloku" '("X" "Y" "Z" "Ustaw" "Wyjdź") "Ustaw"
            )
          )
          (progn
            (setq o (vlax-ename->vla-object n))
            (cond
              ( (= r "X")(vla-put-xscalefactor o x))
              ( (= r "Y")(vla-put-yscalefactor o y))
              ( (= r "Z")(vla-put-zscalefactor o z))
              ( (= r "Ustaw")(alert "Tu wywołaj swoje okno dialogowe"))
              ( (= r "Wyjdź")(princ "\nNic nie zmieniono. "))
              (t (princ "\nAnulowano. "))
            )
          )
        )
      )
    )
  )
  (princ)
)
Avatar użytkownika
kojacek
 
Posty: 5245
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 06, 2017 22:07

Coś podobnego, a
dokładnie coś takiego jak w poleceniu matchprop autocada.
W tym moim lispie wszystko działa tylko chciałbym aby okno dialogowe było wyświetlane tylko wtedy jak chcę (strzałka przy komunikacie o wyborze obiektu) zmienić które właściwości do skopiowania.
Poniżej przykład lispa który nic nie robi ale pokazuje też o co mi chodzi
Kod: Zaznacz cały
(defun c:testdialog ( / blok1 blok2 )

(setq blok1 (entsel "\nWybierz blok zródłowy: "))

(initget "Zmień")
(setq blok2 (cond ( (entsel  "\wskaz bkok docelowy lub [Zmień] : ") ) ( "Zmień" )))
)

Przykład matchprop
Załączniki
test 2CBP.gif
wilda
 
Posty: 167
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] Polecenie z wyborem opcji

Postprzez kojacek » sie 07, 2017 06:05

wilda napisał(a):Coś podobnego, a
dokładnie coś takiego jak w poleceniu matchprop autocada.
W tym moim lispie wszystko działa tylko chciałbym aby okno dialogowe było wyświetlane tylko wtedy jak chcę (strzałka przy komunikacie o wyborze obiektu) zmienić które właściwości do skopiowania.
Poniżej przykład lispa który nic nie robi ale pokazuje też o co mi chodzi
Kod: Zaznacz cały
(defun c:testdialog ( / blok1 blok2 )

(setq blok1 (entsel "\nWybierz blok zródłowy: "))

(initget "Zmień")
(setq blok2 (cond ( (entsel  "\wskaz bkok docelowy lub [Zmień] : ") ) ( "Zmień" )))
)

Przykład matchprop


No ale to przecież prawie zrobiłeś. Patrz:
Kod: Zaznacz cały
(defun C:TESTUJ2 (/ e d)
  (initget "Ustaw")
  (if
    (setq e (entsel "\nWybierz blok źródłowy lub [Ustaw]: "))
    (cond
      ( (= e "Ustaw")(alert "Ustawiam w dcl-u"))
      ( (= "INSERT" (cdr (assoc 0 (setq d (entget (car e))))))
        (princ "\nMam blok! ")
      )
      (t (princ "\anulowano. "))
    )
  )
  (princ)
)
Avatar użytkownika
kojacek
 
Posty: 5245
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 07, 2017 09:41

Tak, Prawie zrobiłem i Prawie tak jak bym chciał.
Dokładnie to chcę żeby wybór zmiany był przy wyborze bloku docelowego a nie źródłowego (komunikat "Wybierz obiekty") -ciągła możliwość wyboru kolejnych bloków do zmiany właściwości.
Kod: Zaznacz cały
(while
(setq blk (ssget "_+.:E:S"))
(setq blkobj (vlax-ename->vla-object (ssname blk 0)))
Załączniki
test 3CBP.gif
wilda
 
Posty: 167
Dołączył(a): gru 18, 2007 21:41


Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: MarCho