OpenCASCADE(一) VS2017+OpenCASCADE+MFC 下載配置安裝運行單文檔程式畫個基本圖形

原文作者: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:WindowsSysWOW64里(注意我這裡是64位的)你們32就放32里

在VS2017中創建一個單文檔MFC項目,我的命名是OCCmfc

然後在項目屬性里:

 將你們自己路徑下的!!包含目錄,和庫目錄都添加上去(看圖!!)

然後在連接器-》輸入-》附加依賴項里添加下面這些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

然後打開項目後在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; }

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

然後運行如下所示 畫了一個圖形出來:

完整程式碼項目可以關注公眾號發送添加小編微信發送文章標題獲取。