老师上午好:
目前可以实现定义ECClass,并CreateInstanceOnElement上进行属性显示。
现在是想在实现隐藏属性的功能。
当然可以在ECClass下面定义ECCustomAttribute的DisplayOption中的属性进行隐藏,但是对已经挂上属性的实体,通过这个方式没办法实时的隐藏。
我对ECInstance的理解是,ECClass就像是一个类一样,ECInstance像一个实例化出来的对象,而ECCustomAttribute又像是ECClass内部中的一个定义好的对象。
按我的理解应该在ECInstance下面可以获得ECCustomAttribute对应的ECInstance。但是翻看的时候发现ECCustomAttribute对应的ECInstance是在ECClass下面。
我如果从ecclass中拿ECCustomAttribute进行修改的话,按道理说是不会对ecclass中得到的ECInstance有影响的。
想问一下老师我这样的理解是否正确,并有没有可行的实施方案呢。
您修改了ECClass的话,所有添加了这个ECClass属性的元素都会受影响的,不仅仅是刚添加属性的元素。
嗯嗯,我一开始也是想的是修改ECClass即可。但是怎样算修改成功不太能够明白。
我目前的逻辑是:
1、从dgnECManger中discoverSchemas,拿到所有的schemaInfo,通过schemaName匹配到我需要的schemaInfo
2、通过dgnEcManager.LocatieSchemaInDgnFile,从schemaInfo拿到schemaPtr
3、通过schemaPtr中的GetClassP,传入ECClassName获取ECClassP
4、由于CustomAttribute是一个instance。所以从dgnECManager.ObtainInstaceEnablerByName,传入“Bentley_standard_CustomAttributes”和“DisplayOptions”获得能够产生instance的enabler。
5、从DgnECInstanceEnabler.GetsharedWipInstance获取standloneECInstance。然后SetProperty("Hidden",ECValue(False)).
6、最后调用ECClass的SetCustomAttribute接口,给第三步得到的ECClass赋上standloneECInstance。
到这步为止我认为已经把ECCLass修改了,我跟了一下程序也是可以跑通的,但是没有成功隐藏已生成的属性。
想老师请假一下思路是否正确及修改方式。
如下代码是我之前测试用过的,您可以参考一下,不过HideInstances这个属性好像是最近几个版本中才有的:
verMaj = 1; verMin = 13; schemaCustomAtt = DgnECManager.Manager.LocateSchemaInScope(scopeTemp, "Bentley_Standard_CustomAttributes", verMaj, verMin, SchemaMatchType.LatestCompatible); if (schemaCustomAtt != null) { IECClass ecClassItemId = schemaCustomAtt.GetClass("DisplayOptions"); IECInstance ecInsCate = ecClassItemId.CreateInstance(); ecInsCate.SetBoolean("HideInstances", true); ecClass.SetCustomAttribute(ecInsCate); }
您这个好像是C#的代码,我的逻辑应该跟您这差不多。您是在ECClass中通过CreateInstance获得IECInstance的,C++中的ECClass好像是没有这个接口的。我是通过ObtainInstaceEnablerByName,获得enabler,然后从enabler中拿到instance的。我之前设置的是Hidden属性,我刚试了一下将HideInstance属性也设置为False,也没有达到预想的效果。
SetCustomAttribute之后,我将ecschema WriteToXmlFile后的schema文件,可以看到属性是给进去的。把这个文件在安装目录中替换一下,新生成的element中挂载这个属性是不会显示的。我怀疑是不是修改的ecSchema没有影响到之前的element。
lobby lee said:HideInstance属性也设置为False
这个属性要设置为true才会隐藏。
不好意思,笔误了,代码里面设置的是true的。
请上传一下您的dgn文件,就是ecschema更新后往元素上添加了属性的文件,这里边应该也包含更新之前添加了属性的元素。