关闭EC属性覆盖元素名称


我们在使用EC方式给元素添加属性时,元素属性对话框中元素的名称会被EC属性所属的ECClass的名称覆盖掉,如下图所示:

大多数情况下我们是不想覆盖掉元素原有的名称的,我们可以通过给ECClass添加一个定制化属性(CustomAttribute)来关闭这个效果。这个定制化属性就是位于"C:\Program Files\Bentley\MicroStation CONNECT Edition\MicroStation\ECSchemas\Dgn\DgnCustomAttributes.01.00.ecschema.xml"中的定制化属性ECClass“CustomAttributeClass”,如下图所示:

如下链接是测试代码:

communities.bentley.com/.../DisableECName.7z

编译后在Mstn中加载我们的插件程序,然后通过选择集工具选中一个元素后,执行keyin命令“disableecname test”。此时在元素属性对话框中查看到的元素属性如下图所示:

可以看到虽然添加了我们自定的EC属性,但是元素名称仍然是元素原有的名称。实现这个效果的关键代码就在KeyinCommands.CreateECSchema这个函数中,此函数的代码如下所示:

public static ECSchema CreateECSchema()
        {
            ECSchema ecSchema = new ECSchema(NameECSchema, 1, 0, "Sample");
            IECClass ecClass = ecSchema.AddClass(NameECClass);
            IECProperty ecprop = ecClass.AddProperty(NameProp, ECObjects.StringType);
            int verMaj = 1, verMin = 0;
            FindInstancesScope scopeTemp = FindInstancesScope.CreateScope(Session.Instance.GetActiveDgnFile(), new FindInstancesScopeOption());
            IECSchema schemaCustomAtt = DgnECManager.Manager.LocateSchemaInScope(scopeTemp, "DgnCustomAttributes", verMaj, verMin,
                      SchemaMatchType.LatestCompatible);
            if (schemaCustomAtt != null)
            {
                IECClass ecClassCate = schemaCustomAtt.GetClass("ItemIdentifiesHost");
                IECInstance ecInsCate = ecClassCate.CreateInstance();
                ecInsCate.SetBoolean("ShouldIdentifyHost", false);
                ecClass.SetCustomAttribute(ecInsCate);
            }
            return ecSchema;
        }

在这个函数中我们创建了自定义属性所属的ECSchema和ECClass,并获取了“DgnCustomAttributes”中的“ItemIdentifiesHost”定制化类添加给了我们的ECClass,从而实现了我们想要的效果。