我在界面上弄了个按钮,想让用户点击后加载一个交互工具,选择一个元素。
目前我是使用了一个继承自DgnElementSetTool的子类做的,在_OnElementModify中获取选择集进行操作,但问题是对于参考进来的只读元素无法进行选择,重写了_OnPostLocate函数也无济于事,请问该如何实现?实在不行,就只能让用户先选择了。。。
virtual bool _IsModifyOriginal () override {return false;}
其实搜一下以前的帖子也能找到该问题的答案的。如下:
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/177401/msce-c-dgnelementsettool
https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/151508/c-msv8i-ilocatecommandevents
Answer Verified By: 程远 李
重写_IsModifyOriginal后确实可以选中只读元素了,但是好像不能正确获取元素的id了。。。我已经改成让用户先选择再点按钮了。。。
你是如何获取元素Id的?注意此时的DgnModelRef已经不是ACTIVEMODEL了,而是指定的参考模型的DgnModelRef了。
直接获取选择集合里的元素,代码如下:
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可以。