一、选择模式
Opencascade 通过鼠标选择对象,有多种选择模式;调用AIS_InteractiveContext::Activate方法进行设置:
void SinnView::SetSelectMode(TopAbs_ShapeEnum theMode)
{
if(myContext.IsNull())
return;
myContext->Deactivate();
mySelMode = theMode;
Standard_Integer slMode=0;
if(theMode == TopAbs_ShapeEnum::TopAbs_COMPOUND)
slMode = AIS_Shape::SelectionMode (TopAbs_ShapeEnum::TopAbs_SHAPE);
else
slMode = AIS_Shape::SelectionMode (theMode);
myContext->Activate (slMode,Standard_True);
}
选择模式有:
static Standard_Integer SelectionMode (const TopAbs_ShapeEnum theShapeType)
{
switch (theShapeType)
{
case TopAbs_VERTEX: return 1; //选择顶点Shape或Shape的顶点
case TopAbs_EDGE: return 2; //选择边Shape或Shape的边
case TopAbs_WIRE: return 3; //选择环Shape或Shape的环
case TopAbs_FACE: return 4; //选择面Shape或Shape的Face
case TopAbs_SHELL: return 5; //选择Shell
case TopAbs_SOLID: return 6;
case TopAbs_COMPSOLID: return 7;
case TopAbs_COMPOUND: return 8; //选择复合Shape,效果同TopAbs_Shape
case TopAbs_SHAPE: return 0; //选择一个Shape
}
return 0;
}
经常用到的选择模式有:顶点、边、环、面、Shape、COMPOUND(复合Shape)。
二、选择对象的绘制风格
Opencascade 选择一个Shape时,分为两个过程:
1. 移动鼠标时,检测鼠标位置是否有对象:
AIS_StatusOfDetection SinnView::MoveTo
( const Standard_Integer theXPix //鼠标位置X
,const Standard_Integer theYPix //鼠标位置Y
,const Standard_Boolean theToRedrawOnUpdate
)
{
AIS_StatusOfDetection st = AIS_StatusOfDetection::AIS_SOD_Nothing;
if(myView.IsNull())return st;
st = myContext->MoveTo(theXPix,theYPix,myView,theToRedrawOnUpdate);
this->HighlightCompoundDetected(); //复合Shape的检测处理
myContext->UpdateCurrentViewer();
return st;
}
2.接下按下鼠标左键,选中检测到的对象:
AIS_StatusOfPick SinnView::Select()
{
AIS_StatusOfPick st = AIS_StatusOfPick::AIS_SOP_NothingSelected;
if (!myContext.IsNull())
{
this->UnHighlightCompoundDetected();//处理复合Shape
st = myContext->SelectDetected();
this->SetCompoundSelected();//复合对象的选择处理
myContext->UpdateCurrentViewer();
}
return st;
}
因此,选择对象时的绘制风格也分对象被检测到时的绘制风格、对象被选中时的绘制风格。
2.1 设置对象被检测到的绘制风格:
//对象被Detected时的高亮Style
const Handle(Prs3d_Drawer)& aHighlightStyle = myContext->HighlightStyle();
aHighlightStyle->SetColor(Quantity_NOC_CYAN);
aHighlightStyle->SetTransparency(0.3);
aHighlightStyle->SetDisplayMode(AIS_Shaded);
//对象部分被Detected时的高亮Style
const Handle(Prs3d_Drawer)& aPartHightStyle = myContext->HighlightStyle(Prs3d_TypeOfHighlight::Prs3d_TypeOfHighlight_LocalDynamic);
aPartHightStyle->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS);
aPartHightStyle->PointAspect()->SetScale(3.);
aPartHightStyle->SetTransparency(0.8);
Shape选择模式,对象被检测到(MoveTo)的绘制风格:
复合Shape整体选择模式,对象被检测到(MoveTo)的绘制风格:
面(Face)选择模式,对象被检测到(MoveTo)的绘制风格:
环、边选择模式,对象被检测到(MoveTo)的绘制风格:
2.2 设置对象被选中的绘制风格:
//设置对象选中时的绘制Style
const Handle(Prs3d_Drawer)& aSelStyle = myContext->SelectionStyle();
aSelStyle->SetColor(Quantity_NOC_BLUE);
aSelStyle->SetTransparency(0.3);
aSelStyle->SetDisplayMode(AIS_Shaded);
//设置对象的部分选中时的绘制风格
const Handle(Prs3d_Drawer)& aPartSelStyle = myContext->HighlightStyle(Prs3d_TypeOfHighlight::Prs3d_TypeOfHighlight_LocalSelected);
aPartSelStyle->SetColor(Quantity_NOC_RED);
aPartSelStyle->SetTransparency(0.5);
aPartSelStyle->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS);
aPartSelStyle->PointAspect()->SetScale(3.);
Shape选择模式,对象被选中的绘制风格:
复合Shape整体选择模式,对象被选中的绘制风格:
面(Face)选择模式,对象被选中的绘制风格:
环、边选择模式,对象被选中的绘制风格: