缩放选定项目
尊敬的各位:,我想使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 也许是这样的。。。
(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 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)
)
) 感谢您的快速回复,如果我选择了多个项目(即项目1、项目3),并且第1层和第3层有多个圆圈。如何使这个Lisp程序可以重复呢?
感谢您的快速响应,此lisp将在所有圆上缩放2倍。因为我将通过对话框选择界面选择要缩放2倍的层。
我用entmod更新了我的代码,它更好更快。
关于你的问题,我没有明白,你能带上你的代码或例子吗?
那么好吧。使用对话框函数的结果值在列表上指定图层名称,例如,从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代码,而不是命令调用。 谢谢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
是的,它可以。
张贴DCL文件的代码。 谢谢这是我的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