LearnDgnTool-02_DgnPrimitiveTool的使用_交互式放置圆


DgnPrimitiveTool是直接从DgnTool派生下来的一个类,提供了最基本的放置元素的逻辑。如果我们要实现的交互式工具在使用过程 中,不需要用户选择某些元素来完成操作的话,最好是从这个类派生我们自己的类来实现我们的交互式工具,我们首先通过一个放置圆的工具来看一下其最简单的用法。

communities.bentley.com/.../5557.LearnDgnTool_5F00_Ver1.7z

上面的链接实现了交互式放置圆的工具,下载后将压缩包中的文件解压到新建的“LearnDgnTool”文件夹下。编译后在“Mdlapps”下生成“LearnDgnTool.dll”和“LearnDgnTool.ma”文件。打开任意Dgn文件后,执行Key-in命令:mdl load LearnDgnTool;LearnDgnTool PlaceCircle后,激活我们的工具。现在在视图中移动我们的鼠标,会看到光标处有一个圆会随着光标移动。通过单击鼠标左键,会看到在点击处会有一个圆生成。

接下来看一下我们的工具是如何实现的,打开“…\LearnDgnTool\LearnDgnTool.cpp”,在“LearnDgnTool PlaceCircle”命令函数里边我们调用了PlaceCircleTool类的静态成员函数InstallNewInstance。PlaceCircleTool是我们从DgnPrimitiveTool派生的一个类,这个类的声明和实现分别在“…\LearnDgnTool\ PlaceCircleTool.h”和“…\LearnDgnTool\ PlaceCircleTool.cpp”文件中。在InstallNewInstance函数中我们通过“new”运算符创建了一个PlaceCircleTool的实例,紧接着通过返回的指针调用了InstallTool来启动我们的工具。InstallTool函数后台会执行很多操作,会调用一些DgnTool中定义的函数,这些函数中有两个虚函数是我们在写交互式工具类中经常用到的,分别是_OnInstall和_OnPostInstall,函数声明如下图所示:

从注释我们可以看到_OnInstall是在我们的工具类真正成为当前工具之前被调用的,只有_OnInstall返回true我们的工具类才会被激活成为当前工具,如果返回false的话就不能被激活,这就给了我们一个机会去判断满足特定条件时我们的工具才能使用。例如注释中举的例子,某些工具只能在3D Model中才能使用,实现这些工具类时,我们就可以在_OnInstall函数中通过“ACTIVEMODEL->Is3d()”判断是否是在3D Model中。而_OnPostInstll则是在我们的工具真正激活成为当前工具之后调用的,这个时候我们就可以做一些初始化的事情了。例如如果你的工具需要一个界面让用户输入一些参数,而你又不想用Bentley提供的定义界面的方式来定制你的窗体的话,你可以通过混合编程借助于VS可视化定制界面的功能利用.Net WinForm来设计你的窗体。这个时候就可以在_OnPostInstall里边实例化你的窗体,并附加到ToolSettings窗口上去,当然这种方式需要你对混合编程比较了解才可以。我们的工具中没有需要输入的参数,所以不需要使用窗体,后面的版本中我会给大家一个通过混合编程定制界面的例子。我们这里在_OnPostInstall函数里边只是启动动态绘制,启动动态绘制后光标在视图中移动时,我们重写的_OnDynamicFrame函数会被不停地调用,通过参数“DgnButtonEventCR ev”可以获取鼠标当前所在点,我们在这里动态绘制用户如果输入确认点后放置出来的效果。

               _OnPostInstall执行完后我们的工具就真正被激活了,接下来用户在视图中单击鼠标左键时我们重写的_OnDataButton函数就会被调用。在这个函数里边,同样地我们可以通过函数参数“DgnButtonEventCR ev”来获取用户输入的点,我们在用户输入的点处生成一个圆并添加到Model中。单击鼠标右键时,我们重写的_OnResetButton函数会被调用,我们只是简单地调用了_OnReinitialize函数。这个函数会调用_OnRestartTool函数,我们重写的_OnRestartTool函数直接调用了InstallNewInstance函数来重启工具。至此我们的第一个例子就全部完成了。