OpenCaseCade使用小结
- OCC简介
1.背景
Open CASCADE是一套开放原始码的CAD/CAM/CAE几何模型核心,源自于法国的Matra Datavision公司,这一套函式库系统原来是著名的CADCAM软体EUCLID的开发平台,但是在1998年, Matra Datavision改变了经营策略,从以销售软体为主改变为提供CAD/CAM/CAE软体服务为主的获利模式,并且在1999年公布Open CASCADE的程式原始码,任何人都可以在该公司的网站上下载并且使用这些程式码,而Matra Datavision则以此函式库为基础位客户建立客制化的数值模拟软体,国内CADCAM产业所需的套装软体常常动辄数百万甚至上千万,如此高昂的软体 费用对于中小企业来说确实是非常沉重的负担,而且套装软体中的功能有些其实根本用不到,但是软体使用者却必须花钱购买这些用不到的功能,如果能够针对中小 企业的需求建构一个精简化的CAD/CAM软体,并且在生产需求改变的时候才增加新的功能,将可以有效节省软体成本,而Open CASCADE的成功经验或许可以提供产业界甚至学术界一些新的思考方向 。
- 基本内容介绍
- 基本功能:
Open CASCADE是一个功能强大的三维建模工具,提供了点、线、面、体和复杂形体的显示和交互操作,经过深度开发后可实现纹理、光照、图元填充、渲染等图形操作和放大、缩小、旋转、漫游、模拟飞行、模拟穿越等动态操作。
开源Open CASCADE从底层构建的CAD平台,所以在做机械仿真方面会好用很多,比如数控加工中模拟切屑的去除过程,对于干涉的检查等,使用CASCADE的实体布尔运算即可都可以实现。
其基本描述从官网翻译大致如下:
OpenCascade提供二维和三维几何体的生成、显示和分析。主要功能有:
1.创建锥、柱、环等基本几何体;
2.对几何体进行布尔操作(相加,相减,相交运算);
3.倒角,斜切,镂空,偏移,扫视;
4.几何空间关系计算(法线,点积,叉积,投影,拟合等);
5.几何体分析(质心,体积,曲率等);
空间变换(平移,缩放,旋转)。
高级功能:
1.应用框架服务;
2.数据交换服务。
OCC是基于OO概念的C++类库,用于精密设备等设计应用程序。典型的应用是CAD(2D/3D)应用程序的开发,制造业,仿真,或者一些其他的图形工具。OCC让你能够很快的开发这些程序。
2.类库模块与内容:
基础类 Foundation Classes | 模型数据 Modeling Data | 建模算法 Modeling Algorithms | 可视化 Visualization | 数据交换 Data Exchange | 程序框架 Application Framework |
Kernel Classes Math Utilities 核心类和数学库 | 2D Geometry 3D Geometry Geometry Utilities Topology 几何和拓扑 | Construction of Primitives Boolean Operations Fillets and Chamfers Offsets, Drafts Sewing and Sweeps Features Hidden Line Removal Geometric Tools Topological Tools | Services Common to 2D and 3D 2D Visualization 3D Visualization | IGES Extended data exchange (XDE) | Data Framework Data Storage Application Desktop |
3.安装目录简介:
当你安装完成后,你可以找到下面这些目录,这里简单介绍一下目录结构:
| 目录树描述 freeimage-3.16.0-vc10-32:freeimage是一款免费的、开源的、跨平台 (Windows 、Linux 和Mac OS X )的,支持20 多种图像类型的 (如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。 freetype-2.5.3-vc10-32:FreeType库是一个完全免费(开源)的、高质量的 且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件, 包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。 gl2ps-1.3.8-vc10-32:一个OpenGL到PostScript打印库。 opencascade-6.8.0:OCC目录 qt486-vc10-32:QT版本号,QT相关。 tbb30_018oss:是一个使用ISO C++代码实现的多平台、可扩展并行编程库, 它可以帮助你利用多核提高性能。 tcltk-86-32:Tcl 是“工具控制语言(Tool Command Language)”的缩写, 其面向对象为otcl语言。Tk 是 Tcl“图形工具箱”的扩展, 它提供各种标准的 GUI 接口项,以利于迅速进行高级应用程序开发。 VTK-6.1.0-vc10-32:(visualization toolkit)是一个开源的免费软件系统, 主要用于三维计算机图形学、图像处理和可视化。 Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的, 包含有大约250,000行代码,2000多个类,还包含有几个转换界面, 因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk unins000:卸载当前安装的OCC |
| 目录树描述 data - 这里面包含各种不同格式的模型文件。都是occ支持的格式。 doc –occ的文档。 adm - occ团队工具,可以用来重新生成occ。 adm/msvc - 包含vc8.0,vc9,vc10等的工程文件(可以自己生成对应新的版本), 用来生成occ的win32版本。 drv - 此文件夹包含WOK生成的源码文件。 inc - 包含所有的occ头文件。 src - 此文件夹包含occ源码,根据开发模块组织存放。 win32 - 此文件夹包含了occ的可执行程序(dll)和lib,有debug,release。 Samples - 此文件夹包含了帮助文档中的标准例程。 |
二.开发环境
在MFC下开发展示OCC使用(OCC版本目前是6.8.0),vs2010 32位
可以独立封装一个类CMFCOCCView来实现OCC的功能,这样可以在以后的使用中方便移植。
1.在CMFCOCCView类头文件中添加 标准宏定义 和 图形设备 头文件
#include <Standard_Macro.hxx>
#include <Graphic3d_GraphicDriver.hxx>
2.在CMFCOCCView类添加以下成员变量:
Handle_Graphic3d_GraphicDriver myGraphicDriver;
3.在CMFCOCCView类的构造函数中完成对设备环境生成和初始化:
CMFCOCCView::CMFCOCCView()
{
//myXmin=0;
//myYmin=0;
//myXmax=0;
//myYmax=0;
//myWidth=0;
//myHeight=0;
//m_Pen=NULL;
try
{
Handle(Aspect_DisplayConnection) aDisplayConnection;
myGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection);
}
catch(Standard_Failure)
{
ExitProcess (1);
}
4.在CMFCOCCView类的构造函数中对OpenCasCade变量初始化设置
TCollection_ExtendedString a3DName("Visu3D");
myViewer = new V3d_Viewer(myGraphicDriver,a3DName.ToExtString());
myViewer->SetDefaultLights();
myViewer->SetLightOn();
myViewer->SetDefaultBackgroundColor(Quantity_NOC_GRAY);
myAISContext =new AIS_InteractiveContext(myViewer);
myAISContext->SetDisplayMode(AIS_Shaded,Standard_False);
}
- OpenCasCade变量设置以及图形显示设置
Handle_V3d_View myView;
Standard_Boolean myHlrModeIsOn;
- 在窗口生成之前作如下操作,如下代码:
void CMFCOCCView::OnPaint()
{
//窗口重绘时做如下操作
CStatic::OnPaint();
myView->Redraw();
}
int CMFCOCCView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
PreSubclassWindow();
return 0;
}
void CMFCOCCView::PreSubclassWindow()
{
myView = myViewer->CreateView();
myView->SetComputedMode(Standard_False);
Handle(WNT_Window) aWNTWindow = new WNT_Window(this->GetSafeHwnd());
myView->SetWindow(aWNTWindow);
if (!aWNTWindow->IsMapped())
{
aWNTWindow->Map();
}
aWNTWindow->SetBackground(Quantity_NOC_SLATEBLUE2);
CStatic::PreSubclassWindow();
}
三.开发基本技术点汇总
- 基本2D-3D图元的绘制
1基本内容:
2D:点,线,面,线框(2D)
3D:实体(矩形,圆,椭圆,圆柱,梯形,锥形,管形,线框拉伸的不规则实体)
- 具体细节:
- 2D 3D点:
在笛卡尔坐标系中,在默认的坐标系下指定一点p(x,y),x和y可以自定义输入,使用OCC基本方法进行绘画。点的构成有多种实现方式,其他请参考源码。
核心代码:
2D点:创建默认零坐标的点
gp_Pnt2d(10,10);
3D点:创建默认零坐标的点,并显示
gp_Pnt P1(110,60,100);
Handle(AIS_Point) aRect1 = new AIS_Point(new Geom_CartesianPoint(P1));
myAISContext->SetColor(aRect1,Quantity_NOC_BLUE3);
myAISContext->Display(aRect1,true);
- 2D 3D线:
在三维坐标系中,通过指定的两点p1(x1,y1,z1), p2(x2,y2,z2)在两点间构成线段。线的构成有多种实现方式,其他请参考源码。
核心代码:
2D线:
gp_Pnt2d P1(1,2);
gp_Pnt2d P2(4,5);
gp_Lin2d L = gce_MakeLin2d(P1,P2);
Handle(Geom2d_TrimmedCurve) aLine = GCE2d_MakeSegment(L,-3,8);
Handle(ISession2D_Curve) aCurve = new ISession2D_Curve(aLine);
aDoc->GetISessionContext()->Display(aCurve, Standard_False);
3D线:
TopoDS_Edge E14 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,68.,0.),gp_Pnt(40.,0.,0.));
Handle_AIS_Shape aRect1 = new AIS_Shape(E14);
myAISContext->Display(aRect1);
myAISContext->SetColor(aRect1,Quantity_NOC_YELLOW);
- 2D 3D面:
在笛卡尔坐标系中,通过几条线端构成封闭的线框,由线框构成面,再绘制显示。
面有多种,2D与3D差别在于是否可以旋转。面的实现方式有多种,圆,椭圆等可以直接输入参数绘制,也可以由线段组合形成面线框,然后形成面。
下面是列举其一。
核心代码:
2D面:由组合线段构成面
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymax),gp_Pnt2d(aSPL2Xmax,aSPL2Ymax)) ,4); // X,Ymax
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmax,aSPL2Ymin)) ,4); // X,Ymin
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmin,aSPL2Ymax)) ,4); // Xmin,Y
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmax,aSPL2Ymin),gp_Pnt2d(aSPL2Xmax,aSPL2Ymax)) ,4); // Xmax,Y
3D面:
TopoDS_Face BlueFace,BrownFace;
TopoDS_Edge E11 = BRepBuilderAPI_MakeEdge(gp_Pnt(40.,0.,0.), gp_Pnt(82.5,25.,0.));
TopoDS_Edge E12 = BRepBuilderAPI_MakeEdge(gp_Pnt(82.5,25.,0.), gp_Pnt(42.5,93.,0.));
TopoDS_Edge E13 = BRepBuilderAPI_MakeEdge(gp_Pnt(42.5,93.,0.), gp_Pnt(0.,68.,0.));
TopoDS_Edge E14 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,68.,0.), gp_Pnt(40.,0.,0.));
BRepBuilderAPI_MakeWire W1(E11,E12,E13,E14);
BlueFace = BRepBuilderAPI_MakeFace(W1);
Handle(AIS_Shape) Blue = new AIS_Shape(BlueFace);
myAISContext->SetColor(Blue,Quantity_NOC_WHITE,Standard_False);
myAISContext->SetMaterial(Blue,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(Blue,Standard_True);
- 2D 3D线框:
在笛卡尔坐标系中,可以通过若干条线端构成线框,然后绘制显示。
线框类似于面的实现。
核心代码:
2D线框:由组合线段构成线框
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymax),gp_Pnt2d(aSPL2Xmax,aSPL2Ymax)) ,4); // X,Ymax
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmax,aSPL2Ymin)) ,4); // X,Ymin
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmin,aSPL2Ymax)) ,4); // Xmin,Y
DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmax,aSPL2Ymin),gp_Pnt2d(aSPL2Xmax,aSPL2Ymax)) ,4); // Xmax,Y
3D线框:由组合线段构成线框
TopoDS_Face BlueFace,BrownFace;
TopoDS_Edge E11 = BRepBuilderAPI_MakeEdge(gp_Pnt(40.,0.,0.), gp_Pnt(82.5,25.,0.));
TopoDS_Edge E12 = BRepBuilderAPI_MakeEdge(gp_Pnt(82.5,25.,0.), gp_Pnt(42.5,93.,0.));
TopoDS_Edge E13 = BRepBuilderAPI_MakeEdge(gp_Pnt(42.5,93.,0.), gp_Pnt(0.,68.,0.));
TopoDS_Edge E14 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,68.,0.), gp_Pnt(40.,0.,0.));
BRepBuilderAPI_MakeWire W1(E11,E12,E13,E14);
Handle(AIS_Shape) Blue = new AIS_Shape(W1.wire());
myAISContext->SetColor(Blue,Quantity_NOC_WHITE,Standard_False);
myAISContext->SetMaterial(Blue,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(Blue,Standard_True);
- 3D矩形:
在三维坐标系中,由OCC基本图元绘制方法,输入矩形的长,宽,高来绘制矩形,或者通过基础的面通过拉伸形成矩形
核心代码:
1:通过输入长宽高,基于默认坐标系画矩形
TopoDS_Shape S1 = BRepPrimAPI_MakeBox(gp_Pnt(0.,0.,0.),500.,500.,500).Shape();
Handle(AIS_Shape) ais1 = new AIS_Shape(S1);
myAISContext->SetColor(ais1,Quantity_NOC_WHITE,Standard_False);
myAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais1);
2:通过基础图形拉伸形成矩形
BRepBuilderAPI_MakeWire mkw;
TopoDS_Edge E11 = BRepBuilderAPI_MakeEdge(gp_Pnt(40.,0.,0.), gp_Pnt(82.5,25.,0.));
TopoDS_Edge E15 = BRepBuilderAPI_MakeEdge(gp_Pnt(82.5,25.,0.), gp_Pnt(42.5,93.,0.));
TopoDS_Edge E12 = BRepBuilderAPI_MakeEdge(gp_Pnt(82.5,25.,0.), gp_Pnt(42.5,93.,0.));
TopoDS_Edge E13 = BRepBuilderAPI_MakeEdge(gp_Pnt(42.5,93.,0.), gp_Pnt(0.,68.,0.));
TopoDS_Edge E14 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,68.,0.), gp_Pnt(40.,0.,0.));
TopoDS_Wire W1 = BRepBuilderAPI_MakeWire(E11,E12,E13,E14);
TopoDS_Shape S =BRepPrimAPI_MakePrism(BRepBuilderAPI_MakeFace(W1),gp_Vec(0.,0.,50));
Handle(AIS_Shape) ais1 = new AIS_Shape(S);
myAISContext->SetColor(ais1,Quantity_NOC_CYAN2,Standard_False);
myAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais1,Standard_False);
myAISContext->SetCurrentObject(ais1,Standard_False);
Fit();
- 3D球:
在三维坐标系中,由OCC基本图元绘制方法,输入圆的半径以及圆心坐标进行绘制或者通过基础圆旋转。
核心代码:
直接创建:
TopoDS_Shape S1 = BRepPrimAPI_MakeSphere(gp_Pnt(-200., -250., 0.), 80.).Shape();
Handle(AIS_Shape) ais1 = new AIS_Shape(S1);
myAISContext->SetColor(ais1,Quantity_NOC_AZURE,Standard_False);
myAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais1,Standard_False);
旋转形成:
TopoDS_Edge RedEdge;
gp_Circ circle(gp_Ax2(gp_Pnt(0,0,0),gp_Dir(0,0,1)),180); //圆2
RedEdge = BRepBuilderAPI_MakeEdge(circle,0,2*M_PI);
TopoDS_Shape S =BRepPrimAPI_MakeRevol(RedEdge,gp_Ax1(gp_Pnt(0.001, 0, 0), gp_Dir(0, 1, 0)));
Handle(AIS_Shape) ais4 = new AIS_Shape(S);
myAISContext->SetColor(ais4,Quantity_NOC_BLUE3);
myAISContext->SetMaterial(ais4,Graphic3d_NOM_PLASTIC);
myAISContext->SetCurrentObject(ais4,Standard_False);
myAISContext->Display(ais4);
Fit();
- 3D椭圆:
在三维坐标系中,由OCC基本图元绘制方法,通过基础椭圆旋转。
TopoDS_Edge RedEdge;
gp_Elips Elips(gp_Ax2(gp_Pnt(0,0,0),gp_Dir(0,0,1)),260,230);//椭?圆2
RedEdge = BRepBuilderAPI_MakeEdge(Elips,0,2*M_PI);
TopoDS_Shape S =BRepPrimAPI_MakeRevol(RedEdge,gp_Ax1(gp_Pnt(0.001, 0, 0), gp_Dir(0, 1, 0)));
Handle(AIS_Shape) ais4 = new AIS_Shape(S);
myAISContext->SetColor(ais4,Quantity_NOC_BLUE3);
myAISContext->SetMaterial(ais4,Graphic3d_NOM_PLASTIC);
myAISContext->SetCurrentObject(ais4,Standard_False);
myAISContext->Display(ais4);
Fit();
- 3D圆柱:
- 通过基础方法直接创建:
TopoDS_Shape C1 = BRepPrimAPI_MakeCylinder(50., 200.).Shape();
Handle(AIS_Shape) aCyl1 = new AIS_Shape(C1);
myAISContext->SetMaterial(aCyl1,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->SetColor(aCyl1,Quantity_NOC_RED,Standard_False);
myAISContext->Display(aCyl1,Standard_False);
- 通过基础圆拉伸实现:
TopoDS_Edge RedEdge;
BRepBuilderAPI_MakeWire mkw;
gp_Circ circle(gp_Ax2(gp_Pnt(0,0,0),gp_Dir(0,0,1)),180); //圆22
RedEdge = BRepBuilderAPI_MakeEdge(circle,0,2*M_PI);
TopoDS_Wire W1 = BRepBuilderAPI_MakeWire(RedEdge);
TopoDS_Shape S = BRepPrimAPI_MakePrism(BRepBuilderAPI_MakeFace(W1),gp_Vec(0.,0.,150));
Handle(AIS_Shape) ais1 = new AIS_Shape(S);
myAISContext->SetColor(ais1,Quantity_NOC_CYAN2,Standard_False);
myAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais1,Standard_False);
myAISContext->SetCurrentObject(ais1,Standard_False);
- 3D梯形:
可以由组合线框实现,或者由实现锥的方法改造
椎体的改造:
TopoDS_Shape S = BRepPrimAPI_MakeBox(200., 300., 150.).Shape();
Handle(AIS_Shape) ais1 = new AIS_Shape(S);
BRepOffsetAPI_DraftAngle adraft(S);
TopExp_Explorer Ex;
for (Ex.Init(S,TopAbs_FACE); Ex.More(); Ex.Next()) {
TopoDS_Face F = TopoDS::Face(Ex.Current());
Handle(Geom_Plane) surf = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(F));
gp_Pln apln = surf->Pln();
gp_Dir dirF = apln.Axis().Direction();
if (dirF.IsNormal(gp_Dir(0.,0.,1.),Precision::Angular()))
adraft.Add(F, gp_Dir(0.,0.,1.), 15.*M_PI/180, gp_Pln(gp::XOY()));
}
ais1->Set(adraft.Shape());
myAISContext->Display(ais1);
Fit();
- 3D锥形:
锥形分为两种一种是有尖头的,一种是上下都是圆面:
无尖:即上下两面圆半径大于0
TopoDS_Shape C1 = BRepPrimAPI_MakeCone(50., 25., 200.).Shape();
Handle(AIS_Shape) ais1 = new AIS_Shape(C1);
myAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->SetColor(ais1,Quantity_NOC_MATRABLUE,Standard_False);
myAISContext->Display(ais1,Standard_False);
有尖头:有一面圆面半径等于0
TopoDS_Shape C2 = BRepPrimAPI_MakeCone(gp_Ax2(gp_Pnt(100.,100.,0.),
gp_Dir(0.,0.,1.)),60., 0., 150., 2*M_PI).Shape();
Handle(AIS_Shape) ais2 = new AIS_Shape(C2);
myAISContext->SetMaterial(ais2,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->SetColor(ais2,Quantity_NOC_GREEN,Standard_False);
myAISContext->Display(ais2,Standard_False);
Fit();
- 3D管形:
这里所说的管形,就是由基础面扫略形成的实体
圆面扫略形成管形:
TColgp_Array1OfPnt CurvePoles(1,4);
gp_Pnt pt = gp_Pnt(0.,0.,0.);
CurvePoles(1) = pt;
pt = gp_Pnt(20.,50.,0.);
CurvePoles(2) = pt;
pt = gp_Pnt(60.,100.,0.);
CurvePoles(3) = pt;
pt = gp_Pnt(150.,0.,0.);
CurvePoles(4) = pt;
Handle(Geom_BezierCurve) curve = new Geom_BezierCurve(CurvePoles);
TopoDS_Edge E = BRepBuilderAPI_MakeEdge(curve);
TopoDS_Wire W = BRepBuilderAPI_MakeWire(E);
Handle(AIS_Shape) ais1 = new AIS_Shape(W);
myAISContext->Display(ais1,Standard_False);
Fit();
Sleep(500);
gp_Circ c = gp_Circ(gp_Ax2(gp_Pnt(0.,0.,0.),gp_Dir(0.,1.,0.)),10.);
TopoDS_Edge Ec = BRepBuilderAPI_MakeEdge(c);
TopoDS_Wire Wc = BRepBuilderAPI_MakeWire(Ec);
Handle(AIS_Shape) ais3 = new AIS_Shape(Wc);
myAISContext->Display(ais3,Standard_False);
TopoDS_Face F = BRepBuilderAPI_MakeFace(gp_Pln(gp::ZOX()),Wc);
TopoDS_Shape S = BRepOffsetAPI_MakePipe(W,F);
Handle(AIS_Shape) ais2 = new AIS_Shape(S);
myAISContext->SetColor(ais2,Quantity_NOC_MATRABLUE,Standard_False);
myAISContext->SetMaterial(ais2,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais2,Standard_False);
Fit();
- 线框拉伸的不规则实体:
由任意线段组合成封闭的线性框,然后沿着指定方向进行(指定长度)拉伸,形成实体,封闭的线框也可以先形成面,然后由面拉伸成实体:
1.不规则线框组成面拉伸为实体:
TopoDS_Face BlueFace;
BRepBuilderAPI_MakeWire W1;
TopoDS_Edge E11 = BRepBuilderAPI_MakeEdge(gp_Pnt(40.,0.,0.), gp_Pnt(82.5,25.,0.));
TopoDS_Edge E12 = BRepBuilderAPI_MakeEdge(gp_Pnt(82.5,25.,0.), gp_Pnt(42.5,93.,0.));
TopoDS_Edge E13 = BRepBuilderAPI_MakeEdge(gp_Pnt(42.5,93.,0.), gp_Pnt(0.,68.,0.));
TopoDS_Edge E14 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,68.,0.), gp_Pnt(0.,10.,0.));
TopoDS_Edge E15 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,10.,0.), gp_Pnt(40.,0.,0.));
W1.Add(E11);
W1.Add(E12);
W1.Add(E13);
W1.Add(E14);
W1.Add(E15);
BlueFace = BRepBuilderAPI_MakeFace(W1.Wire());
TopoDS_Shape S = BRepPrimAPI_MakePrism(BlueFace,gp_Vec(0.,0.,150));
Handle(AIS_Shape) ais5 = new AIS_Shape(S);
myAISContext->SetColor(ais5,Quantity_NOC_MATRABLUE,Standard_False);
myAISContext->SetMaterial(ais5,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais5);
2.不规则线框直接拉伸成实体
TopoDS_Face BlueFace;
BRepBuilderAPI_MakeWire W1;
TopoDS_Edge E11 = BRepBuilderAPI_MakeEdge(gp_Pnt(40.,0.,0.), gp_Pnt(82.5,25.,0.));
TopoDS_Edge E12 = BRepBuilderAPI_MakeEdge(gp_Pnt(82.5,25.,0.), gp_Pnt(42.5,93.,0.));
TopoDS_Edge E13 = BRepBuilderAPI_MakeEdge(gp_Pnt(42.5,93.,0.), gp_Pnt(0.,68.,0.));
TopoDS_Edge E14 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,68.,0.), gp_Pnt(0.,10.,0.));
TopoDS_Edge E15 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,10.,0.), gp_Pnt(40.,0.,0.));
W1.Add(E11);
W1.Add(E12);
W1.Add(E13);
W1.Add(E14);
W1.Add(E15);
TopoDS_Shape S = BRepPrimAPI_MakePrism(W1,gp_Vec(0.,0.,150)); //不?规?则ò线?框ò拉?伸Θ?
Handle(AIS_Shape) ais5 = new AIS_Shape(S);
myAISContext->SetColor(ais5,Quantity_NOC_MATRABLUE,Standard_False);
myAISContext->SetMaterial(ais5,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais5);
2.组合形状
1.基本内容:
基本实体+加工项(孔,矩形槽)
不规则实体+加工项
- 具体细节:
- 示例1:矩形+孔+矩形槽:
TopoDS_Shape S1 = BRepPrimAPI_MakeBox(gp_Pnt(0.,0.,0.),500.,500.,500).Shape();//大矩形Handle(AIS_Shape) ais1 = new AIS_Shape(S1);
myAISContext->SetColor(ais1,Quantity_NOC_WHITE,Standard_False);
myAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais1);
TopoDS_Shape S2 = BRepPrimAPI_MakeBox(gp_Pnt(-0.01,200,-0.01),100,100,50).Shape();//小矩
Handle(AIS_Shape) ais2 = new AIS_Shape(S2);
myAISContext->SetColor(ais2,Quantity_NOC_YELLOW,Standard_False);
myAISContext->SetMaterial(ais2,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais2,Standard_False);
int num=100;
TopoDS_Shape S3;
for (int i=0;i<7;i++)
{
S3 = BRepPrimAPI_MakeCylinder (gp_Ax2(gp_Pnt(100.,-0.01,num),gp_Dir(0.,1.,0.)),10.,110., 360.*M_PI / 180).Shape();
Handle(AIS_Shape) ais3 = new AIS_Shape(S3);
myAISContext->SetColor(ais3,Quantity_NOC_BLUE3,Standard_False);
myAISContext->SetMaterial(ais3,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais3,Standard_False);
num+=50;
}
- 示例2:拉伸不规则实体+孔:
TopoDS_Face BlueFace;
BRepBuilderAPI_MakeWire W1;
TopoDS_Edge E11 = BRepBuilderAPI_MakeEdge(gp_Pnt(40.,0.,0.), gp_Pnt(82.5,25.,0.));
TopoDS_Edge E12 = BRepBuilderAPI_MakeEdge(gp_Pnt(82.5,25.,0.), gp_Pnt(42.5,93.,0.));
TopoDS_Edge E13 = BRepBuilderAPI_MakeEdge(gp_Pnt(42.5,93.,0.), gp_Pnt(0.,68.,0.));
TopoDS_Edge E14 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,68.,0.), gp_Pnt(0.,10.,0.));
TopoDS_Edge E15 = BRepBuilderAPI_MakeEdge(gp_Pnt(0.,10.,0.), gp_Pnt(40.,0.,0.));
W1.Add(E11);
W1.Add(E12);
W1.Add(E13);
W1.Add(E14);
W1.Add(E15);
BlueFace = BRepBuilderAPI_MakeFace(W1.Wire());
TopoDS_Shape S = BRepPrimAPI_MakePrism(BlueFace,gp_Vec(0.,0.,150));
Handle(AIS_Shape) ais5 = new AIS_Shape(S);
myAISContext->SetColor(ais5,Quantity_NOC_MATRABLUE,Standard_False);
myAISContext->SetMaterial(ais5,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais5);
int num=100;
TopoDS_Shape S3;
for (int i=0;i<2;i++)
{
S3 = BRepPrimAPI_MakeCylinder (gp_Ax2(gp_Pnt(30.,-0.01,num),gp_Dir(0.,1.,0.)),5., 11., 360.*M_PI / 180).Shape();
Handle(AIS_Shape) ais3 = new AIS_Shape(S3);
myAISContext->SetColor(ais3,Quantity_NOC_BLUE3,Standard_False);
myAISContext->SetMaterial(ais3,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(ais3,Standard_False);
num+=50;
}
- 图元编辑
1.基本内容:
2D: 图元的移动,放大缩小,旋转,删除,更改颜色,选中,更改材质,显示模式切换等
3D: 2D图元的拉伸,旋转,放大缩小,删除,更改颜色,选中,更改材质,显示模式切换等
显示模式切换包括:阴影,轮廓,透明(可以更改透明度)
3D视图的投影:目前3D图元支持从六面投影(上,下,左,右,前,后支持六个视角投影显示)
- 具体细节:
- 整体视图的 移动,放大缩小,旋转:
这几项操作都是在鼠标消息中实现的,涉及到鼠标左右中键的按下和抬起,鼠标的移动,鼠标的移动涉及到光标的坐标的变换。
核心代码如下:
- 移动:
myView->Pan(point.x-myXmax,myYmax-point.y);
- 放大缩小:
myView->Zoom(myXmax,myYmax,point.x,point.y);
- 旋转:
myView->Rotation(point.x,point.y);
- 单个图元的 删除,更改颜色,选中,更改材质,显示模式切换:
- 选中:当鼠标移动到某个图元的时候,该图元的轮廓,会显示高亮,即选中。
核心代码:
if (nFlags & MK_SHIFT) //鼠标左键按下
ShiftDragEvent(myXmax-450,myYmax-110,-1,myView);
else
{
DragEvent(myXmax-450,myYmax-110,-1,myView);
}
if (nFlags & MK_SHIFT) //鼠标移动
myAISContext->MoveTo(point.x-450,point.y-110,myView);
else
myAISContext->MoveTo(point.x-450,point.y-110,myView);
DrawRectangle(myXmin-450,myYmin-110,myXmax-450,myYmax-110,Standard_False,Default);//鼠标左键按下拖动产生的矩形框选择区域。
if ( nFlags & MK_CONTROL ) //鼠标左键抬起
{
return;
}
else
{
if (point.x == myXmin && point.y == myYmin)
{ myXmax=point.x;
myYmax=point.y;
if (nFlags & MK_SHIFT ) ShiftInputEvent(point.x-450,point.y-110,myView);
else
InputEvent(point.x-450,point.y-110,myView);
}
else
{
myXmax=point.x;
myYmax=point.y;
DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,Default);
if (nFlags & MK_SHIFT)
ShiftDragEvent(point.x,point.y,1,myView);
else{
DragEvent(point.x,point.y,1,myView);
//myView->Redraw();
}
}
}
- 删除:可以一次性全部删除,也可以在选中某一图元之后,进行删除操作。
核心代码:
单个选中图元删除:
for (myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent())
{
myAISContext->Erase (myAISContext->Current(), Standard_True);
}
myAISContext->ClearCurrents();
全部删除:
myAISContext->RemoveAll(true);
- 更改颜色:在选中单一图元之后,可以在颜色选择器中对其颜色进行修改:
核心代码:
Handle_AIS_InteractiveObject Current ;
COLORREF MSColor ;
myAISContext->InitCurrent();
Current = myAISContext->Current();
if ( Current->HasColor () ) {
CSFColor = myAISContext->Color(myAISContext->Current());
MSColor = RGB (CSFColor.Red()*255.,CSFColor.Green()*255.,CSFColor.Blue()*255.);
}
else {
MSColor = RGB (255,255,255) ;
}
CColorDialog dlgColor(MSColor);
if (dlgColor.DoModal() == IDOK)
{
MSColor = dlgColor.GetColor();
CSFColor = Quantity_Color (GetRValue(MSColor)/255.,GetGValue(MSColor)/255.,
GetBValue(MSColor)/255.,Quantity_TOC_RGB);
for (;myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
myAISContext->SetColor (myAISContext->Current(),CSFColor.Name());
}
- 更改材质:在选中单一图元之后,可以对其材质进行修改,OCC提供的实体材质有如下几种,可以根据实际情况选用。
核心代码:
CDialogMaterial DialBox(myAISContext);
DialBox.DoModal();
- 显示模式切换:显示模式指的是图元的轮廓显示,实体阴影显示,透明度显示三种,其实做法是一致的,只是透明度的不同。
核心代码:
1.轮廓:
for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
myAISContext->SetDisplayMode(myAISContext->Current(),0);
2.实体阴影:
for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
myAISContext->SetDisplayMode(myAISContext->Current(),1);
3.透明度:可以由一个值定义透明度
for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
myAISContext->SetDisplayMode(myAISContext->Current(),0.5);
- 整体视图的6面投影:从六个面进行投影,显示不同的面的2D视图。
核心代码:
- 上面:
myView->SetProj(V3d_Zpos);
- 下面:
myView->SetProj(V3d_Zneg);
- 左面:
myView->SetProj(V3d_Xneg);
- 右面:
myView->SetProj(V3d_Xpos);
- 前面:
myView->SetProj(V3d_Yneg);
- 后面:
myView->SetProj(V3d_Ypos);
- 复位:恢复原始状态
myView->Reset();
- 文件导入导出
- 模型文件的导出:Brep
- 模型文件的导入:Brep