目标:

要实现鼠标在移动的过程中自动识别并且高亮模型的 面、线、点;

所有工作均在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);

上面的平移旋转可以忽略。

点击运行》》

 

 

 

至此,模型面、线、点的拾取均能够实现!!!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐