乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 9|回复: 9

[编程交流] 使用lisp创建层

[复制链接]

55

主题

118

帖子

65

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
273
发表于 2022-7-6 07:51:33 | 显示全部楼层 |阅读模式
我需要覆盖这么多图纸中的图层。我想用这个代码可以解决这个问题:
 
  1. (setq layers (list "005_DIMENSION" "off" "thaw" "unlock" "255" "255" "255" "Continuous" "-3" "CHBL_01" "dimensions"))
  2. (entmake (list (cons 0 "LAYER")
  3.           (cons 100 "AcDbSymbolTableRecord")
  4.           (cons 100 "AcDbLayerTableRecord")
  5.           (cons 2 (car layers))
  6.           (cons 70 0)
  7.     )
  8. )
  9. (setq layers (cdr layers))
  10. (if (= (car layers) "on")
  11. (setq test ':vlax-true)
  12. (setq test ':vlax-false)
  13. )
  14. (vla-put-layeron
  15. (vlax-ename->vla-object
  16.    (tblobjname "LAYER" (car layers))
  17. )
  18. (princ test)
  19. )

 
最后的问题是,我无法/读取/添加lisp中符号的值(称为测试)
 
有人能帮我吗?
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:03:20 | 显示全部楼层
您应该检查此行:
请注意,您已经从列表中删除了图层名称上方的内容:
  1. (setq layers (cdr layers))

 
我建议寻找第n个函数来访问列表中的项目。或者更好的方法是构建一个伪字典(点对列表),而不是依赖于项目的位置。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 08:07:11 | 显示全部楼层
 
覆盖的意思是,如果图层处于打开状态,则将其关闭,反之亦然?
 
使用foreach函数,这样您就不需要(汽车层)和(cdr层)来跟踪层名称和当前状态。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 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文件意味着您可以添加更改或删除,只需简单地再次运行即可。
回复

使用道具 举报

55

主题

118

帖子

65

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
273
发表于 2022-7-6 08:21:19 | 显示全部楼层
非常感谢大家。仍然没有解决我的问题,因为我无法通过autolisp向每个层添加描述?这是我尝试使用这个程序的唯一原因:
 
  1. (setq layers (list "005_DIMENSION"           "off"
  2.           "thaw"     "unlock"      "255"
  3.           "255"     "255"           "Continuous"
  4.           "-3"         "TEST_01"     "dimensions FOR ALL DRAWINGS"
  5.          )
  6. )
  7. (entmake (list (cons 0 "LAYER")
  8.           (cons 100 "AcDbSymbolTableRecord")
  9.           (cons 100 "AcDbLayerTableRecord")
  10.           (cons 2 (car layers))
  11.           (cons 70 0)
  12.     )
  13. )
  14. (setq layers (cdr layers))
  15. (if (= (car layers) "on")
  16. (setq test ':vlax-true)    ;;;;;;here I am trying to add the value from a sym to a variable
  17. (setq test ':vlax-false)    ;;;;;;here I am trying to add the value from a sym to a variable
  18. )
  19. (vla-put-layeron
  20. (vlax-ename->vla-object
  21.    (tblobjname "LAYER" (car layers))
  22. )
  23. (eval (vl-symbol-value test))
  24. )
  25. (vla-put-layeron
  26. (vlax-ename->vla-object
  27.    (tblobjname "LAYER" (car layers))
  28. )
  29. (eval test)            ;;;;;;here I want to read the variable's value from the symbol
  30. )

 
我在开始时创建的列表只是一个占位符,因为我实际上是从包含所有图层和条件列表的CSV文件中读取这些值。正如我所说的,主要问题是我无法添加描述。
 
再次感谢大家
回复

使用道具 举报

55

主题

118

帖子

65

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

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

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:31:44 | 显示全部楼层
这对我来说没问题,但是您应该找到一种不同的方法来为TBLOBJNAME函数提供层名称。代码摘录:
  1. (tblobjname "LAYER" [color=red](car layers)[/color])
回复

使用道具 举报

55

主题

118

帖子

65

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
273
发表于 2022-7-6 08:44:28 | 显示全部楼层
我做不到,知道吗?
 
  1. (setq test ':vlax-false)
  2. )
  3. (vla-put-layeron
  4. (vlax-ename->vla-object
  5.    (tblobjname "LAYER" "0")
  6. )
  7. (eval test) ;;;;;; Here it is the mistake
  8. )

 
如果我这样说,它会起作用
  1. (vla-put-layeron
  2. (vlax-ename->vla-object
  3.    (tblobjname "LAYER" "0")
  4. )
  5. :vlax-false ;;;;;; I cannot make this work, any idea?
  6. )

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

使用道具 举报

55

主题

118

帖子

65

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
273
发表于 2022-7-6 08:47:30 | 显示全部楼层
我终于这样解决了。。。无论如何谢谢你
 
  1. (defun tttt () ':vlax-false)
  2. (vla-put-layeron
  3. (vlax-ename->vla-object
  4.    (tblobjname "LAYER" "0")
  5. )
  6. (tttt)
  7. )
回复

使用道具 举报

55

主题

118

帖子

65

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
273
发表于 2022-7-6 08:53:56 | 显示全部楼层
MSasu,非常感谢,我完全错了,因为我没有从层中取名称,我试图将其关闭层“关闭”。这是可行的:
  1. 8
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-9 21:57 , Processed in 0.824618 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表