如题,我通过交互工具选择了指定的管线,然后想获取管线上的支吊架进行标注,不知道如何获取,请帮忙。
private static string Relationship = "DEVICE_HAS_SUPPORT"; public static void Run() { // pipe Element element = Utils.Utils.GetASelectedElement(); if (element == null) { return; } var instances = DgnECManager.Manager.GetElementProperties(element, ECQueryProcessFlags.SearchAllClasses); var instance = instances.ElementAt(1);//pipeInstance List<IECRelationshipInstance> relationships = DgnUtilities.GetAllRelationshipInstances(instance).Where(e => e.ClassDefinition.Name == Relationship).ToList(); foreach (var relationship in relationships) { IECInstance support = relationship.Target; var id = (support as IDgnECInstance).Element.ElementId; } }
我去实验了一下,好像没有取到,我得到的RelationshipInstances是以下这些,没有DEVICE_HAS_SUPPORT,不知道哪里的问题
有没有可能,您选的那根管道上,他就没有support呢?
有是肯定有,我用ScanCriteria这个类然后用选中的管道的Range扫描到所有对象,然后取得对象的所有的IECInstance, 然后再查找这些的BaseClasses,找到父类是 [ "PipingSupport", "PIPE_SUPPORT" ]的,取到3个,然后我看图上也是三个,但是这个方法感觉很绕的感觉
我从模型观察也是这个情况,应该是对的
就是我上传的模型中的图示里面的那个管件
首先您截图中的这个支吊架确实不是 DEVICE_HAS_SUPPORT 对应的 SUPPORT(去查ClassEditer),所以没找到是正常的。
其次您都发现这个支吊架对应的是 PIPE_SUPPORT 这个类,接下来您的思路应该是这个 PIPE_SUPPORT 有什么relationship。通过查询 ClassEditer 不难发现这个家伙有一个这个 relationship: ObjectHasSupport. 接下来将上述代码中的 relationship 替换掉,是不是就可以找到唯三的支吊架了?
由于中英文翻译问题,这种情况是非常常见的。可以从 ClassEditer 中发现,有好几个class 都叫 *support ,而且没有很近的父子关系,也许他们在英文环境中代表不同的支吊架,所以我们通常要去检查一下 relaionship 对应的两边的 ecclass 是不是我们期望的。
再多啰嗦几句,像管道这些是比较核心的opm组件,所以它所拥有的relationship是很多的。但是像支吊架这种,一般来说它所拥有的关系就很少,您可以先从支吊架入手,查询支吊架拥有哪些relationship,从得到的relationshipinstance 的source属性中获取这个支吊架是和何种元素关联的,他们的关联relationship是什么,得到这些信息之后,你就可以胸有成竹的获取您想要的支吊架。
Answer Verified By: Ethan Yuan
多谢帮忙,通过ObjectHasSupport确实找到了,然后你说的这个查找方式也是我特别晕的地方,我在classeditor里确实看到了PipingSupport, 然后他的Relationship里找到了ObjectHasSupport,但是这个PipingSupport我其实是根据管道自己猜出来的,我的管道的ECClass名字是PIPE,但是我看好像没有从PIPE到PipingSupport的联系,这块是真的晕,不过多谢帮忙了,当前问题先解决了