_

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

Re: [LISP] Polecenie z wyborem opcji

Postprzez kojacek » sie 21, 2017 06:46

wilda napisał(a):Pojawił się następujący problem z wywołaniem okna dialogowego.
Jeżeli wybór bloku mam w programie
Kod: Zaznacz cały
    (setq srcblk (car (entsel "\nWybierz blok źródłowy lub [Ustaw]: ")))

to program po wyborze opcji "Ustaw" nie wyświetla okna dialogowego, przestaje działać
Kod: Zaznacz cały
  (initget "Ustaw")
  (if
    (setq srcblk (car (entsel "\nWybierz blok źródłowy lub [Ustaw]: ")))

    (cond
      ( (= srcblk "Ustaw")                                                ;WYBÓR USTAWIEŃ
         (setq dcl_id (load_dialog "Match Block.dcl")
         )
      (if (not (new_dialog "CopyBlockProp" dcl_id))
         (exit)
         (progn
            (action_tile "accept" "(getValues)")
            (action_tile "cancel" "(done_dialog 1)")
            (setq an (start_dialog))
               (C:TESTUJ6)
         )                                                 ;end progn
      )                                                    ;end if
      (unload_dialog dcl_id)
      )
      (t (princ "\anulowano. "))
    ) ;end cond
  ) ;end if

w wypadku gdy jest samo "entsel" bez "car" okno dialogowe wyświetla się prawidłowo, ale potem mam problem
bo dalej program powinien użyć zmiennej "srcblk" jako "(car (entsel..."
Kod: Zaznacz cały
(setq srcobj (vlax-ename->vla-object srcblk)
   x-scale (vla-get-xscalefactor srcobj)
   .....



1) initget działa dla entsel, a nie dla car
2) entsel zwraca listę (stąd można aplikować car), lub nil ale tu car nie zadziała dobrze
3) biorąc powyższe, nie można zakładać że car zadziała zawsze, zadziała tylko wtedy gdy jest prawidłowy entsel (nie nil)
Avatar użytkownika
kojacek
 
Posty: 5264
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 21, 2017 09:06

W takim wypadku jak uzyskać na podstawie wybieranego blok poprzez
Kod: Zaznacz cały
(setq srcblk (entsel "\nWybierz blok źródłowy lub [Ustaw]: ")))

odpowiednie dane w dalszej części programu, takie jak się uzyskuje poprzez "car (entsel..."
potrzebne w [.....]
Kod: Zaznacz cały
(setq srcobj (vlax-ename->vla-object [srcblk = car (enset)])
   x-scale (vla-get-xscalefactor srcobj)
wilda
 
Posty: 189
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] Polecenie z wyborem opcji

Postprzez ziele_o2k » sie 21, 2017 13:18

Nie wczytywałem się za bardzo w temat, ale może tak:
Kod: Zaznacz cały
(if
  (setq srcblk (entsel "\nWybierz blok źródłowy lub [Ustaw]: "))
  (cond
    ( (= srcblk "Ustaw")
      ;tutaj coś tam
    )
    ( T (setq srcblk (car srcblk)))
  )
)
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 504
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Re: [LISP] Polecenie z wyborem opcji

Postprzez ziele_o2k » sie 21, 2017 13:22

Generalnie używanie entsela samego w sobie nie polecam, lepiej używać Cadpackowego cd:USR_EntSelObj albo tego tutaj poniżej:
Kod: Zaznacz cały
;;---------------------=={ Select if }==----------------------;;
;;                                                            ;;
;;  Provides continuous selection prompts until either a      ;;
;;  predicate function is validated or a keyword is supplied. ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  msg  - prompt string                                      ;;
;;  pred - optional predicate function [selection list arg]   ;;
;;  func - selection function to invoke                       ;;
;;  keyw - optional initget argument list                     ;;
;;------------------------------------------------------------;;
;;  Returns:  Entity selection list, keyword, or nil          ;;
;;------------------------------------------------------------;;

(defun LM:SelectIf ( msg pred func keyw / sel ) (setq pred (eval pred)) 
  (while
    (progn (setvar 'ERRNO 0) (if keyw (apply 'initget keyw)) (setq sel (func msg))
      (cond
        ( (= 7 (getvar 'ERRNO))
          (princ "\nMissed, Try again.")
        )
        ( (eq 'STR (type sel))
          nil
        )
        ( (vl-consp sel)
          (if (and pred (not (pred sel)))
            (princ "\nInvalid Object Selected.")
          )
        )
      )
    )
  )
  sel
)

Źródło
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 504
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Re: [LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 21, 2017 15:45

ziele_o2k napisał(a):Nie wczytywałem się za bardzo w temat, ale może tak:
Kod: Zaznacz cały
(if
  (setq srcblk (entsel "\nWybierz blok źródłowy lub [Ustaw]: "))
  (cond
    ( (= srcblk "Ustaw")
      ;tutaj coś tam
    )
    ( T (setq srcblk (car srcblk)))
  )
)

zwraca bład
Kod: Zaznacz cały
błąd: zły typ
argumentu: stringp nil
wilda
 
Posty: 189
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] Polecenie z wyborem opcji

Postprzez ziele_o2k » sie 21, 2017 17:10

Co nie działa:
Kod: Zaznacz cały
(defun c:testuje (/ srcblk)
  (initget "Ustaw")
  (if
    (setq srcblk (entsel "\nWybierz blok źródłowy lub [Ustaw]: "))
    (cond
      ( (= srcblk "Ustaw")
        (princ "\nDziała")
      )
      ( T
        (setq srcblk (car srcblk))
        (princ "\nTeż działa")
      )
    )
    (princ "\nNic nie wskazano")
  )
  (princ)
)

wszystko działa
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 504
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Re: [LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 21, 2017 18:11

Oczywiście działa.
Błąd wkradł mi się z nawiasami.
Tak to jest jak się ciągle coś zmienia i poprawia w kodzie.
Dziękuję

Mam jeszcze jedno zagadnienie.
Przy pierwszym uruchomieniu programu zmienne nie mają wartości.
Jak zapisać warunek że jeżeli zmienna nie ma wartość to żeby przyjęła wartość domyślną, a jeżeli już ma jakąś wartość to żeby tą wartość zachowała.
wilda
 
Posty: 189
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] Polecenie z wyborem opcji

Postprzez ziele_o2k » sie 21, 2017 20:10

Kod: Zaznacz cały
(if (not TwojaZmienna)
  (setq TwojaZmienna WartoscDomyslna)
)
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 504
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Re: [LISP] Polecenie z wyborem opcji

Postprzez wilda » sie 22, 2017 15:36

Wszystko zmierza do szczęśliwego końca.
Jeszcze tylko jak zrobić żeby okno dialogowe otwierając się pobrało wartości ze zmiennych zapisanych w lispie?
(value równało się wartości zmiennej z lispa)
Kod: Zaznacz cały
CopyBlockProp: dialog {
      : toggle { key = "key_XY"; label = "X scala"; value = "1"; }
       ....................
wilda
 
Posty: 189
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] Polecenie z wyborem opcji

Postprzez ziele_o2k » sie 22, 2017 17:27

Wywalasz z definicji DCLa
Kod: Zaznacz cały
value = "1";
i dajesz w lispie
Kod: Zaznacz cały
(set_tile "key_XY" "i_tutaj_wartość_domyślna")


Edit:
Taka rada: wartości domyślne okienka dialogowego zapisuj sobie w formie listy asocjacyjnej. Przykładowo
Kod: Zaznacz cały
(setq
  DefValLst
  (list
    (cons "Key_A" "1")
    (cons "Key_B" "2")
    (cons "Key_C" "3")
  )
)

Dzięki temu możesz potem taką oto funkcją sobie załatwić ustawienia wszystkich wartości w DCLu.
Kod: Zaznacz cały
(foreach % DefValLst
  (set_tile (car %) (cdr %))
)
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 504
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Poprzednia stronaNastępna strona

Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników