ahyin 发表于 2022-7-6 08:41:00

缩放选定项目

尊敬的各位:,
 
我想使lisp与对话框,让用户选择哪一层要缩放2倍的圆圈。我不知道如何编写能够存储所选项目的代码,并重复该命令。谁能教我如何完成代码?谢谢
(defun sc2 ()
(if
(= item1 1) (setq sset (ssget "x"'(8 . "layer1" ) (0 . "CIRCLE")(cons 410 (getvar "CTAB"))))
(= item2 1) (setq sset (ssget "x"'(8 . "layer2" ) (0 . "CIRCLE")(cons 410 (getvar "CTAB"))))
(= item3 1) (setq sset (ssget "x"'(8 . "layer3" ) (0 . "CIRCLE")(cons 410 (getvar "CTAB"))))
(setq sset (vlax-safearray-list sset))
);if
(repeat sset
(command "scale" ssget 2 "")
   
);repeat
);defun

Tharwat 发表于 2022-7-6 08:49:04

也许是这样的。。。
 

(defun sc2 ()
(cond
   ((= item1 1) (setq sset (ssget "x"(list '(8 . "layer1" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
   ((= item2 1) (setq sset (ssget "x"(list '(8 . "layer2" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
   ((= item3 1) (setq sset (ssget "x"(list '(8 . "layer3" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
   )
(if sset
   (repeat (setq i (sslength sset))
   (setq sn (ssname sset (setq i (1- i))))
   (entmod (subst (cons 40 (* (cdr (assoc 40 (setq e (entget sn)))) 4.)) (assoc 40 e) e))
   )
)
(princ)
)

pBe 发表于 2022-7-6 08:53:32

(defun c:test (/ ss ent)
(setq ss (ssget "_X"
   (list '(0 . "CIRCLE") (cons 410 (getvar "CTAB")))
   )
)
(repeat (sslength ss)
   (setq ent (ssname ss 0))
   (if (member (strcase (cdr (assoc 8 (entget ent))))
'("LAYER1" "LAYER2" "LAYER3")
)
   (command "_scale"
       ent
       ""
       "_non"
       (cdr (assoc 10 (entget ent)))
       "2"
   )
   )
   (ssdel ent ss)
)
)

ahyin 发表于 2022-7-6 08:57:29

感谢您的快速回复,如果我选择了多个项目(即项目1、项目3),并且第1层和第3层有多个圆圈。如何使这个Lisp程序可以重复呢?
 
 

ahyin 发表于 2022-7-6 08:59:29

感谢您的快速响应,此lisp将在所有圆上缩放2倍。因为我将通过对话框选择界面选择要缩放2倍的层。
 

Tharwat 发表于 2022-7-6 09:08:41

 
我用entmod更新了我的代码,它更好更快。
 
关于你的问题,我没有明白,你能带上你的代码或例子吗?

pBe 发表于 2022-7-6 09:10:33

 
那么好吧。使用对话框函数的结果值在列表上指定图层名称,例如,从lsit框中选择“LAYER1”和“LAYER3”。用这两个名称构造一个列表,即(“LAYER1”“LAYER3”),并将其作为参数传递给此子对象。
 
(defun ScleCir(lst / ss ent)
(setq ss (ssget "_X"
   (list '(0 . "CIRCLE") (cons 410 (getvar "CTAB")))
   )
)
(repeat (sslength ss)
   (setq ent (ssname ss 0))
   (if (member (strcase (cdr (assoc 8 (entget ent))))
lst
)
   (entmod
(subst (cons 40 (* (cdr (assoc 40 (setq e (entget ent)))) 2))
(assoc 40 e)
e
)
)
   )
   (ssdel ent ss)
)
)
 

 

(defun ScleCir (lst / ss ent)
(setq
   ss (ssget
"_X"
(list
   '(0 . "CIRCLE")
   (cons 410 (getvar "CTAB"))
   (cons
   2
   (apply 'strcat (mapcar '(lambda (j) (strcat "," j)) lst))
   )
)
      )
)
(repeat (sslength ss)
   (setq ent (ssname ss 0))
   (entmod
   (subst (cons 40 (* (cdr (assoc 40 (setq e (entget ent)))) 2))
   (assoc 40 e)
   e
   )
   )
   (ssdel ent ss)
)
)

 
编辑:是的。使用entmod方法,如tharwats代码,而不是命令调用。

ahyin 发表于 2022-7-6 09:16:43

谢谢Tharwat!这里是我的代码,如果第1层和第3层有多个圆,你的lisp能处理吗?
 
(defun chkToggle ()
   (setq item1(atoi(get_tile "item1")))
(setq item2(atoi(get_tile "item2")))
(setq item3(atoi(get_tile "item3")))
)

(defun s1()
(setq dcl_id (load_dialog "sub.dcl"))
(if (not (new_dialog "sub" dcl_id) ) (exit))
(action_tile "item1" "(chkToggle)")   
(action_tile "item2" "(chkToggle)")   
(action_tile "item3" "(chkToggle)")   
(action_tile "accept" "(setq ddiag 2)(done_dialog)")
(action_tile "cancel" "(setq ddiag 1)(done_dialog)")
(start_dialog)                                                                                                                                                                        
(unload_dialog dcl_id)


(if(= ddiag 1)
   (princ "\nCancelled!")
)

(if (= ddiag 2)

(sc2)

)
);defun


(defun sc2 ()
(cond
   ((= item1 1) (setq sset (ssget "x"(list '(8 . "layer1" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
   ((= item2 1) (setq sset (ssget "x"(list '(8 . "layer2" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
   ((= item3 1) (setq sset (ssget "x"(list '(8 . "layer3" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
   )
(if sset
   (repeat (setq i (sslength sset))
   (setq sn (ssname sset (setq i (1- i))))
   (entmod (subst (cons 40 (* (cdr (assoc 40 (setq e (entget sn)))) 4.)) (assoc 40 e) e))
   )
)
(princ)
);defun

 

Tharwat 发表于 2022-7-6 09:20:17

 
是的,它可以。
 
张贴DCL文件的代码。

ahyin 发表于 2022-7-6 09:26:15

谢谢这是我的DCL文件代码。如果我同时选择了第1层和第3层。这个lisp能够同时缩放两层圆吗?
sub : dialog {
         label = "Select layer for scale circle";
          :column {
         : boxed_column {
            :text {
    key = "text";
               value ="nothing selected";
   }
    }
         : boxed_column{
   key = "mylist";
             : toggle {
               key = "item1";
               label = "layer1";
                value = "0";
             }
             : toggle {
               key = "item2";
               label = "layer2";
                value = "0";
             }

    : toggle {
               key = "item3";
               label = "layer3";
                value = "0";
             }
         }
         : boxed_row {
   : button {
               key = "accept";
               label = " Okay ";
               is_default = true;
             }   

             : button {
               key = "cancel";
               label = "Close";
               is_default = true;
               is_cancel = true;
             }
         }   
         }
}
页: [1] 2
查看完整版本: 缩放选定项目