amarcon 发表于 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。图纸

Tharwat 发表于 2022-7-6 08:16:34

这能满足你的需要吗?
 
(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)
)

ketxu 发表于 2022-7-6 08:17:56

我认为您只需要用(一个。另一个)块创建一个assoc列表,并成对更改Insert的名称(不是entmake,而是entdel)^^
(我没有CAD来测试我的想法)

Tharwat 发表于 2022-7-6 08:20:31

 
我没有领会你的意思。

MSasu 发表于 2022-7-6 08:26:22

 
你是对的!
 
当做
米尔恰

Lee Mac 发表于 2022-7-6 08:28:29

 
该方法适用于非属性块,但请小心属性块,因为属性可以在块定义之外创建,因此在切换参考块定义时,属性可能会被保留。此外,您还需要确保图形中存在新的块定义。
 
不过,对于这种情况,您应该没问题,因为OP表示块没有属性

ReMark 发表于 2022-7-6 08:32:44

每个点都有一个唯一的插入点这一事实是否会阻止例程循环?16NF-->16FF-->16NF-->16FF。。。。。。。等等等等等等。

ketxu 发表于 2022-7-6 08:34:23

我不这么认为,因为我们在选择集中只对一个实体循环一次。
Srr,因为缺少CAD进行测试,我的英语很差^

amarcon 发表于 2022-7-6 08:37:31

感谢Tharwat提供的代码,以及其他人对思考过程的贡献。
不幸的是,在vanilla 2012上(图纸中有所有必需的块),我运行这个例程没有得到任何结果;(

ReMark 发表于 2022-7-6 08:39:18

也许你确实得到了一个结果,但这不是你所期望的。也许我在最后一点中提出的观点已经实现了。也就是说,在第一个过程中,16NF更改为16FF,但在第二个过程中,16FF更改回16NF。也许是的?
页: [1] 2
查看完整版本: 块交换-需要帮助。