一文带你全面了解 Microstation 中的 Keyin 配置

本文将详细介绍 Microstation 中 Keyin 的配置,包括 Keyin 命令表的结构、各项参数等等,最后将分享如何通过代码的方式来自动生成 command 表。

Addin 中使用 XML 来定义命令表。

命令表结构

Keyin 命令表结构如下图所示:

keyinCommandStructure

命令表是一个 xml 文件,每个命令表中有且仅有一个 KeyinTree 根节点,其下由三部分组成,分别为 RootKeyinTableSubKeyinTablesKeyinHandlers,它们分别表示根命令表、子命令表以及命令对应的处理函数映射。

command.xml 命令表代码示例如下:

使用 <!--xxx--> 包含的内容为注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="utf-8" ?>
<KeyinTree xmlns="http://www.bentley.com/schemas/1.0/MicroStation/AddIn/KeyinTree.xsd">
<!--根命令表,其 ID 为 root-->
<RootKeyinTable ID="rootId">
<!--使用 keyword 定义根命令,通过 SubtableRef 来指向 KeyinTable 的 ID,指定下一级命令。CommandWord 表示命令的单词(不区分大小写)-->
<Keyword SubtableRef="CommandsId" CommandWord="fenceExample">
<!--定义 Keyword 的选项-->
<Options Required="true" />
</Keyword>
</RootKeyinTable>

<SubKeyinTables>
<KeyinTable ID="CommandsId">
<Keyword SubtableRef="FromCmdId" CommandWord="from">
<Options Required="true" />
</Keyword>
<Keyword SubtableRef="ModifyCmdId" CommandWord="modify">
<Options Required="true" />
</Keyword>
<Keyword CommandWord="clear">
<Options Required="true" />
</Keyword>
</KeyinTable>

<KeyinTable ID="FromCmdId">
<Keyword CommandWord="element" />
<Keyword CommandWord="points" />
</KeyinTable>

<KeyinTable ID="ModifyCmdId">
<Keyword CommandWord="move"/>
<Keyword CommandWord="clip"/>
<Keyword CommandWord="stretch"/>
</KeyinTable>
</SubKeyinTables>

<KeyinHandlers>
<KeyinHandler Keyin="fenceExample from element" Function="ManagedFenceExample.Keyin.CmdPlaceFenceFromElement"/>
<KeyinHandler Keyin="fenceExample from points" Function="ManagedFenceExample.Keyin.CmdPlaceFenceFromPoints"/>
<KeyinHandler Keyin="fenceExample clear" Function="ManagedFenceExample.Keyin.CmdClearFence"/>
<KeyinHandler Keyin="fenceExample modify move" Function="ManagedFenceExample.Keyin.CmdMoveFenceContents"/>
<KeyinHandler Keyin="fenceExample modify clip" Function="ManagedFenceExample.Keyin.CmdClipFenceContents"/>
<KeyinHandler Keyin="fenceExample modify stretch" Function="ManagedFenceExample.Keyin.CmdStretchFenceContents"/>
</KeyinHandlers>
</KeyinTree>

上例中的代码命令可以表示为:

keyinCommand结构-代码命令示例

节点标签介绍

KeyinTree 节点包含 RootKeyinTableSubKeyinTablesKeyinHandlers 三个部分。

KeyinTable 中有属性 ID,表示该表的名称。命令表的内容由一个或多个Keyword 元素组成,Keyword属性 SubtableRef 指向其下级命令表的 ID。这样,通过当前表中KeywordSubtableRef 和下级表中 KeyinTable>ID 就能构成一个命令树。

Mstn 中的命令由一到五个单词组成,因而,我们在定义自己的 commands.xml 时在 SubKeyinTables 段中最多可以定义四级命令。

Keyword 还必须有属性 CommandWord,这是用户在 Mstn 键入域中可输入的单词。Keyword 中还可以包含 Options 项,该项是对Keyword的进一步说明,其属性有 RequiredDefaultTryParseHidden 等。

RootKeyinTable

KeyinTree 中必须包含 RootKeyinTable 标签,且只能有一个标签。

RootKeyinTable 中应至少包含一个 Keyword 标签,用于定义根命令单词。

Keyword

Keyword 标签用于定义命令的单词,它可以在 RootKeyinTableKeyinTable 中使用。

Keyword 有如下属性:

属性名称 默认值 可选 作用
SubtableRef - - 指定下一级命令
CommandClass Inherit 指定命令类别
CommandWord - 必须 [必须] 用于定义命令单词

其中 CommandClass 属性表示命令的类别,当为 Inherit 时,表示继承上一个命令的类型。除了 Inherit 外,还有以下类别:

Placement、Viewing、Fence、Parameters、Locks、MacroCommand、Manipulation、Show、Plot、Newfile、Measure、Input、Celllib、Filedesign、Compress、Reference、Database、Dimension、Locate、Tutorial、WorkingSet、List、Undo、SubProcess、ViewParam、ViewImmediate、WindowManager、DialogManager

Keyword 中,可以添加 Option 标签来对 Keyword 进行设置。Option 标签是可选的,它拥有如下属性:

属性名称 默认值 是否可选
Required false
Default false
TryParse false
Hidden false

Required="true" 表示该命令字不是最后一个单词,必须有下级子节点;

Default="true" 表示该命令字为默认,当省略这一级命令字时取该命令字,在同一级别中只能有一个命令字为 Default

TryParse="true"表示该命令字后可跟用户输入的任意字符,这些不在命令表中的字符串将被传递到命令处理函数的 unparsed 参数中。比如 Active Color 命令后可跟 Red、Green、Blue 等,也可以跟一个数字,如 Active Color 245。我们不可能在命令表中列出每个这样的键入,此时可用 TryParse 属性。

Hidden="true" 表示该命令隐藏,用户在 Mstn 的命令浏览器中看不到该命令,但该命令仍然有效。这些隐藏的命令往往为程序所用或暂时不想对用户公开。

SubKeyinTables

SubKeyinTables 是可选标签。若命令大于 1 个单词时,需要用 SubKeyinTables 来定义剩余的单词。

SubKeyinTables 最多只能在配置文件中出现 1 次。它下面必须至少有一个 KeyinTable 子节点,每个 KeyinTable 都必须有一个唯一的 ID 属性值。

每个 KeyinTable 中应至少有 1 个 Keyword 子节点。

每个 KeyinTable 中的 Keyword 可以通过 SubtableRef = "ID" 的方式来指定到其它的 KeyinTable,从而形成命令链。

KeyinHandlers

KeyinHandlers 标签中只有 KeyinHandler 一种元素。KeyinHandler 中必须拥有 KeyinFunction 两个属性。

KeyinHandler 中的 Keyin 属性表示完整的键入命令字符串, 它的 Function 属性为该键入命令对应的处理函数名,该函数名格式为:命名空间名.类名.函数名(或称方法名) 。换句话说,当用户在 Mstn 中输入 Keyin 中的字符串时,就会调用到 Function 指定的函数。

将命令表嵌入 Addin

若要使命令表能够正确被 Microstsation 识别,需要在项目的工程配置文件 (*.csproj) 中的 Project 节点中增加如下配置:

1
2
3
4
5
6
<ItemGroup>
<EmbeddedResource Include="填写commands.xml相对于.csproj文件的相对路径">
<LogicalName>CommandTable.xml</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>

快速生成命令表

参考

本文参考以下文章,在此致以诚挚谢意!

  1. 自动检查Addin程序中XML格式命令表语法 - 中国BDN社区-博客 - 中国BDN社区 - Bentley Communities
  2. 第4章、给Addins添加命令 - 中国BDN社区-威客 - 中国BDN社区 - Bentley Communities
  3. Learning MicroStation Addins Step by Step 4 - 中国BDN社区-博客 - 中国BDN社区 - Bentley Communities