我在界面上弄了个按钮,想让用户点击后加载一个交互工具,选择一个元素。
目前我是使用了一个继承自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了。。。我已经改成让用户先选择再点按钮了。。。
我试了,确实不行,上传截图给你看看
难道是我的sdk版本太低了?算了,我自己另外想办法解决吧。。。
您对DgnTool的理解有问题。在DgnElementDetTool中直接调用GetElementAgenda()就能获得用户选中的元素。这些元素不是在选择集中的。这是两个概念。
我对你选择集的测试前提是,先手工用系统的构造选择集工具构造了一个选择集,然后才执行的你那段代码。
当然,DgnElementSetTool也能和选择集直接集成,此种情况下还是可以通过调用GetElementAgenda得到选中的一系列元素。
修改元素一般分两种情况:
①利用DgnElementSetTool的_OnElementModify自动就会对每个元素调用一遍了,你只需要在此函数中对传入的EditElementHandle修改就可以了,也不需要你调用RepalceInModel。也不需要调用GetElementAgenda;
②选完所有元素后统一修改。此时需要对_OnElementModify返回ERROR;需要在_OnModifiyComplete中调用GetElementAgenda获得所有选中的元素统一修改。
多读一下SDK中带有的例子,自己不要发明操作流程,抄就可以了。
问题是我现在不要修改元素,只是想选中一个只读元素并获取该元素相关信息,用继承于DgnElementSetTool的类来做似乎不太合适,还是只能自己从DgnTool类来继承
能否上传一下您的测试文件,如果我这边复现不出来您的问题,就没办法帮您解决。
好的,我把自己写的类上传一下,麻烦有空帮我看看ChooseElement.rar
测试的dgn文件呢?
土方计算地形模型.rar
有点大。。。
你的_NeedAcceptPoint返回了false,所以就没再启用动态,我是再动态显示的状态下获取到的ID,我建议您重写一下_OnDataButton函数,在这个函数里边调一下基类的_OnDataButton函数,然后判断一下ElementAgenda里是否有元素,有的话就进行你的操作,然后调用_OnReinitialize,最后返回true,没有的话就直接返回false就行。
可以了,谢谢郭老师