我们在开发交互式工具时,通常会使用_OnDynamicFrame函数来实现动态绘制的功能。以往我们在实现动态绘制功能时,都是在重写的_OnDynamicFrame函数中去创建工具要生成的元素,然后再使用RedrawElems类去动态绘制元素。这在大部分情况下是可行的,但如果我们的工具要创建的元素如果是一个很复杂的元素,例如参数化单元。那么创建元素将会是一个很耗时的动作,而_OnDynamicFrame函数又是一个随着鼠标在视图中来回移动时被高频率回调的一个函数,这个时候我们的工具在动态绘制时将会表现地非常卡顿,用户体验非常不好。如下链接就包含了这么一个交互式工具:
communities.bentley.com/.../PlaceParametricCell_5F00_Ver1.7z
编译后,启动Mstn打开任意dgn文件以后,执行keyin命令“mdl load PlaceParametricCell;placeparametriccell cmd test”可以启动插件中交互式放置参数化单元的工具。可以看到鼠标在视图中移动时,整个过程非常卡顿。作为对比,我们可以使用Mstn自带的放置单元的工具,如下图所示,打开“Cell Library”对话框:
在“File”菜单中选择“Attach File...”菜单项,在弹出的文件选择对话框中选择“C:\ProgramData\Bentley\MicroStation CONNECT Edition\Configuration\WorkSpaces\Example\WorkSets\MetroStation\DGN\Parametric Models\Double Door Cabinet.dgn”文件(我们的实例代码中使用的就是这个单元库文件)。选择此文件以后会将此文件中包含的单元定义在对话框下部的列表中列出,我们双击”Double Door Cabinet“一栏,可以直接启动放置单元的工具,此时我们在视图中来回移动光标时,会看到Mstn的交互式放置工具在放置同一参数单元时,相当的流畅。那么我们的交互式工具是否也能像Mstn的那样一样流畅呢?答案是肯定的,我们就需要对我们工具类做适当的优化,使动态绘制像Mstn工具那样流畅。如下链接是优化后的版本:
communities.bentley.com/.../PlaceParametricCell_5F00_Ver2.7z
在此版本中,我们在工具类中定义了一个EditElementHandle类型的成员变量m_eehCell,我们重写了_OnInstall成员函数,这个函数会在工具类被启动后,而且真正激活为当前工具之前被回调。我们在这个函数中创建了要放置的参数化单元。这样当工具真正激活以后,我们只需要在重写的_OnDynamicFrame函数中,对预先创建好(注:只是在内存中,并没有被添加保存到dgn文件中)的单元实例仅做空间的旋转平移变换,随后再将其动态绘制出来即可。这样就大大地提高了_OnDynamicFrame函数地运行效率。此时我们的交互式工具就会像Mstn原生地放置单元工具那样流畅了。