乐筑天下

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

[编程交流] 块交换-需要帮助。

[复制链接]

2

主题

18

帖子

16

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:10:47 | 显示全部楼层 |阅读模式
我在寻求帮助。我收集了大量AutoLISP例程,这些例程或多或少都是简单的工具,用于自动化许多日常绘图任务。我现在真的需要一个来操作块,然而,我从来没有掌握过处理列表。(我更喜欢直接的AutoLISP,因为我们有一个克隆座位,不做vLISP)
 
基本上,我会有一个需要翻转的项目。这意味着所有当前的“近面”块必须成为“远面”块,反之亦然。块的比例始终为1:1,没有属性,也没有动态。。。一个简单的替代品。。。(一张图片能说出千言万语,因此附上一张示例图)
 
例子:
一个图形中可能会出现多次。
块变为块
16NF------>16FF
20NF------>20FF
24NF------>24FF
 
在同一图纸中:
块变为块
16FF------>16NF
20FF------>20NF
24FF------>24NF
 
我对日常生活的看法是:
-创建所有现有块的列表(名称及其插入点)
-单步列表交换块名
-在插入点重新插入新块
 
然而,有了正确的机制,我可以扩展它以满足我的需求。非常感谢
 
根据要求添加了示例的ACAD2000版本。谢谢
实例图纸
示例2000。图纸
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 08:16:34 | 显示全部楼层
这能满足你的需要吗?
 
  1. (defun c:TesT (/ ss i sset e)
  2. ;;; Tharwat 10 Nov. 2011 ;;;
  3. (defun SwapBlock (block e ename)
  4. (if (tblsearch "BLOCK" block)
  5.    (progn
  6.      (entmake (list '(0 . "INSERT")
  7.                     (cons 2 block)
  8.                     (assoc 10 e)
  9.                     (assoc 41 e)
  10.                     (assoc 42 e)
  11.                     (assoc 43 e)
  12.                     (assoc 50 e)
  13.               )
  14.      )
  15.      (entdel ename)
  16.    )
  17. )
  18. )
  19. (if (setq ss (ssget "_x" '((0 . "INSERT"))))
  20.    (repeat (setq i (sslength ss))
  21.      (setq sset (ssname ss (setq i (1- i))))
  22.      (setq e (entget sset))
  23.      (cond ((eq (cdr (assoc 2 e)) "16FF")
  24.             (SwapBlock "16NF" e sset)
  25.            )
  26.            ((eq (cdr (assoc 2 e)) "20FF")
  27.             (SwapBlock "20NF" e sset)
  28.            )
  29.            ((eq (cdr (assoc 2 e)) "24FF")
  30.             (SwapBlock "24NF" e sset)
  31.            )
  32.      )
  33.    )
  34.    (princ)
  35. )
  36. (princ)
  37. )
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

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

铜币
243
发表于 2022-7-6 08:17:56 | 显示全部楼层
我认为您只需要用(一个。另一个)块创建一个assoc列表,并成对更改Insert的名称(不是entmake,而是entdel)^^
(我没有CAD来测试我的想法)
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 08:20:31 | 显示全部楼层
 
我没有领会你的意思。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:26:22 | 显示全部楼层
 
你是对的!
 
当做
米尔恰
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:28:29 | 显示全部楼层
 
该方法适用于非属性块,但请小心属性块,因为属性可以在块定义之外创建,因此在切换参考块定义时,属性可能会被保留。此外,您还需要确保图形中存在新的块定义。
 
不过,对于这种情况,您应该没问题,因为OP表示块没有属性
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-6 08:32:44 | 显示全部楼层
每个点都有一个唯一的插入点这一事实是否会阻止例程循环?16NF-->16FF-->16NF-->16FF。。。。。。。等等等等等等。
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

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

铜币
243
发表于 2022-7-6 08:34:23 | 显示全部楼层
我不这么认为,因为我们在选择集中只对一个实体循环一次。
Srr,因为缺少CAD进行测试,我的英语很差^
回复

使用道具 举报

2

主题

18

帖子

16

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:37:31 | 显示全部楼层
感谢Tharwat提供的代码,以及其他人对思考过程的贡献。
不幸的是,在vanilla 2012上(图纸中有所有必需的块),我运行这个例程没有得到任何结果;(
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-6 08:39:18 | 显示全部楼层
也许你确实得到了一个结果,但这不是你所期望的。也许我在最后一点中提出的观点已经实现了。也就是说,在第一个过程中,16NF更改为16FF,但在第二个过程中,16FF更改回16NF。也许是的?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 08:54 , Processed in 0.516049 second(s), 72 queries .

© 2020-2025 乐筑天下

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