Opencascade之选择对象

本文详细介绍了Opencascade中通过AIS_InteractiveContext设置的选择模式,包括顶点、边、环、面等,并展示了不同选择模式下的对象检测与选中时的绘制风格。此外,还阐述了选择对象时的两个关键过程:MoveTo和Select,以及如何定制对象被检测到和选中时的高亮和选中样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、选择模式

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)选择模式,对象被选中的绘制风格:

 环、边选择模式,对象被选中的绘制风格:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值