明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: KO你

[源码] 导出导入属性值

[复制链接]
发表于 2021-11-30 22:48 | 显示全部楼层
先梳理下你的需求
假定你的图纸里使用的是带属性的图框
并且已经全部填写完成
现在你需要解决的是图框替换问题
也就是将A单位的图框换成B单位的图框

 楼主| 发表于 2021-12-1 10:36 | 显示全部楼层
masterlong 发表于 2021-11-30 22:48
先梳理下你的需求
假定你的图纸里使用的是带属性的图框
并且已经全部填写完成

是的,图框信息内容位置不同,如果按指定去导出导入通用性会更高
发表于 2021-12-1 11:25 | 显示全部楼层
如果是我就不会采用属性导入导出的思路


假设你的两套图框拥有【相同的大小】和【相同的插入点位置】
同时拥有【相同的属性“标记”】
比如“工程名称”、“子项名称”、“图纸名称”、“图纸编号”等等


块定义都存在的情况下
图框替换其实很简单
(mapcar ''(( Atknm Btknm )
                                        (foreach Atk (ss2list (ssget "x" (list '(0 . "insert") (cons 2 Atknm))))
                                                (entmodone Atk 2 Btknm)
                                        )
                        )
                        '("A单位图框-A0" "A单位图框-A1" "A单位图框-A2")
                        '("B单位图框-A0" "B单位图框-A1" "B单位图框-A2")
)
再用battman命令逐一选择B单位图框同步属性位置
图框的替换就算是基本完成了


以上代码用到的公共函数如下
;999公共函数
;;选择集转为图元列表
(defun ss2list ( ss / n i elist )
        (cond
                ((null ss) NIL)
                ((and (= (type ss) 'Pickset) (null (sslength ss)))
                                NIL
                )
                ((= (type ss) 'Pickset)
                        (setq n  (sslength ss)
                                        i n
                                        elist '()
                        )
                        (repeat n
                                (setq i (1- i))
                                ;;如果没有这个if,那么选择集中被删除的图元,也会被加入到列表之中————但是极其偶尔也有可能,图元不存在但是能entget(遇到过一次,原因不明,或许是CAD的BUG)
                                (if (entget (ssname ss i))
                                        (setq elist (cons (ssname ss i) elist))
                                )
                        )
                        elist
                )
                ((= (type ss) 'ename)
                        (list ss)
                )
                ((= (type ss) 'list)
                        (vl-remove-if-not ''((x) (and (= (type x) 'ename) (entget x))) ss)
                )
                ( T NIL )
        )
)
;999公共函数
;;修改一个图元的某个数据                        ——————不是所有的图元类型都适用此方式                ——————此函数尚未考虑组码不存在时的情况:比如62
(defun entmodone( ent dxfnum data )
        (entmod (list (cons -1 ent)(cons dxfnum data)))
)
发表于 2021-12-1 11:28 | 显示全部楼层
当然以上说的是最理想的情况
AB两单位的图框肯定会存在某些差异
比如
【大小不一样】
一个SC=1时是1:100的尺寸
一个SC=1时是1:1的尺寸
【插入点位置不一样】
一个插入点在左下角
一个插入点在右下角
更多的可能的差异是【不同的属性“标记”】
比如A图框的“工程编号”在B图框里叫“业号”之类的
因此
你就要另外做一件事----将它们统一起来
也就是将B单位的图框按A单位的模式
全部重新做成属性块


至于怎么在这个步骤中将事情变得相对轻松
其实也不难
先做好两个准备工作
一是找个可指定插入点的快速建块插件以及块改名的插件
搜一下一大堆
二是将所有A图框的属性定义
按【1:1的比例】单独放到某个dwg里保存起来备用
需要重新做块的时候
先将某一个B图框调整好大小
粘贴A图框的属性定义并调整好位置
移位后ctrl+shift+c全部属性
再连同【B图框和A属性定义】【一起】快速建块、改名
其它B图框依次操作即可


这个地方看明白没有
新建的块是个“嵌套块”
嵌套了原始的B图框
不管原始B图框是否属性块、动态块
大小是否匹配、插入点在哪里
一个嵌套全部统一了
发表于 2021-12-1 11:31 | 显示全部楼层
假设B单位图框有一些A单位图框所没有的属性
这时就需要你做一些变通
比如“建设单位名称”之类的
直接就在原始B图框内以文字的形式“固化”
因为对一个特定项目而言
这些基本都属于“固定”的内容
如果实在是无法固化的
那就新建属性定义
并在替换完成以后一个一个改吧
反正按你之前的思路也是需要手动改的


再假设反过来
A单位图框有一些B单位图框所没有的属性
或者前面重新做块阶段就删除
或者find命令清空
左右也费不了多少时间


以上所说
肯定不如一个完整的程序一步到位简便
但是相比找到人为你定制的难度
已经是小了很多很多


最后再推荐你一个或许能用得上的程序
http://bbs.mjtd.com/thread-80718-1-1.html
2楼
发表于 2024-5-5 03:02 | 显示全部楼层
感谢论坛,让同为设计尸的人聚在一起套路技巧,学习一波思路
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-6-26 14:53 , Processed in 0.168734 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表