您的位置:首页 > 运维架构

Opencascade6.5.3+VS2010的使用初步

2012-10-19 09:22 645 查看
这几天开始学习OpenCascade,很迷茫,不知道从哪儿开始!下载了软件装上之后就百度+google一下,发现很多文章都是说要编译啊神马的,搞得我很不知所措!

后来才知道,我如果只是简单的使用这个库去编程的话那就不需要去编译了。

我认为,这个OpenCascade跟OpenCv是差不多的,是一个第三方的库,只需要把一些头文件了,库啊神马的包含进去就可以使用了。那我就开始试试喽,发现有很多稀奇古怪的错误,不过现在都忘了是什么了,现在自己弄出来了,贴出来分享一下,高手勿喷啊!



首先,创建一个单文档应用程序

头文件加入OpenCascade的目录:

D:\OpenCASCADE6.5.3\ros\inc是我的安装目录。

库文件同样加入OpenCascade的目录:

D:\OpenCASCADE6.5.3\ros\win32\vc9\lib是我的安装目录。



然后,修改stdafx.h直接在后面加上

#pragma warning(  disable : 4244 )        // Issue warning 4244
#include "Standard_ShortReal.hxx"
#pragma warning(  default : 4244 )        // Issue warning 4244

#include <V2d_Viewer.hxx>
#include <V2d_View.hxx>
#include <AIS2D_InteractiveContext.hxx>
#include <WNT_WDriver.hxx>

#include <Standard.hxx>
#include <AIS_InteractiveContext.hxx>
#include <AIS_Shape.hxx>
#include <Graphic3d_WNTGraphicDevice.hxx>
#include <V3d_Viewer.hxx>
#include <V3d_View.hxx>
#include <WNT_Window.hxx>

#include <AIS2D_InteractiveObject.hxx>
#include <Graphic2d_SetOfCurves.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <Prs2d_AspectLine.hxx>
#include <Graphic2d_Array1OfVertex.hxx>
#include <Graphic2d_Polyline.hxx>
#include <Graphic2d_Text.hxx>

#include <Prs3d_Drawer.hxx>
#include <Prs3d_IsoAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>

#include <BRepPrimAPI_MakeCylinder.hxx>
#include <AIS_Drawer.hxx>
#include <StdPrs_ShadedShape.hxx>
#include <StdPrs_HLRPolyShape.hxx>
#include <StdSelect_BRepSelectionTool.hxx>
#include <StdPrs_WFDeflectionShape.hxx>
#include <TopExp_Explorer.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
#include <Geom_Surface.hxx>
#include <Geom_Plane.hxx>

#include <TopTools_HSequenceOfShape.hxx>
#include <BRepTools.hxx>

#include <BRepBuilderAPI_NurbsConvert.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <Aspect_PolygonOffsetMode.hxx>
#include <Graphic3d_Group.hxx>


打开工程属性,在链接器选项卡中的输入项的附加依赖项中添加OpenCascade库文件

TKVrml.lib
TKStl.lib
TKBrep.lib
TKIGES.lib
TKShHealing.lib
TKStep.lib
TKXSBase.lib
TKShapeSchema.lib
FWOSPlugin.lib
PTKernel.lib
TKBool.lib
TKCAF.lib
TKCDF.lib
TKDraw.lib
TKernel.lib
TKFeat.lib
TKFillet.lib
TKG2d.lib
TKG3d.lib
TKGeomAlgo.lib
TKGeomBase.lib
TKHLR.lib
TKMath.lib
TKOffset.lib
TKPCAF.lib
TKPrim.lib
TKPShape.lib
TKService.lib
TKTopAlgo.lib
TKMesh.lib
TKV2d.lib
TKV3d.lib
TKBO.lib//千万别忘了这个啊

**APP类中OpenCascade图形设备环境变量添加和设置

在App头文件中添加标准宏定义和Windows图形设备头文件:

#include <Standard_Macro.hxx>
#include <wnt_graphicdevice.hxx>



在类中添加成员变量和引用方法。

protected:
  Handle_Graphic3d_WNTGraphicDevice m_GraphicDevice;
public:
 Handle_Graphic3d_WNTGraphicDevice GetGraphicDevice() const { return m_GraphicDevice; } ;



在APP的源文件中的构造函数中对设备环境生成并初始化:


try
 {
  m_GraphicDevice = new Graphic3d_WNTGraphicDevice();
 }
 catch (Standard_Failure)
 {
  ExitProcess(1);
 }



此时,需要将

//#ifdef _DEBUG

//#define new DEBUG_NEW

//#endif

注释掉,原因是因为OpenCascade对New操作符进行了重载,与VS中的定义存在冲突。

**Document类中添加OpenCascade间接设备环境和图形接口

在Doc头文件中添加OpenCascade成员变量和引用方法

Handle_AIS_InteractiveContext& GetAISContext(){ return myAISContext; };
Handle_V3d_Viewer GetViewer()  { return myViewer; };
Handle_V3d_Viewer myViewer;
Handle_AIS_InteractiveContext myAISContext;


Doc类源文件中构造函数中对OpenCascade变量初始化设置

Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice = 
  ((COpenCascadeApp*)AfxGetApp())->GetGraphicDevice();
 
 myViewer = new V3d_Viewer(theGraphicDevice,(short *) "Visu3D");
 myViewer->SetDefaultLights();
 myViewer->SetLightOn();
 myAISContext =new AIS_InteractiveContext(myViewer);



此时还需要注释New的那段代码!!!

**View类Opencascade变量设置和图形显示设置

在View头文件中添加OpenCascade变量

public:
	Handle_V3d_View& GetView() { return myView; }


添加OnInitialUpdate虚函数设置OpenCascade显示,在OnInitialUpdate函数中添加以下代码

myView =GetDocument()->myViewer->CreateView();
myView->SetDegenerateModeOn();
myView->SetBackgroundColor(Quantity_TOC_RGB,0.1,0.,0.1);
Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice = ((COpenCascadeApp*)AfxGetApp())->GetGraphicDevice();
Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,GetSafeHwnd ());
myView->SetWindow(aWNTWindow);
if (!aWNTWindow->IsMapped()) aWNTWindow->Map();



在View的析构函数中删除OpenCascade的Viewer,清理内存。

if (myView)
   myView->Remove();




在OnDraw()函数添加:

if ( !myView.IsNull() )//别人的代码没加这个判断,我的不加就不对 
   myView->Redraw();


OK!此时应该能够运行成功了,如果你想要显示一个瓶子,那么应该添加一个菜单或者工具栏,然后添加消息响应函数:

TopoDS_Shape aBottle = MakeBottle(50,70,30);
Handle(AIS_Shape) AISBottle=new AIS_Shape(aBottle);
GetDocument()->myAISContext->SetMaterial(AISBottle,Graphic3d_NOM_GOLD);
GetDocument()->myAISContext->SetDisplayMode(AISBottle,1,Standard_True);
GetDocument()->myAISContext->Display(AISBottle,1, Standard_True);
GetDocument()->myAISContext->SetCurrentObject(AISBottle,Standard_False);

Quantity_Color CSFColor ;
CSFColor = Quantity_Color (0.3,0.5,0.2,Quantity_TOC_RGB); 
GetDocument()->myAISContext->SetColor(AISBottle,CSFColor.Name());

myView->FitAll();//使瓶子最大化;

这样你就能看到显示的瓶子了!



然后就是自己往下深究Opencascade的其他功能了!



参考:

http://blog.csdn.net/Augusdi/article/details/5642368

http://blog.csdn.net/astrosky

http://blog.csdn.net/dandanCool
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: