OpenCasCade 从零开始到生成MFC单文档测试程序

1.下载

1.1. 安装程序 OpenCASCADExxx.exe(xxx为最新版本号,下同)

  http://www.opencascade.org/getocc/download/loadocc/

1.2.文档OCCTDocumentationxxx.exe(xxx为最新版本号,下同)

  http://www.opencascade.org/getocc/download/loadocc/

2.安装

2.1. 安装在默认路径:

  OpenCASCADExxx.exe  > C:\OpenCASCADEx.x.x

  OCCTDocumentationxxx.exe > C:\OCCTDocumentationx.x.x

2.2. 配置OpenCASCADE环境变量:

  双击 C:\OpenCASCADE6.5.4\ros\env.bat 重启电脑

3.配置VS20xx:

3.1. 复制头文件:

  C:\OpenCASCADEx.x.x\ros\inc 中所有文件复制到:X:\Program Files\Microsoft Visual Studio xx.0\VC\include

3.2. 复制库文件:

  C:\OpenCASCADEx.x.x\ros\win32\vc9\lib 中所有文件复制到:C:\Program Files\Microsoft Visual Studio xx.0\VC\lib

3.3. 复制Bin文件:

C:\OpenCASCADEx.x.x\ros\win32\vc9\bin 中所有文件复制到:C:\Windows\System32

  说明:用复制的方法可以省略VS中的部分配置工作,在OpenCASCADE版本升级之后要重新手动覆盖

4.建立测试MFC单文档程序:

4.1. 新建工程:

  VS20xx新建MFC 单文档工程MyOcc。

  (VS2012)工程右键 > 属性 > 配置属性 > C/C++ > 命令行 > 输入:/DWNT

4.2. 链接库文件:

  (VS2008)工程右键 > 属性 > 配置属性 > Linker > Input > Additional Dependencies > 输入:

  (VS2012)工程右键 > 属性 > 配置属性 > 链接器 > 输入 > 附加依赖项 > 输入:

[cpp]  view plain  copy
  1. DRAWEXE.lib  
  2. FWOSPlugin.lib  
  3. PTKernel.lib  
  4. TKAdvTools.lib  
  5. TKBin.lib  
  6. TKBinL.lib  
  7. TKBinTObj.lib  
  8. TKBinXCAF.lib  
  9. TKBO.lib  
  10. TKBool.lib  
  11. TKBRep.lib  
  12. TKCAF.lib  
  13. TKCDF.lib  
  14. TKDCAF.lib  
  15. TKDraw.lib  
  16. TKernel.lib  
  17. TKFeat.lib  
  18. TKFillet.lib  
  19. TKG2d.lib  
  20. TKG3d.lib  
  21. TKGeomAlgo.lib  
  22. TKGeomBase.lib  
  23. TKHLR.lib  
  24. TKIGES.lib  
  25. TKLCAF.lib  
  26. TKMath.lib  
  27. TKMesh.lib  
  28. TKMeshVS.lib  
  29. TKNIS.lib  
  30. TKOffset.lib  
  31. TKOpenGl.lib  
  32. TKPCAF.lib  
  33. TKPLCAF.lib  
  34. TKPrim.lib  
  35. TKPShape.lib  
  36. TKQADraw.lib  
  37. TKService.lib  
  38. TKShapeSchema.lib  
  39. TKShHealing.lib  
  40. TKStdLSchema.lib  
  41. TKStdSchema.lib  
  42. TKSTEP.lib  
  43. TKSTEP209.lib  
  44. TKSTEPAttr.lib  
  45. TKSTEPBase.lib  
  46. TKSTL.lib  
  47. TKTObj.lib  
  48. TKTObjDRAW.lib  
  49. TKTopAlgo.lib  
  50. TKTopTest.lib  
  51. TKV2d.lib  
  52. TKV3d.lib  
  53. TKViewerTest.lib  
  54. TKVoxel.lib  
  55. TKVRML.lib  
  56. TKXCAF.lib  
  57. TKXCAFSchema.lib  
  58. TKXDEDRAW.lib  
  59. TKXDEIGES.lib  
  60. TKXDESTEP.lib  
  61. TKXMesh.lib  
  62. TKXml.lib  
  63. TKXmlL.lib  
  64. TKXmlTObj.lib  
  65. TKXmlXCAF.lib  
  66. TKXSBase.lib  
  67. TKXSDRAW.lib  

  说明:这里是C:\OpenCASCADE6.5.4\ros\win32\vc9\lib下的所有文件列表

4.3. 在StdAfx.h头文件中添加OpenCascade头文件:

[cpp]  view plain  copy
  1. //////////////////////////////////////////////////////////////////////////  
  2. #pragma warning(  disable : 4244 )        // Issue warning 4244  
  3. #pragma warning(  disable : 4312 )        // Issue warning 4312  
  4. #pragma warning(  disable : 4267 )        // Issue warning 4312  
  5. #include "Standard_ShortReal.hxx"  
  6. #pragma warning(  default : 4244 )        // Issue warning 4244  
  7.   
  8. #include <V2d_Viewer.hxx>  
  9. #include <V2d_View.hxx>  
  10. #include <AIS2D_InteractiveContext.hxx>  
  11. #include <WNT_WDriver.hxx>  
  12.   
  13. #include <Standard.hxx>  
  14. #include <AIS_InteractiveContext.hxx>  
  15. #include <AIS_Shape.hxx>  
  16. #include <Graphic3d_WNTGraphicDevice.hxx>  
  17. #include <V3d_Viewer.hxx>  
  18. #include <V3d_View.hxx>  
  19. #include <WNT_Window.hxx>  
  20.   
  21. #include <AIS2D_InteractiveObject.hxx>  
  22. #include <Graphic2d_SetOfCurves.hxx>  
  23. #include <Geom2d_TrimmedCurve.hxx>  
  24. #include <Prs2d_AspectLine.hxx>  
  25. #include <Graphic2d_Array1OfVertex.hxx>  
  26. #include <Graphic2d_Polyline.hxx>  
  27. #include <Graphic2d_Text.hxx>  
  28.   
  29. #include <Prs3d_Drawer.hxx>  
  30. #include <Prs3d_IsoAspect.hxx>  
  31. #include <Prs3d_ShadingAspect.hxx>  
  32.   
  33. #include <BRepPrimAPI_MakeCylinder.hxx>  
  34. #include <AIS_Drawer.hxx>  
  35. #include <StdPrs_ShadedShape.hxx>  
  36. #include <StdPrs_HLRPolyShape.hxx>  
  37. #include <StdSelect_BRepSelectionTool.hxx>  
  38. #include <StdPrs_WFDeflectionShape.hxx>  
  39. #include <TopExp_Explorer.hxx>  
  40. #include <BRep_Tool.hxx>  
  41. #include <TopoDS.hxx>  
  42. #include <Geom_Surface.hxx>  
  43. #include <Geom_Plane.hxx>  
  44.   
  45. #include <TopTools_HSequenceOfShape.hxx>  
  46. #include <BRepTools.hxx>  
  47.   
  48. #include <BRepBuilderAPI_NurbsConvert.hxx>  
  49. #include <Graphic3d_AspectFillArea3d.hxx>  
  50. #include <Aspect_PolygonOffsetMode.hxx>  
  51. #include <Graphic3d_Group.hxx>  

4.4. APP类:

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

[cpp]  view plain  copy
  1. #include <Standard_Macro.hxx>  
  2. #include <wnt_graphicdevice.hxx>  
4.4.2. 在类中添加成员变量和引用方法:
[cpp]  view plain  copy
  1. protected:  
  2.     Handle_WNT_GraphicDevice m_GraphicDevice;  
  3. public:  
  4.     Handle_WNT_GraphicDevice& GetGraphicDevice()  
  5.     {  
  6.         return m_GraphicDevice;  
  7.     }  

4.4.3. 在APP的源文件中的构造函数中对设备环境生成并初始化:
[cpp]  view plain  copy
  1. try  
  2. {  
  3.     m_GraphicDevice = new WNT_GraphicDevice();  
  4. }  
  5. catch (Standard_Failure)  
  6. {  
  7.     ExitProcess(1);  
  8. }  
4.4.4. 屏蔽#define new DEBUG_NEW

此时编译提示错误信息:

error C2661: 'Standard_Transient::operator new' : no overloaded function takes 3 arguments

原因是因为OpenCascade对New操作符进行了重载,与VS中的定义存在冲突,屏蔽文件前面的以下代码就可以解决了:

[cpp]  view plain  copy
  1. // #ifdef _DEBUG  
  2. // #define new DEBUG_NEW  
  3. // #endif  
说明:后面OpenCascade使用new操作符的地方,都需同样的方法解决,不再赘述。具体可以参考OpenCascade官方放站的以下链接,有详细说明: http://www.opencascade.org/org/forum/thread_14858/

4.5. Document类

4.5.1. 在Doc头文件中添加OpenCascade成员变量和引用方法:
[cpp]  view plain  copy
  1. protected:  
  2.     Handle_AIS2D_InteractiveContext m_AISInteractiveContext2D;  
  3.     Handle_V2d_Viewer m_2dViewer;  
  4.   
  5. public:  
  6.     Handle_V2d_Viewer Get2dViewer()   
  7.     {  
  8.         return m_2dViewer;  
  9.     }  

4.5.2. Doc类源文件中构造函数中对OpenCasca变量初始化设置:
[cpp]  view plain  copy
  1. Handle(WNT_GraphicDevice)& hGD = ((CMyOccApp*)AfxGetApp())->GetGraphicDevice();  
  2. TCollection_ExtendedString strName("2D Viewer");  
  3. TCollection_AsciiString strDomain("My Domain");  
  4.   
  5. m_2dViewer = new V2d_Viewer(hGD, strName.ToExtString(), strDomain.ToCString());  
  6.   
  7. m_2dViewer->SetCircularGridValues(0, 0, 10, 8, 0);  
  8. m_2dViewer->SetRectangularGridValues(0, 0, 10, 10, 0);  
  9.   
  10. m_AISInteractiveContext2D = new AIS2D_InteractiveContext(m_2dViewer);  

4.6. View类

4.6.1. 在View头文件中添加OpenCascade变量:
[cpp]  view plain  copy
  1. private:  
  2.     Handle_V2d_View m_2dView;  
4.6.2.  添加OnInitialUpdate虚函数设置OpenCascade显示,在OnInitialUpdate函数中添加以下代码:
[cpp]  view plain  copy
  1. Handle(WNT_Window) hWindow;  
  2. hWindow = new WNT_Window(((CMyOccApp*)AfxGetApp())->GetGraphicDevice(), GetSafeHwnd());  
  3. hWindow->SetBackground(Quantity_NOC_SLATEBLUE2);  
  4.   
  5. Handle(WNT_WDriver) hDriver = new WNT_WDriver(hWindow);  
  6. m_2dView = new V2d_View(hDriver, GetDocument()->Get2dViewer(), 0, 0, 50);  
  7.   
  8. Standard_Integer nWidth = 100, nHeight = 100;  
  9. hWindow->Size(nWidth, nHeight);  
  10.   
  11. ::PostMessage(GetSafeHwnd(), WM_SIZE, SIZE_RESTORED, nWidth + nHeight * 65536);  

4.6.3.  在View的析构函数中删除OpenCascade的Viewer,清理内存:
[cpp]  view plain  copy
  1. Handle(V2d_Viewer) viewer2D = m_2dView->Viewer();  
  2. viewer2D->RemoveView(m_2dView);  

5.运行

 到此为止,OpenCascade的初始化和设置已经完成,运行程序,就可以看到OpenCascade的紫色界面了。如果运行还是出现问题,可按6.2的方法用bat文件重新打开项目,然后再试(只需要第一个C:\OpenCASCADEx.x.x\ros\env.bat)。

6.出现的问题及解决办法:

6.1. 确保屏蔽了所有相关的#define new DEBUG_NEW。
6.2. 关于环境变量
  OCC用到很多环境变量,所以Sample中的Demo都只能在命令行打开。可是官方给了好多的bat文件,眼花缭乱。所以我们用最简单的方法打开MFC示例程序:在Sample\MFC新建open.bat文件,输入:
[plain]  view plain  copy
  1. call ../../ros/env.bat  
  2. call %~dp0env.bat  
  3.   
  4. start "C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe" "All-vc10.sln"  
然后双击open.bat,就可以载入环境变量后打开示例程序了。
6.3. 用try...catch...捕捉错误:
[cpp]  view plain  copy
  1. try  
  2. {  
  3.     ...  
  4. }  
  5. catch(Standard_Failure sf)  
  6. {  
  7.     const char* str = sf.GetMessageString();  
  8.     wchar_t msg[5000];  
  9.     MultiByteToWideChar(CP_ACP, 0, str,strlen(str)+1, msg, 5000/sizeof(msg[0]) );    
  10.     MessageBox(msg);  
  11. }  

7.参考:

7.1.OpenCascade学习笔记-创建一个简单的OpenCascade单文档:http://blog.csdn.net/Augusdi/article/details/5642368

转:https://blog.csdn.net/ljfblog/article/details/8545816

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/80727764