xinxirong 发表于 2015-12-24 18:07:27

lisp如何只处理选中的块表

Z轴归零,但每次都把块表里的所有块定义都处理一遍,对于图形很大的话会很慢。
(defun zero-block (/)
(vlax-for block (vla-get-blocks
      (vla-get-activedocument (vlax-get-acad-object))
      )
    (vlax-for eblock
      (zero-ent (vlax-vla-object->ename e))
    )
)
)

(defun c:z0 (/ c10 c38 dxf ent i len ss)
(princ "\n选择需要将Z坐标或标高属性清零的对象 <回车选择所有图元>: ")
(setq ss (ssget))
(setqlen (sslength ss)
       i   0
       c10 0
       c38 0
)
;; 块定义内实体归零
(zero-block)
(setqlen (sslength ss)
       i   0
)

(repeat len
    (zero-ent (setq ent (ssname ss i)))
    (setq i (1+ i))
)
)
怎样写能只处理选中的块的块定义,我的想法是先把选中的对象筛选出Insert,然后做成一个没有重复的块名字的表,最后再在块表中遍历。

xinxirong 发表于 2015-12-25 11:05:12

(setq ss1 (ssget "p" (list (cons 0 "insert"))))
(if ss1
    (zero-blocks ss1)
)

(defun zero-blocks (ss / knum blklst blkname)

(repeat (setq knum(sslength ss))
    (if (not (member (setq blkname(vla-get-name (vlax-ename->vla-object (ssname ss (setq knum(1- knum)))))) blklst))
      (setq blklst(cons blkname blklst))
    );end if
)

(vlax-for block (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (if (member (setq blkname (vla-get-name block)) blklst)
      (vlax-for eblock
      (zero-ent (vlax-vla-object->ename e))
      )
    )
)
)
页: [1]
查看完整版本: lisp如何只处理选中的块表