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