老师,最近想做一个门窗放置工具,想如果点击墙就在墙上放,否则直接放。但是在_OnDataButton中用mdlLocate_findPath获取HitPathCP时获取不到,用_DoLocate就能获取到;想通过点击点有没有Path来判断是直接放门窗,还是走_BuildLocateAgenda这个函数去放在元素上;如下是我的最简测试代码,两个获取的Path不同
class SelectFaceTool : public DgnElementSetTool { public: SelectFaceTool() {} ~SelectFaceTool() {} bool _OnResetButton(DgnButtonEventCR ev) override { _OnReinitialize(); return true; } void _OnPostInstall() override { __super::_OnPostInstall(); } StatusInt _OnElementModify(EditElementHandleR elHandle)override { return ERROR; } void _OnRestartTool() override { SelectFaceTool *pTool = new SelectFaceTool(); pTool->InstallTool(); } EditElementHandleP _BuildLocateAgenda(HitPathCP path, DgnButtonEventCP ev)override { int size1 = GetElementAgenda().GetCount(); if (size1 > 0) { return NULL; } return NULL; } bool _OnDataButton(DgnButtonEventCR ev) override { LocateFailure reasonCode; HitPathCP path1; WString cantAcceptExplanation = L""; HitPathCP path = mdlLocate_findPath(&reasonCode, &cantAcceptExplanation, true, ev.GetPoint(), ev.GetViewNum(), ComponentMode::None, false, false); UInt32 filepos = mdlLocate_findElementEx(&reasonCode, &cantAcceptExplanation, ev.GetPoint(), ev.GetViewNum(), true, ComponentMode::None, false); path1 = _DoLocate(ev, true, ComponentMode::None); if (path1 == NULL) { return true; } return __super::_OnDataButton(ev); } };
那因该是mdlLocate_findPath的参数您传递的不合适,但是在DgnElementSetTool中最好不要调用mdlLocate_findPath,这两种定位元素的方式有可能会有冲突。直接调用_LocateOneElement即可,基类DgnElementSetTool的实现中会将定位到的元素放到DgnElementSetTool的成员变量m_agenda中,通过DgnElementSetTool的GetElementAgenda函数可以获取m_agenda的引用,进而获取到是否定位到元素了。
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
Answer Verified By: chenxuan chen