使用lisp创建层
我需要覆盖这么多图纸中的图层。我想用这个代码可以解决这个问题:(setq layers (list "005_DIMENSION" "off" "thaw" "unlock" "255" "255" "255" "Continuous" "-3" "CHBL_01" "dimensions"))
(entmake (list (cons 0 "LAYER")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 (car layers))
(cons 70 0)
)
)
(setq layers (cdr layers))
(if (= (car layers) "on")
(setq test ':vlax-true)
(setq test ':vlax-false)
)
(vla-put-layeron
(vlax-ename->vla-object
(tblobjname "LAYER" (car layers))
)
(princ test)
)
最后的问题是,我无法/读取/添加lisp中符号的值(称为测试)
有人能帮我吗? 您应该检查此行:
请注意,您已经从列表中删除了图层名称上方的内容:
(setq layers (cdr layers))
我建议寻找第n个函数来访问列表中的项目。或者更好的方法是构建一个伪字典(点对列表),而不是依赖于项目的位置。
覆盖的意思是,如果图层处于打开状态,则将其关闭,反之亦然?
使用foreach函数,这样您就不需要(汽车层)和(cdr层)来跟踪层名称和当前状态。 也许另一种方法是使用脚本,只使用autocad命令
例如,m C layer1 1 LT layer1虚线
_层m C层2 1 LT层2连续
使用m来实现这种方式,如果层存在,则更改层,如果不存在,则添加层
这将改变图层设置,你只需要一个图层名的主列表,你也可以进行重命名,你也可以在脚本中执行lisp,比如说,如果图层存在,做些什么。我建议这样做比创建长层列表语句更容易。另一种方法是在与entmake相同的lisp中使用相同的_layer语句,但不必担心是否保留了放样,而是逐行读取文本文件,只需替换文件中所需的响应即可。在Excel中设置并导出CSV文件。这里有一些示例。我还使用了一个固定长度的txt文件,以便知道有多少个字符=图层名称颜色编号LT等等。使用txt文件意味着您可以添加更改或删除,只需简单地再次运行即可。 非常感谢大家。仍然没有解决我的问题,因为我无法通过autolisp向每个层添加描述?这是我尝试使用这个程序的唯一原因:
(setq layers (list "005_DIMENSION" "off"
"thaw" "unlock" "255"
"255" "255" "Continuous"
"-3" "TEST_01" "dimensions FOR ALL DRAWINGS"
)
)
(entmake (list (cons 0 "LAYER")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 (car layers))
(cons 70 0)
)
)
(setq layers (cdr layers))
(if (= (car layers) "on")
(setq test ':vlax-true) ;;;;;;here I am trying to add the value from a sym to a variable
(setq test ':vlax-false) ;;;;;;here I am trying to add the value from a sym to a variable
)
(vla-put-layeron
(vlax-ename->vla-object
(tblobjname "LAYER" (car layers))
)
(eval (vl-symbol-value test))
)
(vla-put-layeron
(vlax-ename->vla-object
(tblobjname "LAYER" (car layers))
)
(eval test) ;;;;;;here I want to read the variable's value from the symbol
)
我在开始时创建的列表只是一个占位符,因为我实际上是从包含所有图层和条件列表的CSV文件中读取这些值。正如我所说的,主要问题是我无法添加描述。
再次感谢大家 是的,MSasu,我知道我去掉了图层名,这正是我想要的,因为我现在读到列表的第二个实体,在我的CSV文件中,它是“off”,这是我想要添加到图层的值,等等。。。
最后,我在顶部用以下值配置了CSV文件:
“名称;开/关;冻结/解冻;锁定/解锁;r;g;b;线型;线宽;打印样式;描述”
让他们每行都被读取,这样我就可以用CSV文件中的图层值覆盖每个图形中的当前图层值。
再次感谢 这对我来说没问题,但是您应该找到一种不同的方法来为TBLOBJNAME函数提供层名称。代码摘录:
(tblobjname "LAYER" (car layers)) 我做不到,知道吗?
(setq test ':vlax-false)
)
(vla-put-layeron
(vlax-ename->vla-object
(tblobjname "LAYER" "0")
)
(eval test) ;;;;;; Here it is the mistake
)
如果我这样说,它会起作用
(vla-put-layeron
(vlax-ename->vla-object
(tblobjname "LAYER" "0")
)
:vlax-false ;;;;;; I cannot make this work, any idea?
)
这是我要解决的问题。
再次提前感谢
塞尔吉奥 我终于这样解决了。。。无论如何谢谢你
(defun tttt () ':vlax-false)
(vla-put-layeron
(vlax-ename->vla-object
(tblobjname "LAYER" "0")
)
(tttt)
)
MSasu,非常感谢,我完全错了,因为我没有从层中取名称,我试图将其关闭层“关闭”。这是可行的:
8
页:
[1]