块交换-需要帮助。
我在寻求帮助。我收集了大量AutoLISP例程,这些例程或多或少都是简单的工具,用于自动化许多日常绘图任务。我现在真的需要一个来操作块,然而,我从来没有掌握过处理列表。(我更喜欢直接的AutoLISP,因为我们有一个克隆座位,不做vLISP)基本上,我会有一个需要翻转的项目。这意味着所有当前的“近面”块必须成为“远面”块,反之亦然。块的比例始终为1:1,没有属性,也没有动态。。。一个简单的替代品。。。(一张图片能说出千言万语,因此附上一张示例图)
例子:
一个图形中可能会出现多次。
块变为块
16NF------>16FF
20NF------>20FF
24NF------>24FF
在同一图纸中:
块变为块
16FF------>16NF
20FF------>20NF
24FF------>24NF
我对日常生活的看法是:
-创建所有现有块的列表(名称及其插入点)
-单步列表交换块名
-在插入点重新插入新块
然而,有了正确的机制,我可以扩展它以满足我的需求。非常感谢
根据要求添加了示例的ACAD2000版本。谢谢
实例图纸
示例2000。图纸 这能满足你的需要吗?
(defun c:TesT (/ ss i sset e)
;;; Tharwat 10 Nov. 2011 ;;;
(defun SwapBlock (block e ename)
(if (tblsearch "BLOCK" block)
(progn
(entmake (list '(0 . "INSERT")
(cons 2 block)
(assoc 10 e)
(assoc 41 e)
(assoc 42 e)
(assoc 43 e)
(assoc 50 e)
)
)
(entdel ename)
)
)
)
(if (setq ss (ssget "_x" '((0 . "INSERT"))))
(repeat (setq i (sslength ss))
(setq sset (ssname ss (setq i (1- i))))
(setq e (entget sset))
(cond ((eq (cdr (assoc 2 e)) "16FF")
(SwapBlock "16NF" e sset)
)
((eq (cdr (assoc 2 e)) "20FF")
(SwapBlock "20NF" e sset)
)
((eq (cdr (assoc 2 e)) "24FF")
(SwapBlock "24NF" e sset)
)
)
)
(princ)
)
(princ)
)
我认为您只需要用(一个。另一个)块创建一个assoc列表,并成对更改Insert的名称(不是entmake,而是entdel)^^
(我没有CAD来测试我的想法)
我没有领会你的意思。
你是对的!
当做
米尔恰
该方法适用于非属性块,但请小心属性块,因为属性可以在块定义之外创建,因此在切换参考块定义时,属性可能会被保留。此外,您还需要确保图形中存在新的块定义。
不过,对于这种情况,您应该没问题,因为OP表示块没有属性 每个点都有一个唯一的插入点这一事实是否会阻止例程循环?16NF-->16FF-->16NF-->16FF。。。。。。。等等等等等等。 我不这么认为,因为我们在选择集中只对一个实体循环一次。
Srr,因为缺少CAD进行测试,我的英语很差^ 感谢Tharwat提供的代码,以及其他人对思考过程的贡献。
不幸的是,在vanilla 2012上(图纸中有所有必需的块),我运行这个例程没有得到任何结果;( 也许你确实得到了一个结果,但这不是你所期望的。也许我在最后一点中提出的观点已经实现了。也就是说,在第一个过程中,16NF更改为16FF,但在第二个过程中,16FF更改回16NF。也许是的?
页:
[1]
2