block:ssget 选择满足指定属性标记及对应值的块
本帖最后由 vitalgg 于 2023-12-6 16:16 编辑选择满足指定属性标记及对应值的块。
参数:sel-method 参照ssget。当为x时选择全部,无需交互。如需相应的点参数时,需以列表的形式给出如'(\"c\" pt1 pt2),需手动选择时设为nil。
参数: blknames 块名(支持通配符),或块名列表,或nil
参数: lst-attr 属性名与值的点对表或nil
;; 用法示例
(block:ssget nil "块名" nil);; 选择块真实名为”块名“ 的块,需手动框选
(block:ssget "x" "块名" nil);; 选择所有块真实名为”块名“ 的块.
(block:ssget (list "c" (getpoint) (getpoint))"块名" nil);; 叉选给定两点的矩形框内的块真实名为 ”块名“ 的块.
(block:ssget (list "w" (getpoint) (getpoint))"块名" nil);; 窗选给定两点的矩形框内的块真实名为 ”块名“ 的块.
(block:ssget nil "块名" '(("属性1" . "A")));; 选择块真实名为”块名“ 的且属性1的值为A块,需手动框选
(block:ssget nil "块名" '(("属性1" . "A")));; 选择所有块真实名为”块名“ 的且属性1的值为A块.
使用以下代码加载@lisp函数库,即可直接调用block:ssget 函数。(可放到lsp文件头部)
(progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))
函数源码只供研究。因调用了其它自定义函数,不能直接复制使用,如需调用请按上面的方法加载@lisp函数库。
(defun block:ssget (sel-method blknames lst-attr / ss ss-res ss0)
"选择满足指定属性标记及对应值的块。
参数:sel-method 参照ssget。当为x时选择全部,无需交互。如需相应的点参数时,需以列表的形式给出如'(\"c\" pt1 pt2),需手动选择时设为nil。
参数: blknames 块名(支持通配符),或块名列表,或nil
参数: lst-attr 属性名与值的点对表或nil"
"满足条件的选择集"
"(block:ssget \"x\" '(\"块1\" \"块2\")'((\"属性1\" . \"值1\")(\"属性2\" . \"值2\")))"
(cond
((= (quote str)(type blknames))
(setq blknames (list blknames)))
)
(setq ss-res (ssadd))
(cond
((null sel-method)
(setq ss0 (ssget '((0 . "insert")))))
((p:stringp sel-method)
(setq ss0 (ssget sel-method '((0 . "insert")))))
((and sel-method (listp sel-method))
(setq ss0 (apply 'ssget (append sel-method (list '((0 . "insert"))))))
)
(t (setq ss0 (ssget "x" '((0 . "insert"))))
))
(if (setq lst-ent (pickset:to-list ss0))
(foreach
ent% lst-ent
(if (and (or
(null blknames)
(member (block:get-effectivename ent%)
blknames)
(apply 'or
(mapcar '(lambda(x)(wcmatch (block:get-effectivename ent%) x))
blknames)))
(or (null lst-attr)
(apply (quote and)
(mapcar (quote (lambda (x)
(member x (block:get-attributes ent%))))
lst-attr))))
(ssadd ent% ss-res))))
(sssetfirst nil ss-res)
ss-res)
在微信公众号中查询函数用法:
在vscode中的函数提示:
页:
[1]