一、新建MFC项目
1.1、打开vs2013新建MFC项目,名称输入OCCDemo,点击确定,如图:
1.2、点击下一步
1.3、选择office(F),
1.4、点击下一步
1.5、点击下一步
1.6、点击下一步
1.7、去掉“导航窗格”,点击下一步
1.8、点击下一步
1.9、点击完成
1.10、选择64位编译
1.11、编译完成运行如图
二、配置Opencascade环境
说明:配置occ主要需要一下参数:
Handle(OpenGl_GraphicDriver) m_GraphicDriver; //OpenGl图形驱动程序
Handle(XCAFApp_Application) m_OCCApp;//实现DECAF文档的应用程序
Handle(AIS_InteractiveContext) m_AISContext;//交互式上下文对象
Handle(V3d_Viewer) m_Viewer;//查看器
Handle(TDocStd_Document) m_OCCDoc;//occ文档类
Handle(V3d_View) m_View;//为Viewer应用程序定义应用程序对象View
2.1、配置occ头文件和库路径:
2.2、附加依赖库:
具体库如下:
TKBRep.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKXSBase.lib;TKBo.lib;TKMesh.lib;TKShHealing.lib;TKStep.lib;TKIGES.lib;TKMeshVS.lib;TKSTL.lib;TKVRML.lib;TKXDEDRAW.lib;TKXSDRAW.lib;TKOpenGL.lib;TKXCAF.lib;TKXDESTEP.lib;TKLCAF.lib;TKVCAF.lib;TKXDEIGES.lib;TKBin.lib;TKXml.lib
2.3、引入头文件,在 stdafx.h 添加常用头文件:
#include <AIS_InteractiveContext.hxx>
#include <AIS_InteractiveObject.hxx>
#include <AIS_Shape.hxx>
#include <AIS_SequenceOfInteractive.hxx>
#include <AIS_Trihedron.hxx>
#include <Aspect_Background.hxx>
#include <Aspect_TypeOfLine.hxx>
#include <Aspect_WidthOfLine.hxx>
#include <Bnd_Box2d.hxx>
#include <BndLib_Add2dCurve.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRepBuilderAPI.hxx>
#include <BRepAlgo.hxx>
#include <BRepTools.hxx>
#include <Standard_DefineHandle.hxx>
#include <DsgPrs_LengthPresentation.hxx>
#include <GCE2d_MakeSegment.hxx>
#include <GCPnts_TangentialDeflection.hxx>
#include <Geom_Axis2Placement.hxx>
#include <Geom_CartesianPoint.hxx>
#include <Geom_Line.hxx>
#include <Geom_Surface.hxx>
#include <Geom2d_BezierCurve.hxx>
#include <Geom2d_BSplineCurve.hxx>
#include <Geom2d_Curve.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <Geom2dAdaptor_Curve.hxx>
#include <GeomAbs_CurveType.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <GeomTools_Curve2dSet.hxx>
#include <gp_Ax2d.hxx>
#include <gp_Circ2d.hxx>
#include <gp_Dir2d.hxx>
#include <gp_Lin2d.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Vec.hxx>
#include <gp_Vec2d.hxx>
#include <Graphic3d_NameOfMaterial.hxx>
#include <MMgt_TShared.hxx>
#include <OSD_Environment.hxx>
#include <Precision.hxx>
#include <Prs3d_Drawer.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 <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_ListIteratorOfListOfShape.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Solid.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopExp.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_HSequenceOfShape.hxx>
#include <UnitsAPI.hxx>
#include <V3d_View.hxx>
#include <V3d_Viewer.hxx>
#include <WNT_Window.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepPrimAPI_MakeCylinder.hxx>
// OCAF
#include <TDocStd_Document.hxx>
#include <TPrsStd_AISViewer.hxx>
#include <TDF_Label.hxx>
#include <TDF_Reference.hxx>
#include <TDF_ChildIterator.hxx>
#include <TNaming_NamedShape.hxx>
#include <TNaming_Builder.hxx>
#include <TDataStd_Real.hxx>
#include <TFunction_Logbook.hxx>
#include <TPrsStd_AISPresentation.hxx>
#include <TDataStd_Name.hxx>
#include <TFunction_DriverTable.hxx>
#include <TFunction_Function.hxx>
#include <TDataStd_Integer.hxx>
2.4、配置调试环境:(如果不在这里配置dll路径,需要把涉及到的所有dll复制到debug或release目录下)
PATH=C:\OpenCASCADE-7.4.0-vc14-64\ffmpeg-3.3.4-64\bin;C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\win64\vc12\bind;C:\OpenCASCADE-7.4.0-vc14-64\freeimage-3.17.0-vc14-64\bin;C:\OpenCASCADE-7.4.0-vc14-64\tcltk-86-64\bin;C:\OpenCASCADE-7.4.0-vc14-64\tbb_2017.0.100\bin\intel64\vc12;C:\OpenCASCADE-7.4.0-vc14-64\freetype-2.5.5-vc14-64\bin;%PATH%
三、编写occ环境代码:
在当前项目搜索 “#define new DEBUG_NEW” ,全部注释掉
#ifdef _DEBUG
//#define new DEBUG_NEW
#endif
3.1 在COCCDemoApp类的头文件里面添加
Handle(OpenGl_GraphicDriver) m_GraphicDriver; //OpenGl图形驱动程序
Handle(XCAFApp_Application) m_OCCApp;//实现DECAF文档的应用程序
#include <OpenGl_GraphicDriver.hxx>
#include <XCAFApp_Application.hxx>
// COCCDemoApp:
// 有关此类的实现,请参阅 OCCDemo.cpp
//
class COCCDemoApp : public CWinAppEx
{
public:
COCCDemoApp();
protected:
Handle(OpenGl_GraphicDriver) m_GraphicDriver;
Handle(XCAFApp_Application) m_OCCApp;
public:
//图形驱动
Handle(OpenGl_GraphicDriver) GetGraphicDriver(){ return m_GraphicDriver; }
Handle(XCAFApp_Application) GetOCCApp(){ return m_OCCApp; }
// 重写
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
// 实现
UINT m_nAppLook;
virtual void PreLoadState();
virtual void LoadCustomState();
virtual void SaveCustomState();
afx_msg void OnAppAbout();
DECLARE_MESSAGE_MAP()
};
3.2 初始化m_OCCApp,在COCCDemoApp::COCCDemoApp()添加初始化代码:
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
m_OCCApp = XCAFApp_Application::GetApplication();
BinDrivers::DefineFormat(m_OCCApp);
XmlDrivers::DefineFormat(m_OCCApp);
try
{
//单位转换工具
//它们为各种量和相应物理单位的处理提供统一机制。这种机制能够检查单位的兼容性,以及在两种不同的单位间进行数值转换等
UnitsAPI::SetLocalSystem(UnitsAPI_MDTV);
}
catch (Standard_Failure)
{
AfxMessageBox(_T("单位转换工具初始化错误!"));
}
3.3 初始化m_GraphicDriver,在BOOL COCCDemoApp::InitInstance()添加初始代码:
try
{
Handle(Aspect_DisplayConnection) aDisplayConnection;
m_GraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection);
}
catch (Standard_Failure)
{
AfxMessageBox(_T("(初始化Opencascade图形变量时发生错误.)"));
return FALSE;
}
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
3.4 在COCCDemoDoc类头文件添加代码:
Handle(AIS_InteractiveContext) m_AISContext;//交互式上下文对象
Handle(V3d_Viewer) m_Viewer;//查看器
Handle(TDocStd_Document) m_OCCDoc;//occ文档类
class COCCDemoDoc : public CDocument
{
protected: // 仅从序列化创建
COCCDemoDoc();
DECLARE_DYNCREATE(COCCDemoDoc)
// 特性
public:
// 操作
public:
//查看器
Handle(V3d_Viewer) GetViewer(){ return m_Viewer; }
//上下文
Handle(AIS_InteractiveContext) GetAISContext(){ return m_AISContext;}
//ocaf 文档
Handle(TDocStd_Document) GetOCCDoc(){ return m_OCCDoc; }
void SetOCCDoc(const Handle(TDocStd_Document)& doc);
protected:
Handle(AIS_InteractiveContext) m_AISContext;
Handle(V3d_Viewer) m_Viewer;
Handle(TDocStd_Document) m_OCCDoc;
// 重写
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
#ifdef SHARED_HANDLERS
virtual void InitializeSearchContent();
virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
#endif // SHARED_HANDLERS
// 实现
public:
virtual ~COCCDemoDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
#ifdef SHARED_HANDLERS
// 用于为搜索处理程序设置搜索内容的 Helper 函数
void SetSearchContent(const CString& value);
#endif // SHARED_HANDLERS
};
3.5初始化m_Viewer和m_AISContext,在COCCDemoDoc::COCCDemoDoc()添加初始化代码:
COCCDemoDoc::COCCDemoDoc()
{
// TODO: 在此添加一次性构造代码
Handle(Graphic3d_GraphicDriver) theGraphicDriver = ((COCCDemoApp*)AfxGetApp())->GetGraphicDriver();
m_Viewer = new V3d_Viewer(theGraphicDriver);
m_AISContext = new AIS_InteractiveContext(m_Viewer);
}
3.6 在COCCDemoView类头文件添加代码:
Handle(V3d_View) m_View;//为Viewer应用程序定义应用程序对象View
class COCCDemoView : public CView
{
protected: // 仅从序列化创建
COCCDemoView();
DECLARE_DYNCREATE(COCCDemoView)
// 特性
public:
COCCDemoDoc* GetDocument() const;
// 操作
public:
const Handle(V3d_View)& GetView() { return m_View; }
protected:
//为Viewer应用程序定义应用程序对象View
Handle(V3d_View) m_View;
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
// 实现
public:
virtual ~COCCDemoView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的消息映射函数
protected:
afx_msg void OnFilePrintPreview();
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
DECLARE_MESSAGE_MAP()
};
3.7 将Handle(V3d_View) m_View与WNT_Window 关联:利用类导向,在COCCDemoView类里面添加虚函数OnInitialUpdate(),并添加代码,如图
void COCCDemoView::OnInitialUpdate()
{
CView::OnInitialUpdate();
m_View = GetDocument()->GetViewer()->CreateView();
Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd());
m_View->SetWindow(aWNTWindow);
if (!aWNTWindow->IsMapped())
aWNTWindow->Map();
}
3.8 在COCCDemoView::OnDraw里面添加重绘代码:
// COCCDemoView 绘制
void COCCDemoView::OnDraw(CDC* /*pDC*/)
{
COCCDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
const Handle(V3d_View)& aView = GetView();
if (!aView.IsNull())
{
aView->MustBeResized();
aView->Update();
}
}