wyl219 发表于 2019-10-14 23:31:04

请问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函数,

caoyin 发表于 2019-10-15 03:19:31

1)系统变量 PICKFIRST 为1的时候,如果有对象处于选中状态那么执行(ssget)和(ssget "I")的效果是一样的,(ssget)和(ssget "I")的区别是如果当前如果没有被选中的对象,那么(ssget)会要求用户在屏幕上拾取对象,而(ssget "I")则只返回nil。
2)ssgetfirst当然也可以获取已经被选中的选集。但它该干的事情主要还是设置选集是否被选中。

e2002 发表于 2019-10-15 09:45:47

你不需要管命令输入执行之前是否选中对象。
第二行直接改为:(if(setq ss (ssget))

结果如何,你自己看看...

wyl219 发表于 2019-10-16 17:16:14

e2002 发表于 2019-10-15 09:45
你不需要管命令输入执行之前是否选中对象。
第二行直接改为:(if(setq ss (ssget))



是的,我后来也是采用的这个方法,我是好奇为什么ssgwtfirst获得的选择集不能用于后面的command函数,明明是正确的选择集.

wyl219 发表于 2019-10-16 17:20:12

caoyin 发表于 2019-10-15 03:19
1)系统变量 PICKFIRST 为1的时候,如果有对象处于选中状态那么执行(ssget)和(ssget "I")的效果是一样的,( ...

那为什么ssgwtfirst获得的选择集不能用于后面的command函数呢,明明是正确的选择集.

caoyin 发表于 2019-10-17 14:30:03

wyl219 发表于 2019-10-16 17:20
那为什么ssgwtfirst获得的选择集不能用于后面的command函数呢,明明是正确的选择集.

把代码贴出来看看

1291500406 发表于 2019-10-17 17:11:29

天天瞎捣鼓,

wyl219 发表于 2019-10-17 18:28:44

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:20:24

本帖最后由 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)
)


wyl219 发表于 2019-10-17 23:25:29

caoyin 发表于 2019-10-17 22:20
;;应该是变量没设为局部变量的问题吧。再试一下看看

(defun c:tt ( / ss1 layname)


试了一下,好像不是局部变量的原因,而是天正的原因,纯cad环境下没有问题。天正环境下有问题。
页: [1]
查看完整版本: 请问ssgetfirst的问题