0028088: Visualization, AIS_InteractiveContext - drop default value for Update Viewer...
[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(), Standard_True);
242     }
243   }
244
245   /// <summary>
246   ///Select by click
247   /// </summary>
248   void Select()
249   {
250     if (!myAISContext().IsNull())
251     {
252       myAISContext()->Select (Standard_True);
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(), Standard_True);
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(), Standard_True);
275     }
276   }
277
278   /// <summary>
279   ///Select by "Shift" key
280   /// </summary>
281   void ShiftSelect()
282   {
283     if (!myAISContext().IsNull())
284     {
285       myAISContext()->ShiftSelect (Standard_True);
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()->NbSelected() == 0)
469     {
470        myAISContext()->SetDisplayMode (aCurrentMode, Standard_False);
471     }
472     else
473     {
474        for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
475        {
476          myAISContext()->SetDisplayMode (myAISContext()->SelectedInteractive(), theMode, Standard_False);
477        }
478     }
479     myAISContext()->UpdateCurrentViewer();
480   }
481
482   /// <summary>
483   ///Set color
484   /// </summary>
485   void SetColor (int theR, int theG, int theB)
486   {
487     if (myAISContext().IsNull())
488     {
489       return;
490     }
491
492     Quantity_Color aCol (theR / 255.0, theG / 255.0, theB / 255.0, Quantity_TOC_RGB);
493     for (; myAISContext()->MoreSelected(); myAISContext()->NextSelected())
494     {
495       myAISContext()->SetColor (myAISContext()->SelectedInteractive(), aCol.Name(), false);
496     }
497     myAISContext()->UpdateCurrentViewer();
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()->InitSelected();
544     if (!myAISContext()->MoreSelected())
545     {
546       return;
547     }
548
549     Handle(AIS_InteractiveObject) aCurrent = myAISContext()->SelectedInteractive();
550     if (aCurrent->HasColor())
551     {
552       Quantity_Color anObjCol = myAISContext()->Color (aCurrent);
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_False);
581     myAISContext()->ClearSelected (Standard_True);
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()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
602     {
603       myAISContext()->SetMaterial (myAISContext()->SelectedInteractive(), (Graphic3d_NameOfMaterial )theMaterial, Standard_False);
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()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
618     {
619       myAISContext()->SetTransparency (myAISContext()->Current(), ((Standard_Real )theTrans) / 10.0, Standard_False);
620     }
621     myAISContext()->UpdateCurrentViewer();
622   }
623
624   /// <summary>
625   ///Return true if object is selected
626   /// </summary>
627   bool IsObjectSelected()
628   {
629     if (myAISContext().IsNull())
630     {
631       return false;
632     }
633     myAISContext()->InitSelected();
634     return myAISContext()->MoreSelected() != Standard_False;
635   }
636
637   /// <summary>
638   ///Return display mode
639   /// </summary>
640   int DisplayMode()
641   {
642     if (myAISContext().IsNull())
643     {
644       return -1;
645     }
646
647     bool isOneOrMoreInShading   = false;
648     bool isOneOrMoreInWireframe = false;
649     for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
650     {
651       if (myAISContext()->IsDisplayed (myAISContext()->SelectedInteractive(), AIS_Shaded))
652       {
653         isOneOrMoreInShading = true;
654       }
655       if (myAISContext()->IsDisplayed (myAISContext()->SelectedInteractive(), AIS_WireFrame))
656       {
657         isOneOrMoreInWireframe = true;
658       }
659     }
660     if (isOneOrMoreInShading
661      && isOneOrMoreInWireframe)
662     {
663       return 10;
664     }
665     else if (isOneOrMoreInShading)
666     {
667       return 1;
668     }
669     else if (isOneOrMoreInWireframe)
670     {
671       return 0;
672     }
673     return -1;
674   }
675
676   /// <summary>
677   ///Set AISContext
678   /// </summary>
679   bool SetAISContext (OCCTProxyD3D^ theViewer)
680   {
681      this->myAISContext() = theViewer->GetContext();
682      if (myAISContext().IsNull())
683      {
684        return false;
685      }
686     return true;
687   }
688
689   /// <summary>
690   ///Get AISContext
691   /// </summary>
692   Handle(AIS_InteractiveContext) GetContext()
693   {
694     return myAISContext();
695   }
696
697 public:
698   // ============================================
699   // Import / export functionality
700   // ============================================
701
702   /// <summary>
703   ///Import BRep file
704   /// </summary>
705   /// <param name="theFileName">Name of import file</param>
706   bool ImportBrep (System::String^ theFileName)
707   {
708     bool  isResult  = false;
709     int   aLength   = theFileName->Length;
710     char* aFilename = new char[aLength + 1];
711     for(int i = 0; i < aLength; ++i)
712     {
713       aFilename[i] = (char )theFileName->ToCharArray()[i];
714     }
715     aFilename[aLength] = '\0';
716     isResult = ImportBrep (aFilename);
717     delete[] aFilename;
718     return isResult;
719   }
720
721   /// <summary>
722   ///Import BRep file
723   /// </summary>
724   /// <param name="theFileName">Name of import file</param>
725   bool ImportBrep (char* theFileName)
726   {
727     TopoDS_Shape aShape;
728     BRep_Builder aBuilder;
729     if (!BRepTools::Read (aShape, theFileName, aBuilder))
730     {
731       return false;
732     }
733
734     Handle(AIS_Shape) aPrs = new AIS_Shape (aShape);
735     myAISContext()->SetMaterial   (aPrs, Graphic3d_NOM_GOLD, Standard_False);
736     myAISContext()->SetDisplayMode(aPrs, AIS_Shaded, Standard_False);
737     myAISContext()->Display (aPrs, Standard_True);
738     return true;
739   }
740
741   /// <summary>
742   ///Import Step file
743   /// </summary>
744   /// <param name="theFileName">Name of import file</param>
745   bool ImportStep (char* theFileName)
746   {
747     STEPControl_Reader aReader;
748     if (aReader.ReadFile (theFileName) != IFSelect_RetDone)
749     {
750       return false;
751     }
752
753     bool isFailsonly = false;
754     aReader.PrintCheckLoad( isFailsonly, IFSelect_ItemsByEntity );
755
756     int aNbRoot = aReader.NbRootsForTransfer();
757     aReader.PrintCheckTransfer (isFailsonly, IFSelect_ItemsByEntity);
758     for (Standard_Integer aRootIter = 1; aRootIter <= aNbRoot; ++aRootIter)
759     {
760       aReader.TransferRoot (aRootIter);
761       int aNbShap = aReader.NbShapes();
762       if (aNbShap > 0)
763       {
764         for (int aShapeIter = 1; aShapeIter <= aNbShap; ++aShapeIter)
765         {
766           myAISContext()->Display (new AIS_Shape (aReader.Shape (aShapeIter)), Standard_False);
767         }
768         myAISContext()->UpdateCurrentViewer();
769       }
770     }
771     return true;
772   }
773
774   /// <summary>
775   ///Import Iges file
776   /// </summary>
777   /// <param name="theFileName">Name of import file</param>
778   bool ImportIges (char* theFileName)
779   {
780     IGESControl_Reader aReader;
781     if (aReader.ReadFile (theFileName) != IFSelect_RetDone)
782     {
783       return false;
784     }
785
786     aReader.TransferRoots();
787     TopoDS_Shape aShape = aReader.OneShape();
788     myAISContext()->Display (new AIS_Shape (aShape), Standard_False);
789     myAISContext()->UpdateCurrentViewer();
790     return true;
791   }
792
793   /// <summary>
794   ///Export BRep file
795   /// </summary>
796   /// <param name="theFileName">Name of export file</param>
797   bool ExportBRep (char* theFileName)
798   {
799     myAISContext()->InitSelected();
800     if (!myAISContext()->MoreSelected())
801     {
802       return false;
803     }
804
805     Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->SelectedInteractive());
806     return !anIS.IsNull()
807          && BRepTools::Write (anIS->Shape(), theFileName);
808   }
809
810   /// <summary>
811   ///Export Step file
812   /// </summary>
813   /// <param name="theFileName">Name of export file</param>
814   bool ExportStep (char* theFileName)
815   {
816     STEPControl_StepModelType aType = STEPControl_AsIs;
817     STEPControl_Writer        aWriter;
818     for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
819     {
820       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->SelectedInteractive());
821       if (anIS.IsNull())
822       {
823         return false;
824       }
825
826       TopoDS_Shape aShape = anIS->Shape();
827       if (aWriter.Transfer (aShape, aType) != IFSelect_RetDone)
828       {
829         return false;
830       }
831     }
832     return aWriter.Write (theFileName) == IFSelect_RetDone;
833   }
834
835   /// <summary>
836   ///Export Iges file
837   /// </summary>
838   /// <param name="theFileName">Name of export file</param>
839   bool ExportIges (char* theFileName)
840   {
841     IGESControl_Controller::Init();
842     IGESControl_Writer aWriter (Interface_Static::CVal ("XSTEP.iges.unit"),
843                                 Interface_Static::IVal ("XSTEP.iges.writebrep.mode"));
844     for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
845     {
846       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->SelectedInteractive());
847       if (anIS.IsNull())
848       {
849         return false;
850       }
851
852       aWriter.AddShape (anIS->Shape());
853     }
854
855     aWriter.ComputeModel();
856     return aWriter.Write (theFileName) != Standard_False;
857   }
858
859   /// <summary>
860   ///Export Vrml file
861   /// </summary>
862   /// <param name="theFileName">Name of export file</param>
863   bool ExportVrml (char* theFileName)
864   {
865     TopoDS_Compound aRes;
866     BRep_Builder    aBuilder;
867     aBuilder.MakeCompound (aRes);
868     for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
869     {
870       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->SelectedInteractive());
871       if (anIS.IsNull())
872       {
873         return false;
874       }
875       aBuilder.Add (aRes, anIS->Shape());
876     }
877
878     VrmlAPI_Writer aWriter;
879     aWriter.Write (aRes, theFileName);
880     return true;
881   }
882
883   /// <summary>
884   ///Export Stl file
885   /// </summary>
886   /// <param name="theFileName">Name of export file</param>
887   bool ExportStl (char* theFileName)
888   {
889     TopoDS_Compound aComp;
890     BRep_Builder    aBuilder;
891     aBuilder.MakeCompound (aComp);
892     for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
893     {
894       Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->SelectedInteractive());
895       if (anIS.IsNull())
896       {
897         return false;
898       }
899       aBuilder.Add (aComp, anIS->Shape());
900     }
901
902     StlAPI_Writer aWriter;
903     aWriter.Write (aComp, theFileName);
904     return true;
905   }
906
907   /// <summary>
908   ///Define which Import/Export function must be called
909   /// </summary>
910   /// <param name="theFileName">Name of Import/Export file</param>
911   /// <param name="theFormat">Determines format of Import/Export file</param>
912   /// <param name="theIsImport">Determines is Import or not</param>
913   bool TranslateModel (System::String^ theFileName, int theFormat, bool theIsImport)
914   {
915     bool  isResult  = false;
916     int   aLength   = theFileName->Length;
917     char* aFilename = new char[aLength + 1];
918     for (int aCharIter = 0; aCharIter < aLength; ++aCharIter)
919     {
920       aFilename[aCharIter] = (char)theFileName->ToCharArray()[aCharIter];
921     }
922     aFilename[aLength] = '\0';
923
924     if (theIsImport)
925     {
926       switch (theFormat)
927       {
928         case 0: isResult = ImportBrep  (aFilename); break;
929         case 1: isResult = ImportStep  (aFilename); break;
930         case 2: isResult = ImportIges  (aFilename); break;
931       }
932     }
933     else 
934     {
935       switch (theFormat)
936       {
937         case 0: isResult = ExportBRep (aFilename); break;
938         case 1: isResult = ExportStep (aFilename); break;
939         case 2: isResult = ExportIges (aFilename); break;
940         case 3: isResult = ExportVrml (aFilename); break;
941         case 4: isResult = ExportStl  (aFilename); break;
942         case 5: isResult = Dump (aFilename);      break;
943       }
944     }
945     delete[] aFilename;
946     return isResult;
947   }
948
949   /// <summary>
950   ///Initialize OCCTProxyD3D
951   /// </summary>
952   void InitOCCTProxy()
953   {
954     myGraphicDriver().Nullify();
955     myViewer().Nullify();
956     myView().Nullify();
957     myAISContext().Nullify();
958   }
959
960 private:
961
962   NCollection_Haft<Handle(V3d_Viewer)>             myViewer;
963   NCollection_Haft<Handle(V3d_View)>               myView;
964   NCollection_Haft<Handle(AIS_InteractiveContext)> myAISContext;
965   NCollection_Haft<Handle(D3DHost_GraphicDriver)>  myGraphicDriver;
966
967 };