0024699: Visualization - prototype interoperation of TKOpenGl viewer with Direct3D...
[occt.git] / samples / CSharp / OCCTProxy_D3D / OCCTProxyD3D.cpp
1 #include "BridgeFBO.hxx"
2
3 // include required OCCT headers
4 #include <Standard_Version.hxx>
5 #include <Message_ProgressIndicator.hxx>
6 //for OCC graphic
7 #include <Aspect_DisplayConnection.hxx>
8 #include <WNT_Window.hxx>
9 #include <Graphic3d_CView.hxx>
10 #include <Graphic3d_Camera.hxx>
11 #include <Graphic3d_TextureParams.hxx>
12 #include <OpenGl_GraphicDriver.hxx>
13 #include <OpenGl_CView.hxx>
14 //for object display
15 #include <V3d_Viewer.hxx>
16 #include <V3d_View.hxx>
17 #include <Visual3d_View.hxx>
18 #include <AIS_InteractiveContext.hxx>
19 #include <AIS_Shape.hxx>
20 //topology
21 #include <TopoDS_Shape.hxx>
22 #include <TopoDS_Compound.hxx>
23 //brep tools
24 #include <BRep_Builder.hxx>
25 #include <BRepTools.hxx>
26 #include <MgtBRep.hxx>
27 #include <PTColStd_PersistentTransientMap.hxx>
28 //csfdb I/E
29 #include <FSD_File.hxx>
30 #include <ShapeSchema.hxx>
31 #include <Storage_Data.hxx>
32 #include <Storage_HSeqOfRoot.hxx>
33 #include <Storage_Root.hxx>
34 // iges I/E
35 #include <IGESControl_Reader.hxx>
36 #include <IGESControl_Controller.hxx>
37 #include <IGESControl_Writer.hxx>
38 #include <IFSelect_ReturnStatus.hxx>
39 #include <Interface_Static.hxx>
40 //step I/E
41 #include <STEPControl_Reader.hxx>
42 #include <STEPControl_Writer.hxx>
43 //for stl export
44 #include <StlAPI_Writer.hxx>
45 //for vrml export
46 #include <VrmlAPI_Writer.hxx>
47 //wrapper of pure C++ classes to ref classes
48 #include <NCollection_Haft.h>
49
50 // list of required OCCT libraries
51 #pragma comment(lib, "TKernel.lib")
52 #pragma comment(lib, "TKMath.lib")
53 #pragma comment(lib, "TKBRep.lib")
54 #pragma comment(lib, "PTKernel.lib")
55 #pragma comment(lib, "TKPShape.lib")
56 #pragma comment(lib, "TKShapeSchema.lib")
57 #pragma comment(lib, "TKXSBase.lib")
58 #pragma comment(lib, "TKService.lib")
59 #pragma comment(lib, "TKV3d.lib")
60 #pragma comment(lib, "TKOpenGl.lib")
61 #pragma comment(lib, "TKIGES.lib")
62 #pragma comment(lib, "TKSTEP.lib")
63 #pragma comment(lib, "TKStl.lib")
64 #pragma comment(lib, "TKVrml.lib")
65
66 /// <summary>
67 /// Proxy class encapsulating calls to OCCT C++ classes within
68 /// C++/CLI class visible from .Net (CSharp)
69 /// </summary>
70 public ref class OCCTProxyD3D
71 {
72 public:
73
74   OCCTProxyD3D() : myBridgeFBO (NULL)
75   {
76     //
77   }
78
79   // ============================================
80   // Viewer functionality
81   // ============================================
82
83   /// <summary>
84   ///Initialize a viewer
85   /// </summary>
86   /// <param name="theWnd">System.IntPtr that contains the window handle (HWND) of the control</param>
87   bool InitViewer (System::IntPtr theWnd)
88   {
89     myGraphicDriver() = new OpenGl_GraphicDriver (Handle(Aspect_DisplayConnection)());
90     //myGraphicDriver()->ChangeOptions().contextDebug = true;
91
92     TCollection_ExtendedString a3DName ("Visu3D");
93     myViewer() = new V3d_Viewer (myGraphicDriver(), a3DName.ToExtString(), "", 1000.0,
94                                  V3d_XposYnegZpos, Quantity_NOC_GRAY30,
95                                  V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT,
96                                  Standard_True, Standard_False);
97
98     myViewer()->SetDefaultLights();
99     myViewer()->SetLightOn();
100     myView() = myViewer()->CreateView();
101     Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast<HWND> (theWnd.ToPointer()));
102     myView()->SetWindow(aWNTWindow);
103     if (!aWNTWindow->IsMapped())
104     {
105       aWNTWindow->Map();
106     }
107     myAISContext() = new AIS_InteractiveContext (myViewer());
108     myAISContext()->UpdateCurrentViewer();
109     myView()->MustBeResized();
110     return true;
111   }
112
113   /// <summary> Initializes OCCT viewer for OpenGL-Direct3D interoperability. </summary>
114   bool InitViewer (System::IntPtr theHWND,
115                    System::IntPtr theD3DDevice)
116   {
117     if (!InitViewer (theHWND))
118     {
119       return false;
120     }
121
122     Graphic3d_CView*       aCView     = reinterpret_cast<Graphic3d_CView*> (myView()->View()->CView());
123     OpenGl_CView*          aCViewGl   = reinterpret_cast<OpenGl_CView*>    (aCView->ptrView);
124     Handle(OpenGl_Context) aGlContext = aCViewGl->WS->GetGlContext();
125     if (aGlContext.IsNull())
126     {
127       return false;
128     }
129     if (!aGlContext->IsCurrent())
130     {
131       aGlContext->MakeCurrent();
132     }
133
134     myBridgeFBO = new BridgeFBO();
135     if (!myBridgeFBO->Init (aGlContext, theD3DDevice.ToPointer()))
136     {
137       return false;
138     }
139
140     aCView->ptrFBO = myBridgeFBO;
141     return true;
142   }
143
144   /// <summary> Resizes custom FBO for Direct3D output. </summary>
145   bool ResizeBridgeFBO (int theWinSizeX,
146                         int theWinSizeY,
147                         System::IntPtr theColorSurf,
148                         System::IntPtr theColorSurfShare)
149   {
150     if (myBridgeFBO == NULL)
151     {
152       return false;
153     }
154
155     OpenGl_CView* aCView = reinterpret_cast<OpenGl_CView*> (reinterpret_cast<Graphic3d_CView*> (myView()->View()->CView())->ptrView);
156     Handle(OpenGl_Context) aGlContext = aCView->WS->GetGlContext();
157     if (aGlContext.IsNull()
158     || !aGlContext->MakeCurrent())
159     {
160       return false;
161     }
162
163     myBridgeFBO->Resize (aGlContext, theWinSizeX, theWinSizeY);
164     if (!myBridgeFBO->RegisterD3DColorBuffer (aGlContext, theColorSurf.ToPointer(), theColorSurfShare.ToPointer()))
165     {
166       return false;
167     }
168
169     myView()->Camera()->SetAspect (Standard_Real (theWinSizeX) / Standard_Real (theWinSizeY));
170     return true;
171   }
172
173   /// <summary>
174   /// Make dump of current view to file
175   /// </summary>
176   /// <param name="theFileName">Name of dump file</param>
177   bool Dump (const char* theFileName)
178   {
179     if (myView().IsNull())
180     {
181       return false;
182     }
183     myView()->Redraw();
184     return myView()->Dump (theFileName) != Standard_False;
185   }
186
187   /// <summary>
188   ///Redraw view
189   /// </summary>
190   void RedrawView()
191   {
192     if (!myView().IsNull())
193     {
194       myView()->Redraw();
195     }
196   }
197
198   /// <summary>
199   ///Update view
200   /// </summary>
201   void UpdateView(void)
202   {
203     if (!myView().IsNull())
204     {
205       myView()->MustBeResized();
206     }
207   }
208
209   /// <summary>
210   ///Set computed mode in false
211   /// </summary>
212   void SetDegenerateModeOn()
213   {
214     if (!myView().IsNull())
215     {
216       myView()->SetComputedMode (Standard_False);
217     }
218   }
219
220   /// <summary>
221   ///Set computed mode in true
222   /// </summary>
223   void SetDegenerateModeOff()
224   {
225     if (!myView().IsNull())
226     {
227       myView()->SetComputedMode (Standard_True);
228     }
229   }
230
231   /// <summary>
232   ///Fit all
233   /// </summary>
234   void WindowFitAll (int theXmin, int theYmin,
235                      int theXmax, int theYmax)
236   {
237     if (!myView().IsNull())
238     {
239       myView()->WindowFitAll (theXmin, theYmin, theXmax, theYmax);
240     }
241   }
242
243   /// <summary>
244   ///Current place of window
245   /// </summary>
246   /// <param name="theZoomFactor">Current zoom</param>
247   void Place (int theX, int theY, float theZoomFactor)
248   {     
249     Quantity_Factor aZoomFactor = theZoomFactor;
250     if (!myView().IsNull())
251     {
252       myView()->Place (theX, theY, aZoomFactor);
253     }
254   }
255
256   /// <summary>
257   ///Set Zoom
258   /// </summary>
259   void Zoom (int theX1, int theY1, int theX2, int theY2)
260   {
261     if (!myView().IsNull())
262     {
263       myView()->Zoom (theX1, theY1, theX2, theY2);
264     }
265   }
266
267   /// <summary>
268   ///Set Pan
269   /// </summary>
270   void Pan (int theX, int theY)
271   {
272     if (!myView().IsNull())
273     {
274       myView()->Pan (theX, theY);
275     }
276   }
277
278   /// <summary>
279   ///Rotation
280   /// </summary>
281   void Rotation (int theX, int theY)
282   {
283     if (!myView().IsNull())
284     {
285       myView()->Rotation (theX, theY);
286     }
287   }
288
289   /// <summary>
290   ///Start rotation
291   /// </summary>
292   void StartRotation (int theX, int theY)
293   {
294     if (!myView().IsNull())
295     {
296       myView()->StartRotation (theX, theY);
297     }
298   }
299
300   /// <summary>
301   ///Select by rectangle
302   /// </summary>
303   void Select (int theX1, int theY1, int theX2, int theY2)
304   {
305     if (!myAISContext().IsNull())
306     {
307       myAISContext()->Select (theX1, theY1, theX2, theY2, myView());
308     }
309   }
310
311   /// <summary>
312   ///Select by click
313   /// </summary>
314   void Select()
315   {
316     if (!myAISContext().IsNull())
317     {
318       myAISContext()->Select();
319     }
320   }
321
322   /// <summary>
323   ///Move view
324   /// </summary>
325   void MoveTo (int theX, int theY)
326   {
327     if (!myAISContext().IsNull() && !myView().IsNull())
328     {
329       myAISContext()->MoveTo (theX, theY, myView());
330     }
331   }
332
333   /// <summary>
334   ///Select by rectangle with pressed "Shift" key
335   /// </summary>
336   void ShiftSelect (int theX1, int theY1, int theX2, int theY2)
337   {
338     if (!myAISContext().IsNull() && !myView().IsNull())
339     {
340       myAISContext()->ShiftSelect (theX1, theY1, theX2, theY2, myView());
341     }
342   }
343
344   /// <summary>
345   ///Select by "Shift" key
346   /// </summary>
347   void ShiftSelect()
348   {
349     if (!myAISContext().IsNull())
350     {
351       myAISContext()->ShiftSelect();
352     }
353   }
354
355   /// <summary>
356   ///Set background color
357   /// </summary>
358   void BackgroundColor (int& theRed, int& theGreen, int& theBlue)
359   {
360     if (!myView().IsNull())
361     {
362       Quantity_Color aColor = myView()->BackgroundColor();
363       theRed   = (int )aColor.Red()   * 255;
364       theGreen = (int )aColor.Green() * 255;
365       theBlue  = (int )aColor.Blue()  * 255;
366     }
367   }
368
369   /// <summary>
370   ///Get background color Red
371   /// </summary>
372   int GetBGColR()
373   {
374     int anRgb[3];
375     BackgroundColor (anRgb[0], anRgb[1], anRgb[2]);
376     return anRgb[0];
377   }
378
379   /// <summary>
380   ///Get background color Green
381   /// </summary>
382   int GetBGColG()
383   {
384     int anRgb[3];
385     BackgroundColor (anRgb[0], anRgb[1], anRgb[2]);
386     return anRgb[1];
387   }
388
389   /// <summary>
390   ///Get background color Blue
391   /// </summary>
392   int GetBGColB()
393   {
394     int anRgb[3];
395     BackgroundColor (anRgb[0], anRgb[1], anRgb[2]);
396     return anRgb[2];
397   }
398
399   /// <summary>
400   ///Update current viewer
401   /// </summary>
402   void UpdateCurrentViewer()
403   {
404     if (!myAISContext().IsNull())
405     {
406       myAISContext()->UpdateCurrentViewer();
407     }
408   }
409
410   /// <summary>
411   ///Front side
412   /// </summary>
413   void FrontView()
414   {
415     if (!myView().IsNull())
416     {
417       myView()->SetProj (V3d_Xpos);
418     }
419   }
420
421   /// <summary>
422   ///Top side
423   /// </summary>
424   void TopView()
425   {
426     if (!myView().IsNull())
427     {
428       myView()->SetProj (V3d_Zpos);
429     }
430   }
431
432   /// <summary>
433   ///Left side
434   /// </summary>
435   void LeftView()
436   {
437     if (!myView().IsNull())
438     {
439       myView()->SetProj (V3d_Ypos);
440     }
441   }
442
443   /// <summary>
444   ///Back side
445   /// </summary>
446   void BackView()
447   {
448     if (!myView().IsNull())
449     {
450       myView()->SetProj (V3d_Xneg);
451     }
452   }
453
454   /// <summary>
455   ///Right side
456   /// </summary>
457   void RightView()
458   {
459     if (!myView().IsNull())
460     {
461       myView()->SetProj (V3d_Yneg);
462     }
463   }
464
465   /// <summary>
466   ///Bottom side
467   /// </summary>
468   void BottomView()
469   {
470     if (!myView().IsNull())
471     {
472       myView()->SetProj (V3d_Zneg);
473     }
474   }
475
476   /// <summary>
477   ///Axo side
478   /// </summary>
479   void AxoView()
480   {
481     if (!myView().IsNull())
482     {
483       myView()->SetProj (V3d_XposYnegZpos);
484     }
485   }
486
487   /// <summary>
488   ///Scale
489   /// </summary>
490   float Scale()
491   {
492     return myView().IsNull()
493          ? -1.0f
494          : float(myView()->Scale());
495   }
496
497   /// <summary>
498   ///Zoom in all view
499   /// </summary>
500   void ZoomAllView()
501   {
502     if (!myView().IsNull())
503     {
504       myView()->FitAll();
505       myView()->ZFitAll();
506     }
507   }
508
509   /// <summary>
510   ///Reset view
511   /// </summary>
512   void Reset()
513   {
514     if (!myView().IsNull())
515     {
516       myView()->Reset();
517     }
518   }
519
520   /// <summary>
521   ///Set display mode of objects
522   /// </summary>
523   /// <param name="theMode">Set current mode</param>
524   void SetDisplayMode (int theMode)
525   {
526     if (myAISContext().IsNull())
527     {
528       return;
529     }
530
531     AIS_DisplayMode aCurrentMode = theMode == 0
532                                  ? AIS_WireFrame
533                                  : AIS_Shaded;
534     if (myAISContext()->NbCurrents() == 0
535      || myAISContext()->NbSelected() == 0)
536     {
537        myAISContext()->SetDisplayMode (aCurrentMode);
538     }
539     else
540     {
541        for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
542        {
543          myAISContext()->SetDisplayMode (myAISContext()->Current(), theMode, Standard_False);
544        }
545     }
546     myAISContext()->UpdateCurrentViewer();
547   }
548
549   /// <summary>
550   ///Set color
551   /// </summary>
552   void SetColor (int theR, int theG, int theB)
553   {
554     if (myAISContext().IsNull())
555     {
556       return;
557     }
558
559     Quantity_Color aCol (theR / 255.0, theG / 255.0, theB / 255.0, Quantity_TOC_RGB);
560     for (; myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
561     {
562       myAISContext()->SetColor (myAISContext()->Current(), aCol.Name());
563     }
564   }
565
566   /// <summary>
567   ///Get object color red
568   /// </summary>
569   int GetObjColR()
570   {
571     int anRgb[3];
572     ObjectColor (anRgb[0], anRgb[1], anRgb[2]);
573     return anRgb[0];
574   }
575
576   /// <summary>
577   ///Get object color green
578   /// </summary>
579   int GetObjColG()
580   {
581     int anRgb[3];
582     ObjectColor (anRgb[0], anRgb[1], anRgb[2]);
583     return anRgb[1];
584   }
585
586   /// <summary>
587   ///Get object color blue
588   /// </summary>
589   int GetObjColB()
590   {
591     int anRgb[3];
592     ObjectColor (anRgb[0], anRgb[1], anRgb[2]);
593     return anRgb[2];
594   }
595
596   /// <summary>
597   ///Get object color R/G/B
598   /// </summary>
599   void ObjectColor (int& theRed, int& theGreen, int& theBlue)
600   {
601     if (myAISContext().IsNull())
602     {
603       return;
604     }
605
606     theRed   = 255;
607     theGreen = 255;
608     theBlue  = 255;
609     myAISContext()->InitCurrent();
610     if (!myAISContext()->MoreCurrent())
611     {
612       return;
613     }
614
615     Handle(AIS_InteractiveObject) aCurrent = myAISContext()->Current();
616     if (aCurrent->HasColor())
617     {
618       Quantity_Color anObjCol = myAISContext()->Color (myAISContext()->Current());
619       theRed   = int(anObjCol.Red()   * 255.0);
620       theGreen = int(anObjCol.Green() * 255.0);
621       theBlue  = int(anObjCol.Blue()  * 255.0);
622     }
623   }
624
625   /// <summary>
626   ///Set background color R/G/B
627   /// </summary>
628   void SetBackgroundColor (int theRed, int theGreen, int theBlue)
629   {
630     if (!myView().IsNull())
631     {
632       myView()->SetBackgroundColor (Quantity_TOC_RGB, theRed / 255.0, theGreen / 255.0, theBlue / 255.0);
633     }
634   }
635
636   /// <summary>
637   ///Erase objects
638   /// </summary>
639   void EraseObjects()
640   {
641     if (myAISContext().IsNull())
642     {
643       return;
644     }
645     for(myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
646     {
647       myAISContext()->Erase (myAISContext()->Current(), Standard_True);
648     }
649     myAISContext()->ClearCurrents();
650   }
651
652   /// <summary>
653   ///Get version
654   /// </summary>
655   float GetOCCVersion()
656   {
657     return (float )OCC_VERSION;
658   }
659
660   /// <summary>
661   ///set material
662   /// </summary>
663   void SetMaterial (int theMaterial)
664   {
665     if (myAISContext().IsNull())
666     {
667       return;
668     }
669     for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
670     {
671       myAISContext()->SetMaterial (myAISContext()->Current(), (Graphic3d_NameOfMaterial )theMaterial);
672     }
673     myAISContext()->UpdateCurrentViewer();
674   }
675
676   /// <summary>
677   ///set transparency
678   /// </summary>
679   void SetTransparency (int theTrans)
680   {
681     if (myAISContext().IsNull())
682     {
683       return;
684     }
685     for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextSelected())
686     {
687       myAISContext()->SetTransparency (myAISContext()->Current(), ((Standard_Real )theTrans) / 10.0);
688     }
689   }
690
691   /// <summary>
692   ///Return true if object is selected
693   /// </summary>
694   bool IsObjectSelected()
695   {
696     if (myAISContext().IsNull())
697     {
698       return false;
699     }
700     myAISContext()->InitCurrent();
701     return myAISContext()->MoreCurrent() != Standard_False;
702   }
703
704   /// <summary>
705   ///Return display mode
706   /// </summary>
707   int DisplayMode()
708   {
709     if (myAISContext().IsNull())
710     {
711       return -1;
712     }
713
714     bool isOneOrMoreInShading   = false;
715     bool isOneOrMoreInWireframe = false;
716     for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
717     {
718       if (myAISContext()->IsDisplayed (myAISContext()->Current(), AIS_Shaded))
719       {
720         isOneOrMoreInShading = true;
721       }
722       if (myAISContext()->IsDisplayed (myAISContext()->Current(), AIS_WireFrame))
723       {
724         isOneOrMoreInWireframe = true;
725       }
726     }
727     if (isOneOrMoreInShading
728      && isOneOrMoreInWireframe)
729     {
730       return 10;
731     }
732     else if (isOneOrMoreInShading)
733     {
734       return 1;
735     }
736     else if (isOneOrMoreInWireframe)
737     {
738       return 0;
739     }
740     return -1;
741   }
742
743   /// <summary>
744   ///Create new view
745   /// </summary>
746   /// <param name="theWnd">System.IntPtr that contains the window handle (HWND) of the control</param>
747   void CreateNewView (System::IntPtr theWnd)
748   {
749     if (myAISContext().IsNull())
750     {
751       return;
752     }
753
754     myView() = myAISContext()->CurrentViewer()->CreateView();
755     if (myGraphicDriver().IsNull())
756     {
757       myGraphicDriver() = new OpenGl_GraphicDriver (Handle(Aspect_DisplayConnection)());
758       //myGraphicDriver()->ChangeOptions().contextDebug = true;
759     }
760     Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast<HWND> (theWnd.ToPointer()));
761     myView()->SetWindow (aWNTWindow);
762     Standard_Integer aWidth = 100, aHeight = 100;
763     aWNTWindow->Size (aWidth, aHeight);
764     if (!aWNTWindow->IsMapped())
765     {
766       aWNTWindow->Map();
767     }
768   }
769
770   /// <summary>
771   ///Set AISContext
772   /// </summary>
773   bool SetAISContext (OCCTProxyD3D^ theViewer)
774   {
775      this->myAISContext() = theViewer->GetContext();
776      if (myAISContext().IsNull())
777      {
778        return false;
779      }
780     return true;
781   }
782
783   /// <summary>
784   ///Get AISContext
785   /// </summary>
786   Handle_AIS_InteractiveContext GetContext()
787   {
788     return myAISContext();
789   }
790
791 public:
792   // ============================================
793   // Import / export functionality
794   // ============================================
795
796   /// <summary>
797   ///Import BRep file
798   /// </summary>
799   /// <param name="theFileName">Name of import file</param>
800   bool ImportBrep (System::String^ theFileName)
801   {
802     bool  isResult  = false;
803     int   aLength   = theFileName->Length;
804     char* aFilename = new char[aLength + 1];
805     for(int i = 0; i < aLength; ++i)
806     {
807       aFilename[i] = (char )theFileName->ToCharArray()[i];
808     }
809     aFilename[aLength] = '\0';
810     isResult = ImportBrep (aFilename);
811     delete[] aFilename;
812     return isResult;
813   }
814
815   /// <summary>
816   ///Import BRep file
817   /// </summary>
818   /// <param name="theFileName">Name of import file</param>
819   bool ImportBrep (char* theFileName)
820   {
821     TopoDS_Shape aShape;
822     BRep_Builder aBuilder;
823     if (!BRepTools::Read (aShape, theFileName, aBuilder))
824     {
825       return false;
826     }
827     if (myAISContext()->HasOpenedContext())
828     {
829       myAISContext()->CloseLocalContext();
830     }
831     Handle(AIS_Shape) aPrs = new AIS_Shape (aShape);
832     myAISContext()->SetMaterial   (aPrs, Graphic3d_NOM_GOLD);
833     myAISContext()->SetDisplayMode(aPrs, AIS_Shaded, Standard_False);
834     myAISContext()->Display (aPrs);
835     return true;
836   }
837
838   /// <summary>
839   ///Import Csfdb file
840   /// </summary>
841   /// <param name="theFileName">Name of import file</param>
842   bool ImportCsfdb (char* theFileName)
843   {
844     TCollection_AsciiString aName (theFileName);
845     if (FSD_File::IsGoodFileType (aName) != Storage_VSOk)
846     {
847       return false;
848     }
849
850     FSD_File aFileDriver;
851     if (aFileDriver.Open (aName, Storage_VSRead) != Storage_VSOk)
852     {
853       return false;
854     }
855
856     Handle(ShapeSchema)  aSchema = new ShapeSchema();
857     Handle(Storage_Data) aData   = aSchema->Read (aFileDriver);
858     if (aData->ErrorStatus() != Storage_VSOk)
859     {
860       return false;
861     }
862     aFileDriver.Close();
863
864     Handle(Storage_HSeqOfRoot) aRoots = aData->Roots();
865     for (Standard_Integer aRootIter = 1; aRootIter <= aRoots->Length(); ++aRootIter)
866     {
867       Handle(Storage_Root)        aStorRoot        = aRoots->Value (aRootIter);
868       Handle(Standard_Persistent) aStandPersistent = aStorRoot->Object();
869       Handle(PTopoDS_HShape)      aPShape          = Handle(PTopoDS_HShape)::DownCast (aStandPersistent);
870       if (!aPShape.IsNull())
871       {
872         PTColStd_PersistentTransientMap aMap;
873         TopoDS_Shape aTShape;
874         MgtBRep::Translate (aPShape, aMap, aTShape, MgtBRep_WithTriangle);
875         myAISContext()->Display (new AIS_Shape (aTShape), Standard_True);
876       }
877     }
878
879     return true;
880   }
881
882   /// <summary>
883   ///Import Step file
884   /// </summary>
885   /// <param name="theFileName">Name of import file</param>
886   bool ImportStep (char* theFileName)
887   {
888     STEPControl_Reader aReader;
889     if (aReader.ReadFile (theFileName) != IFSelect_RetDone)
890     {
891       return false;
892     }
893
894     bool isFailsonly = false;
895     aReader.PrintCheckLoad( isFailsonly, IFSelect_ItemsByEntity );
896
897     int aNbRoot = aReader.NbRootsForTransfer();
898     aReader.PrintCheckTransfer (isFailsonly, IFSelect_ItemsByEntity);
899     for (Standard_Integer aRootIter = 1; aRootIter <= aNbRoot; ++aRootIter)
900     {
901       aReader.TransferRoot (aRootIter);
902       int aNbShap = aReader.NbShapes();
903       if (aNbShap > 0)
904       {
905         for (int aShapeIter = 1; aShapeIter <= aNbShap; ++aShapeIter)
906         {
907           myAISContext()->Display (new AIS_Shape (aReader.Shape (aShapeIter)), Standard_True);
908         }
909       }
910     }
911     return true;
912   }
913
914   /// <summary>
915   ///Import Iges file
916   /// </summary>
917   /// <param name="theFileName">Name of import file</param>
918   bool ImportIges (char* theFileName)
919   {
920     IGESControl_Reader aReader;
921     if (aReader.ReadFile (theFileName) != IFSelect_RetDone)
922     {
923       return false;
924     }
925
926     aReader.TransferRoots();
927     TopoDS_Shape aShape = aReader.OneShape();
928     myAISContext()->Display (new AIS_Shape (aShape), Standard_False);
929     myAISContext()->UpdateCurrentViewer();
930     return true;
931   }
932
933   /// <summary>
934   ///Export BRep file
935   /// </summary>
936   /// <param name="theFileName">Name of export file</param>
937   bool ExportBRep (char* theFileName)
938   {
939     myAISContext()->InitCurrent();
940     if (!myAISContext()->MoreCurrent())
941     {
942       return false;
943     }
944
945     Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current());
946     return !anIS.IsNull()
947          && BRepTools::Write (anIS->Shape(), theFileName);
948   }
949
950   /// <summary>
951   ///Export Step file
952   /// </summary>
953   /// <param name="theFileName">Name of export file</param>
954   bool ExportStep (char* theFileName)
955   {
956     STEPControl_StepModelType aType = STEPControl_AsIs;
957     STEPControl_Writer        aWriter;
958     for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
959     {
960       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current());
961       if (anIS.IsNull())
962       {
963         return false;
964       }
965
966       TopoDS_Shape aShape = anIS->Shape();
967       if (aWriter.Transfer (aShape, aType) != IFSelect_RetDone)
968       {
969         return false;
970       }
971     }
972     return aWriter.Write (theFileName) == IFSelect_RetDone;
973   }
974
975   /// <summary>
976   ///Export Iges file
977   /// </summary>
978   /// <param name="theFileName">Name of export file</param>
979   bool ExportIges (char* theFileName)
980   {
981     IGESControl_Controller::Init();
982     IGESControl_Writer aWriter (Interface_Static::CVal ("XSTEP.iges.unit"),
983                                 Interface_Static::IVal ("XSTEP.iges.writebrep.mode"));
984     for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
985     {
986       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current());
987       if (anIS.IsNull())
988       {
989         return false;
990       }
991
992       aWriter.AddShape (anIS->Shape());
993     }
994
995     aWriter.ComputeModel();
996     return aWriter.Write (theFileName) != Standard_False;
997   }
998
999   /// <summary>
1000   ///Export Vrml file
1001   /// </summary>
1002   /// <param name="theFileName">Name of export file</param>
1003   bool ExportVrml (char* theFileName)
1004   {
1005     TopoDS_Compound aRes;
1006     BRep_Builder    aBuilder;
1007     aBuilder.MakeCompound (aRes);
1008     for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
1009     {
1010       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current());
1011       if (anIS.IsNull())
1012       {
1013         return false;
1014       }
1015       aBuilder.Add (aRes, anIS->Shape());
1016     }
1017
1018     VrmlAPI_Writer aWriter;
1019     aWriter.Write (aRes, theFileName);
1020     return true;
1021   }
1022
1023   /// <summary>
1024   ///Export Stl file
1025   /// </summary>
1026   /// <param name="theFileName">Name of export file</param>
1027   bool ExportStl (char* theFileName)
1028   {
1029     TopoDS_Compound aComp;
1030     BRep_Builder    aBuilder;
1031     aBuilder.MakeCompound (aComp);
1032     for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
1033     {
1034       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current());
1035       if (anIS.IsNull())
1036       {
1037         return false;
1038       }
1039       aBuilder.Add (aComp, anIS->Shape());
1040     }
1041
1042     StlAPI_Writer aWriter;
1043     aWriter.Write (aComp, theFileName);
1044     return true;
1045   }
1046
1047   /// <summary>
1048   ///Define which Import/Export function must be called
1049   /// </summary>
1050   /// <param name="theFileName">Name of Import/Export file</param>
1051   /// <param name="theFormat">Determines format of Import/Export file</param>
1052   /// <param name="theIsImport">Determines is Import or not</param>
1053   bool TranslateModel (System::String^ theFileName, int theFormat, bool theIsImport)
1054   {
1055     bool  isResult  = false;
1056     int   aLength   = theFileName->Length;
1057     char* aFilename = new char[aLength + 1];
1058     for (int aCharIter = 0; aCharIter < aLength; ++aCharIter)
1059     {
1060       aFilename[aCharIter] = (char)theFileName->ToCharArray()[aCharIter];
1061     }
1062     aFilename[aLength] = '\0';
1063
1064     if (theIsImport)
1065     {
1066       switch (theFormat)
1067       {
1068         case 0: isResult = ImportBrep  (aFilename); break;
1069         case 1: isResult = ImportCsfdb (aFilename); break;
1070         case 2: isResult = ImportStep  (aFilename); break;
1071         case 3: isResult = ImportIges  (aFilename); break;
1072       }
1073     }
1074     else 
1075     {
1076       switch (theFormat)
1077       {
1078         case 0: isResult = ExportBRep (aFilename); break;
1079         case 2: isResult = ExportStep (aFilename); break;
1080         case 3: isResult = ExportIges (aFilename); break;
1081         case 4: isResult = ExportVrml (aFilename); break;
1082         case 5: isResult = ExportStl  (aFilename); break;
1083         case 6: isResult = Dump (aFilename);      break;
1084       }
1085     }
1086     delete[] aFilename;
1087     return isResult;
1088   }
1089
1090   /// <summary>
1091   ///Initialize OCCTProxyD3D
1092   /// </summary>
1093   void InitOCCTProxy()
1094   {
1095     myGraphicDriver().Nullify();
1096     myViewer().Nullify();
1097     myView().Nullify();
1098     myAISContext().Nullify();
1099   }
1100
1101 private:
1102
1103   NCollection_Haft<Handle_V3d_Viewer>             myViewer;
1104   NCollection_Haft<Handle_V3d_View>               myView;
1105   NCollection_Haft<Handle_AIS_InteractiveContext> myAISContext;
1106   NCollection_Haft<Handle_OpenGl_GraphicDriver>   myGraphicDriver;
1107   BridgeFBO*                                      myBridgeFBO;     //!< Provides output to Direct3D buffers
1108
1109 };