明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1113|回复: 9

[提问] 请问ssgetfirst的问题

[复制链接]
发表于 2019-10-14 23:31 | 显示全部楼层 |阅读模式
我原来的想法是将某些对象切换到当前激活的图层,如果运行命令前未选择对象,则需要选择对象.

(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函数,
发表于 2019-10-15 03:19 | 显示全部楼层
1)系统变量 PICKFIRST 为1的时候,如果有对象处于选中状态那么执行(ssget)和(ssget "I")的效果是一样的,(ssget)和(ssget "I")的区别是如果当前如果没有被选中的对象,那么(ssget)会要求用户在屏幕上拾取对象,而(ssget "I")则只返回nil。
2)ssgetfirst当然也可以获取已经被选中的选集。但它该干的事情主要还是设置选集是否被选中。
回复 支持 1 反对 0

使用道具 举报

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

结果如何,你自己看看...
 楼主| 发表于 2019-10-16 17:16 | 显示全部楼层
e2002 发表于 2019-10-15 09:45
你不需要管命令输入执行之前是否选中对象。
第二行直接改为:(if  (setq ss (ssget))

是的,我后来也是采用的这个方法,我是好奇为什么ssgwtfirst获得的选择集不能用于后面的command函数,明明是正确的选择集.
 楼主| 发表于 2019-10-16 17:20 | 显示全部楼层
caoyin 发表于 2019-10-15 03:19
1)系统变量 PICKFIRST 为1的时候,如果有对象处于选中状态那么执行(ssget)和(ssget "I")的效果是一样的,( ...

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

把代码贴出来看看
发表于 2019-10-17 17:11 | 显示全部楼层
天天瞎捣鼓,
 楼主| 发表于 2019-10-17 18:28 | 显示全部楼层
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 (ssname  ss1 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 (ssname  ss2 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获得的选择集要求继续选择对象,但是直接空格以后也能删除.
  
发表于 2019-10-17 22:20 | 显示全部楼层
本帖最后由 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 (ssname  ss1 0))))
      (setq layname (getvar "clayer"))
      (command ".chprop" ss1 "" "LA" layname "");;;切换对象图层
  )  (princ "\n当前没有被选中的对象。")
)
(princ)
)


 楼主| 发表于 2019-10-17 23:25 | 显示全部楼层
caoyin 发表于 2019-10-17 22:20
;;应该是变量没设为局部变量的问题吧。再试一下看看

(defun c:tt ( / ss1 layname)

试了一下,好像不是局部变量的原因,而是天正的原因,纯cad环境下没有问题。天正环境下有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-24 21:17 , Processed in 1.875679 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表