在实际应用中,除了定义常规的EC属性外(即基本的单值或数组类型),我们可能还需要定义一些复杂的或特殊的EC属性,而这些EC属性的定义都需要使用特殊的CustomAttribute才能完成。接下来我们介绍几种特殊EC属性的定义方法:
结构体类型的EC属性定义: 正如前面所介绍的,在特定ECClass中加入isStruct = “True” 这个XML属性字段后,则这个ECClass就可以在其他ECProperty中用作其typeName的值了,与此同时,也需要在这个ECProperty中加入 isStruct = “True” 属性字段。例如:
<ECClass typeName="CurveData" isStruct="True" isDomainClass="True"> <ECProperty propertyName="Order" typeName="int" displayLabel="Order" /> </ECClass> <ECClass typeName="PointData" isStruct="True" isDomainClass="True"> <ECProperty propertyName="BCurve" typeName="CurveData" displayLabel="Curve" isStruct="True" /> </ECClass>
上例中,EC类CurveData被定义成一个结构体类型,然后被以类型的方式用在了EC类PointData中。这里需要注意的是,PointData依旧是个结构体类型,可以被作为类型用在其他地方。所以,结构体类型的定义支持任意层次的嵌套;同时,我们也可以将这个定义延伸到结构体数组类型,道理都是一样的。
文件选择类型的EC属性定义: 这种类型的EC属性在显示时,系统会提供一个编辑框和一个按钮,用户既可以直接输入文件名,也可以通过点击按钮来选择文件,选择得到的文件名会自动填入到编辑框中。要定义这种类型的EC属性,我们需要用到上表FilePickerAttributes和ExtendType类型的CustomAttribute,并且需要通过在ExtendType中指定其Name值为ECFile,具体使用如下:
<ECProperty propertyName="FileName" typeName="string" displayLabel="File Name"> <ECCustomAttributes> <ExtendType xmlns="EditorCustomAttributes.01.00"> <Name>ECFile</Name> </ExtendType> <FilePickerAttributes xmlns="EditorCustomAttributes.01.00"> <Title>Select RealityMesh File</Title> <FilterIndex>0</FilterIndex> <UseSaveFile>False</UseSaveFile> <CreatePrompt>False</CreatePrompt> <OverwritePrompt>False</OverwritePrompt> <FilterList>Reality Mesh (*.3mx)|*.3mx</FilterList> </FilePickerAttributes> </ECCustomAttributes> </ECProperty>
其中,ExtendType指定了使用EC的文件选取功能(这种扩展后面介绍),而FilePickerAttributes则指定了配置文件选择对话框所需的所有信息。
路径选择类型的EC属性定义: 这种类型的EC属性在外观行为上与文件选择类型属性非常相似,只不过点击按钮后弹出的是路径选择对话框,而不是文件选择对话框;相较而言它的定义要更简单一些,定义如下:
<ECProperty propertyName="FileName" typeName="string" displayLabel="File Name"> <ECCustomAttributes> <ExtendType xmlns="EditorCustomAttributes.01.00"> <Name>DgnFolerBrowser</Name> </ExtendType> </ECCustomAttributes> </ECProperty>
下拉列表类型的EC属性定义: 这种类型的EC属性显示在属性面板上时,系统会为它提供一个标题和一个下拉列表,用户可以通过下拉列表在已有选项中选择一个字符串项,选择完成后系统会将选择的字符串项作为此属性的值来显示,对内部而言,与用户所选择字符串项相对应的int值会作为属性的值保存起来。这种类型EC属性的定义需要用到上表中名为StandardValues这个CustomAttribute,具体格式如下:
<ECProperty propertyName="CfType" typeName="int" displayLabel="CfType" description="chamfer"> <ECCustomAttributes> <StandardValues xmlns="EditorCustomAttributes.01.02"> <ValueMap> <ValueMap> <DisplayString>None</DisplayString> <Value>0</Value> </ValueMap> <ValueMap> <DisplayString>Fillet</DisplayString> <Value>1</Value> </ValueMap> <ValueMap> <Value>2</Value> <DisplayString>Chamfer</DisplayString> </ValueMap> </ValueMap> <MustBeFromList>True</MustBeFromList> </StandardValues> </ECCustomAttributes> </ECProperty>
由上可见,定义一个带下拉列表的EC属性,有以下要求:
1. 属性的typeName必须是int;
2. 下拉列表中的每一项都需要用一个ValueMap节点来描述,这个节点中的DisplayString和Value子节点值分别代表每一项的显示名称以及数值,而且这个数值的类型也必须是int;
3. 用于代表下拉列表中每项的ValueMap节点必须统一包含在另一个ValueMap中以构成选择列表;
4. 使用StandardValues作为下拉列表属性的顶层节点,其内包含下拉列表的ValueMap和MustBeFromList节点,其中,这个MustBeFromList用于控制用户是否只能从所提供列表中选择,而不能直接输入。
自定义行为的EC属性定义: 这种类型的EC属性主要用于支持用户自定义行为。这种属性在显示时,系统会提供一个编辑框和一个按钮,编辑框中的内容用户可随意修改,当用户点击按钮时会在系统内部触发ICimEventListener::OnEventProperty()[C++]回调或OnEventProperty()[C#]事件,此时用户就可以通过响应这个回调/事件来实现自定义行为,例如: 执行keyin、显示上下文菜单、弹出对话框等等。由于这是CIM扩展出来的EC属性,所以在定义上非常简单,具体形式如下:
<ECProperty propertyName="PopupItem" typeName="string" displayLabel="Click Me"> <ECCustomAttributes> <ExtendType xmlns="EditorCustomAttributes.01.00"> <Name>CimEventItem</Name> </ExtendType> </ECCustomAttributes> </ECProperty>
这里需要注意的是,ExtendType中的Name的值必须是CimEventItem。
其他内置特殊EC属性的定义: 在系统内部已经预定义了一些特殊的EC属性,这类EC属性的定义都是以ExtendType这种CustomAttribute为基础,通过为其Standard字段指定不同的值来完成的。其基本使用方式如下例所示:
<ECProperty propertyName="Origin" typeName="point3d"> <ECCustomAttributes> <ExtendType xmlns="EditorCustomAttributes.01.00"> <Standard>7</Standard> </ExtendType> </ECCustomAttributes> </ECProperty>
系统中预定义的Standard值、对应属性的typeName及其含义如下表所示:
Standard
typeName
含义
1
int
代表Element的类型ID。
2
代表Element的层ID, 显示时系统会自动为其配置层下拉列表。
3
代表Element的颜色ID, 显示时系统会自动为其配置颜色下拉列表。
4
代表Element的线宽值, 显示时系统会自动为其配置线宽下拉列表。
5
代表Element的线形样式ID, 显示时系统会自动为其配置线形下拉列表。
6
代表Element的类ID, 显示时系统会自动为其配置元素类下拉列表。
7
point3d
代表以上下文Model中的单位显示的3D点坐标(如: 1.23m,4.56m,7.89m)。
8
double
代表以上下文Model中的单位显示的距离值(如: 4.56m)。
9
代表以上下文Model中的单位显示的面积值(如: 8.45 Sq.m)。
10
代表以上下文Model中的单位显示的体积值(如: 2.68 Cu.m)。
11
代表以上下文Model中的单位显示的角度值(如: 12°15’22’’)。
15
代表Element的文字样式ID, 显示时系统会自动为其配置文字样式下拉列表。
16
string
代表Element的渲染材质名称, 显示时系统会自动为其配置材质选择器下拉列表。
17
代表以上下文Model中的单位显示的方位角度值(如: N15°12’30’’E)。
18
代表无单位3D点坐标。
19
代表有名称的比例值。
20
代表材质投影命名组。
22
代表Element的透明度值。
24
long
代表文件大小, 显示时带有省略样式的字符串表达。
25
代表文件大小, 显示时带有完整样式的字符串表达。
26
代表属性的显示优先级, 值越小显示越靠前。
27
代表Element的字体ID,显示时系统会自动为其配置字体名称下拉列表。
28
代表Element的大字体ID, 显示时烯烃会自动为其配置字体名称下拉列表。
29
代表Element的ElementId。
30
代表Element的填充单元名称。
57
代表一个以上下文Model中的单位现实的绕三个轴的旋转角度。