请问ssgetfirst的问题
我原来的想法是将某些对象切换到当前激活的图层,如果运行命令前未选择对象,则需要选择对象.(defun c:ttt ( /)
(if (or (setq ss (cadr (ssgetfirst))) (setq ss (ssget)))
(progn
(setq layname (getvar "clayer"))
(command ".chprop" ss "" "LA" layname "");;;切换对象图层
))
)
这样写的话如果先执行后选择,没问题,如果先选择后执行会提示command 函数错误,需要重新选择对象.
然后分步执行, (setq ss (cadr (ssgetfirst)))能正确获得选择集,用(redraw (ssname ss 0) 3)也能确定就是想要的选择集.
然后
(defun c:tt1 ( / )
(setq ss (ssget))
(setq layname (getvar "clayer"))
(command ".chprop" ss "" "LA" layname "");;;切换对象图层
)
这样可以正常执行,也能实现先选择后执行.
所以是因为ssgetfirst获得的选择集不能用于command么?如果是这样ssgetfirst的具体作用是什么呢?
我知道的还有一个用法
(and (setq ss2 (cadr (ssgetfirst)))
(setq ss2 (ssget)))
如果当前有选择,那么将选择的内容做成选择集,否则跳过ssget函数,
1)系统变量 PICKFIRST 为1的时候,如果有对象处于选中状态那么执行(ssget)和(ssget "I")的效果是一样的,(ssget)和(ssget "I")的区别是如果当前如果没有被选中的对象,那么(ssget)会要求用户在屏幕上拾取对象,而(ssget "I")则只返回nil。
2)ssgetfirst当然也可以获取已经被选中的选集。但它该干的事情主要还是设置选集是否被选中。
你不需要管命令输入执行之前是否选中对象。
第二行直接改为:(if(setq ss (ssget))
结果如何,你自己看看... e2002 发表于 2019-10-15 09:45
你不需要管命令输入执行之前是否选中对象。
第二行直接改为:(if(setq ss (ssget))
是的,我后来也是采用的这个方法,我是好奇为什么ssgwtfirst获得的选择集不能用于后面的command函数,明明是正确的选择集. caoyin 发表于 2019-10-15 03:19
1)系统变量 PICKFIRST 为1的时候,如果有对象处于选中状态那么执行(ssget)和(ssget "I")的效果是一样的,( ...
那为什么ssgwtfirst获得的选择集不能用于后面的command函数呢,明明是正确的选择集. wyl219 发表于 2019-10-16 17:20
那为什么ssgwtfirst获得的选择集不能用于后面的command函数呢,明明是正确的选择集.
把代码贴出来看看 天天瞎捣鼓, caoyin 发表于 2019-10-17 14:30
把代码贴出来看看
(defun c:ttt ( / )
(setq ss1 (cadr (ssgetfirst)))
(princ (strcat "\nssgetfirst获得的选择集名为" (vl-princ-to-string ss1)
"变量类型为" (vl-princ-to-string (type ss1))
"选择集长度为" (vl-princ-to-string (sslength ss1))
"第一个图元的图元名为" (vl-princ-to-string (ssnamess1 0))))
(setq layname (getvar "clayer"))
(command ".chprop" ss1 "" "LA" layname "");;;切换对象图层
)
(princ)
(defun c:ttt1 ( / )
(setq ss2 (ssget))
(princ (strcat "\nssget获得的选择集名为" (vl-princ-to-string ss2)
"变量类型为" (vl-princ-to-string (type ss2))
"选择集长度为" (vl-princ-to-string (sslength ss2))
"第一个图元的图元名为" (vl-princ-to-string (ssnamess2 0))))
(setq layname (getvar "clayer"))
(command ".chprop" ss1 "" "LA" layname "");;;切换对象图层
)
运行效果如下
命令: ttt
ssgetfirst获得的选择集名为<Selection set: 4b6>变量类型为PICKSET选择集长度为1第一个图元的图元名为<图元名:
7ffffb079c0>
*无效选择*
需要点或窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)/删除(R)/多个(M
)/前一个(P)/放弃(U)/自动(AU)/单个(SI)
函数被取消
选择对象:
输入要更改的特性 [颜色(C)/图层(LA)/线型(LT)/线型比例(S)/线宽(LW)/厚度(T)/材质(M)/注释性(A)]:
命令: *取消*
命令: ttt1
找到 1 个
ssget获得的选择集名为<Selection set: 4f7>变量类型为PICKSET选择集长度为1第一个图元的图元名为<图元名:
7ffffb079c0>nil
将(command ".chprop" ss1 "" "LA" layname "")修改为(command "ERASE" ss1 "" )后,用ssget获得的选择集能正常被删除,用ssgetfirst获得的选择集要求继续选择对象,但是直接空格以后也能删除.
本帖最后由 caoyin 于 2019-10-17 22:29 编辑
;;应该是变量没设为局部变量的问题吧。再试一下看看
(defun c:tt ( / ss1 layname)
(if (setq ss1 (cadr (ssgetfirst)))
(progn
(princ (strcat "\nssgetfirst获得的选择集名为" (vl-princ-to-string ss1)
"\n变量类型为" (vl-princ-to-string (type ss1))
"\n选择集长度为" (vl-princ-to-string (sslength ss1))
"\n第一个图元的图元名为" (vl-princ-to-string (ssnamess1 0))))
(setq layname (getvar "clayer"))
(command ".chprop" ss1 "" "LA" layname "");;;切换对象图层
)(princ "\n当前没有被选中的对象。")
)
(princ)
)
caoyin 发表于 2019-10-17 22:20
;;应该是变量没设为局部变量的问题吧。再试一下看看
(defun c:tt ( / ss1 layname)
试了一下,好像不是局部变量的原因,而是天正的原因,纯cad环境下没有问题。天正环境下有问题。
页:
[1]