RU: MFC connection

Подключение OpenCascade к MFC-приложению

Библиотеки

Перечислим вначале библиотеки, которые должны быть подключены к проекту. Это
TKOpenGl.lib; TKernel.lib; TKGeomBase.lib; TKTopAlgo.lib; TKOffset.lib;
TKBool.lib; TKPrim.lib; TKFillet.lib; TKMath.lib; TKService.lib; TKV3d.lib;
TKBrep.lib; TKIGES.lib; PTKernel.lib; TKSTL.lib; TKVRML.lib; TKSTEP.lib;
TKShapeSchema.lib; TKG3d.lib; TKG2d.lib; TKXSBase.lib; TKPShape.lib; TKShHealing.lib; TKBO.lib

Общие замечания

Мы будем предполагать, что приложение (программа) имеет структуру документ-представление (document-view), т.е. содержит классы, наследованные от

  • Приложение (класс CWinApp)
  • Документ (класс CDocument)
  • Представление (класс CView)

Приложение

В приложение (будем называть его COCCApp) добавляется переменная — указатель на графический драйвер.

// File: COCCApp.h
. . . . .
private :
. . . . .
   Handle(Graphic3d_GraphicDriver) myGraphicDriver;
. . . . .

и процедура доступа к ней
// File: COCCApp.h
. . . . .
public:
. . . . .
   Handle(Graphic3d_GraphicDriver) GetGraphicDriver() const
   {
      return myGraphicDriver;
   }
. . . . .

Сам графический драйвер создается в конструкторе приложения

// File: COCCApp.cpp
. . . . .
COCCApp::COCCApp()
{
. . . . .
//
// OpenCascade :
   try {
      Handle(Aspect_DisplayConnection) aDisplayConnection;
      myGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection);
   }
   catch (Standard_Failure) {
      AfxMessageBox(_T("Fatal Error in graphic initialisation"));
   }
. . . . .

Документ

В документ (будем называть его COCCDoc) добавляются переменные — указатели на объекты классов V3d_Viewer и AIS_InteractiveContext:

// File: COCCDoc.h
. . . . .
private :
. . . . .
  Handle(V3d_Viewer) myViewer;
  Handle(AIS_InteractiveContext) myAISContext;
. . . . .

Процедуры доступа к этим переменным имеют вид:
// File: COCCDoc.h
. . . . .
public:
. . . . .
   Handle(V3d_Viewer) GetViewer()
   {
      return myViewer;
   }
   Handle(AIS_InteractiveContext)& GetAISContext()
   {
      return myAISContext;
   }
. . . . .

Создание объектов выполняется в конструкторе документа

// File: COCCDoc.cpp
. . . . .
COCCDoc::COCCDoc()
{
. . . . .
// Viewer
   Handle(Graphic3d_GraphicDriver) aGraphicDriver =
      ((COCCApp*)AfxGetApp())->GetGraphicDriver();
   TCollection_ExtendedString name("Viewew01");
   myViewer = new V3d_Viewer(aGraphicDriver,
      name.ToExtString(),   // имя объекта
      "", 1000.0,           // Размер экрана в видовых координатах
      V3d_XposYnegZpos,     // Ориентация системы координат
      Quantity_NOC_GRAY30,  // Цвет фона
      V3d_ZBUFFER,V3d_GOURAUD,V3d_WAIT,
      Standard_True, Standard_False);
. . . . .
// AIS_InteractiveContext
   myAISContext = new AIS_InteractiveContext(myViewer);
   myAISContext->SetDisplayMode(AIS_Shaded);
   myAISContext->SetAutomaticHilight(Standard_False);
. . . . .

Представление

В представлении (будем называть его COCCView) добавляется переменная — указатель на объект класса V3d\_View:

// File: COCCView.h
. . . . .
private :
. . . . .
   Handle(V3d_View)     myView;
. . . . .

Создание объекта предлагается выполнять в процедуре OnInitialUpdate, так что в заголовочном файле нужно описать ее и процедуру доступа к переменной myView:
// File: COCCView.h
. . . . .
public:
. . . . .
   virtual void OnInitialUpdate();
//
   Handle(V3d_View)&  GetView()
   {
      return myView;
   };
. . . . .

В процедуре OnInitialUpdate создаем OCC-вид и связываем его с окном:
// File: COCCView.cpp
. . . . .
void COCCView::OnInitialUpdate()
{
   CView::OnInitialUpdate();
//
// Создаем новый OCC-вид
   Handle(V3d_Viewer) aViewer = GetDocument()->GetViewer();
   myView = aViewer->CreateView();
//
   Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd ());
   myView->SetWindow(aWNTWindow);
   if (!aWNTWindow->IsMapped())
      aWNTWindow->Map();
. . . . .
}

Теперь в окне представления готово отображаться содержимое myAISContext. Для этого в методе представления
OnDraw (основной функции для отображения содержимого документа) следует написать:

// File: COCCView.cpp
. . . . .
//
// ----- OnDraw ------------------------------------------------------
void CVKView::OnDraw(CDC* pDC)
{
   myView->Redraw();
}

Если, например, в при создании документа (в методе OnNewDocument) мы напишем

// File: COCCDoc.cpp
. . . . .

//
// ----- OnNewDocument -----------------------------------------------
BOOL COCCDoc::OnNewDocument( void )
{
   if (!CDocument::OnNewDocument())
      return FALSE;
. . . . .
//
// Локальная система координат
   gp_Ax2 axes(gp_Pnt(100.,100.,100.),gp_Dir(1.,2.,3.),gp_Dir(-3.,0.,1.));
// Создаем объект
   Standard_Real dx, dy, dz;
   dx = 200.; dy = 300.; dz = 100.;
   BRepPrimAPI_MakeBox makeBox(axes,dx,dy,dz);
// Фигура параллелепипеда
   TopoDS_Shape shape = makeBox.Shape();;
   Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
// Добавляем в список отображения
   myAISContext->Display(aisShape,Standard_False);
//
   return TRUE;
}

то на экране увидим параллелепипед.

Таким образом, при построении графики основными являются следующие объекты

  • myGraphicDriver — принадлежит приложению.
  • myViewer — принадлежит документу.
  • myAISContext — принадлежит документу.
  • myView — принадлежит представлению.

.