Apache2k 发表于 2022-7-6 06:53:18

按ACI拆分层

大家好,
我又提了一个奇怪的问题。
 
是否可以通过script/lisp实现这一点。
 
我有一个dwg模型。
 
模型有层,但层中有不同颜色的实体。
 
例如:
层名称=屋顶;实体颜色=256(3dsolid)
层名称=屋顶;实体颜色=83(3dsolid)
 
是否可以将其转换为:
 
新图层名=“roof 256”(包含颜色为256且图层名为roof的图元)
新图层名=“roof 83”(包含颜色为83且图层名为roof的图元)
 
 
我知道这听起来似乎没有逻辑,但确实如此
 
谢谢

marko_ribar 发表于 2022-7-6 07:00:29

当然有可能。。。当您创建新层并将对象按颜色更改为驻留在适当的对应层中时,我建议您也将新层的颜色更改为与命名的颜色完全相同,并且最终可以将所有对象的颜色更改为“BYLAYER”-颜色256-对象将采用层颜色。。。
 
请注意,“Roof 256”层无法装箱,因为256色不存在。。。

BlackBox 发表于 2022-7-6 07:05:58


(vl-load-com)

(defun c:FOO (/ *error* ss acDoc layerName)

(defun *error* (msg)
   (if acDoc (vla-endundomark acDoc))
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** ")))                  ; Fatal error, display it
   )
   (princ)
)

(if (setq ss (ssget "_:L"))
   (progn
   (vla-startundomark
       (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
   )
   (vlax-for x (setq ss (vla-get-activeselectionset acDoc))
       (if
         (not (tblsearch "layer"
                         (setq layerName (strcat (vla-get-layer x)
                                                 " "
                                                 (itoa (vla-get-color x))
                                       )
                         )
            )
         )
          (vla-add (vla-get-layers acDoc) layerName)
       )
       (vla-put-layer x layerName)
   )
   (vla-delete ss)
   )
)
(*error* nil)
)

BlackBox 发表于 2022-7-6 07:10:01

 
这只是一个虚假的陈述,马尔科。。。在属性中设置为“ByLayer color”的任何图元上使用此选项:
 

(vla-get-color (vlax-ename->vla-object (car (entsel))))

Apache2k 发表于 2022-7-6 07:13:09

谢谢谢谢:)工作100%救了我一天。

BlackBox 发表于 2022-7-6 07:17:52

 
不客气;我很乐意帮忙。

marko_ribar 发表于 2022-7-6 07:21:00

 
是的,但在“Roof 256”层中创建了具有256色的对象后,原始层“Roof”将为空。。。

Lee Mac 发表于 2022-7-6 07:23:29

我提议:
(defun c:layerbycolor ( / c e i s )
   (if (setq s (ssget "_:L"))
       (repeat (setq i (sslength s))
         (setq e (entget (ssname s (setq i (1- i)))))
         (if (setq c (cdr (assoc 62 e)))
               (entmod (subst (cons 8 (strcat (cdr (assoc 8 e)) " " (itoa c))) (assoc 8 e) e))
         )
       )
   )
   (princ)
)

marko_ribar 发表于 2022-7-6 07:27:40

RenderMan的代码很好。。。我稍微修改了一下:
 

(vl-load-com)

(defun c:splitlayersbycolor (/ *error* ss acDoc layerName)

(defun *error* (msg)
   (if acDoc (vla-endundomark acDoc))
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** ")))                  ; Fatal error, display it
   )
   (princ)
)

(if (setq ss (ssget "_:L"))
   (progn
   (vla-startundomark
       (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
   )
   (vlax-for x (setq ss (vla-get-activeselectionset acDoc))
       (if
         (not (tblsearch "layer"
                         (setq layerName (strcat (vla-get-layer x)
                                                 " "
                                                 (itoa (vla-get-color x))
                                       )
                         )
            )
         )
         (progn
         (vla-add (vla-get-layers acDoc) layerName)
         (vla-put-truecolor (vla-item (vla-get-layers acDoc) layerName) (vla-get-truecolor x))
         (vla-put-color x 256)
         )
       )
       (vla-put-layer x layerName)
   )
   (vla-delete ss)
   )
)
(*error* nil)
)

 
M、 R。
 
现在,通过拆分创建的层中的对象都具有颜色“ByLayer”,并且拆分层的颜色已更改为引用实体的颜色,就像我在上一篇文章中解释的那样。。。

BlackBox 发表于 2022-7-6 07:36:08

 
我不争辩逻辑,我同意你。。。但是(1)这不是OP(最初)要求的,(2)这与你之前所做的错误陈述无关。
页: [1] 2
查看完整版本: 按ACI拆分层