引用关系的介绍:
引用关系包括两种:所有关系和指针关系,它们分别叙述如下:
1.所有关系(owerrefrence):针对所有者与被所有者来叙述,它们具有双向关系
1)硬所有(hard ower):
2)软所有(soft ower):
注意:
2.指针关系(pointrefrence):针对指向与被指向来叙述
1)硬指针(hard point):
2)软指针(soft point):
注意:如果两个实体都派生于AcDbEntity,而想实现它们之间具有一定的关系,则必须是指针关系而不能是所有关系,原因在所有关系中已经叙述。
Deepclone操作中需要使用的引用关系:
Deepclone操作默认使用所有关系,包括硬所有和软所有。一旦执行了Deepclone后,它自动将其所有关系拷贝一份至目标中。
Deepclone不自动处理任何指针关系,如果需要处理时,我们必须重载此函数,然后明确的写出具体的操作。
Wblock操作中需要使用的引用关系:
Wblock操作默认使用硬引用关系,分别是硬所有和硬指针。一旦执行了
Wblock不自动处理软引用关系,如果需要处理时,我们必须重载此函数,然后指定具体操作。
注意:软指针关系没有一个操作默认使用,其使用方式需要使用者自己定义。
在Deepclone中,如果想要操作指针关系,该怎么办:
需要重载Deepclone函数,函数体中需要明确知道指针所指向的实体是派生于AcDbObject还是AcDbEntity,这样才能将正确的所有者传入给指针对象。如:指针对象派生于AcDbObject,则只需要将实体本身当作所有者传入即可;而如果指针对象派生于AcDbEntity,则需要将本对象的所有者当作指针对象的所有者传入
在Wblock中,如果想要操作软引用关系,该怎么办:
在Wblock实现函数中,需要区分软所有和软指针所引用的对象派生于哪个实体,分别作出处理。如果派生于AcDbObject,则将实体本身作为参数当作被引用对象的所有者传入;
这是由所有关系的性质决定的,一般来说所有关系是建立在两个实体之间密切关系,一个实体如果拥有别的对象的话,要么是绝对依赖于它、要么就是它的容器,这样当复制实体本身时,就必须要将于它密切联系的实体拷贝一份。
还要明确一点的就是Deepclone执行的时机,它在以下命令时被执行:
1)
2)
3)
4)
5)
6)
7)
说明:Ctrl+C调用的是Wblock而非Deepclone;CAD的Copy命令,调用Deepclone。
如:实体对它的扩展字典而言,实体是扩展字典的硬所于者,扩展字典保存着这个实体存在所必需的数据,当这个实体被复制一份后,它的数据一定要一同被复制。
层表也是这个道理,层表是它的层记录软所有者,当我们复制层表时,一定要将它所包含的层记录一同复制过去。
如果在Deepclone中,默认使用了指针关系的话,就会导致出错,比如:文字实体硬指向字体样式表的字体样式,如果我们在拷贝文字实体时,将字体样式也拷贝了一份,这样字体样式表中就会出现两个相同的字体样式记录,这样就导致了错误。
Wblock中,为什么只默认使用硬引用关系:
这也是由硬引用关系性质及Wblock调用的时机决定的,硬引用时说明实体的存在绝对地依赖于被它引用的实体存在,如果实体被写出去了,它所依赖的实体一定要被写出去,否则将会导致错误发生。
Wblock被执行的时机是:
1)
2)
3)
这些命令都是起将当前数据库中的实体写出去的作用。这就需要自动在目标数据库中建立没有的实体。
如:一个实体在数据库A中,它所在的图层是“1”,当将此实体Ctrl+C拷贝到数据库B中,而B中没有图层“1”,则它将会自动建立该图层。