原文作者:aircraft
原文鏈接:https://www.cnblogs.com/DOMLX/p/12368154.html
一.下載OpenCASCADE
官網下載是: http://www.opencascade.org/getocc/download/loadocc/
我的百度雲已經下載好的是:
鏈接:https://pan.baidu.com/s/1D-fw8vspKTOZ8GmAGBSVGw
提取碼:mzp3
下載后運行完畢就是這樣:
二.VS2017 MFC單文檔配置OpenCASCADE 環境
先將每個文件夾里的bin文件夾都添加到系統的環境變量里
然后在將bin文件夾內的dll文件全部復制一份放在C:\Windows\SysWOW64里(注意我這里是64位的)你們32就放32里
在VS2017中創建一個單文檔MFC項目,我的命名是OCCmfc
然后在項目屬性里:
將你們自己路徑下的!!包含目錄,和庫目錄都添加上去(看圖!!)
我的包含目錄是:E:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc
我的庫目錄是:E:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\win64\vc14\lib
然后在連接器-》輸入-》附加依賴項里添加下面這些Lib文件名:
TKBin.lib
TKBinL.lib
TKBinTObj.lib
TKBinXCAF.lib
TKBO.lib
TKBool.lib
TKBRep.lib
TKCAF.lib
TKCDF.lib
TKD3DHost.lib
TKDCAF.lib
TKDFBrowser.lib
TKDraw.lib
TKernel.lib
TKFeat.lib
TKFillet.lib
TKG2d.lib
TKG3d.lib
TKGeomAlgo.lib
TKGeomBase.lib
TKHLR.lib
TKIGES.lib
TKIVtk.lib
TKIVtkDraw.lib
TKLCAF.lib
TKMath.lib
TKMesh.lib
TKMeshVS.lib
TKOffset.lib
TKOpenGl.lib
TKPrim.lib
TKQADraw.lib
TKRWMesh.lib
TKService.lib
TKShapeView.lib
TKShHealing.lib
TKStd.lib
TKStdL.lib
TKSTEP.lib
TKSTEP209.lib
TKSTEPAttr.lib
TKSTEPBase.lib
TKSTL.lib
TKTInspector.lib
TKTInspectorAPI.lib
TKTObj.lib
TKTObjDRAW.lib
TKToolsDraw.lib
TKTopAlgo.lib
TKTopTest.lib
TKTreeModel.lib
TKV3d.lib
TKVCAF.lib
TKView.lib
TKViewerTest.lib
TKVInspector.lib
TKVRML.lib
TKXCAF.lib
TKXDEDRAW.lib
TKXDEIGES.lib
TKXDESTEP.lib
TKXMesh.lib
TKXml.lib
TKXmlL.lib
TKXmlTObj.lib
TKXmlXCAF.lib
TKXSBase.lib
TKXSDRAW.lib
如果你們版本跟我的不一樣 那么可以在cmd里打開到這個文件夾然后輸入命令 dir /b>libName.txt
然后打開這個文件,復制lib的名字就行了
然后打開項目后在stdafx.h中添加這些要用到的頭文件:
#include <BRepTools.hxx> #include <Standard_DefineHandle.hxx> #include <DsgPrs_LengthPresentation.hxx> #include <GCPnts_TangentialDeflection.hxx> #include <Geom_Axis2Placement.hxx> #include <Geom_CartesianPoint.hxx> #include <Geom_Line.hxx> #include <Geom_Surface.hxx> #include <BRepAdaptor_Surface.hxx> #include <GeomAbs_CurveType.hxx> #include <GeomAdaptor_Curve.hxx> #include <GeomTools_Curve2dSet.hxx> #include <gp_Vec.hxx> #include <Graphic3d_NameOfMaterial.hxx> #include <MMgt_TShared.hxx> #include <OSD_Environment.hxx> #include <Precision.hxx> #include <Prs3d_IsoAspect.hxx> #include <Prs3d_LineAspect.hxx> #include <Prs3d_Projector.hxx> #include <Prs3d_Text.hxx> #include <Quantity_Factor.hxx> #include <Quantity_Length.hxx> #include <Quantity_NameOfColor.hxx> #include <Quantity_PhysicalQuantity.hxx> #include <Quantity_PlaneAngle.hxx> #include <Quantity_TypeOfColor.hxx> #include <SelectMgr_EntityOwner.hxx> #include <SelectMgr_SelectableObject.hxx> #include <SelectMgr_Selection.hxx> #include <SelectMgr_SelectionManager.hxx> #include <SelectMgr_ListOfFilter.hxx> #include <SelectMgr_Filter.hxx> #include <StdSelect_EdgeFilter.hxx> #include <StdSelect_ShapeTypeFilter.hxx> #include <Standard_Boolean.hxx> #include <Standard_CString.hxx> #include <Standard_ErrorHandler.hxx> #include <Standard_Integer.hxx> #include <Standard_IStream.hxx> #include <Standard_Macro.hxx> #include <Standard_NotImplemented.hxx> #include <Standard_OStream.hxx> #include <Standard_Real.hxx> #include <StdPrs_Curve.hxx> #include <StdPrs_Point.hxx> #include <StdPrs_PoleCurve.hxx> #include <TCollection_AsciiString.hxx> #include <TColgp_Array1OfPnt2d.hxx> #include <TColgp_HArray1OfPnt2d.hxx> #include <TCollection_AsciiString.hxx> #include <TColStd_HSequenceOfTransient.hxx> #include <TColStd_MapIteratorOfMapOfTransient.hxx> #include <TColStd_MapOfTransient.hxx> #include <TopExp_Explorer.hxx> #include <TopoDS.hxx> #include <TopoDS_Compound.hxx> #include <TopoDS_Shape.hxx> #include <TopoDS_Solid.hxx> #include <TopoDS_Vertex.hxx> #include <TopExp.hxx> #include <TopTools_HSequenceOfShape.hxx> #include <UnitsAPI.hxx> #include <V3d_View.hxx> #include <V3d_Viewer.hxx> #include <WNT_Window.hxx> #include <Prs3d_PointAspect.hxx> #include <AIS_Point.hxx> #include <AIS_InteractiveContext.hxx> #include <AIS_Shape.hxx> #include <BRep_Tool.hxx> #include <BRepAlgoAPI_Fuse.hxx> #include <BRepBuilderAPI_MakeEdge.hxx> #include <BRepBuilderAPI_MakeFace.hxx> #include <BRepBuilderAPI_MakeWire.hxx> #include <BRepBuilderAPI_MakeVertex.hxx> #include <BRepBuilderAPI_Transform.hxx> #include <BRepPrimAPI_MakeCone.hxx> #include <BRepPrimAPI_MakeRevol.hxx> #include <BRepFilletAPI_MakeFillet.hxx> #include <BRepBuilderAPI_Copy.hxx> #include <BRepBuilderAPI_MakePolygon.hxx> #include <BRepLib.hxx> #include <BRepOffsetAPI_MakeThickSolid.hxx> #include <BRepOffsetAPI_ThruSections.hxx> #include <BRepPrimAPI_MakeCylinder.hxx> #include <BRepPrimAPI_MakePrism.hxx> #include <BRepPrimAPI_MakeTorus.hxx> #include <BRepAlgoAPI_Section.hxx> #include <BRepPrimAPI_MakeSphere.hxx> #include <BRepFeat_SplitShape.hxx> #include <TColgp_HArray1OfPnt.hxx> #include <GeomAPI_Interpolate.hxx> #include <GC_MakeArcOfCircle.hxx> #include <GC_MakeSegment.hxx> #include <GC_MakeCircle.hxx> #include <GCE2d_MakeSegment.hxx> #include <gp.hxx> #include <gp_Ax1.hxx> #include <gp_Ax2.hxx> #include <gp_Ax2d.hxx> #include <gp_Dir.hxx> #include <gp_Dir2d.hxx> #include <gp_Pnt.hxx> #include <gp_Pnt2d.hxx> #include <gp_Trsf.hxx> #include <gp_Vec.hxx> #include <Geom_CylindricalSurface.hxx> #include <Geom_Plane.hxx> #include <Geom_Surface.hxx> #include <Geom_TrimmedCurve.hxx> #include <Geom2d_Ellipse.hxx> #include <Geom2d_TrimmedCurve.hxx> #include <TopExp_Explorer.hxx> #include <TopoDS.hxx> #include <TopoDS_Edge.hxx> #include <TopoDS_Face.hxx> #include <TopoDS_Wire.hxx> #include <TopoDS_Shape.hxx> #include <TopoDS_Compound.hxx> #include <GCPnts_AbscissaPoint.hxx> #include <BRepAdaptor_Curve.hxx> #include <GeomLib.hxx> #include <GeomConvert_CompCurveToBSplineCurve.hxx> #include <TopTools_ListOfShape.hxx> #include <TopTools_ListIteratorOfListOfShape.hxx> #include <TopTools_DataMapOfShapeInteger.hxx> #include <TopTools_DataMapOfShapeReal.hxx> #include <TopTools_IndexedDataMapOfShapeAddress.hxx> #include <V3d_PositionalLight.hxx> #include <V3d_DirectionalLight.hxx> #include <V3d_AmbientLight.hxx> #include <IGESControl_Controller.hxx> #include <IGESControl_Writer.hxx> #include <Interface_Static.hxx> #include <OpenGl_GraphicDriver.hxx> #include <Graphic3d_GraphicDriver.hxx>
然后在OCCmfc.h文件的類里添加:
Handle(Graphic3d_GraphicDriver) m_GraphicDriver; Handle(Graphic3d_GraphicDriver) GetGraphicDriver() { return m_GraphicDriver; }
和頭文件
#include <Standard_Macro.hxx>
#include <Graphic3d_GraphicDriver.hxx>
在OCCmfc.cpp的構造函數里加上:
try { Handle(Aspect_DisplayConnection) aDisplayConnection; m_GraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection); } catch (Standard_Failure) { AfxMessageBox(L"(Error Ocured in Initializing the Opencascade graphic variable.)"); }
注意!!!如果new字符報錯,那么是因為opencascade對new進行了重載,我們將每個new報錯文件頂部的:
#ifdef _DEBUG #define new DEBUG_NEW
#endif
這幾行代碼注釋就行了
接着在OCCmfcDoc.h文件類里添加:
Handle(AIS_InteractiveContext) myAISContext; Handle(V3d_Viewer) myViewer; Handle(V3d_Viewer) GetViewer(void) {return myViewer;}
接着去實現文檔OCCmfcDoc.cpp中類的構造函數中添加:
Handle(Graphic3d_GraphicDriver) theGraphicDriver = ((CmOCCTApp*)AfxGetApp())->GetGraphicDriver(); myViewer = new V3d_Viewer(theGraphicDriver); myViewer->SetDefaultLights(); myViewer->SetLightOn(); myAISContext = new AIS_InteractiveContext(myViewer); myAISContext->SetDisplayMode(AIS_Shaded,true); myAISContext->SetAutomaticHilight(Standard_False);
然后去去OCCmfcView.h定義類里添加:
Handle(V3d_View) myView;
和添加要重寫的這個函數:
virtual void OnInitialUpdate();
然后去OCCmfcView.cpp文件里添加下面這個實現函數(隨便添加在哪里):
void COCCmfcView::OnInitialUpdate() { CView::OnInitialUpdate(); myView = GetDocument()->GetViewer()->CreateView(); myView->SetShadingModel(V3d_GOURAUD); Handle(Graphic3d_GraphicDriver) theGraphicDriver = ((COCCmfcApp*)AfxGetApp())->GetGraphicDriver(); Aspect_Handle aWindowHandle = (Aspect_Handle)GetSafeHwnd(); Handle(WNT_Window) aWntWindow = new WNT_Window(GetSafeHwnd()); myView->SetWindow(aWntWindow); if (!aWntWindow->IsMapped()) { aWntWindow->Map(); } Standard_Integer w = 100; Standard_Integer h = 100; aWntWindow->Size(w, h); ::PostMessage(GetSafeHwnd(), WM_SIZE, SIZE_RESTORED, w + h * 65536); myView->FitAll(); myView->ZBufferTriedronSetup(Quantity_NOC_RED, Quantity_NOC_GREEN, Quantity_NOC_BLUE1, 0.8, 0.05, 12); myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.2, V3d_ZBUFFER); }
然后在這個文件中的OnDraw()函數中添加:
myView->MustBeResized(); myView->Update();
編譯運行:
三.繪制圖形
在OCCmfcDoc.h中添加
void DrawSphere(double Radius);
在OCCmfcDoc.cpp中添加函數(隨便放哪):
void COCCmfcDoc::DrawSphere(double Radius) { BRepPrimAPI_MakeSphere mkSphere(Radius); TopoDS_Shape Sphere = mkSphere.Shape(); Handle(AIS_Shape) myAISSphere = new AIS_Shape(Sphere); myAISContext->Display(myAISSphere, Standard_False); CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd; CMDIChildWnd *pChild = (CMDIChildWnd *)pFrame->GetActiveFrame(); COCCmfcView *pView = (COCCmfcView *)pChild->GetActiveView(); pView->FitAll(); }
然后在OCCmfcView.h中添加:
void FitAll() { if (!myView.IsNull()) myView->FitAll(); myView->ZFitAll(); };
最后在OCCmfcView.cpp文件里的OnDraw()函數里添加:
pDoc->DrawSphere(6);
然后運行如下所示 畫了一個圖形出來:
完整代碼項目可以關注公眾號發送添加小編微信發送文章標題獲取。
若有興趣交流分享技術,可關注本人公眾號,里面會不定期的分享各種編程教程,和共享源碼,諸如研究分享關於c/c++,python,前端,后端,opencv,halcon,opengl,機器學習深度學習之類有關於基礎編程,圖像處理和機器視覺開發的知識