素材巴巴 > 程序开发 >

OpenCasCade开发小结

程序开发 2023-09-08 19:01:51

OpenCaseCade使用小结

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的成功经验或许可以提供产业界甚至学术界一些新的思考方向 。

  1. 基本内容介绍
  1. 基本功能:

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
STEP AP203 AP214

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 

#include 

 

 

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);}
  1. OpenCasCade变量设置以及图形显示设置
Handle_V3d_View myView;Standard_Boolean myHlrModeIsOn;

 

  1. 在窗口生成之前作如下操作,如下代码:
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();  }  

三.开发基本技术点汇总

  1. 基本2D-3D图元的绘制

1基本内容:

2D:点,线,面,线框(2D)

3D:实体(矩形,圆,椭圆,圆柱,梯形,锥形,管形,线框拉伸的不规则实体)

  1. 具体细节:
  1.  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);
  1.   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);

 

  1.  2D 3D面:

在笛卡尔坐标系中,通过几条线端构成封闭的线框,由线框构成面,再绘制显示。

面有多种,2D与3D差别在于是否可以旋转。面的实现方式有多种,圆,椭圆等可以直接输入参数绘制,也可以由线段组合形成面线框,然后形成面。

下面是列举其一。

核心代码:

2D面:由组合线段构成面

DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymax),gp_Pnt2d(aSPL2Xmax,aSPL2Ymax)) ,4); // X,YmaxDisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmax,aSPL2Ymin)) ,4); // X,YminDisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmin,aSPL2Ymax)) ,4); // Xmin,YDisplayCurve(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);
  1.  2D 3D线框:

在笛卡尔坐标系中,可以通过若干条线端构成线框,然后绘制显示。

线框类似于面的实现。

核心代码:

2D线框:由组合线段构成线框

DisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymax),gp_Pnt2d(aSPL2Xmax,aSPL2Ymax)) ,4); // X,YmaxDisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmax,aSPL2Ymin)) ,4); // X,YminDisplayCurve(aDoc,GCE2d_MakeSegment(gp_Pnt2d(aSPL2Xmin,aSPL2Ymin),gp_Pnt2d(aSPL2Xmin,aSPL2Ymax)) ,4); // Xmin,YDisplayCurve(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);
  1.  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();
  1.  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);   //圆2RedEdge = 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();
  1.  3D椭圆:

      在三维坐标系中,由OCC基本图元绘制方法,通过基础椭圆旋转。

TopoDS_Edge RedEdge;gp_Elips Elips(gp_Ax2(gp_Pnt(0,0,0),gp_Dir(0,0,1)),260,230);//椭?圆2RedEdge = 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();

 

  1.  3D圆柱:
  1. 通过基础方法直接创建:
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);
  1. 通过基础圆拉伸实现:

        

TopoDS_Edge RedEdge;BRepBuilderAPI_MakeWire mkw;gp_Circ circle(gp_Ax2(gp_Pnt(0,0,0),gp_Dir(0,0,1)),180);   //圆22RedEdge = 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);
  1.  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();
  1. 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();
  1. 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. 线框拉伸的不规则实体:

      由任意线段组合成封闭的线性框,然后沿着指定方向进行(指定长度)拉伸,形成实体,封闭的线框也可以先形成面,然后由面拉伸成实体:

 

     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. 具体细节:
  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;}

 

  1. 示例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. 图元编辑

1.基本内容:

   2D: 图元的移动,放大缩小,旋转,删除,更改颜色,选中,更改材质,显示模式切换等

   3D:  2D图元的拉伸,旋转,放大缩小,删除,更改颜色,选中,更改材质,显示模式切换等

 

   显示模式切换包括:阴影,轮廓,透明(可以更改透明度)

   

   3D视图的投影:目前3D图元支持从六面投影(上,下,左,右,前,后支持六个视角投影显示)

  1. 具体细节:
  1. 整体视图的 移动,放大缩小,旋转:

这几项操作都是在鼠标消息中实现的,涉及到鼠标左右中键的按下和抬起,鼠标的移动,鼠标的移动涉及到光标的坐标的变换。

核心代码如下:

  1. 移动:

       

 myView->Pan(point.x-myXmax,myYmax-point.y);
  1. 放大缩小:

       

 myView->Zoom(myXmax,myYmax,point.x,point.y);
  1. 旋转:

      

  myView->Rotation(point.x,point.y);
  1. 单个图元的 删除,更改颜色,选中,更改材质,显示模式切换:
  1. 选中:当鼠标移动到某个图元的时候,该图元的轮廓,会显示高亮,即选中。

    核心代码:    

  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);elsemyAISContext->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);   elseInputEvent(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();}}}

    

  1. 删除:可以一次性全部删除,也可以在选中某一图元之后,进行删除操作。

核心代码:

单个选中图元删除:        

 for (myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent()){myAISContext->Erase (myAISContext->Current(), Standard_True);}myAISContext->ClearCurrents();

     全部删除:

        

 myAISContext->RemoveAll(true);

 

  1. 更改颜色:在选中单一图元之后,可以在颜色选择器中对其颜色进行修改:

     核心代码:       

 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());}
  1. 更改材质:在选中单一图元之后,可以对其材质进行修改,OCC提供的实体材质有如下几种,可以根据实际情况选用。

     

     核心代码:        

CDialogMaterial DialBox(myAISContext);DialBox.DoModal();

 

  1. 显示模式切换:显示模式指的是图元的轮廓显示,实体阴影显示,透明度显示三种,其实做法是一致的,只是透明度的不同。

   核心代码:

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);

 

  1. 整体视图的6面投影:从六个面进行投影,显示不同的面的2D视图。

   核心代码:

  1. 上面:

        

 myView->SetProj(V3d_Zpos);
  1. 下面:

        

 myView->SetProj(V3d_Zneg);
  1. 左面:

        

 myView->SetProj(V3d_Ypos);
  1. 右面:

       

  myView->SetProj(V3d_Yneg);
  1. 前面:

         

myView->SetProj(V3d_Xpos);
  1. 后面:

      

  myView->SetProj(V3d_Xneg);
  1. 复位:恢复原始状态

        

 myView->Reset();

 

  1. 文件导入导出
  1. 模型文件的导出:Brep
  2. 模型文件的导入:Brep

标签:

上一篇: HBuilder X安装及常用配置 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。