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