3.4.1.4 特殊类型的EC属性定义


         在实际应用中,除了定义常规的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

int

代表Element的层ID, 显示时系统会自动为其配置层下拉列表。

3

int

代表Element的颜色ID, 显示时系统会自动为其配置颜色下拉列表。

4

int

代表Element的线宽值, 显示时系统会自动为其配置线宽下拉列表。

5

int

代表Element的线形样式ID, 显示时系统会自动为其配置线形下拉列表。

6

int

代表Element的类ID, 显示时系统会自动为其配置元素类下拉列表。

7

point3d

代表以上下文Model中的单位显示的3D点坐标(如: 1.23m,4.56m,7.89m)。

8

double

代表以上下文Model中的单位显示的距离值(如: 4.56m)。

9

double

代表以上下文Model中的单位显示的面积值(如: 8.45 Sq.m)。

10

double

代表以上下文Model中的单位显示的体积值(如: 2.68 Cu.m)。

11

double

代表以上下文Model中的单位显示的角度值(如: 12°15’22’’)。

15

int

代表Element的文字样式ID, 显示时系统会自动为其配置文字样式下拉列表。

16

string

代表Element的渲染材质名称, 显示时系统会自动为其配置材质选择器下拉列表。

17

double

代表以上下文Model中的单位显示的方位角度值(如: N15°12’30’’E)。

18

point3d

代表无单位3D点坐标。

19

double

代表有名称的比例值。

20

string

代表材质投影命名组。

22

double

代表Element的透明度值。

24

long

代表文件大小, 显示时带有省略样式的字符串表达。

25

long

代表文件大小, 显示时带有完整样式的字符串表达。

26

int

代表属性的显示优先级, 值越小显示越靠前。

27

int

代表Element的字体ID,显示时系统会自动为其配置字体名称下拉列表。

28

int

代表Element的大字体ID, 显示时烯烃会自动为其配置字体名称下拉列表。

29

long

代表Element的ElementId。

30

string

代表Element的填充单元名称。

57

point3d

代表一个以上下文Model中的单位现实的绕三个轴的旋转角度。