zhongys 发表于 2011-7-3 00:14:19

命令完成后如何把对象从选择状态中取消

这是一个改变图层的小程 式,但是命令完成后选中的对象还是在选择状态中,每次完成后都要按“esc",请各位修改一下命令完成后把对象从选择状态中取消。

;;;命令(change_layer "dim")


(Defun change_layer (find_layer / ss old_la)
(SETVAR "cmdecho" 0)
(VL-LOAD-COM)
(setq old_la (getvar "clayer"))
(Setq ss (SSGET "I"))
(IF (= nil ss) (SETVAR "CLAYER" find_layer))
(if (/= nil ss)(change_obj find_layer))
;(Princ find_layer)
(Princ)
)

(defun change_obj( find_layer / i obj)
   (setq i 0)
   (repeat (sslength ss)
    (progn
    (setq obj (vlax-ename->vla-object (ssname ss i)))
    (vla-put-Layer obj find_layer)
    (vla-put-Linetype obj "ByLayer")
    (vla-put-LinetypeScale obj 1)
    (vla-put-Color obj acByLayer)
    (setq i (1+ i))
   )
)
)



淮上 发表于 2011-7-3 01:33:27

(sssetfirst nil nil)

LLXXZZ 发表于 2011-7-3 08:28:22

楼上正解,功能可以实现

LLXXZZ 发表于 2011-7-3 08:29:01

也可以在程序的后面加上: (command)

ljpnb 发表于 2011-7-3 09:15:31

这是一个操作先后的问题,你是先选择物体,然后再执行程序,当然程序结束时还处于选择状态,可以把这句(Setq ss (SSGET "I"))改为(Setq ss (SSGET )),先运行程序再选择物体就不会出现这个问题了,一般程序设计基本上都是这样的

zhongys 发表于 2011-7-3 09:31:55

多谢“淮上 ”与"LLXXZZ " 指点,问题已解决, 对于在程式后加command的用法在高版本的CAD上有时执行不了,我原来是用COMMAND做的,运行不了才改的。

zhongys 发表于 2011-7-3 10:35:22

回复 ljpnb 的帖子

我的这个程式是点击工具条的图标执行的,如果没有选择对象的就把当前层指定为点击图标的层如下两句
(IF (= nil ss) (SETVAR "CLAYER" find_layer))
(if (/= nil ss)(change_obj find_layer))
有选择对象的就把选中的对象改为图标的层,把这句(Setq ss (SSGET "I"))改为(Setq ss (SSGET ))就不能把图标的层定义为当前层了(或者有其它方法可以解决),故就先选择后执行。

ljpnb 发表于 2011-7-3 10:46:26

我试试效果一样啊

zhongys 发表于 2011-7-3 11:17:05

回复 ljpnb 的帖子

我又修改了一下,我把完整的程式发上来给大家看看。
;;;(change_layer "螺丝层")
(Defun change_layer (find_layer / ss search_lay old_la i obj)
(SETVAR "cmdecho" 0)
(VL-LOAD-COM)
(setq old_la (getvar "clayer"))
(Setq ss (SSGET "I"))
(IF (= (setq search_lay (tblsearch "layer" find_layer)) nil)
(cond
((= find_layer "POLT")(new_lay "POLT"   7    "CONTINUOUS"))
((= find_layer "G1")(new_lay "G1"         7    "CONTINUOUS"))
((= find_layer "螺丝层")(new_lay "螺丝层"   3    "CONTINUOUS"))
((= find_layer "螺丝剖面层")(new_lay "螺丝剖面层" 3"hidden"))
((= find_layer "中心线层")(new_lay "中心线层"   1    "CENTER"))
((= find_layer "短虚线层")(new_lay "短虚线层"   3    "HIDDEN"))
((= find_layer "长虚线层")(new_lay "长虚线层"   6    "DASHED"))
((= find_layer "尺寸线层")(new_lay "尺寸线层"   4    "CONTINUOUS"))
((= find_layer "文字层")(new_lay "文字层"   6    "CONTINUOUS"))
((= find_layer "顶出板层")(new_lay "顶出板层"   111"HIDDEN"))
((= find_layer "线切割层")(new_lay "线切割层"   2    "CONTINUOUS"))
((= find_layer "线割虚线层")(new_lay "线割虚线层"   62    "hidden"))
((= find_layer "细实线层")(new_lay "细实线层"   2    "CONTINUOUS"))
((= find_layer "剖面线层")(new_lay "剖面线层"   40   "CONTINUOUS"))
((= find_layer "假想线层")(new_lay "假想线层"   8    "PHANTOM"))
((= find_layer "模仁水路层")(new_lay "模仁水路层" 171"DASHED"))
((= find_layer "模板水路层")(new_lay "模板水路层" 141"DASHED"))
((= find_layer "滑块水路层")(new_lay "滑块水路层" 31   "DASHED"))
((= find_layer "汽泡球层")(new_lay "汽泡球层"   241"PHANTOM"))
((= find_layer "流道层")(new_lay "流道层"   2    "CONTINUOUS"))
((= find_layer "顶针平面层")(new_lay "顶针平面层"   7    "CONTINUOUS"))
((= find_layer nil)(princ "\n 没有定义的层"))
)
);;;end cond
(cond
((and (= search_lay nil)(= ss nil)) (princ "\n 没有定义的层"))
((and (/= search_lay nil)(= ss nil)) (SETVAR "CLAYER" find_layer))
((/= ss nil)
(progn
   (setq i 0)
   (repeat (sslength ss)
    (progn
    (setq obj (vlax-ename->vla-object (ssname ss i)))
    (vla-put-Layer obj find_layer)
    (vla-put-Linetype obj "ByLayer")
    (vla-put-LinetypeScale obj 1)
    (vla-put-Color obj acByLayer)
    (setq i (1+ i))
   )
)
(sssetfirst nil nil)
)
)
);;;end cond
;(Princ find_layer)
(Princ)
)

工具条如下图
e:\66.jpg

功夫佬 发表于 2012-6-2 23:32:01

怎么没有命令的?
页: [1] 2
查看完整版本: 命令完成后如何把对象从选择状态中取消