乐筑天下

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

[编程交流] Q、 包含以下内容的选择集:

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:48:55 | 显示全部楼层
符号参数只是表项的标识符,因此在块的情况下,它的名称。
 
tblobjname将获得块实体名称,而不是插入实体名称(由entsel检索)。
 
例如,在创建LISP时,我使用这些作为参考,查看每个返回的不同结果:
 
  1. (defun c:on (/ ent)
  2. (if (setq ent (car (entsel "\nSelect Object: ")))
  3.    (progn
  4.      (foreach n (entget ent)
  5.        (print n)) (textscr)))
  6. (princ))
  7. (defun c:layen (/ lay tdef)
  8. (if (and (snvalid (Setq lay (getstring t "\nSpecify Layer: ")))
  9.           (setq tdef (tblsearch "LAYER" lay)))
  10.    (progn
  11.      (princ "\n-- Table Definition --\n")
  12.      (foreach x tdef
  13.        (print x))
  14.      (princ "\n\n-- LAYER Object -- \n")
  15.      (foreach x (entget (tblobjname "LAYER" lay))
  16.        (print x)) (textscr))
  17.    (princ "\n<< Layer not Found >>"))
  18. (princ))
  19. (defun c:blken (/ blk tdef)
  20. (if (and (snvalid (setq blk (getstring t "\nSpecify Block Name: ")))
  21.           (setq tdef (tblsearch "BLOCK" blk)))
  22.    (progn
  23.      (princ "\n-- Table Definition --\n")
  24.      (foreach x tdef
  25.        (print x))
  26.      (princ "\n\n-- BLOCK Object -- \n")
  27.      (foreach x (entget (tblobjname "BLOCK" blk))
  28.        (print x)) (textscr))
  29.    (princ "\n<< Block not Found >>"))
  30. (princ))

 
获得块实体名称后,可以使用entnext逐步遍历构成所述块的各种实体。正如使用entmake创建块一样,首先要创建块实体:
 
  1. (entmake
  2. (list
  3.    (cons 0 "BLOCK")
  4.    (cons 2 <Block Name>)
  5. etc
  6. (entmake
  7. (list
  8.    (cons 0 "LINE")
  9.    (cons... etc
  10. etc
  11. (entmake
  12. (list
  13.    (cons 0 "ENDBLK")
  14.    (cons 8 "0")
  15. )
  16. )

 
最后是一个ENDBLK,当使用TblObjName实体时,您只需检索块实体,然后单步执行(在本例中获取行),直到到达ENDBLK,它将返回nil。。。
 
希望这有帮助
 
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 14:53:34 | 显示全部楼层
谢谢你们,我想我已经差不多理解了!最后一段代码点击;“区块”是第一个子实体:
无论如何,现在使用李的代码和将绿色实体更改为红色的示例,我得到了:
我确信这不是最好的方法,但它确实有效。现在我所要做的就是把它应用到绘图中的所有块上,它会很甜美。我稍后再发。我现在没有时间。
谢谢
 
另外,你如何在这个论坛上复制代码来维护vlisp的颜色?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:56:35 | 显示全部楼层
 
嘿,史蒂夫,
 
我的方法只会稍有不同,考虑到漏选:
 
  1. [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:blk_mod  [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] ent elst[b][color=RED])[/color][/b]
  2. [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ent [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entsel[/color][/b] [b][color=#ff00ff]"\nSelect a Block: "[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  3.    [b][color=RED]([/color][/b][b][color=BLUE]foreach[/color][/b] sub [b][color=RED]([/color][/b]getObj [b][color=RED]([/color][/b][b][color=BLUE]tblobjname[/color][/b] [b][color=#ff00ff]"BLOCK"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]2[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] ent[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  4.      [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] elst [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] sub[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  5.      [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=#009900]3[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]62[/color][/b] elst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  6.        [b][color=RED]([/color][/b][b][color=BLUE]progn[/color][/b]
  7.          [b][color=RED]([/color][/b][b][color=BLUE]entmod[/color][/b]
  8.            [b][color=RED]([/color][/b][b][color=BLUE]subst[/color][/b]
  9.              [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]62[/color][/b] [b][color=#009900]1[/color][/b][b][color=RED])[/color][/b]
  10.                [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]62[/color][/b] elst[b][color=RED])[/color][/b] elst[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  11.          [b][color=RED]([/color][/b][b][color=BLUE]entupd[/color][/b] sub[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  12. [b][color=RED]([/color][/b][b][color=BLUE]command[/color][/b] [b][color=#ff00ff]"_regenall"[/color][/b][b][color=RED])[/color][/b]
  13. [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  14. [i][color=#990099]; Get Sub-Entities from Table Def[/color][/i]
  15. [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] GetObj  [b][color=RED]([/color][/b]bObj[b][color=RED])[/color][/b]
  16. [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] bObj [b][color=RED]([/color][/b][b][color=BLUE]entnext[/color][/b] bObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  17.    [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] bObj [b][color=RED]([/color][/b]GetObj bObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 
此外,请记住,这只会改变那些未设置为BYLAYER或BYBLOCK的颜色。
 
至于应用到每个块,您需要循环遍历表中的每个块,也许可以使用以下方法:
 
  1. [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] getblk [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] tdef lst[b][color=RED])[/color][/b]
  2. [b][color=RED]([/color][/b][b][color=BLUE]reverse[/color][/b]
  3.    [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] tdef [b][color=RED]([/color][/b][b][color=BLUE]tblnext[/color][/b] [b][color=#ff00ff]"BLOCK"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]not[/color][/b] tdef[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  4.      [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] lst [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]2[/color][/b] tdef[b][color=RED])[/color][/b][b][color=RED])[/color][/b] lst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 
上面将返回表中所有块的列表,您可以将其与foreach一起使用。
 
 
在发布之前,我为自己编写了一个LISP,将特定的[color]标记添加到代码中
 
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 14:56:59 | 显示全部楼层
啊,很好,我必须学会使用foreach函数。我从未想过将entmod放在subst之前,而不是将entmod放在末尾的“(setq elst)”。
 
我今天找个时间试试getblk。
 
只是关于颜色的旁白。我注意到RGB蓝色和ACI蓝色之间的唯一区别在于它的实体(420.255)。有没有办法删除实体列表中的此项?我在想,只要创建一个循环,在达到420时用catch创建一个新列表,然后替换实体,如果没有其他方法的话。
 
这里还有其他发光体吗?恭喜!
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 15:02:15 | 显示全部楼层
谢谢你的帮助,但现在我很早就被困在选择所有区块的问题上了。
李的代码:
  1. (defun getblk (/ tdef lst)
  2. (reverse
  3.    (while (setq tdef (tblnext "BLOCK" (not tdef)))
  4.      (setq lst (cons (cdr (assoc 2 tdef)) lst)))))
输出所有块的名称,但我在实体名称之后。
现在(cdr(assoc-2(tblnext“BLOCK”T))(非+2)输出实体名称,但它不是从(car(entsel))(块实体)获得的同一实体,也不是从(tblobjname“BLOCK”)(第一个子块实体)获得的同一实体。你知道这是什么吗?谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:04:42 | 显示全部楼层
嘿,史蒂夫,
 
对不起,朋友,这几天一直很忙。
 
 
Foreach并不太难,实际上非常直观。
 
格式如下:
 
  1. (foreach [i][color=Red]<symbol>[/color][/i] [color=Red][i]<list>[/i][/color] [color=Red][i]<functions...etc>[/i][/color]

 
该符号表示所提供列表中的一项-可以根据需要调用该符号(当然,现有函数名等除外)。
 
因此,例如:
 
  1. (foreach x '(1 2 3)
  2. (setq lst (cons (1+ x) lst))
  3. )

 
将变量lst设置为:(4 3 2)。在这种情况下,我们的符号只是“x”,依次代表1、2和3。
 
 
我想这样做就可以了:
 
  1. 13

 
 
只有我和备注-唯一的区别是,我加入比他晚两年。。。
 
 
我认为它是块定义的第一个子实体,即“块开始”之后的子实体。
 
我假设迭代所有块,可以使用如下内容:
 
  1. 14

 
甚至可能:
 
  1. 15

 
希望这能有所帮助,
 
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 15:08:43 | 显示全部楼层
啊,这有助于堆!
它是固定的;我简直不敢相信现在我看到这件事有多容易。当使用块名同样简单时,就不需要获取实体名。
我仍然理解使用entnext等进入子实体的问题,但我会继续进一步研究。不过暂时还是要谢谢你!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:11:00 | 显示全部楼层
很高兴能帮上忙,如果你在其他事情上遇到困难,尽管问
 
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 15:13:46 | 显示全部楼层
“测试”表格(由Lee发布)非常有效,除非在一张大图纸上试用(有100多个表块),在这种情况下,它会返回:
 
发生硬错误***
达到内部堆栈限制(模拟)
 
我在想,因为这是一个内存问题,编译所有块中所有实体的列表可能是原因。因此,这可能意味着这种影响所有块的方法不适用于大型图形(具有许多块)。
有什么想法吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:17:53 | 显示全部楼层
 
我正在使用的编译块实体列表的方法是递归的,因此受到堆栈的限制,因此在大型操作中会失败。
 
我会给你另一个选择
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-6 16:41 , Processed in 1.366119 second(s), 70 queries .

© 2020-2025 乐筑天下

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