<ECProperty propertyName="Name" typeName="string"> <ECCustomAttributes> <PreviousNameArray xmlns="Bentley_Standard_CustomAttributes.01.00"> <PreviousNames> <PreviousName> <OldName /> <SchemaFullNameKey>TestSchema.01.00</SchemaFullNameKey> <IsNewInThisVersion>True</IsNewInThisVersion> </PreviousName> </PreviousNames> <PreviousNameAlreadySaved>True</PreviousNameAlreadySaved> </PreviousNameArray> <PropertyPriority xmlns="EditorCustomAttributes.01.00"> <Priority>100</Priority> </PropertyPriority> </ECCustomAttributes> </ECProperty>
Sub test() Dim oPH As PropertyHandler Set oPH = CreatePropertyHandler(ActiveModelReference.GetElementByID(DLongFromLong(32358))) oPH.SelectByAccessString "mingCheng" oPH.SetValue "12" End Sub
从你粘贴出来的ECSchema.XML中看到的ECProperty的名称是"Name",而你的代码中SelectByAccessString后指定的名称是"mingCheng",这两个名称不匹配。请查看一下是否是这个原因?
我这个xml粘贴自您给的文件!疏忽了,我使用的是我另写的xml,并没有不匹配,如下:
<ECProperty propertyName="mingCheng" typeName="String" displayLabel="名称"> <ECCustomAttributes> <PreviousNameArray xmlns="Bentley_Standard_CustomAttributes.01.00"> <PreviousNames> <PreviousName> <OldName /> <SchemaFullNameKey>TestSchema.01.00</SchemaFullNameKey> <IsNewInThisVersion>True</IsNewInThisVersion> </PreviousName> </PreviousNames> <PreviousNameAlreadySaved>True</PreviousNameAlreadySaved> </PreviousNameArray> <PropertyPriority xmlns="EditorCustomAttributes.01.00"> <Priority>100</Priority> </PropertyPriority> </ECCustomAttributes> </ECProperty>
我测试这个ProertyHandler的SelectByAccessString,它只认识系统自带的属性,无法选择自定义的属性。该方法返回值总是False。
请升级到MSCE,改用ItemType编程。会比在V8i中这样用EC属性要简单得多。
确实是有默认值或手工赋过值之后就能用ProertyHandler的SelectByAccessString来选择了。由于V8i将被淘汰,CE下又有新的ItemType可用,所以,这类Bug开发组不给修复的。
利用XML还可以定义一个ECInstance来给自定义属性赋初始值吧?符老师我们在V8i平台花费的心血太多了,最后一步也不好立马转CE平台,所以才会如此守旧
我们这个XML定义的是ECClass(多个相关的ECClass可以放到一个ECSchema中),不是ECInstance。ECInstance是附到元素上的XML片段,含有具体的值。
我请教了EC方面的专家,在V8i的VBA下没有更好的办法实现您的需求。需要用C#编程应该是可以的。C#有关EC的开发请参考SDK中的帮助文档:ecsdk.chm、ecobjects.chm、ecservices.chm等。但请注意,EC编程V8i和CE下变化很大。
好的,谢谢老师的细心指导和耐心的咨询查找
EC技术确实复杂,刚刚又深入研究了一下Bentley ClassEditor工具,其中有CalculatedECPropertySpecification 自定义属性可满足给ECProperty设置默认值的功能。修改你的ECSchema.XML如下:
<CalculatedECPropertySpecification xmlns="Bentley_Standard_CustomAttributes.01.00"> <RequiredSymbolSets /> <ECExpression>"Default Name"</ECExpression> <IsDefaultValueOnly>True</IsDefaultValueOnly> </CalculatedECPropertySpecification>
即在每个ECProperty的<ECCustomAttributes>下增加如上的一段就能给一个ECProperty增加默认值了。增加部分的位置如下图所示:
我写VBA代码测试通过了。
万分感谢,看到您的回复,下班了还折回来研究了一下!我们本来都要放弃VBA,转变方向了!真的万分感谢符工,您太负责任了!