乐筑天下

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

[编程交流] Lisp来排序我们不存在的

[复制链接]

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 16:02:02 | 显示全部楼层 |阅读模式
你好
 
首先,我对lisp很陌生(一周的自学,以创建我的第一个自动化),但在这一点上我被卡住了
 
我的用例:
我从一家供应商那里得到了一张图纸,想根据图层修改一些对象。不幸的是,我只有一个我感兴趣的图层列表,可能在图纸中,但并非所有图层都在该供应商的每张图纸中。另外,图形中的一些对象位于图层上,不需要修改
 
更好理解的示例:
要修改的图层位于列表中:
(setq ltbm(列表“131”“144”“154”“204”“家具”“水”)
 
第一个图形中有以下图层:
(列出“1”“17”“131”“204”“石头”“家具”)
第二个图形使用了其他图层:
(列出“5”“76”“144”“154”“204”“空气”“水”)
 
问题是:
第一:
我需要找出使用了哪个有趣的层。
在第一种情况下:
(列出“131”“204”“家具”)
在第二种情况下:
(列出“144”“154”“204”“水”)
 
其次:
我需要选择该层上的所有对象。如果我手动执行选择命令。
第一种情况是:
(ssget mod(ssget“_X”'(-4.))
在第二种情况下:
(ssget mod(ssget“_X”'(-4.))
 
有了选择集mod,我可以自己继续。
 
所以我的问题是:
如何找出图形中使用的图层。而不是如何得到我感兴趣的层子集。以及如何在这些层上选择对象。
 
我希望有人能帮我。非常感谢。
 
顺致敬意,
马库斯
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:05:46 | 显示全部楼层
ssget过滤器可以包含图形中不存在的图层。你尝试做的很多事情都是不必要的。但通常建议检查ssget是否返回选择集而不是nil:
  1. (if (setq mod (ssget "_X" (8 . "131,144,154,204,Furniture,Water")))
  2. (progn
  3.    ; Do something
  4. )
  5. )
要检查层是否存在,可以使用以下选项:
  1. (tblobjname "layer" "Water")
回复

使用道具 举报

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 16:11:35 | 显示全部楼层
哦,真的。它的工作没有那么恶劣或太。当我试图在代码中放置一些不存在的层时,它返回了一个错误。看来我回到公司后还要再检查一遍
如果解决方案这么简单,那就太好了!!
提前谢谢!!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:12:12 | 显示全部楼层
你可以使用你的图层列表,在警报中添加一点Roy_043建议,你可以添加图层等。
 
  1. (setq ltbm (list "131" "144" "154" "204" "Furniture" "Water"))
  2. (repeat (setq x (length ltbm))
  3. (setq chk (tblobjname "layer" (nth (setq x (- x 1)) ltbm)))
  4. (if (= chk nil)
  5. (Alert (strcat "your layer " (nth x ltbm) "  " "is missing"))
  6. (princ (strcat "\n" (nth x ltbm)))
  7. )
  8. )
回复

使用道具 举报

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 16:17:47 | 显示全部楼层
哦,不,如果我使用Roy_043建议的代码,我在加载lisp时会出错。
腐败的参数类型:consp“131,144,154,204,家具,水”
 
如何解决这个问题?
回复

使用道具 举报

76

主题

312

帖子

254

银币

后起之秀

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

铜币
390
发表于 2022-7-5 16:20:54 | 显示全部楼层
这段代码对找到的层上的所有对象进行处理,定义为“mod”
 
  1. (defun C:CadTutor ( / )
  2. (setq layerslist (list "layer1" "layer2" "layer3" "layer4"))
  3. (foreach layer layerslist
  4.         (if (/= (tblsearch "LAYER" layer) nil)
  5.                 (progn
  6.                         (setq mod (ssget "_X" (list (cons 8 layer)))) ; selects all object on the found layers
  7.                                 ; Code here to do something with the found layers
  8.                 )
  9.                 (progn
  10.                         (princ (strcat "\nLayer: " layer " not found in drawing"))
  11.                 )
  12.         )
  13. )
  14. (princ)
  15. )
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:23:08 | 显示全部楼层
哎呀,我的错。代码应为:
  1. (if (setq mod (ssget "_X" '((8 . "131,144,154,204,Furniture,Water"))))
  2. (progn
  3.    ; Do something
  4. )
  5. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:27:13 | 显示全部楼层
 
很好。
 
我刚刚评论了一些语句/代码供您参考,希望您不要介意。
 
回复

使用道具 举报

13

主题

55

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 16:29:34 | 显示全部楼层
不幸的是,罗伊的解决方案并没有像预期的那样奏效。它总是返回零。可能是因为它正在寻找一个在引号中包含字符的层。但Aftertouch提出的方法对我来说很有效。非常感谢!
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:32:32 | 显示全部楼层
@Ament:
我不理解你的评论。ssget过滤器中的层与OP中您提供的层匹配。当然,如果它们不再适用,您必须更改它们。当然,你必须在我写的“做点什么”的地方添加代码。复制粘贴代码将返回零。
尝试:
  1. (if (setq mod (ssget "_X" '((8 . "131,144,154,204,Furniture,Water"))))
  2. (progn
  3.    (princ (strcat "\n" (itoa (sslength mod)) " entities in selection set "))
  4.    (princ)
  5.    ; Do something
  6. )
  7. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 21:06 , Processed in 0.437576 second(s), 83 queries .

© 2020-2025 乐筑天下

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