乐筑天下

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

[编程交流] 一个简单的选择集LISP go

[复制链接]

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 08:03:37 | 显示全部楼层 |阅读模式
我以为我在写一个简单的lisp例程,然后就出了问题。。。
 
开始前提:
通过单击构建一个选择集,该选择集将选择包含TRANS一词的任何层上的所有块(这些是具有匿名名称的动态块,因此为简单起见,选择层),但忽略任何冻结层。lisp需要保留选中的项目,以便绘图者可以在“属性”窗口中更改公共属性。这在quickselect中很简单,但操作员希望只需单击或键入单词即可完成。
 
下面是代码的工作行。它会选择所有正确的内容,但不会让选择集处于选中状态。然后,用户必须键入SELECT,P以使集合恢复运行。
 
  1. (command "._select" (ssget "A" '((8 . "*TRANS*"))))

 
然后我把这行代码转换成程序格式(或者不管它的技术名称是什么),现在当我测试它时,它冻结了。我很确定我没有在某个地方结束一个循环。
 
  1. (defun c:TRANS (/ sstrans)
  2. (setq sstrans (command "._select" (ssget "A" '((8 . "*TRANS*")))))
  3. (princ)
  4. )

 
我不敢相信这一行简单的代码让我如此悲伤。我确信我错过了一些非常简单的事情。最后,我在各自的层上有5-6个不同的块,我需要为它们构建选择集。我已附上我的测试图纸。我计划使用一个lisp文件,只需单击工具栏上的一个按钮,即可从中运行所有不同的sel集。
 
我非常感谢有人指出我遗漏的任何明显的东西。
 
细节:在Civil 2011上运行,所有块都是动态的w/*U名称
trans\u pole\u测试。图纸
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:14:15 | 显示全部楼层
SELECT命令是重复的,因此它希望关闭选择过程;您还可以为实体类型添加额外的过滤器,因为您只查找块:
  1. (defun c:TRANS ( / sstrans)
  2. (setq sstrans (command "._select" (ssget "[color=red]_[/color]A" '([color=red](0 . "INSERT")[/color] (8 . "*TRANS*")))[color=red] ""[/color]))
  3. (princ)
  4. )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:27:56 | 显示全部楼层
再次阅读你的帖子,我想知道你想通过创建选择集实现什么?您要调用它来执行编辑命令吗?在这种情况下,创建一个新按钮并只在该按钮的宏字段中添加选择功能不是更好吗?
请确保从宏字段中删除默认的“^C^C”,因为这将取消您的命令。
 
要使用它,只需调用所需的命令(即移动)并按下该按钮。
回复

使用道具 举报

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 08:41:15 | 显示全部楼层
谢谢,谢谢!宏的想法效果很好,任务主管对他的新玩具很满意。。。我是说,工具。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 08:51:53 | 显示全部楼层
不需要Select命令;相反,请查看Sssetfirst函数。伪代码:
 
  1. (defun c:FOO ( / ss)
  2. (if (setq ss (ssget "_x" ;|your filter|)
  3.    (sssetfirst nil ss)
  4.    (prompt "\n** Nothing selected ** "))
  5. (princ))
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 09:00:37 | 显示全部楼层
考虑到RenderMan的建议的组合解决方案;如果没有激活的命令或输入编辑命令的节提示,这将创建默认选择集。
 
  1. (defun SelectBlocks( / ssetBlocks )
  2. (setq ssetBlocks (ssget "_A" '((0 . "INSERT") (8 . "*TRANS*"))))
  3. (if ssetBlocks
  4. (if (= (getvar "CMDACTIVE") 0)
  5.   (sssetfirst nil ssetBlocks)   ;return on command prompt
  6.   ssetBlocks                    ;return on select prompt
  7. )
  8. (princ)                        ;return silent if no items to match filter
  9. )
  10. )

 
可以将其放入启动列表中,并将以下行添加到专用按钮的宏字段中:
  1. (SelectBlocks)
回复

使用道具 举报

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 09:09:41 | 显示全部楼层
哇,当你的两个想法结合在一起时,这个工具工作得更好。恐怕成功只会让任务大师变得贪婪。现在按钮可以工作了,我正在努力防止人为错误。(翻译——全部重写)
 
情况:如果动态块最初放置在正确的层上,则正确选择了它们。但是,当用户在错误的层上放置块时,很少出现1。然后,该按钮不会选择块,因为它已硬连接到层名称。因此,我试图通过有效块名进行选择,使选择集工作。我浏览过网络,知道我必须使用vba“有效名称”工具,但我想不出将其放在lisp中的最佳位置,或者如何将例程连接在一起。
 
是的,所有这些都可以通过quickselect通过几次单击来完成,但这些选择集每天要完成数百次,因此只需单击一次即可。接下来,任务主管希望我构建更多在其中使用相同工具的Lisp,并在此基础上进行构建。(小规模的成功让他觉得我可以做大事。我一直告诉他我对自己在做什么知之甚少,但这似乎并没有阻止他的要求。)(是的,他看了这个论坛。哈哈)
 
以下是我需要在lisp中实现的4个步骤:
1.选择所有名为“elect\u transformr\u bank\u point”或“*u*”的块。使用MSau中的“selectblock”。它真的很好用。
2.获取selectblock lisp选择的所有*u*块的有效名称。使用pBe中的EFname lisp,它可以一次在一个块上很好地工作。
3.从选择集中筛选出与“elect\u transformr\u bank\u point”不匹配的任何有效名称。
4.用块名称或有效名称“elect\u transformr\u bank\u point”创建剩余块的活动选择集。使用MSau的“selectblock”lisp的最后几行
 
以下是我尝试过的:
 
从pBe开始:
 
  1. defun c:test (/ ss en) ;;Written by pBe in this [url="http://www.cadtutor.net/forum/showthread.php?64785-How-to-get-the-original-block-name-of-a-dynamic-block&highlight=EFFECTIVE+BLOCK"]thread[/url].
  2. (defun _EFName (ent)
  3. (vl-load-com)
  4. (vla-get-effectivename (vlax-ename->vla-object ent)))
  5. (if (setq ss (ssget '((0 . "INSERT")(2 . "ELECT_TRANSFORMR_BANK_POINT,`*U*"))))
  6. (repeat (sslength ss)
  7.           (setq en (ssname ss 0))
  8.           (setq blockname (_EFName en))
  9.           (princ "\nThe rest of your code")
  10.           (print blockname)
  11.           (ssdel (ssname ss 0) ss)
  12.          )
  13.   )(princ)
  14. )

 
1.MSasu中的“SelectBlock”lisp(稍微调整)
  1. (defun SelectBlocks( / ssetBlocks )  ;;by MSasu, see earlier post in this thread.
  2. (setq ssetBlocks (ssget "_A" '((0 . "INSERT") (2 . "ELECT_TRANSFORMR_BANK_POINT,`*U*"))))
  3. (if ssetBlocks
  4. (if (= (getvar "CMDACTIVE") 0)
  5.   (sssetfirst nil ssetBlocks)   ;return on command prompt
  6.   ssetBlocks                        ;return on select prompt
  7. )                                ;end if
  8. (princ)                                ;return silent if no items to match filter
  9. )                                 ;end if
  10. )                                 ;end defun

2.从pBe获取块的有效名称
  1. defun c:test (/ssetBlocks en) ;;I think this will only get the effective name one at a time, so I added some ideas to make the lisp go through the entire list and get the effective name of each block selected.
  2. (defun _EFName (ent)
  3. (vl-load-com)
  4. (vla-get-effectivename (vlax-ename->vla-object ent)));; I think I need to add something like this
  5. (setq cntr 0) (ssname ssetBlocks 0) so that the effective name lisp looks at each entity individually, but I am not sure if ssname is the correct command to use.
  6. (if (ssetBlocks)) ;; I put the selection set variable from “selectblocks” where the selection filter used to be.
  7. (repeat (sslength ssetBlocks)

 
3.从选择集中筛选出与“elect\u transformr\u bank\u point”不匹配的任何有效名称
程序
  1. if (setq en (ssname ssetBlocks 0)) ;;If the name of the first entity is “ELECT_TRANSFORMR_BANK_POINT” I want to keep it, otherwise I want to delete it from the selection set.
  2. Then (ssdel  (en  /= “ELECT_TRANSFORMR_BANK_POINT”))
  3. (setq cntr (+ cntr 1)) ;; at some point I need to add this so the lisp increments through the list created in ssetBlocks.
  4. (setq blockname (_EFName en)) );; this line was in the original code, but I’m not sure what it does.
  5.           (princ "\nThe rest of your code"));; this line was in the original code, but I’m not sure what it does.
  6.           (ssdel (ssname ss 0) ss);; this line was in the original code, but I’m not sure what it does.
  7.          )
  8.   )(princ)
  9. )

 
4.用块名称或有效名称“elect\u transformr\u bank\u point”创建剩余块的活动选择集。这一部分是从上面重复的,我想我只需要在例行程序中的一个例子。
  1. 11

 
正如你所看到的,这些想法从一些承诺(我希望)开始,然后变成与愿望联系在一起的疯狂想法。对这位苦苦挣扎的代码编写者有什么指导吗?有一天,我梦见自己在睡梦中吐出代码,醒来后发现自己自动操作了咖啡机,但我会从解决手头的任务开始。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 21:32 , Processed in 0.340241 second(s), 66 queries .

© 2020-2025 乐筑天下

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