明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1859|回复: 6

[源码] 关于数据绑定的讨论

[复制链接]
发表于 2013-5-3 04:15:22 | 显示全部楼层 |阅读模式
绑定这个词是我瞎掰的
它的意思举个例子说明下
一个单行文字图元A
它的文字内容A·old  = (cdr (assoc 1 (entget A)))
另一个任意图元B
将A·old与B建立某种联系
这样找到A和B时
可以通过B的记录
得到A·old
再获取图元A的现值A·new
比较A·old与A·new
判断A的值是否发生过变化

以前用过一个办法
利用VLAX-LDATA类函数在图元上附加数据
(VLAX-LDATA-PUT  A  "图元绑定2"  B)
(VLAX-LDATA-PUT  B  "图元绑定1"  (LIST A A·old))
这样找到A时可以得到B
再可以得到A的原值
但是后来发现
如果把图元A、B同时复制
再粘贴到另一张图时
A和B只会有一个被粘贴
另一个变成nil了
很久以来都没明白是为什么
后来发现
采用这种方式绑定图元
如果同时copy A、B得到AA、BB
那么原来的绑定关系
会延伸至AA、BB
同时还有意想不到的结果

下面操作大家可以试下
1.随便建立图元A,B
(SETQ A (car (entsel)))
(SETQ B (car (entsel)))
!A
!B
2.建立绑定关系
(VLAX-LDATA-PUT  A  "图元绑定"  B)  ;;B绑定至A
(VLAX-LDATA-PUT  B  "图元绑定"  A)  ;;A绑定至B
!A
!B
3.copy A+B
!A
!B
这时你会发现!A=nil
4.copy之后继续
(SETQ A (car (entsel)))
(SETQ B (car (entsel)))
(SETQ AA  (car (entsel)))  ;;选A副本
(SETQ BB  (car (entsel)))  ;;选B副本
(eq (VLAX-LDATA-GET  AA  "图元绑定") BB)  ;=T
(eq (VLAX-LDATA-GET  BB  "图元绑定") AA)  ;=T
5. copy A + copy B
(SETQ AAA  (car (entsel)))  ;;选A副本2
(SETQ BBB  (car (entsel)))  ;;选B副本2
(eq (VLAX-LDATA-GET  AAA  "图元绑定") B)  ;=T
(eq (VLAX-LDATA-GET  BBB  "图元绑定") A)  ;=T
6. copyclip A+B  新图pasteclip
A插入、B设为nil
7. A、B分别copyclip、pasteclip
(vlax-ldata-list (car (entsel)))  ;分选A、B副本 均=nil

由此可见
在copy过程中
新增图元智能的继承了原图元的LDATA
但是由于图元是依次建立的
导致某些情况下会造成数据遗失
比如上面第3步时参数A被自动指定为了nil
这会造成程序隐藏的BUG
而在另一张图纸中同时pasteclip的情况
由于图元是依次建立的
第1个图元A在插入时
因为B还没有被插入
所以找不到绑定关系的B
就把B设为了nil
然后轮到B在插入时
因为已经被设为了nil
所以就没办法再被建立

通过以上的论述
图元上附加词典数据
是需要非常小心的事情
它可以伴随copy、mirror等操作
附加到新的图元副本上
也可能造成某些参数数据遗失
paste到另一张图时
数据可能可以成功的穿越
也有可能遗失
这都取决于词典数据的具体内容

现在我要绑定图元
一般采用全局词典+handent方式
利用handent作为词典关键字
存取修改删除都方便
不用担心参数遗失
不能穿越
一般也不需要穿越
任意操作不会自动增加词典数据
这一点很重要
不然每次取得数据
还要判别有效性
很是麻烦

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-5-5 03:09:22 来自手机 | 显示全部楼层
masterlong 发表于  前天 04:15
绑定这个词是我瞎掰的
它的意思举个例子说明下
一个单行文字图元A
它的文字内容A·old  = (cdr (assoc 1 (entget A)))
另一个任意图元B
将A·old...

能详细讲讲采用全局词典+handent方式吗来自: iPhone客户端
发表于 2013-5-5 08:23:05 | 显示全部楼层
希望看到楼主更多的分享,思路很好!
 楼主| 发表于 2013-5-6 20:01:39 | 显示全部楼层
全局词典+handent分两种模式

第一种模式
用图元的handent做全局词典的名字
关键字根据自己需要设定
举例如下
(setq a (car (entsel)))
(setq a5 (cdr (assoc 5 (entget a))))  ;;a5既图元a的handent
(vlax-ldata-put a5 "数据1" ......)
(vlax-ldata-put a5 "数据2" ......)
当然为了避免不同程序偶然撞车的发生
可以为handent加一个前缀
例如
(vlax-ldata-put (strcat "$mydata$" a5) "数据1" ......)
当以图元为载体存储很多种数据时
这种模式是适合的
它的缺点是
要获得它的词典内容必须首先得到确定的图元
再得到它的handent再得到全局词典名
在不知道具体图元的情况下
想要获取有哪些全局词典名是很困难的
我能想到的办法是将dwg输出成dxf
通过读取dxf来得到全局词典名
还是很麻烦的
这就相当于只具有单向的检索性能


第二种模式
指定任意的全局词典的名字后
用图元的handent做关键字
举例如下
(setq a (car (entsel)))
(setq a5 (cdr (assoc 5 (entget a))))  ;;a5既图元a的handent
(vlax-ldata-put "数据1" a5 ......)
因为可以用vlax-ldata-list函数查询全局词典的内容
所以这就具有了双向的检索功能
个人推荐采用这样的方式来存储数据
发表于 2013-5-7 23:28:52 | 显示全部楼层
等着继续。学习思路。。。
发表于 2015-3-4 23:01:45 | 显示全部楼层
感谢楼主分享
发表于 2015-3-5 09:04:51 | 显示全部楼层
是否可以用扩展数据呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 11:28 , Processed in 0.171788 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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