我们在Mstn中打开由OBD(OpenBuildings Designer)创建的dgn文件时,有时候会碰到一些元素无法操作甚至是无法删除的情况。这是因为OBD在这些元素上添加了特殊的“依赖属性”,限制了这些元素只能在OBD中才能修改。其实不仅仅是OBD,其他基于Mstn的垂直产品(例如OpenRoads Designer、OpenPlant等)甚至是我们自己编写的插件也可以往元素上添加类似的属性。但是我们在开发自己的插件时有可能需要对dgn文件中的所有元素做一些定制化的修改,有时候做这些修改时碰到这些被限制修改的元素可能会造成修改无效的情况,有些时候甚至可能会出现程序异常退出的情况。那么我们该如何判断出元素上是否存在这样一种特殊的属性,从而在处理所有元素时跳过这些元素呢?其实通过Keyin命令“analyze element”查看元素属性时就能看到这些特殊的属性,如下图所示:
正是这两个属性造成了元素无法修改以及被删除,其中“Require app”的值表明在没有加载特定插件时是否允许元素被修改,而“Delete allowed w/o app”的值表明在没有加载特定插件时是否允许元素被删除。通过这两个值我们就可以区分出这些特殊的元素。那么我们如何在代码中获取这些值呢?这些属性都是通过依赖属性添加到元素上的,所以我们可以通过获取元素依赖属性得到这些想要的属性值。从上面的截图中也可以查看到依赖属性的ID:AppID以及AppValue。在读取元素依赖属性时,通过AppID和AppValue就可以获取到对应的依赖属性,具体实现方式请参考如下代码:
ElementAgenda eleAgen; SelectionSetManager::GetManager().BuildAgenda(eleAgen); if (eleAgen.GetCount() < 1) return; EditElementHandleR eeh = eleAgen[0]; DependencyLinkageCP dpendLinkage = NULL; DependencyManagerLinkage::GetLinkage(&dpendLinkage, eeh, 48640, 0); if (dpendLinkage->u.f.requireApp) { //.... }