各位老师:
测试regiongraphicsContext,主要目的测试在程序中生成region。遇到的问题:1、在三维模型中生成的region(强制在顶视图)和顶视图的观测是有差距的,二维模型不存在这个问题;2、三维模型中如果两个曲线Z方向距离比较远就不会生成region。同样的条件,例子中的examptool和系统的patterns下的flood功能都能正常执行。测试代码如下:
struct Region : DgnElementSetTool { private: int m_toolId; Region(int toolId) : DgnElementSetTool(toolId), m_toolId(toolId) {} void _OnPostInstall() override { __super::_OnPostInstall(); _SetLocateCursor(true); } bool _OnDataButton(DgnButtonEventCR ev) override { bool status = __super::_OnDataButton(ev); size_t nCount = GetElementAgenda().GetCount(); if (nCount != 2) return status; ElementAgendaR area = GetElementAgenda(); if (nCount != area.GetCount()) { wprintf(L"%d\n", area.GetCount()); mdlDialog_dmsgsPrint(L"wrong"); } //EditElementHandle eehA(14705L, ACTIVEMODEL); //EditElementHandle eehB(14703L, ACTIVEMODEL); //ElementAgenda list; list.Insert(eehA); list.Insert(eehB); DPoint3d seedPt = DPoint3d::FromZero();//测试:区域边线包围坐标原点。 Transform trans[2]{ Transform::FromIdentity(),Transform::FromIdentity() }; RegionGraphicsContextPtr RgcPtr = RegionGraphicsContext::Create(); //DVec3d vec = DVec3d::UnitZ(); //RgcPtr->SetFlattenBoundary(vec); RgcPtr->SetFloodParams(RegionLoops::Outer, 0.0); RgcPtr->SetFlattenBoundary(trans[0]); RgcPtr->Flood(*ACTIVEMODEL, area, trans, &seedPt, 1); EditElementHandle poly; BentleyStatus flag = RgcPtr->GetRegion(poly); if (ERROR == flag) { mdlDialog_dmsgsPrint(L"error!!"); return false; } poly.AddToModel(); return false; } void _OnRestartTool() override { InstallNewInstance(m_toolId); } private: virtual size_t _GetAdditionalLocateNumRequired() override { return 2; } virtual bool _WantAdditionalLocate(DgnButtonEventCP ev) override { return WantAdditionalLocateHelper(ev); } virtual bool _OnModifierKeyTransition(bool wentDown, int key) override { return OnModifierKeyTransitionHelper(wentDown, key); } bool _IsModifyOriginal()override { return true; } bool _DoGroups(void) { return true; } bool _OnPostLocate(HitPathCP path, WStringR cantAcceptReason) { return true; } int _OnElementModify(EditElementHandleR element) { return ERROR; } public: static void InstallNewInstance(int toolId); }; void Region::InstallNewInstance(int toolId) { Region* tool = new Region(toolId); tool->InstallTool(); } void runRegion(void) { Region::InstallNewInstance(0); }
8105.test01.dgn
我测试了如下确实,如果线性元素不在同一高度确实会出现误差,如果高度差的比较多的话,还可能生成不出来。我猜测系统工具应该是在后台把这些元素平移到同一平面上去生成Shape的。
是否研究过DgnRegionElementTool这个类?
这个类没有问题的。主要是想在程序中获取这个region,不是交互的。
符老师、郭老师,其实最终目的是想实现系统这个功能:flood,associative boundary。
试试这个对象AssocRegionCellHeaderHandler
Answer Verified By: hj z