Vytisknout stránku | Zavřít okno

Výběr více objektů a ukončení dialogu

Vytištěno z: CAD Fórum
Kategorie: Autodesk - stavebnictví, strojírenství, CAD/GIS
Název fóra: CAD programování
Popis fóra: Otázky programování - nadstavby a utility pro CAD a GIS aplikace Autodesk (VBA, AutoLISP, ARX/C++, .Net, JavaScript, Python, MEL...)
URL: https://www.cadforum.cz/forum/forum_posts.asp?TID=2358
Datum vytištění: 11.čer.2026 v 00:14


Téma: Výběr více objektů a ukončení dialogu
Odeslal: PepaR
Předmět: Výběr více objektů a ukončení dialogu
Datum odeslání: 29.bře.2006 v 09:47
Dobrý den,
používáme 2 upravené lispy a chtěl jsme se zeptat zda by mi někdo nemohl pomoci je vyladit. První lisp slouží k otáčení vynašecích čar v kótách, ale kóty je možné vybírat jen jednotlivě. Mohl by někdo pomoci s hromadným výběrem?
 
Druhý lisp slouží pro přidání předdefinované poznámky, pod nebo nad kótovací čáru, ale dialog je nutné uzavřít vždy stiskem tlačítka OK. Mohl by někdo pomoci s úpravou aby fungovlo zavírání na Enter?
 
http://www.cadforum.cz/forum/uploads/PepaR/2006-03-29_094744_pomoc_s_2_lispy.zip - 2006-03-29_094744_pomoc_s_2_lispy.zip
 
Předem moc děkuji za ochotu a možná se Vám budou tyto lispy taky hodit...


-------------
PepaR
https://www.jremes.cz" rel="nofollow - jremes.cz | https://www.stavlab.cz" rel="nofollow - stavlab.cz



Odpovědi:
Odeslal: PepaR
Datum odeslání: 29.bře.2006 v 16:27
Citace
(defun c:FLIPDIM( / OBJ PT1 PT2 )
   (while (not OBJ)
      (setq OBJ(entsel "\nVyberte kótu pro otočení :"))
      (if OBJ
         (progn     
             (setq OBJ(entget(car OBJ)))
             (if (and OBJ (/= (cdr(assoc 0 OBJ)) "DIMENSION"))(progn (prompt "\nVyberte kótu!")(setq OBJ nil)))
         )
      )
   )
   (command "_undo" "_m")
   (setq PT1 (cdr(assoc 14 OBJ)) PT2(cdr(assoc 13 OBJ)))
   (setq OBJ (subst (cons 13 PT1)(assoc 13 OBJ) OBJ)
         OBJ (subst (cons 14 PT2)(assoc 14 OBJ) OBJ)
   )
   (entmod OBJ)
   (princ)
)


-------------
PepaR
https://www.jremes.cz" rel="nofollow - jremes.cz | https://www.stavlab.cz" rel="nofollow - stavlab.cz


Odeslal: Chop
Datum odeslání: 30.bře.2006 v 07:23

zkuste:

(defun c:PRDIM (/ OBJ PT1 PT2)
  (princ "\nVyberte kóty pro úpravu...")
  (setq ss_kot (ssget '((0 . "DIMENSION"))))
  (if ss_kot
    (progn
      (setq cnt 0
     len (sslength ss_kot))
      (princ "\nUpravuji vybrané kóty...")
      (while (< cnt len)
 (progn
   (setq kotajm (ssname ss_kot cnt)
  OBJ (entget kotajm))
   (setq PT1 (cdr (assoc 14 OBJ))
  PT2 (cdr (assoc 13 OBJ))
   )
   (setq OBJ (subst (cons 13 PT1) (assoc 13 OBJ) OBJ)
  OBJ (subst (cons 14 PT2) (assoc 14 OBJ) OBJ)
   )
   (entmod OBJ)
   (setq cnt (1+ cnt))
      )     ;while
    )     ;progn 
  )     ;if  
  (princ)
)
)



Odeslal: Rostislav Říha
Datum odeslání: 30.bře.2006 v 08:20
Původně odeslal(a) Chop Chop napsal(a):

(defun c:PRDIM

za neslusnou mluvu vas z fora mohou vyhodit.



-------------
Rostislav Říha


Odeslal: Chop
Datum odeslání: 30.bře.2006 v 08:51
Omlouvám se, pokud Vás irituje volání příslušné funkce. Je to jen neškodný fórek vzniklý překladem názvu původní funkce FLIPDIM. Aby volání bylo co nejkratší tak jsem zkrátil PRehoď DIM. Pokud Vám to vadí, tak si to libovolně přejmenujte. Jiný název jsem volil, aby jste si mohli vyzkoušet obě funkce a porovnat rozdíly.


Odeslal: PepaR
Datum odeslání: 30.bře.2006 v 15:27
FLIPDIM/PRDIM: Je to super, Vami zvolenym prikazem jsem teky vahal, ale posleze mi to doslo :)
 
Je to skvele a vse funguje jak ma. Dekuju mockrat....


-------------
PepaR
https://www.jremes.cz" rel="nofollow - jremes.cz | https://www.stavlab.cz" rel="nofollow - stavlab.cz


Odeslal: PepaR
Datum odeslání: 30.bře.2006 v 15:29
Nepomohl by teda nekdo prosim jeste s tim dalsim lispem?
 
Původně odeslal(a) PepaR PepaR napsal(a):

;;======================================================
;; Function: DN_ShowNote
;; Purpose:  Show note selected from ListBox in EditBox
;;======================================================
(defun DN_ShowNote (/ lnum lnote)
(set_tile "error" "")
(setq lnum  (get_tile "lb_notes")
      lnote (nth (atoi lnum) dm_notes)
)
(set_tile "eb_note" lnote)
(princ)
)
;;======================================================
;; Function: DN_PlaceNote
;; Purpose:  If valid note is input, close dialog box
;;======================================================
(defun DN_PlaceNote ()
(set_tile "error" "")
(setq dn_modifier (strcase (get_tile "eb_note")))
(if (= dn_modifier " ")
    (set_tile "error" "Neplatný řetězec poznámky")
    (done_dialog 1)
)   
)
;;======================================================
;; Function: DN_AppendDim
;; Purpose:  Append note to selected dimension entity
;;======================================================
(defun DN_AppendDim (sset mod placement / cnt len ent dval)
(setq cnt 0
      len (sslength sset)
)
(princ "\nUpravuji vybrané kóty...")
(while (< cnt len)
   (setq
           en (ssname sset cnt)
          ent (entget en)
         dval (cdr (assoc 1 ent))
   )
   (if (= dval "")
       (setq dval "<>")
   )
   (if (= placement 1) ;above line
       (setq new_val (strcat dval " " mod))
       (progn
        (if (wcmatch dval "*\\X*")
             (setq new_val (strcat dval " file://\\P - \\P " mod))
             (setq new_val (strcat dval " file://\\X - \\X " mod))
        );if
       );progn    
   );if
   (entmod (subst (cons 1 new_val)(assoc 1 ent) ent))
   (setq cnt (1+ cnt))
);while
(princ "\nDokončeno")
(princ)
)
;;======================================================
;; Main Function - Dimension NOTE
;;======================================================
(defun C:DNOTE (/ cmd$ ss_dims dcl_id dm_notes dn_above)
(princ "\nVyberte text(y) kóty pro úpravu...")
(setq ss_dims (ssget '((0 . "DIMENSION"))))
(if ss_dims
  (progn
   (setq cmd$ (getvar "cmdecho"))
   (setvar "cmdecho" 0)
   (setq dcl_id (load_dialog "dimnotes.dcl"))
   (if (not (new_dialog "dimnote" dcl_id))(exit))
   (setq dm_notes '("VYSKA(PARAPET)" "MAX" "MIN" "OVĚŘIT" "REF" "TEXT"
                     "TYP" "TYPICAL" "VLASTNÍ 1" "VLASTNÍ 2"
                     "ZMĚNA"
                    )
        dn_above   0
   )
   (set_tile "eb_note" "TYP")
   (set_tile "dn_below" "1") ; Set as default
   (start_list "lb_notes")  
   (mapcar 'add_list dm_notes) 
   (end_list)
   (set_tile "lb_notes" "7")
   (action_tile "lb_notes" "(DN_ShowNote)")
   (action_tile "dn_above" "(setq dn_above 1)")
   (action_tile "dn_below" "(setq dn_above 0)")
   (action_tile "accept" "(DN_PlaceNote)")
   (action_tile "cancel" "(done_dialog 0)")
   (if (eq (start_dialog) 1)
       (DN_AppendDim ss_dims dn_modifier dn_above)
   )
   (unload_dialog dcl_id)
   (setvar "cmdecho" cmd$)
  );progn
  (alert "Nebyl vybrán žádný text kóty pro úpravu.")
);if
(princ)
)


-------------
PepaR
https://www.jremes.cz" rel="nofollow - jremes.cz | https://www.stavlab.cz" rel="nofollow - stavlab.cz


Odeslal: Chop
Datum odeslání: 04.dub.2006 v 06:44

Dobrý den, stačí změnit focus na ovládací prvek v souboru dimnotes.dcl na

initial_focus = ok_cancel;

toto však nastaví "odentrování" při otevření dialogu tj. pokud se dialog otevře s přednastavenými hodnotami, stačí pouze odklepnout enter. Pokud změníte myší nějakou položku, tak se "focus" přesune z OK jinam. Návrat na OK by byl ve VBA možný pomocí procedury, která by sledovala jakoukoliv změnu zaměření (focus) prvků dialogu. V Lispu si nejsem jist, zda je něco podobného možné, protože soubor DCL se volá jen jednou při inicializaci dialogu a volání dialogu v lispu se uskuteční také jen jednou (start_dialog). 

(Pokud Vám to bude takhle stačit, tak budu spokojen. Pokud je to nedostatečné, tak Vám musí poradit někdo zkušenější protože Lisp v podstatě neumím).

 



Odeslal: PepaR
Datum odeslání: 04.dub.2006 v 18:35
Děkuji mnohokrát za info, ne že bych byl náročný, ale předpokládal jsem i po focus na enteru po změně hodnot, ale jsme rád, že to není zas tak jednoduché (aspoň si nepřipadám jako blbec :)

-------------
PepaR
https://www.jremes.cz" rel="nofollow - jremes.cz | https://www.stavlab.cz" rel="nofollow - stavlab.cz


Odeslal: Chop
Datum odeslání: 12.dub.2006 v 07:45

Ještě mi to nedalo. Do funkce DN_ShowNote si před (princ)

doplňte:

(mode_tile "accept" 2)

a pak enter funguje téměř na vše. Výjimkou je jen ručně změněný text v boxu Pozn.



Odeslal: PepaR
Datum odeslání: 12.dub.2006 v 09:24
Díky moc, nakonec jsem do LISPu doplnil (mode_tile "accept" 2) a initial_focus = ok_cancel; radeji nezakomponovaval nebot kazdy pri spusteni predpoklada, ze kurzor skoci do boxu pro zapis hodnoty.

 

 

-------------
PepaR
https://www.jremes.cz" rel="nofollow - jremes.cz | https://www.stavlab.cz" rel="nofollow - stavlab.cz



Vytisknout stránku | Zavřít okno