Bentley二次开发采用commands.xml作为嵌入式资源载入程序中,commands.xml包含了程序要执行的命令,初学者开发时需要准确了解commands.xml的结构才能写好命令,完成开发。
以下为一个程序的.commands的源码:
<?xml version="1.0" encoding="utf-8" ?>
<KeyinTree xmlns="http://www.bentley.com/schemas/1.0/MicroStation/AddIn/KeyinTree.xsd">
<RootKeyinTable ID="root">
<Keyword SubtableRef="Commands" CommandWord="TOOLSEXAMPLE">
<Options Required="true" />
</Keyword>
</RootKeyinTable>
<SubKeyinTables>
<KeyinTable ID="Commands">
<Keyword SubtableRef="GroupedHoleCmd" CommandWord="PLACE">
<Options Required="true" />
</Keyword>
<Keyword SubtableRef="GroupedHoleCmd" CommandWord="MODIFY">
<Options Required="true" />
</Keyword>
<Keyword SubtableRef="BlendEdgeCMD" CommandWord="BLEND">
<Options Required="true" />
</Keyword>
<Keyword SubtableRef="SolidUtilCMD" CommandWord="SOLIDUTIL">
<Options Required="true" />
</Keyword>
</KeyinTable>
<KeyinTable ID="GroupedHoleCmd">
<Keyword CommandWord="GROUPEDHOLE" />
</KeyinTable>
<KeyinTable ID="BlendEdgeCMD">
<Keyword CommandWord="BLENDEDGE" />
</KeyinTable>
<KeyinTable ID="SolidUtilCMD">
<Keyword CommandWord="TOOL" />
</KeyinTable>
</SubKeyinTables>
<KeyinHandlers>
<KeyinHandler Keyin="TOOLSEXAMPLE PLACE GROUPEDHOLE"
Function="ManagedToolsExample.Keyin.CmdStartPlaceGroupedHoleTool"/>
<KeyinHandler Keyin="TOOLSEXAMPLE MODIFY GROUPEDHOLE"
Function="ManagedToolsExample.Keyin.CmdModifyPlaceGroupedHoleTool"/>
<KeyinHandler Keyin="TOOLSEXAMPLE BLEND BLENDEDGE" Function="ManagedToolsExample.Keyin.CmdStartBlendTool"/>
<KeyinHandler Keyin="TOOLSEXAMPLE SOLIDUTIL TOOL"
Function="ManagedToolsExample.Keyin.CmdStartSolidUtilTool"/>
</KeyinHandlers>
</KeyinTree>
1、代码块以<>开始,</>结束。
2、根键入命令表结构:
(1)在<RootKeyinTable>和<KeyinTable>中有属性ID,表示该表的名称。
(2)命令表的内容由一个或多个<Keyword>元素组成,<Keyword>属性SubtableRef指向其下级命令表的ID。这样,通过当前表中<Keyword>的SubtableRef和下级表中<KeyinTable>的ID就能构成一个命令树。
(3)<Keyword>还必须有属性CommandWord,这是用户在Mstn键入域中可输入的单词。<Keyword>有一个属性CommandClass表示该键入命令对应的命令类别,目前支持的命令类别有Placement、Viewing、Fence、Parameters、Locks、MacroCommand、Manipulation等。命令类别还可以是Inherit,表示继承上个命令单词所属的命令类别。
(4)<Keyword>中还可以包含<Options>项,该项是对<Keyword>的进一步说明,其属性有Required、Default、TryParse、Hidden等。
Required="true"表示该命令字不是最后一个单词,必须有下级子节点;
Default="true"表示该命令字为默认,当省略这一级命令字时取该命令字,在同一级别中只能有一个命令字为Default。
TryParse="true"表示该命令字后可跟用户输入的任意字符,这些不在命令表中的字符串将被传递到命令处理函数的unparsed参数中。比如Active Color命令后可跟Red、Green、Blue等,也可以跟一个数字,如Active Color 245。我们不可能在命令表中列出每个这样的键入,此时可用TryParse属性;
Hidden="true"表示该命令隐藏,用户在Mstn的命令浏览器中看不到该命令,但该命令仍然有效。这些隐藏的命令往往为程序所用或暂时不想对用户公开。
(5)<KeyinHandlers>段只有<KeyinHandler>一种元素。其中的Keyin属性表示完整的键入命令字符串,<KeyinHandler>的Function属性为该键入命令对应的处理函数名,该函数名由命名空间名、类名和函数名(或称方法名)三部分组成。换句话说,当用户在Mstn中输入Keyin中的字符串时,就会调用到Function指定的函数。
3、二级命令结构
4、三级命令
5、所调用的方法和命令列表的对应关系
6、执行效果(只是为了示意,和上述commands.xml中的命令列表无关)
Mstn中的命令由一到五个单词组成,因而,我们在定义自己的commands.xml时在<SubKeyinTables>段中最多可以定义四级命令。
建议:命令列表不要超过三级,命令较少时,可以选择两级即可。