明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 746|回复: 9

[经验] 话说ssget

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

;;1 "当前选择集"与ssget[code="lisp]
(defun C:w1 (/ ss)
  (sslength (setq ss (ssget)))
)
(defun C:w2 ()
  (sslength (ssget "_p"))
)
[/code]Command: (C:w1)
Select objects: Specify opposite corner: 2 found
Select objects:
2
Command: (C:w2)
2
由此可见,"当前选择集"Autocad保存在某个地方

;;2  ssgetfirst与ssget[code="lisp]
(defun w3 (/ SS)
  (sslength (setq ss (cadr (ssgetfirst))))
)
(defun w4 ()
  (sslength (ssget "_p"))
)
[/code]先选择3个对象,然后执行(w3)
Command: (w3)
3
Command: (w4)
3
表面上看来,通过ssgetfirst,可以取得"当前选择集"。断续看下面的[code="lisp]
(defun W5 (/ SS1 SS2)
  (sslength (setq ss1 (ssget)));这里假定选择2个对象
  (sslength (setq ss2 (ssget)));这里假定选择3个对象
  (sssetfirst ss1 ss1)
  (princ "\n")
  (princ (sslength (cadr (ssgetfirst))))
  (princ "\n")
  (princ(sslength (ssget "_p")))
  (princ)
)
[/code]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"))))[code="lisp]
(defun StrartSSget (fil / SS)
  (cond ((cadr (ssgetfirst)) (setq ss (apply 'ssget (list "p" fil)))))
  (cond        (SS (sssetfirst nil nil))
        (T (setq ss (apply 'ssget (list fil))))
  )
  ss
)
[/code]看过w5,则StrartSSget完全可以改写如下[code="lisp]
(defun StrartSSget (fil / SS)
  (apply 'ssget (list fil))
)
[/code]未完,待续......
发表于 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 有效时)[code="lisp]
     (command "_copy" (entsel) "" (getpoint "pt1:") (getpoint "pt2:") (getpoint "pt3:") )
     (command "_break" (entsel)  "f" (getpoint) (getpoint) )
     (command "chprop" (entlast) "" "C" "19" "")
    (command "chprop"  (ssget "_p") "" "C" "19" "")
[/code]关于break命令打断后的2个对象,怎么获取?似乎哪个是(entlast)没什么规律啊?[code="lisp] (defun c:W5 (/ SS1 SS2)
  (sslength (setq ss1 (ssget)));这里假定选择2个对象
  (sslength (setq ss2 (ssget)));这里假定选择3个对象
  (sssetfirst ss1 ss1)
  (princ "\n")
  (princ (sslength (cadr (ssgetfirst))))
  (command "chprop" (cadr (ssgetfirst)) "" "C" "29" "")
  (princ "\n")
  (princ(sslength (ssget "_p")))
  (command "chprop"  (ssget "_p") "" "C" "19" "")
  (princ)
)
命令: w5
选择对象: 指定对角点: 找到 4 个
选择对象:
选择对象: 指定对角点: 找到 3 个
选择对象:
4
4
我执行的结果和你的不一致。???

命令: (apply 'ssget (list  '((0 . "TEXT"))))
选择对象: 指定对角点: 找到 6 个
选择对象:  <Selection set: 5a3c>
命令: *取消*
命令: (type (apply 'ssget (list  '((0 . "TEXT")))))
选择对象: 指定对角点: 找到 6 个
选择对象:  PICKSET
[/code]
 楼主| 发表于 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应该是保存在某个地方,我们怎么操作才能释放(清空)“当前选择集”

点评

目前为止,没相到办法。也没见到解决的办法,eachy大师好像也没解决  发表于 2016-9-30 11:07
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2018-10-15 16:13 , Processed in 3.329025 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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