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