jweber 发表于 2022-7-5 16:33:48

外部参照操作-更改la

首先,以下代码归功于Mike。佩里@http://forums.augi.com/showthread.php?5547-将块图元颜色更改为bylayer&p=32836&viewfull=1#post32836和T.Willey@http://forums.augi.com/showthread.php?62996-更改外部参照层颜色&p=719686&viewfull=1#post719686
 
使用上述两个代码,我编写了以下lisp以满足我的需要=1。允许多个选定的外部参照受到影响2。冻结所有选定外部参照3中的图层集列表。将所有层颜色都设置为15,除了少数@颜色13和4。将选定外部参照中的所有图元更改为“颜色随层”,但特别是忽略了几个嵌套的外部参照(剖切、栅格)。
 
(defun c:xr-elec (/ sset ctr xr2 xr3 xr4 xr5 xr6 tx1 xclr ocmd llist temp1 layfzn)
; Change all the layers of an xref to specified color.
(vl-load-com)
(setq ocmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "_.undo" "_end")
(command "_.undo" "_group")
(prompt "\nSelect xref(s) to convert to ELEC: ")
(if (setq sset (ssget))
   (progn
   (setq ctr 0)
   (repeat (sslength sset)
       (setq xr1 (ssname sset ctr))
       (if xr1
         (progn
         (setq xr2 (entget xr1))
         (setq tx1 (cdr (assoc 0 xr2)))
         (if
             (and
               (= tx1 "INSERT")
                (setq xr3 (cdr (assoc 2 xr2)))
                    (setq xr4 (tblsearch "block" xr3))
                      (setq xr5 (cdr (assoc 1 xr4)))
                  )
             (progn
               (setq xclr 15) ;;SET LAYER COLOR
               (if (assoc 62 xr2)
               (entmod (subst (cons 62 xclr) (assoc 62 xr2) xr2))
               (entmod (append xr2 (list (cons 62 xclr))))
               )
               (setq xr6 (strcat xr3 "|"))
               (setq llist (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
               (vlax-for item llist
               (if (vl-string-search xr6 (vlax-get item 'Name))
                   (progn
                     (setq temp1 (vlax-get item 'TrueColor))
                     (vlax-put temp1 'ColorIndex (rtos xclr 2 0))
            (vlax-put item 'TrueColor temp1)
                   )
               )
                )
      ;change all entities within xrefs to color bylayer, omitting <section,grid> nested xrefs
      (command "_.xref" "unload" "section*,grid")
               (blocksbylayer xr1)
      (command "_.xref" "reload" "section*,grid")
             )
         (prompt "\nNot an xref"))
         )
       )
   (setq ctr (1+ ctr)))
   ) (princ)
)
(command "_.undo" "_end")
;freeze list of layers
(setq layfzn "0,*|AREA,*|DIM*,*|DOOR TAG*,*|KEY NOTES,*|LINE-CENTER,*|NO PLOT,
   *|POCHE-FLOOR*,*|SYMBOL-*,*|SYMBOL_*,*|SYMBOL *,*|TEXT*,*|WINDOW TAG*,*|SECTION CUTS-96,
   *|GRID-96")
(command "_.layer" "freeze" layfzn "")
;change a few specific layer colors
(command "_.layer" "color" 13 "*|wall_shade,*|poche-roof*" "")
(setvar "cmdecho" ocmd)
(princ)
)


(defun blocksbylayer (xr1 / ELST ENAM ESEL BNAM FLST)
(setq ELST (entget xr1)
       BNAM (cdr (assoc 2 ELST))
FLST nil
)
(fix1 BNAM)
(vl-cmdf "regen")
(princ)
)


(defun FIX1 (BNAM / BENAM)
(if (not (member BNAM FLST))
   (progn
   (setq FLST(cons BNAM FLST)
    BENAM (tblobjname "block" BNAM))
   (while
(setq BENAM (entnext BENAM))
        ;(print (entget BENAM))
       (if (= (cdr (assoc 0 (entget BENAM))) "INSERT")
         (fix1 (cdr (assoc 2 (entget BENAM))))
         (vla-put-color (vlax-ename->vla-object BENAM) 256)
       )
   )
   )
)
)
 
这是我的问题——将实体(块)更改为逐层颜色的代码,两者都是Mike发布的原始代码。Perry和我的lisp(defun blocksbylayer)中修改过的代码--做他们想要做的事--直到关闭并重新打开我正在处理的文件,此时所有更改为“颜色bylayer”的实体都返回到强制颜色。。。。我对原因感到困惑。
 
我显然不擅长编写代码,但我想学习,讨厌盲目寻求帮助——因此采用了黑客和合并的方法,但我在这个项目中已经达到了一个地步,我真的没有想法了,所以欢迎任何和所有的建议。谢谢

Jef! 发表于 2022-7-5 16:51:59

你好!
 
我时不时地寻找没有答案的线索,并试图帮助解决问题。他们说迟做总比不做好。
 
 
在我看来,系统变量visretain设置为0,需要将其设置为1。Visretain控制x-ref相关图层的lt、颜色、lw、可见性和打印样式。如果visretain设置为0,则任何更改将仅保留在当前会话中。重新打开容器dwg将从外部参照重新加载图层设置。如果visretain设置为1,则对x-ref相关图层的图层设置所做的任何更改都将保存在容器图形中,如果关闭并重新打开,则这些更改将持续存在。
 
我希望这有帮助。

jweber 发表于 2022-7-5 17:15:19

嘿,杰夫,谢谢你的回复。
 
在这篇文章以及更多挖掘之后,使用代码强制外部参照中的实体按层着色只会持续到外部参照通过关闭和重新打开或在外部参照管理器中手动重新加载为止。没办法。
 
也就是说,autocad有一个新的(er)系统变量XREFOVERRIDE,它强制所有外部参照中的所有图元按层着色。如果只希望特定图元或特定外部参照按颜色层显示,则该选项不太有用。
 
我很高兴被纠正,但据我所知,至少目前没有办法。再次感谢您的回复。

Jef! 发表于 2022-7-5 17:33:40

我目前在2015年,没有XREFOVERRIDE变量。但是如果它是一个可以改变的变量,对吗?
 
我要尝试的是,在容器绘图中,
关闭外部参照覆盖
将VISRETAIN设置为1
对外部参照相关图层进行更改
保存容器图形。
 
关闭并重新打开容器图形后,在依赖外部参照的图层上进行的所有替代都应保留在容器图形中。

Dadgad 发表于 2022-7-5 17:47:25

 
+1对我来说,这听起来是个好方法。
 
如果不解决您的问题,您可能还想使用SYSVDLG命令访问XREFOVERRIDE的所有相关变量选项,可能还有一些其他选项可用。
页: [1]
查看完整版本: 外部参照操作-更改la