Steven P 发表于 2022-7-5 16:45:25

标题栏属性颜色L

下午好
 
 
我正在编写一个简单的LISP例程,我可以运行它,并根据客户的要求检查/更改绘图层、颜色等。省去了我在浏览图纸时遗漏的一些东西。
 
 
对于标题栏,他们希望所有内容都在“标题”层上,但不同的文本有不同的颜色。所以标题描述可能是黄色的,图纸编号可能是红色的。
 
 
我的想法是将块属性修改为所需的颜色。
 
 
我正在考虑添加一行或2到我的LISP修改文本的颜色。
 
 
我试过使用-attedit,这很好,但我希望用户输入来选择要修改的块属性。
 
 
任何帮助都会很好。
所有标题栏都是相同的,我知道块名和属性名(MyBlock,title\u 1,title\u 2…Number,Project)
 
 
理想的情况是寻找
 
 
(命令(MyBlock,Title\u 1,Color,“1”))
 
将Title_1设置为红色。
 
 
 
 
 
 
听起来很简单,我很确定我只是需要一点帮助。谢谢

Hippe013 发表于 2022-7-5 16:53:25

我可能会这样做。
 
(setq blk (vlax-ename->vla-object (car (entsel "\nSelect Block: "))))
(setq atts (vlax-safearray->list (vlax-variant-value (vlax-invoke-method blk 'GetAttributes)) ))
(setq cnt 0)
(repeat (length atts)
(setq att (nth cnt atts))
(cond
   ((= (vlax-get-property att 'TagString) "TITLE_1")(vlax-put-property att 'Color acred))
   ((= (vlax-get-property att 'TagString) "TITLE_2")(vlax-put-property att 'Color acgreen))
   ((= (vlax-get-property att 'TagString) "TITLE_3")(vlax-put-property att 'Color acblue))
   )
(setq cnt (+ cnt 1))
)

Lee Mac 发表于 2022-7-5 16:55:00

我可能会建议:
(defun c:attcol ( / col lst sel )

   ;; Tags/Colours
   (setq lst '(("TITLE_1" . 1) ("TITLE_2" . 2) ("NUMBER" . 3) ("TAG1" . 4) ("TAG2" . 5)))
   
   (if (setq sel (ssget "_+.:E:S:L" '((0 . "INSERT") (66 . 1))))
       (foreach att (vlax-invoke (vlax-ename->vla-object (ssname sel 0)) 'getattributes)
         (if (setq col (cdr (assoc (strcase (vla-get-tagstring att)) lst)))
               (if (vlax-write-enabled-p att) (vla-put-color att col))
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)

Tharwat 发表于 2022-7-5 17:00:02

李,最后两个IF函数需要什么,只要你能用一个和函数替换它们?

Lee Mac 发表于 2022-7-5 17:07:41

 
给猫剥皮的方法很多。

Grrr 发表于 2022-7-5 17:10:41

这是我的尝试,Phtephen:
 

(defun C:test ( / Lst SS e grp enx )
(setq Lst ; adjust for personal needs
   '( ; assoc list of (<TagName> . <Index Color>) ; note: <TagName> is case sensitive
   ("AttTag1" . 1)
   ("AttTag2" . 2)
   ("AttTag3" . 3)
   ("AttTag3" . 4)
   )
)
(and
   (not (prompt "\nPick the titleblock: "))
   (setq SS (ssget "_+.:E:S:L" '((0 . "INSERT") (66 . 1))))
   (setq e (ssname SS 0))
   (while (/= "SEQEND" (cdr (assoc 0 (entget (setq e (entnext e))))))
   (and
       (setq grp (assoc (cdr (assoc 2 (setq enx (entget e)))) Lst))
       (entmod (append (vl-remove-if '(lambda (x) (member (car x) '(62 420 430))) enx) (list (cons 62 (cdr grp)))))
   )
   )
)
(princ)
)

编辑:该死,李跑得更快!

Tharwat 发表于 2022-7-5 17:16:40

它一定太可爱了。

Steven P 发表于 2022-7-5 17:21:52

谢谢,在周末下班之前,我只有机会尝试第一种方法——效果很好,尽管如此,我将在周一尝试其他两种方法。
 
我可以看出,如果有很多属性需要更改(我想我必须更新11),那么Lees’中的数组将更加整洁,
 
 
如果我预计需要经常或在大型项目中使用此功能,我将研究如何指定要在LISP例程中使用的块(保存一些secomd)-可能会让它修改文件夹中的所有图形。
 
非常感谢

Steven P 发表于 2022-7-5 17:26:12

星期一早上,我尝试了另外两种解决方案——它们效果很好。
 
 
早上很安静,所以我找到了:
(ssget“x”'((0。“INSERT”)(2。“MyBlock”))
替换
(ssget“_+:E:S:L”'((0。“插入”)(66.1)))
因为我只更新每个图形中具有相同名称的1个块。
 
 
现在有了一个命令,我知道所有层都正确设置了,这个块中的颜色都是应该的,使用其他几个LISP,页面设置等都是正确的,完全如我所愿。
 
 
下次见,谢谢

Lee Mac 发表于 2022-7-5 17:29:18

不客气!
 
除此之外,请小心将(2.“MyBlock”)用于动态块,因为块引用是匿名的。
页: [1] 2
查看完整版本: 标题栏属性颜色L