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