opencascade 标注-直线标注、半径标准、角度标注
opencascade 直线标注
在OpenCascade(OCCT)中实现标注功能主要涉及使用其交互服务模块(AIS)和尺寸标注类。以下是关键步骤和示例代码:
显示精度(小数点后几位)
SetDimensionAspect
设置显示颜色
SetCommonColor
1. 创建尺寸标注对象
使用AIS_LengthDimension
等类创建线性尺寸标注:
#include <AIS_LengthDimension.hxx>
// 定义两个点或边
gp_Pnt P1(0, 0, 0);
gp_Pnt P2(10, 0, 0);
TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(P1, P2);
// 创建长度标注
Handle(AIS_LengthDimension) lengthDim = new AIS_LengthDimension(edge);
2. 设置标注属性
调整颜色、文字大小等属性:
lengthDim->SetColor(Quantity_NOC_RED);
lengthDim->SetTextHeight(5);
lengthDim->SetArrowSize(3);
3. 显示标注
将标注添加到交互上下文:
Handle(AIS_InteractiveContext) context = ...; // 获取交互上下文
context->Display(lengthDim, Standard_True);
4. 半径/直径标注
使用AIS_RadiusDimension
或AIS_DiameterDimension
:
TopoDS_Face aFace = ...; // 获取圆弧或圆
Handle(AIS_RadiusDimension) radiusDim = new AIS_RadiusDimension(aFace);
context->Display(radiusDim, Standard_True);
5. 更新标注
当几何变化时,更新标注位置或值:
// 修改几何后调用
lengthDim->UpdatePosition();
context->Redisplay(lengthDim, Standard_True);
6. 自定义文本格式
重写AIS_Dimension
的ComputeText
方法:
class MyDimension : public AIS_LengthDimension {
virtual void ComputeText() override {
// 自定义文本内容或格式
}
};
7. 交互式标注创建
处理鼠标事件选择几何元素:
void MyInteractor::OnSelectionChanged() {
// 获取用户选择的边或顶点
// 创建对应标注类型
}
opencascade 半径标注
在OpenCASCADE中进行半径标注,可以使用AIS_RadiusDimension类。以下是一个半径标注的基本示例代码:
#include <AIS_RadiusDimension.hxx>
#include <BRepPrimAPI_MakeSphere.hxx>
#include <gp_Pnt.hxx>
#include <AIS_InteractiveContext.hxx>
void DisplayRadiusDimension()
{
// 创建一个球体
BRepPrimAPI_MakeSphere sphereMaker(gp_Pnt(0, 0, 0), 50.0); // 球心在(0,0,0),半径为50
TopoDS_Shape sphereShape = sphereMaker.Shape();
// 创建半径标注
Handle(AIS_RadiusDimension) radiusDimension = new AIS_RadiusDimension(sphereShape);
// 设置标注的样式(可选)
Handle(Prs3d_DimensionAspect) dimensionAspect = new Prs3d_DimensionAspect();
dimensionAspect->TextAspect()->SetHeight(10.0); // 设置文字高度
dimensionAspect->SetCommonColor(Quantity_NOC_RED); // 设置标注颜色
radiusDimension->SetDimensionAspect(dimensionAspect);
// 显示标注
Handle(AIS_InteractiveContext) context = ...; // 获取你的AIS_InteractiveContext实例
context->Display(radiusDimension);
}
角度标注
在OpenCASCADE中进行角度标注,可以使用PrsDim_AngleDimension类。以下是一个完整的代码示例,展示如何在三维空间中创建两条线段,并标注它们之间的角度:
#include <gp_Pnt.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <AIS_Shape.hxx>
#include <PrsDim_AngleDimension.hxx>
#include <Prs3d_DimensionAspect.hxx>
#include <AIS_InteractiveContext.hxx>
void DisplayAngleDimension(Handle(AIS_InteractiveContext) myAISContext)
{
// 定义三个点
gp_Pnt p1(0, 0, 0);
gp_Pnt p2(100, 100, 100);
gp_Pnt p3(180, 150, 60);
// 创建两条线段
TopoDS_Edge edge1 = BRepBuilderAPI_MakeEdge(p1, p2);
TopoDS_Edge edge2 = BRepBuilderAPI_MakeEdge(p2, p3);
// 显示两条线段
Handle(AIS_Shape) aline1 = new AIS_Shape(TopoDS::Edge(edge1));
aline1->SetColor(Quantity_NOC_BLUE);
myAISContext->Display(aline1, false);
Handle(AIS_Shape) aline2 = new AIS_Shape(TopoDS::Edge(edge2));
aline2->SetColor(Quantity_NOC_YELLOW);
myAISContext->Display(aline2, false);
myAISContext->UpdateCurrentViewer();
// 创建角度标注
Handle(PrsDim_AngleDimension) _Dimensioning = new PrsDim_AngleDimension(edge1, edge2);
// 设置标注样式
Handle(Prs3d_DimensionAspect) dimensionAspect = new Prs3d_DimensionAspect();
dimensionAspect->MakeArrows3d(Standard_False);
dimensionAspect->MakeText3d(false);
dimensionAspect->TextAspect()->SetHeight(1);
dimensionAspect->MakeTextShaded(true);
dimensionAspect->SetCommonColor(Quantity_NOC_RED);
dimensionAspect->MakeUnitsDisplayed(false);
_Dimensioning->SetDisplayUnits("deg");
_Dimensioning->SetDimensionAspect(dimensionAspect);
// 显示标注
myAISContext->Display(_Dimensioning, Standard_True);
}