ObjectArx中,所属关系在deepclone和wblock的作用

引用关系的介绍:

 

引用关系包括两种:所有关系指针关系,它们分别叙述如下:

1.所有关系(owerrefrence):针对所有者与被所有者来叙述,它们具有双向关系

1)硬所有(hard ower):

      所有者的存在依赖于被所有者,并且被所有者的存在也依赖于所有者,它们之间相互依赖。一旦一个对象被其他对象硬所有了,它就不能被直接删除,除非这种硬所有关系解除。

      比如:实体对其扩展字典是硬所有关系,实体中的数据保存在它的扩展字典中,如果这些数据不存在的话,实体本身就会出错。另外,扩展字典它也不能离开实体而独立存在,所以说它们是相互依赖的。

      

2)软所有(soft ower):

      所有者的存在并不依赖于被所有者,但是被所有的存在依赖于所有者。它与硬所有的区别就是,一个对象被另外一个对象软所有之后,这个对象还可以被直接删除。

      比如:扩展字典对其字典里的条目是软所有关系,扩展字典本身的存在不依赖于其条目的存在,但是条目不能离开字典而独立存在。条目不被保护,它们可以被直接删除。

  

注意:

    a)一个对象只能有一个所有者;

    b)被另外一个对象所有的对象只能直接派生于AcDbObject而不能派生于AcDbEntity,因为直接派生于AcDbObject的对象可以直接加入到数据库中,而派生于AcDbEntity的对象需要加入到块表中。

 

2.指针关系(pointrefrence):针对指向与被指向来叙述

1)硬指针(hard point):

      实体的存在依赖于被指向的实体,它保护被指向的实体不能被直接删除。另外,被指向的实体可以不依赖别的任何实体而独立存在。

      比如:文字实体与其字体样式是硬指针关系,文字不能离开字体样式的存在而独立存在,一个字体样式如果被一个文字实体硬指向了的话,就不能被直接删除。而文字样式可以独立于具体的文字对象而存在。

 

2)软指针(soft point):

      实体的存在不依赖于被指向的实体,它们都可以被自由删除。它们的存在彼此间相互独立。

      由于这种关系的实质就是在实体中保存一个指向另外一个实体的软所有Id,其它的任何操作都由使用者自己明确制定,在此就不做例子了。

 

注意:如果两个实体都派生于AcDbEntity,而想实现它们之间具有一定的关系,则必须是指针关系而不能是所有关系,原因在所有关系中已经叙述。


Deepclone操作中需要使用的引用关系:

 

Deepclone操作默认使用所有关系,包括硬所有软所有。一旦执行了Deepclone后,它自动将其所有关系拷贝一份至目标中。

 

Deepclone不自动处理任何指针关系,如果需要处理时,我们必须重载此函数,然后明确的写出具体的操作。

 

Wblock操作中需要使用的引用关系:

 

Wblock操作默认使用硬引用关系,分别是硬所有硬指针。一旦执行了 Wblock后,它将自动将这两个种关系拷贝一份之目标中。

 

Wblock不自动处理软引用关系,如果需要处理时,我们必须重载此函数,然后指定具体操作。

 

注意:软指针关系没有一个操作默认使用,其使用方式需要使用者自己定义。

 

在Deepclone中,如果想要操作指针关系,该怎么办:

 

需要重载Deepclone函数,函数体中需要明确知道指针所指向的实体是派生于AcDbObject还是AcDbEntity,这样才能将正确的所有者传入给指针对象。如:指针对象派生于AcDbObject,则只需要将实体本身当作所有者传入即可;而如果指针对象派生于AcDbEntity,则需要将本对象的所有者当作指针对象的所有者传入

 

在Wblock中,如果想要操作软引用关系,该怎么办:

 

在Wblock实现函数中,需要区分软所有和软指针所引用的对象派生于哪个实体,分别作出处理。如果派生于AcDbObject,则将实体本身作为参数当作被引用对象的所有者传入;

 

如果派生于AcDbEntity,则要区分实体本身是派生于AcDbObject还是派生于AcDbEntity;如果自己派生于AcDbObject,则需要得到块表记录,将块表记录作为被引用的所有者传入,而如果自己派生于AcDbEntity,则需要将自己的所有者作为被引用的所有者传入。


Deepclone中,为什么只默认使用所有关系:
 

这是由所有关系的性质决定的,一般来说所有关系是建立在两个实体之间密切关系,一个实体如果拥有别的对象的话,要么是绝对依赖于它、要么就是它的容器,这样当复制实体本身时,就必须要将于它密切联系的实体拷贝一份。

 

还要明确一点的就是Deepclone执行的时机,它在以下命令时被执行:

1)       Copy

2)       Array

3)       Mirror:(如果原对象不被删除时)

4)       Block

5)       Insert

6)       Wblock:(在执行对所有关系时)

7)       Explode:(分解一个块引用时)

说明:Ctrl+C调用的是Wblock而非Deepclone;CAD的Copy命令,调用Deepclone。

 

如:实体对它的扩展字典而言,实体是扩展字典的硬所于者,扩展字典保存着这个实体存在所必需的数据,当这个实体被复制一份后,它的数据一定要一同被复制。

层表也是这个道理,层表是它的层记录软所有者,当我们复制层表时,一定要将它所包含的层记录一同复制过去。

 

如果在Deepclone中,默认使用了指针关系的话,就会导致出错,比如:文字实体硬指向字体样式表的字体样式,如果我们在拷贝文字实体时,将字体样式也拷贝了一份,这样字体样式表中就会出现两个相同的字体样式记录,这样就导致了错误。

 

Wblock中,为什么只默认使用硬引用关系:

 

这也是由硬引用关系性质及Wblock调用的时机决定的,硬引用时说明实体的存在绝对地依赖于被它引用的实体存在,如果实体被写出去了,它所依赖的实体一定要被写出去,否则将会导致错误发生。

 

Wblock被执行的时机是:

1)       Wblock

2)       Xref Bind

3)       Xbind

这些命令都是起将当前数据库中的实体写出去的作用。这就需要自动在目标数据库中建立没有的实体。

 

如:一个实体在数据库A中,它所在的图层是“1”,当将此实体Ctrl+C拷贝到数据库B中,而B中没有图层“1”,则它将会自动建立该图层。

 

注意:如果我们想将软所有在Wblock时一同拷贝出去,则需要在Wblock的Dcopy过程中明确指定以硬所有的方式拷贝出去,这样Wblock会自动以硬所有的方式处理它。并且在Wblcok执行完毕之后,会还原它本来的软所有关系。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值