LearnDgnTool-06_DgnElementSetTool的使用_修改元素颜色


接下来我们通过几个例子来看一下DgnElementSetTool的用法。第一个例子我们通过DgnElementSetTool实现交互式修改元素颜色的工具,下面的链接是完整代码。

communities.bentley.com/.../LearnDgnTool_5F00_Ver4.7z

编译完成后打开任一Dgn文件,加载我们的程序并执行key-in命令:LearnDgnTool ChangeColor ,激活我们的工具。现在通过光标在视图中选择元素,可以看到元素的颜色发生改变(我们这里固定把元素颜色修改成当前颜色值加1的颜色)。但是此时只是动态显示的效果,我们仍然需要在视图中再次点击鼠标左键才能完成修改,如果有其他元素与被选中的元素在同一Group中,那么这些元素的颜色也会被修改,原因是DgnElementSetTool:: _DoGroups返回的是true,而我们的工具没有重写修改其返回值,如果不想同一组中的其他元素颜色被修改就需要重写一下这个函数并返回false。我们退出工具,选择元素选择集工具,选中若干元素以后,再次启动我们的工具,在视图中再次单击鼠标左键确认修改,此时我们通过选择集选中的元素颜色也被修改了(因为被选中的元素会高亮显示,所以我们可能需要清空选择集才能看到修改效果)。打开ChangeColorTool.h和ChangeColorTool.cpp我们可以看到,我们的工具类ChangeColorTool只有四个成员函数,其中最重要的是_OnElementModify。我们重写的这个函数仅仅只是把传递进来的元素颜色改变了一下,并返回SUCCESS就完成了修改元素颜色的功能,而且还支持选择集。当然目前我们的工具功能还不是很完善,例如不支持围栅获取元素、选中元素还需要确认等等,接下来我们就一步一步来完善我们的工具。

首先我们在ChangeColorTool的声明中加上如下所示的内容:

virtual bool _NeedPointForSelection()override { return false; }

重新编译以后,用选择集工具选中若干元素以后,启动我们的工具。此时启动之后会发现选择集中的元素颜色立即发生改变,并且我们的工具会直接退出。我们再往ChangeColorTool的声明中加入如下所示的内容:

virtual bool _NeedAcceptPoint()override { return false; }

清空选择集之后再次启动我们的工具,此时用通过光标点选的元素颜色会立即改变,不需要额外再点击左键去确认了。接下来我们重写想相关的函数使我们的工具支持围栅获取元素,继续我们再往ChangeColorTool的声明中加入如下所示的内容:

virtual UsesFence   _AllowFence()override { return USES_FENCE_Check; }

virtual bool _UseActiveFence()override { return true; }

编译后,我们通过系统工具在视图中放置一个围栅,启动工具,最后在视图中点击鼠标左键完成元素颜色的修改操作。最后我们给工具加上框选或划选获取元素的功能,将以入下内容添加到ChangeColorTool的声明中:

virtual UsesDragSelect  _AllowDragSelect()override { return USES_DRAGSELECT_Box; }

	virtual bool _WantDynamics()override { return false; }

重新编译后,启动工具,按住鼠标左键在视图中拖拽会看到在光标拖拽的区域有一个矩形。直到想要拾取的元素都已经在矩形范围后释放鼠标左键(这里有一个小技巧,当我们从左上角往右下角框选时,元素要全位于矩形区域内才会被选中,而从右下角往左上角时,只要元素与矩形区域有交集就会被选中,另外在框选的过程中如果按下”Shift”键也会切换这种模式),此时在矩形区域内的元素都会被选中,框选的期间如果我们按下”Alt”键会切换到划选模式。我们再次在视图中单击鼠标左键,元素颜色就会被修改。至此我们的修改元素颜色的工具已经完成,我们的工具支持交互式工具选取元素的所有方式:选择集、围栅、点选、框选以及划选。以下是当前完整代码的链接:

communities.bentley.com/.../LearnDgnTool_5F00_Ver5.7z