关于数据绑定的讨论
绑定这个词是我瞎掰的它的意思举个例子说明下
一个单行文字图元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-PUTA"图元绑定2"B)
(VLAX-LDATA-PUTB"图元绑定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-PUTA"图元绑定"B);;B绑定至A
(VLAX-LDATA-PUTB"图元绑定"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-GETAA"图元绑定") BB);=T
(eq (VLAX-LDATA-GETBB"图元绑定") AA);=T
5. copy A + copy B
(SETQ AAA(car (entsel)));;选A副本2
(SETQ BBB(car (entsel)));;选B副本2
(eq (VLAX-LDATA-GETAAA"图元绑定") B);=T
(eq (VLAX-LDATA-GETBBB"图元绑定") 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作为词典关键字
存取修改删除都方便
不用担心参数遗失
不能穿越
一般也不需要穿越
任意操作不会自动增加词典数据
这一点很重要
不然每次取得数据
还要判别有效性
很是麻烦
masterlong 发表于前天 04:15 static/image/common/back.gif
绑定这个词是我瞎掰的
它的意思举个例子说明下
一个单行文字图元A
它的文字内容A·old= (cdr (assoc 1 (entget A)))
另一个任意图元B
将A·old...
能详细讲讲采用全局词典+handent方式吗 希望看到楼主更多的分享,思路很好! 全局词典+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函数查询全局词典的内容
所以这就具有了双向的检索功能
个人推荐采用这样的方式来存储数据 等着继续。学习思路。。。 感谢楼主分享 是否可以用扩展数据呢?
页:
[1]