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