svorgodne 发表于 2022-7-6 07:51:33

使用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中符号的值(称为测试)
 
有人能帮我吗?

MSasu 发表于 2022-7-6 08:03:20

您应该检查此行:
请注意,您已经从列表中删除了图层名称上方的内容:
(setq layers (cdr layers))
 
我建议寻找第n个函数来访问列表中的项目。或者更好的方法是构建一个伪字典(点对列表),而不是依赖于项目的位置。

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

 
覆盖的意思是,如果图层处于打开状态,则将其关闭,反之亦然?
 
使用foreach函数,这样您就不需要(汽车层)和(cdr层)来跟踪层名称和当前状态。

BIGAL 发表于 2022-7-6 08:13:40

也许另一种方法是使用脚本,只使用autocad命令
 
例如,m C layer1 1 LT layer1虚线
_层m C层2 1 LT层2连续
 
使用m来实现这种方式,如果层存在,则更改层,如果不存在,则添加层
 
这将改变图层设置,你只需要一个图层名的主列表,你也可以进行重命名,你也可以在脚本中执行lisp,比如说,如果图层存在,做些什么。我建议这样做比创建长层列表语句更容易。另一种方法是在与entmake相同的lisp中使用相同的_layer语句,但不必担心是否保留了放样,而是逐行读取文本文件,只需替换文件中所需的响应即可。在Excel中设置并导出CSV文件。这里有一些示例。我还使用了一个固定长度的txt文件,以便知道有多少个字符=图层名称颜色编号LT等等。使用txt文件意味着您可以添加更改或删除,只需简单地再次运行即可。

svorgodne 发表于 2022-7-6 08:21:19

非常感谢大家。仍然没有解决我的问题,因为我无法通过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文件中读取这些值。正如我所说的,主要问题是我无法添加描述。
 
再次感谢大家

svorgodne 发表于 2022-7-6 08:28:23

是的,MSasu,我知道我去掉了图层名,这正是我想要的,因为我现在读到列表的第二个实体,在我的CSV文件中,它是“off”,这是我想要添加到图层的值,等等。。。
最后,我在顶部用以下值配置了CSV文件:
 
“名称;开/关;冻结/解冻;锁定/解锁;r;g;b;线型;线宽;打印样式;描述”
 
让他们每行都被读取,这样我就可以用CSV文件中的图层值覆盖每个图形中的当前图层值。
 
再次感谢

MSasu 发表于 2022-7-6 08:31:44

这对我来说没问题,但是您应该找到一种不同的方法来为TBLOBJNAME函数提供层名称。代码摘录:
(tblobjname "LAYER" (car layers))

svorgodne 发表于 2022-7-6 08:44:28

我做不到,知道吗?
 

(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?
)

 
这是我要解决的问题。
 
再次提前感谢
塞尔吉奥

svorgodne 发表于 2022-7-6 08:47:30

我终于这样解决了。。。无论如何谢谢你
 

(defun tttt () ':vlax-false)
(vla-put-layeron
(vlax-ename->vla-object
   (tblobjname "LAYER" "0")
)
(tttt)
)

svorgodne 发表于 2022-7-6 08:53:56

MSasu,非常感谢,我完全错了,因为我没有从层中取名称,我试图将其关闭层“关闭”。这是可行的:
8
页: [1]
查看完整版本: 使用lisp创建层