icteaer 发表于 2019-1-30 14:14:32

求一个解决批量修改属性图层的功能

之前用过一个修改属性颜色的插件,最近因为工作原因,需要一个批量修改属性所在图层的功能。具体是cad的增强属性编辑器里可以一个个修改属性所在的图层,现由于图块种数过多,需要一个批量修改的功能,求大神帮助。

KO你 发表于 2019-6-7 07:18:50

本帖最后由 KO你 于 2019-6-7 07:20 编辑

在论坛有把同名块内对象改图层,颜色,线型的

圣天诺杰 发表于 2019-6-7 17:20:32

KO你 发表于 2019-6-7 07:18
在论坛有把同名块内对象改图层,颜色,线型的

这个好是好,但没有主次之分,还要去设置内线,比较麻烦

KO你 发表于 2019-6-7 17:41:12

本帖最后由 KO你 于 2019-6-7 17:43 编辑

圣天诺杰 发表于 2019-6-7 17:20
这个好是好,但没有主次之分,还要去设置内线,比较麻烦
这个论坛里有,配合这个用,已经很完善了,只有不足的地方是改块选中对象颜色没有框选
快捷键bb`   改块选中对象颜色
快捷键bb``改块全部对象颜色
;修改实体和图块内的颜色
(defun c:bb`` () (pl:block-color) (princ))
(defun c:bb` () (pl:block-ent-color) (princ))
(vl-load-com)
(defun pl:block-ent-color (/ adoc blocks color ent lays)
    (setq adoc(vla-get-activedocument (vlax-get-acad-object))
          lays(vla-get-layers adoc)
          color (acad_colordlg 256)
    )
    (if color
      (progn (setvar "errno" 0)
               (vla-startundomark adoc)
               (while (and (not (vl-catch-all-error-p
                                    (setq ent (vl-catch-all-apply
                                                (function nentsel)
                                                '("\nSelect entity <Exit>:")
                                              )
                                    )
                              )
                           )
                           (/= 52 (getvar "errno"))
                      )
                   (if ent
                     (progn (setq ent (vlax-ename->vla-object (car ent))
                                    lay (vla-item lays (vla-get-layer ent))
                              )
                              (if (= (vla-get-lock lay) :vlax-true)
                                  (progn (setq layloc (cons lay layloc))
                                       (vla-put-lock lay :vlax-false)
                                  )
                              )
                              (vl-catch-all-apply (function vla-put-color) (list ent color))
                              (vla-regen adoc acallviewports)
                     )
                     (princ "\nNothing selection! Try again.")
                   )
               )
               (foreach i layloc (vla-put-lock i :vlax-true))
               (vla-endundomark adoc)
      )
    )
    (princ)
)

(defun pl:block-color (/ adoc blocks color ins lays)
    (setq adoc   (vla-get-activedocument (vlax-get-acad-object))
          blocks (vla-get-blocks adoc)
          lays   (vla-get-layers adoc)
          color(acad_colordlg 256)
    )
    (if color
      (progn (setvar "errno" 0)
               (vla-startundomark adoc)
               (while (and (not (vl-catch-all-error-p
                                    (setq ins (vl-catch-all-apply
                                                (function entsel)
                                                '("\nSelect block <Exit>:")
                                              )
                                    )
                              )
                           )
                           (/= 52 (getvar "errno"))
                      )
                   (if ins
                     (progn (setq ins (vlax-ename->vla-object (car ins)))
                              (if (= (vla-get-objectname ins) "AcDbBlockReference")
                                  (if (vlax-property-available-p ins 'path)
                                    (princ "\nThis is external reference! Try pick other.")
                                    (progn (_pl:block-color blocks ins color lays)
                                             (vla-regen adoc acallviewports)
                                    )
                                  )
                                  (princ "\nThis isn't block! Try pick other.")
                              )
                     )
                     (princ "\nNothing selection! Try again.")
                   )
               )
               (vla-endundomark adoc)
      )
    )
    (princ)
)

(defun _pl:block-color (blocks ins color lays / lay layfrz layloc)
    (vlax-for e (vla-item blocks (vla-get-name ins))
      (setq lay (vla-item lays (vla-get-layer e)))
      (if (= (vla-get-freeze lay) :vlax-true)
            (progn (setq layfrz (cons lay layfrz)) (vla-put-freeze lay :vlax-false))
      )
      (if (= (vla-get-lock lay) :vlax-true)
            (progn (setq layloc (cons lay layloc)) (vla-put-lock lay :vlax-false))
      )
      (vl-catch-all-apply (function vla-put-color) (list e color))
      (if (and (= (vla-get-objectname e) "AcDbBlockReference")
               (not (vlax-property-available-p e 'path))
            )
            (_pl:block-color blocks e color lays)
      )
      (foreach i layfrz (vla-put-freeze i :vlax-true))
      (foreach i layloc (vla-put-lock i :vlax-true))
    )
)

(progn
(princ "\BLCC - Changes color of the chosen blocks")
(princ "\nENCC - Changes color of the chosen objects (may beelement of the block)")
(princ))

圣天诺杰 发表于 2019-6-7 23:33:01

KO你 发表于 2019-6-7 17:41
这个论坛里有,配合这个用,已经很完善了,只有不足的地方是改块选中对象颜色没有框选
快捷键bb`   改 ...

谢谢,期待大神完善
页: [1]
查看完整版本: 求一个解决批量修改属性图层的功能