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