aggie_moose 发表于 2022-7-5 22:48:00

更改表格属性

大家好,
 
 
我想在这里做一件简单的事,但我想不出来。我正在尝试将图形中所有表格的默认文本颜色更改为黑色。我可以通过选择每个表,转到“属性”,然后将列表顶部的“颜色”属性更改为黑色(如附件中的“ByLayer”图片),但我正在尝试在autolisp中执行此操作
 
 

(vlax-for
tablestyle
(vla-item (vla-get-Dictionaries (vla-get-ActiveDocument (vlax-get-acad-object))) "acad_tablestyle")
(vlax-put-property tablestyle 'Color 0 0 0)
)

 
 
上面是我尝试改变桌子的样式(似乎比浏览每张桌子都要容易),但玩了几个小时后,我仍然一事无成。有人能给我指出正确的方向吗?

Tharwat 发表于 2022-7-5 22:59:52

如果我答对了,如果您试图更改图形中已经存在的多个表的颜色,只需创建一个全局选择集并迭代每个表对象,然后使用函数vla put color更改颜色,并使用所需的颜色。
 
HTH。

aggie_moose 发表于 2022-7-5 23:04:13

我原以为更改样式会更容易,但你说得对-在选择集中循环要容易得多。谢谢你的想法!
 
 
任何感兴趣的人的解决方案:
 
 

(vl-load-com)
(if (setq sset (ssget "X" '((0 . "ACAD_TABLE"))))
(progn
   (setq ctr 0)
   (repeat (sslength sset)
      (setq item (ssname sset ctr))
      (setq item (vlax-ename->vla-object item))
      (setq check (vlax-property-available-p item "Color" T))
      (if check
         (vlax-put-property item 'Color 0)
      )
      (setq ctr (1+ ctr))
   )
)
(princ)
)

Tharwat 发表于 2022-7-5 23:08:19

仔细看看这个。
 

(defun c:Test (/ ss i vl)
(if (setq ss (ssget "_X" '((0 . "ACAD_TABLE"))))
   (repeat (setq i (sslength ss))
   (if (vlax-write-enabled-p (setq vl (vlax-ename->vla-object (ssname ss (setq i (1- i))))))
       (vla-put-color vl 0)
   )
   )
)
(princ)
)(vl-load-com)

aggie_moose 发表于 2022-7-5 23:20:28

除了检查块是否已启用写之外,看起来与我发布的内容相同。我不希望区块受到保护,但我认为最好检查一下。
 
 
我注意到的一件事是,这对块内的表不起作用:/但希望不会发生这种情况

Tharwat 发表于 2022-7-5 23:25:16

 
尝试此例程,阅读例程顶部的注释以了解更多信息。
 

(defun c:Test (/ doc ss i vl)
;;    Tharwat 08.July.2014      ;;
;; Function to change the color of   ;;
;; AutoCAD Tables in all layouts and   ;;
;; Blocks as well .            ;;
;;    -----------------------------    ;;
;; Tables on LOCKED layers should   ;;
;; be ignored             ;;
(defun *error* (msg)
   (and doc (vla-endundomark doc))
   (if (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")
   (princ msg)
   (princ (strcat "\n** Error: " msg " **"))
   )
   (princ)
)
(vla-startUndomark (setq doc (vla-get-activedocument (vlax-get-acad-object))))
(if (ssget "_X" '((0 . "ACAD_TABLE")))
   (progn (vlax-for tbl (setq ss (vla-get-activeselectionset doc))
            (if (vlax-write-enabled-p tbl)
            (vla-put-color tbl 0)
            )
          )
          (vla-delete ss)
   )
)
(vlax-for bks (vla-get-blocks doc)
   (if (and (eq :vlax-false (vla-get-isxref bks)) (eq :vlax-false (vla-get-islayout bks)))
   (vlax-for bk bks
       (if (and (eq (vla-get-objectname bk) "AcDbTable") (vlax-write-enabled-p bk))
         (vla-put-color bk 0)
       )
   )
   )
)
(vla-regen doc AcAllviewports)
(vla-endundomark doc)
(princ)
)(vl-load-com)

aggie_moose 发表于 2022-7-5 23:32:21

有道理;首先更改所有表,然后查看块内部并在那里更改表。我对vla get blocks命令不太了解,看起来我需要仔细阅读它。
 
在调用vlax命令时,重新定义错误函数有什么特别的原因吗?或者这只是标准过程吗?

Tharwat 发表于 2022-7-5 23:39:09

 
很好。
 
 
一个很好的问题。
 
实际上,我添加了error函数来确保如果发生任何错误,那么error函数应该结束已经启动的start undo标记。

Lee Mac 发表于 2022-7-5 23:43:50

 
由于模型空间和图纸空间块包含在文档的块集合中,因此不需要单独检索和迭代非嵌套表的选择集:
还要注意,ACI颜色0是ByBlock,而不是黑色-对于黑色,您需要使用真彩色。

Tharwat 发表于 2022-7-5 23:50:02

谢谢李的留言。
 
是的,我完全忘记了用块集合迭代空间的方法。
页: [1]
查看完整版本: 更改表格属性