Zobrazit plnou verzi příspěvku: Výběr více objektů a ukončení dialogu

PepaR
29.03.2006, 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?
 
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
29.03.2006, 16:27
[QUOTE]
(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))[/QUOTE]

Chop
30.03.2006, 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)))

Rostislav Říha
30.03.2006, 08:20
[QUOTE=Chop]
(defun c:PRDIM [/QUOTE] za neslusnou mluvu vas z fora mohou vyhodit.

Chop
30.03.2006, 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.

PepaR
30.03.2006, 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....PepaR2006-3-30 15:28:23

PepaR
30.03.2006, 15:29
Nepomohl by teda nekdo prosim jeste s tim dalsim lispem?
 
[QUOTE=PepaR]

;;======================================================;; 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 "\\P" mod))              (setq new_val (strcat dval "\\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))[/QUOTE]

Chop
04.04.2006, 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).
 

PepaR
04.04.2006, 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 :)

Chop
12.04.2006, 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.

PepaR
12.04.2006, 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.