stevesfr 发表于 2022-7-6 08:02:53

 
如果有多个块具有相同的标记,该程序将仅更改拾取块中属性的颜色。其中,使用“attsync”将更改所有类似块的属性颜色。

Tharwat 发表于 2022-7-6 08:05:35

我的错误是,我没有首先测试代码。
 
看看这个。。。。。。。
 

(defun c:test (/ attribute b blk color i lst name obj sn ss do)
;;;;;            Tharwat 01. June. 2012               ;;;;;
;;;;;            This peice of code to change all         ;;;;;
;;;;;selected objects (Blocks / Attribted Block / Objects)   ;;;;;
(if (not acdoc)
   (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
)
(if (and (setq color (acad_colordlg 7 t))
          (setq ss (ssget "_:L"))
   )
   (progn
   (vla-startundomark acdoc)
   (repeat (setq i (sslength ss))
       (setq obj (vlax-ename->vla-object
                   (setq sn (ssname ss (setq i (1- i))))
               )
       )
       (cond
         ((eq (cdr (assoc 66 (entget sn))) 1)
          (progn
            (setq do t)
            (vlax-for block (setq b (vla-item (vla-get-blocks acdoc)
                                              (cdr (assoc 2 (entget sn)))
                                    )
                            )
            (vlax-for x b (vla-put-color x color))
            )
            (foreach attribute (vlax-invoke obj 'Getattributes)
            (vla-put-color attribute color)
            )
          )
         )
         ((and (eq (cdr (assoc 0 (entget sn))) "INSERT")
               (not (member (cdr (assoc 2 (entget sn))) lst))
          )
          (progn
            (setq lst (cons (cdr (assoc 2 (entget sn))) lst))
            (vlax-for block
                      (setq blk (vla-item (vla-get-blocks acdoc)
                                          (cdr (assoc 2 (entget sn)))
                              )
                      )
            (if (eq :vlax-false (vla-get-isXref blk))
                (vlax-for x blk
                  (if
                  (not
                      (eq "AcDbBlockReference" (vla-get-objectname x))
                  )
                     (vla-put-color x color)
                  )
                )
            )
            )
          )
         )
         (t (vla-put-color obj color))
       )
   )
   (if do
       (vl-cmdf "_.attsync"
                "_name"
                (cdr (assoc 2 (entget sn)))
                ""
       )
   )
   (vla-regen acdoc acAllViewports)
   (vla-endundomark acdoc)
   )
   (princ)
)
(princ "\n Written by Tharwat Al Shoufi ")
(princ)
)

stevesfr 发表于 2022-7-6 08:09:51

@塔尔瓦特。。。现在很好。。。非常感谢。
S

Tharwat 发表于 2022-7-6 08:11:24

 
谢谢你Steve

Lee Mac 发表于 2022-7-6 08:15:52

我对您的代码Tharwat有一些评论和警告,请从中吸取您的经验:
 
1)
 
如果用户选择三维多段线会怎样?
 
2)
 
我特别关注你们节目的这两部分。
 
因为,对于选定的每个不同的非属性块或属性块,您首先检索文档块集合,但更令人担忧的是,您正在重复迭代块定义中包含的每个对象,迭代次数等于块中对象的数量。
 
这是您的代码当前正在执行的操作:
 
因此,如果一个块包含100个对象(并非罕见,如果有任何情况,这可能是一个较低的估计值),代码将在10000个对象上迭代,因为每个对象被处理100次。。。!!!
 
3)
 
由于AttSync操作更新块引用以反映对块定义内属性所做的任何更改,因此此过程只需执行一次,而不是针对每个块引用。
 
编辑:我看到你已经更新了你的代码来解决这个问题,因为写这篇文章。

Lee Mac 发表于 2022-7-6 08:19:37

值得一提的是,附件是我对这项任务的看法。
 
附加的程序将允许用户修改图形中定义的多个块内所有对象(位于解锁层上)的颜色特性。
 
该程序将使用标准块、属性块和动态块。
 

BlockColorV1-0。lsp

LISP2LEARN 发表于 2022-7-6 08:20:10

谢谢李,这很好用。Tharwat的代码和你的代码产生了相同的结果,但将用于不同的场景。你的两个代码将使我的生活更轻松。现在我只需要将其重命名为“BCT”和“BCL”,我是一个快乐的球童。
 
请注意,您将其命名为bcolor_2;1.0版。这是否意味着您稍后将改进此代码并将其添加到您的程序(网站)?如果是这样,是否可以添加最后选定块的预览。我不需要它,但它可能会很酷。再次感谢各位!
 

Tharwat 发表于 2022-7-6 08:24:45

 
哎呀,我忘了3D多边形。
 
 
这是正确的,它的循环比需要的要多。所以今天晚些时候我会继续研究,然后再回来。
 
谢谢

Tharwat 发表于 2022-7-6 08:27:31

我认为现在效率要高得多。。。。
 
5

pBe 发表于 2022-7-6 08:32:07

快速查看您的代码:
 
建议您交换订单。首先选择对象,然后提示输入颜色:
当前代码无法在选择时根据匿名名称识别有效名称:
页: 1 [2]
查看完整版本: 块颜色