Подключение 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 — принадлежит представлению.
.