话说ssget
本帖最后由 自贡黄明儒 于 2016-7-26 15:31 编辑;;1 "当前选择集"与ssget
(defun C:w1 (/ ss)
(sslength (setq ss (ssget)))
)
(defun C:w2 ()
(sslength (ssget "_p"))
)
Command: (C:w1)
Select objects: Specify opposite corner: 2 found
Select objects:
2
Command: (C:w2)
2
由此可见,"当前选择集"Autocad保存在某个地方
;;2ssgetfirst与ssget
(defun w3 (/ SS)
(sslength (setq ss (cadr (ssgetfirst))))
)
(defun w4 ()
(sslength (ssget "_p"))
)
先选择3个对象,然后执行(w3)
Command: (w3)
3
Command: (w4)
3
表面上看来,通过ssgetfirst,可以取得"当前选择集"。断续看下面的
(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)
)
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"))))
(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
)
看过w5,则StrartSSget完全可以改写如下
(defun StrartSSget (fil / SS)
(apply 'ssget (list fil))
)
未完,待续...... 本帖最后由 fl202 于 2016-7-27 09:48 编辑
老黄我请教你几个问题。
(ssgetfirst)
功能及参数
此函数将用来决定哪一个图形已被选取。之后将返回两个选择集的表。在此图元选择集表里的第1个图元, 已经被获取, 但是却未被选取。表里的第二个图元既为被获取, 也是被选取的。只有在模型空间与纸张空间的图元可以被此函数来分析。而非图形图元与图块图元则无法使用此函数。
(sssetfirst gripset )
功能及参数
此函数将用来设定哪一个图形要被选取与获取。gripset 参数将用来指定只要获取的图形选择集。pickset参数则用来指定要获取也要选取的图形选择集。如果这两个参数均有指定, 则sssetfirst仅获取并选择经过pickset参数所指定的选择集。若只指定 gripset 参数, 则此函数将获取经过 gripset 参数所指定的选择集。sssetfirst 函数将返回选择集的两个变量的表。
【注意】 当 AutoCAD 正在执行命令时, 不要调用ads_ssetfirst() 函数
没看懂上面的解释。获取和选取有什么区别?
(ssget "P") 选择您最近所选取的图形
(ssget "L") 选择您最后加入数据库内的图元
(ssget "I") 建立在 Implied 选择模式下所选取图元的选择集。(PICKFIRST 有效时)
(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" "")
关于break命令打断后的2个对象,怎么获取?似乎哪个是(entlast)没什么规律啊?(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
第一个问题,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 10:37 static/image/common/back.gif
第一个问题,sssetfirst。以前在本论坛上看到讨论,好像有个参数没什么用。
第二个问题,(ssget "P")。我 ...
为什么W5我的执行结果与你的不一致呢? fl202 发表于 2016-7-27 14:05 static/image/common/back.gif
为什么W5我的执行结果与你的不一致呢?
命令: w5
选择对象: 指定对角点: 找到 4 个
选择对象:
选择对象: 指定对角点: 找到 3 个
选择对象:
4
4
我执行的结果和你的不一致。??? 黄大师我有问题请教
(setq ss0 (ssget))
(setq ss (ssget "p" '((0 . "TEXT") (62 . 6))))
(command "erase" ss "")
之后我还想再次利用ss0怎么做?
如果 (setq ss (ssget "p" '((0 . "INSERT")))) 就取不到选择集了
实在不想遍历啊 请教楼主,"当前选择集"Autocad应该是保存在某个地方,我们怎么操作才能释放(清空)“当前选择集” 本帖最后由 alexmai 于 2019-3-23 12:03 编辑
老师,这是你写的原码,发现有些问题,请回复一下,感激!
http://bbs.mjtd.com/thread-179168-1-1.html 收藏,顶一下,,,
页:
[1]