明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1685|回复: 12

[经验] 话说ssget

[复制链接]
发表于 2016-7-26 09:28 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2016-7-26 15:31 编辑

;;1 "当前选择集"与ssget

  1. (defun C:w1 (/ ss)
  2.   (sslength (setq ss (ssget)))
  3. )
  4. (defun C:w2 ()
  5.   (sslength (ssget "_p"))
  6. )
Command: (C:w1)
Select objects: Specify opposite corner: 2 found
Select objects:
2
Command: (C:w2)
2
由此可见,"当前选择集"AutoCAD保存在某个地方

;;2  ssgetfirst与ssget

  1. (defun w3 (/ SS)
  2.   (sslength (setq ss (cadr (ssgetfirst))))
  3. )
  4. (defun w4 ()
  5.   (sslength (ssget "_p"))
  6. )
先选择3个对象,然后执行(w3)
Command: (w3)
3
Command: (w4)
3
表面上看来,通过ssgetfirst,可以取得"当前选择集"。断续看下面的

  1. (defun W5 (/ SS1 SS2)
  2.   (sslength (setq ss1 (ssget)));这里假定选择2个对象
  3.   (sslength (setq ss2 (ssget)));这里假定选择3个对象
  4.   (sssetfirst ss1 ss1)
  5.   (princ "\n")
  6.   (princ (sslength (cadr (ssgetfirst))))
  7.   (princ "\n")
  8.   (princ(sslength (ssget "_p")))
  9.   (princ)
  10. )
Command: (w5)
Select objects: Specify opposite corner: 2 found
Select objects:
Select objects: Specify opposite corner: 3 found
Select objects:
2
3
从这个例子可看出,"当前选择集"是用户作出的选择,可以(ssget "_p")的方式取得,是ss2(同w4);ssgetfirst取得的是sssetfirst的选择集ss1(同w3)。
通过sssetfirst亮显的对象,不能做为"当前选择集"。与以上执w3不同,当我们先选择时,就已经取得了"当前选择集"。

;;4 选选择,后执行
使用Autocad时,通常可以先选择后执行,也可执行命令对象。
(defun W6 (/ ss)
  (setq ss (ssget '((0 . "DIMENSION"))))  
)
如果先选择对象,然后执行(w6),则不提示选择对象

;;[功能] 先选择,后执行通用函数
;;(sslength (StrartSSget '((0 . "DIMENSION"))))

  1. (defun StrartSSget (fil / SS)
  2.   (cond ((cadr (ssgetfirst)) (setq ss (apply 'ssget (list "p" fil)))))
  3.   (cond        (SS (sssetfirst nil nil))
  4.         (T (setq ss (apply 'ssget (list fil))))
  5.   )
  6.   ss
  7. )
看过w5,则StrartSSget完全可以改写如下

  1. (defun StrartSSget (fil / SS)
  2.   (apply 'ssget (list fil))
  3. )
未完,待续......
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2016-7-27 09:44 | 显示全部楼层
本帖最后由 fl202 于 2016-7-27 09:48 编辑

老黄我请教你几个问题。
    (ssgetfirst)
功能及参数
    此函数将用来决定哪一个图形已被选取。之后将返回两个选择集的表。在此图元选择集表里的第1个图元, 已经被获取, 但是却未被选取。表里的第二个图元既为被获取, 也是被选取的。只有在模型空间与纸张空间的图元可以被此函数来分析。而非图形图元与图块图元则无法使用此函数。
(sssetfirst gripset [pickset])
功能及参数
    此函数将用来设定哪一个图形要被选取与获取。gripset 参数将用来指定只要获取的图形选择集。pickset参数则用来指定要获取也要选取的图形选择集。如果这两个参数均有指定, 则sssetfirst仅获取并选择经过pickset参数所指定的选择集。若只指定 gripset 参数, 则此函数将获取经过 gripset 参数所指定的选择集。sssetfirst 函数将返回选择集的两个变量的表。
    【注意】 当 AutoCAD 正在执行命令时, 不要调用ads_ssetfirst() 函数

没看懂上面的解释。获取和选取有什么区别?

(ssget "P") 选择您最近所选取的图形
(ssget "L") 选择您最后加入数据库内的图元
(ssget "I") 建立在 Implied 选择模式下所选取图元的选择集。(PICKFIRST 有效时)

  1.      (command "_copy" (entsel) "" (getpoint "pt1:") (getpoint "pt2:") (getpoint "pt3:") )
  2.      (command "_break" (entsel)  "f" (getpoint) (getpoint) )
  3.      (command "chprop" (entlast) "" "C" "19" "")
  4.     (command "chprop"  (ssget "_p") "" "C" "19" "")
关于break命令打断后的2个对象,怎么获取?似乎哪个是(entlast)没什么规律啊?
  1. (defun c:W5 (/ SS1 SS2)
  2.   (sslength (setq ss1 (ssget)));这里假定选择2个对象
  3.   (sslength (setq ss2 (ssget)));这里假定选择3个对象
  4.   (sssetfirst ss1 ss1)
  5.   (princ "\n")
  6.   (princ (sslength (cadr (ssgetfirst))))
  7.   (command "chprop" (cadr (ssgetfirst)) "" "C" "29" "")
  8.   (princ "\n")
  9.   (princ(sslength (ssget "_p")))
  10.   (command "chprop"  (ssget "_p") "" "C" "19" "")
  11.   (princ)
  12. )
  13. 命令: w5
  14. 选择对象: 指定对角点: 找到 4 个
  15. 选择对象:
  16. 选择对象: 指定对角点: 找到 3 个
  17. 选择对象:
  18. 4
  19. 4
  20. 我执行的结果和你的不一致。???

  21. 命令: (apply 'ssget (list  '((0 . "TEXT"))))
  22. 选择对象: 指定对角点: 找到 6 个
  23. 选择对象:  <Selection set: 5a3c>
  24. 命令: *取消*
  25. 命令: (type (apply 'ssget (list  '((0 . "TEXT")))))
  26. 选择对象: 指定对角点: 找到 6 个
  27. 选择对象:  PICKSET
 楼主| 发表于 2016-7-27 10:37 | 显示全部楼层
第一个问题,sssetfirst。以前在本论坛上看到讨论,好像有个参数没什么用。
第二个问题,(ssget "P")。我以上说的就是(ssget "P")与sssetfirst,他们之间没有什么关系。当我们先选择后执行程序时,创建了“当前选择集”,因而(ssget "P")可以获取它。
第三个问题,(ssget "I") ,可以查《AutoLisp葵花宝典A.chm》sssetfirst,上面说得很清楚。
第四个,(ssget "L") 与(entlast)应该差不多,但后都删除后,可能结果不一样
第五,打断后的对象通常(setq e (entlast)),然后用(entnext e)来搜索。
发表于 2016-7-27 14:05 | 显示全部楼层
自贡黄明儒 发表于 2016-7-27 10:37
第一个问题,sssetfirst。以前在本论坛上看到讨论,好像有个参数没什么用。
第二个问题,(ssget "P")。我 ...

为什么W5我的执行结果与你的不一致呢?

点评

那你的是什么结果呢?  发表于 2016-7-27 14:16
发表于 2016-7-29 08:46 | 显示全部楼层
fl202 发表于 2016-7-27 14:05
为什么W5我的执行结果与你的不一致呢?

命令: w5
选择对象: 指定对角点: 找到 4 个
选择对象:
选择对象: 指定对角点: 找到 3 个
选择对象:
4
4
我执行的结果和你的不一致。???
发表于 2016-8-8 11:10 | 显示全部楼层
黄大师我有问题请教

(setq ss0 (ssget))
  (setq ss (ssget "p" '((0 . "TEXT") (62 . 6))))
  (command "erase" ss "")

之后我还想再次利用ss0怎么做?

如果 (setq ss (ssget "p" '((0 . "INSERT")))) 就取不到选择集了

[em0] 实在不想遍历啊

点评

(setq ss (ssget "p" '((0 . "INSERT"))))之前加一句(vl-cmdf "_.select" ss0 "")  发表于 2016-9-30 11:09
发表于 2016-9-29 23:43 | 显示全部楼层
请教楼主,"当前选择集"Autocad应该是保存在某个地方,我们怎么操作才能释放(清空)“当前选择集”

点评

办法找到了,http://bbs.xdcad.net/forum.php?mod=viewthread&tid=710425&highlight=%C7%B0%D2%BB%D1%A1%D4%F1%BC%AF  发表于 2021-2-18 12:35
目前为止,没相到办法。也没见到解决的办法,eachy大师好像也没解决  发表于 2016-9-30 11:07
发表于 2019-3-23 11:54 | 显示全部楼层
本帖最后由 alexmai 于 2019-3-23 12:03 编辑

老师,这是你写的原码,发现有些问题,请回复一下,感激!

http://bbs.mjtd.com/thread-179168-1-1.html
发表于 2020-9-11 23:56 | 显示全部楼层
收藏,顶一下,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 10:11 , Processed in 0.679783 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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