我在界面上弄了个按钮,想让用户点击后加载一个交互工具,选择一个元素。
目前我是使用了一个继承自DgnElementSetTool的子类做的,在_OnElementModify中获取选择集进行操作,但问题是对于参考进来的只读元素无法进行选择,重写了_OnPostLocate函数也无济于事,请问该如何实现?实在不行,就只能让用户先选择了。。。
直接获取选择集合里的元素,代码如下:
void getSelectElement(ElementRefP& erp, DgnModelRefP& dmrp, size_t& num){ erp = nullptr; dmrp = nullptr; auto& ssm = SelectionSetManager::GetManager(); num = ssm.NumSelected(); if (num <= 0) { return; } ssm.GetElement(0, &erp, &dmrp);}
但是获取不到元素,看样子达到要求只能自己写类继承DgnTool类了,DgnElementSetTool类不能满足要求
程远 李 said:但是获取不到元素
在我这里可以获取到元素呀。测试代码如下:
void getSelectElement(ElementRefP& erp, DgnModelRefP& dmrp, size_t num) { erp = nullptr; dmrp = nullptr; auto& ssm = SelectionSetManager::GetManager(); num = ssm.NumSelected(); if (num <= 0) { return; } ssm.GetElement(0, &erp, &dmrp); } void SelectionSetTest() { ElementRefP erp = nullptr; DgnModelRefP dmrp = nullptr; getSelectElement(erp, dmrp, 0); ElementHandle eh(erp, dmrp); WPrintfString wStr(L"elId=%d", eh.GetElementId()); mdlDialog_dmsgsPrint(wStr); }
执行结果如下(我选择集中的所有元素都是在参考文件中的):
程远 李 said:DgnElementSetTool类不能满足要求
不要轻易下错误的结论。DgnElementSetTool可以满足我们各方面的要求的,但其用法也确实比较复杂。
用GetElementAgenda可以。
我试了一下,还是不行。代码如下:
StatusInt SelectOneElement::_OnElementModify(EditElementHandleR el){ auto& agenda = GetElementAgenda(); auto count = agenda.GetCount(); mdlDialog_dmsgsPrint(WPrintfString(L"get [%d] element", count)); if (0 == count) { return ERROR; } mdlDialog_dmsgsPrint(WPrintfString(L"get element id:[%d]", agenda.at(0).GetElementId())); //if (s_SelectOneCallback) //{ // s_SelectOneCallback(agenda.at(0),GetToolId()); //} //_ExitTool(); return SUCCESS;}
SelectOneElement继承自DgnElementSetTool
你在_OnElementModify函数里调用getSelectElement函数试试看,我试了,得到的elementID是0.。。
我打算自己写一个类继承自DgnTool,或者直接调用MicroStation里面的选择命令。。。