老师们好,我们一般可以通过keyin 命令加载自己写的程序。想知道,可否在C++程序里 写一句话,来退出当前命令。
我不太清楚DgnTool的工作机制。 拿DgnPrimitiveTool来说,Install() --> postinstall() --> OnDataButton(点击左键) ,我发现无论是在OnDataButton里return true还是return false,工具都不会调用Oncleanup或者是ExitTool,一定要运行另一个Tool才会退出当前命令。 而我想实现的是工具是,点击一下左键,完成命令后,就退出该工具。
请问各位老师,这能否实现?
在想要退出工具的地方调用ExitTool即可,ExitTool就是退出当前工具。
郭工,我在OnDataButton里调用了ExitTool(), 然而工具并没有退出,还可以继续使用。
ExitTool后边执行了什么?另外OnDataButton是鼠标左键在视图中单击的时候会被调用到。
我这边的产品经理给的需求是 单击鼠标左键画一个钻孔,画好后退出工具。我就在OnDataButton ()里添加了绘制钻孔的代码,最后加一句_ExitTool() 单击左键执行结果是 花了一个钻孔,也调用了_ExitTool() . 然而工具并没有退出,我怀疑这是MS平台机制的问题,必须要切换工具,才会退出当前命令。
能否贴出您OnDataButton的代码,我这边是测试过的,ExitTool调完后就退出当前工具了。
bool DrawZuanKong::_OnDataButton(DgnButtonEventCR ev) { System::String^ bianhao=caForm->zuankongBh; System::String^ gaocheng=caForm->kongkouGc; System::String^ kongshen=caForm->zkDepth; DPoint3dCP basePoint=ev.GetPoint(); DPoint3d basePointtxt; basePointtxt.x = basePoint->x + 30 * m_uor; basePointtxt.y = basePoint->y; basePointtxt.z = basePoint->z; EditElementHandle eeh; EditElementHandle eehTxt; System::String^ zksymbol=caForm->getZkSymbol(); WCharCP wcp= SysString2WString(zksymbol); CreatZkSymbol(eeh,basePoint, wcp, pCellLib); //L"ZK-QT" CreatText(eehTxt, &basePointtxt, bianhao, gaocheng, kongshen); setter->Apply(eeh); setter->Apply(eehTxt); eeh.AddToModel(); eehTxt.AddToModel(); _ExitTool(); return false; } void DrawZuanKong::_ExitTool() { printf("%s\n", "on _ExitTool"); }
一共贴了两个函数,郭工请帮我看一下
为什么要重写_ExitTool呢?在基类DgnPrimitiveTool实现的_ExitTool中,完成了启动默认工具即退出当前工具的操作,您这里重写了这个函数,不仅没有自己去实现这些动作,还不调用基类的_ExitTool(__Super::_ExitTool),肯定不行了。把您这个实现删了就可以了。
Answer Verified By: mkt
真的是这个问题。^^ 我有点明白了。郭工,那可否这样理解,想要在工具函数原有功能的基础重写这个工具函数,为了保持它原有的功能,必须在函数体里调用它的基类函数 :比如在:_OnPostInstall ()的函数体中调用__super::_OnPostInstall (),再写自定义代码,否则就会破坏了基类的机制,在启动工具时就不会自动调用_OnPostInstall ()了.
不是不会调用_OnPostInstall了,在您调用_InstallTool之后,后台会保存您调用_InstallTool的DgnTool*指针,通过这个指针,后台会调用_OnPostInstall,_OnPostInstall是个虚函数,如果子类重新了_OnPostInstall就会调用子类重新的这个_OnPostInstall函数,没有重写的话调用的就是基类的这个函数。这是c/c++里边多态的一种,还是c/c++学的不过关呀。
郭工,这下我明白了。每个基类的函数体并不是空的,除了纯虚函数的函数体是空的。
重写基类函数,为了保持基类函数原有的功能(比如on_install中加载工具的一系列动作),需要调用基类函数(__super::oninstall),然后再写自己的代码。 这也解决了我的一直以来的疑问,关于为什么很多重写函数的函数体里一开始都有一句调用基类函数的语句。
感谢郭工