vitalgg 发表于 2023-12-6 15:56:10

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]
查看完整版本: block:ssget 选择满足指定属性标记及对应值的块