MFC OpenCasCade – 实现View中的实体对象与右边属性窗口的关联

我们现在来实现这样一种功能:点击视图中的实体对象,右边属性窗口显示相应的属性。

MFC OpenCasCade – 实现View中的实体对象与右边属性窗口的关联

问题的关键 是如何获取我所选中的实体对象,下面是关键代码(放在响应鼠标点击的消息响应的函数中):

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//获取所选择的实体对象

TopoDS_Shape selectedShape;

Handle_AIS_InteractiveContext myContext = GetDocument()->GetAISContext();

myContext->Select();

myContext->InitSelected();

if (myContext->MoreSelected())

{

selectedShape = myContext->SelectedShape();

}

 

//在组件集合中找到含有与当前选择的实体对象相同的实体对象成员的组件,然后用这个组件的参数初始化列表框

for (std::vector<BasicComponent*>::iterator itr = pDoc->m_allComponentVec.begin();itr != pDoc->m_allComponentVec.end(); itr++)

{

if (selectedShape.IsEqual((*itr)->m_myViewShape))

{

/*AfxMessageBox("i found it!");*/

pPro->InitPlinthDepCubePropList((*itr)->m_pParamsGather);

return;

}

}

核心思路就是在我的 Component类型 中添加TopoDS_Shape类型的成员变量,再用Component 对象的数据进行绘制时,把绘制的对象保存到TopoDS_Shape

Note:这里不能用 TopoDS_Shape 类型的指针来保存,因为这样在后期再次使用时(也即判断选择的实体模型与现有的所有模型中的某一个Equal时),会发现找不到,你可以在相关代码处查看值,发现用指针指向的位置中的LocationOrientations全和你最初保存时的数据不一样了。具体原因我也不是很清楚,应该是OCC内部进行了某些操作。

最主要的核心代码就是这些,其他需要根据自己的数据结构来调整。

 

感谢原作者的知识分享.

本文转载自:http://www.zyh1690.org/mfc-opencascade-the-view-to-realize-the-entity-object-associated-with-the-right-of-the-properties-window/