OpenCASCADE(OCC)拾取模型的 面、点、线的操作
OpenCASCADE(OCC)智能自动 拾取模型的 面、点、线的操作
·
目标:
要实现鼠标在移动的过程中自动识别并且高亮模型的 面、线、点;
所有工作均在View中进行,在View中定义一个选择函数和测试函数:
publi:
void selectMode(Handle(AIS_Shape) selectmode); //高亮模型的选择模式
void test(); //用于测试高亮的模型
下面分别对函数进行实现:
void COCCmfcMDIView::selectMode(Handle(AIS_Shape) selectmode)
{
COCCmfcMDIDoc* pDoc = GetDocument();
//激活将形状分解为Any
pDoc->myAISContext->Deactivate();
const int aSubShapeSelMode = AIS_Shape::SelectionMode(TopAbs_FACE);
pDoc->myAISContext->Activate(selectmode, aSubShapeSelMode);
pDoc->myAISContext->Activate(selectmode, AIS_Shape::SelectionMode(TopAbs_SOLID));
pDoc->myAISContext->Activate(selectmode, AIS_Shape::SelectionMode(TopAbs_VERTEX));
pDoc->myAISContext->Activate(selectmode, AIS_Shape::SelectionMode(TopAbs_EDGE));
}
void COCCmfcMDIView::test()
{
COCCmfcMDIDoc* pDoc = GetDocument();
//创建一个实体
TopoDS_Shape t_topo_box = BRepPrimAPI_MakeBox(100.0, 50.0, 50.0).Shape();
Handle(AIS_Shape) t_ais_box = new AIS_Shape(t_topo_box);
pDoc->myAISContext->Display(t_ais_box, Standard_True);
selectMode(t_ais_box);
}
这时运行之后,会出现测试的模型,但鼠标移动过程中不会识别面、线、点,当然也不会高亮。
下面就是对这一功能的实现:
首先在View的初始化中添加我们要高亮的颜色和高亮模式:
COCCmfcMDIDoc* pDoc = GetDocument();
pDoc->myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetColor(Quantity_NameOfColor::Quantity_NOC_RED);
pDoc->myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetMethod(Aspect_TOHM_COLOR);
pDoc->myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetDisplayMode(1);
pDoc->myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetTransparency(0.5f);
//myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_LocalSelected)->SetColor(Quantity_NameOfColor::Quantity_NOC_YELLOW);
pDoc->myAISContext->UpdateCurrentViewer();
因为myAISContext 是在Doc中定义的,所以这里多了一步获取 Doc的指针的代码:COCCmfcMDIDoc* pDoc = GetDocument();
如果你是在View中定义的上下文对象,就无需这一步了。
这里可以看出我已经对高亮风格进行了设置。
最后在View的鼠标事件 afx_msg void OnMouseMove(UINT nFlags, CPoint point) 中进行添加:
void COCCmfcMDIView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnMouseMove(nFlags, point);
switch (m_current_mode)
{
case COCCmfcMDIView::CurAction3d_DynamicPanning:
//执行平移
myView->Pan(point.x - m_x_max, m_y_max-point.y);
m_x_max = point.x;
m_y_max = point.y;
break;
case COCCmfcMDIView::CurAction3d_DynamicRotation:
//执行旋转
myView->Rotation(point.x, point.y);
break;
case COCCmfcMDIView::CurAction3d_Nothing:
//执行高亮显示
COCCmfcMDIDoc* pDoc = GetDocument();
pDoc->myAISContext->MoveTo(point.x, point.y, myView, true);
break;
}
}
也就是添加了这两行代码:
//执行高亮显示
COCCmfcMDIDoc* pDoc = GetDocument();
pDoc->myAISContext->MoveTo(point.x, point.y, myView, true);
上面的平移旋转可以忽略。
点击运行》》
至此,模型面、线、点的拾取均能够实现!!!!
更多推荐
所有评论(0)