0026628: Button Erase (Delete where erase algorythm is used) works incorrect
[occt.git] / samples / CSharp / OCCTProxy / OCCTProxy.cpp
CommitLineData
d1a2fee8 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>
65993a95 7#include <OpenGl_GraphicDriver.hxx>
d1a2fee8 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>
d1a2fee8 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")
d1a2fee8 39#pragma comment(lib, "TKXSBase.lib")
40#pragma comment(lib, "TKService.lib")
41#pragma comment(lib, "TKV3d.lib")
65993a95 42#pragma comment(lib, "TKOpenGl.lib")
d1a2fee8 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>
52public ref class OCCTProxy
53{
54public:
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;
65993a95 68 myGraphicDriver() = new OpenGl_GraphicDriver (aDisplayConnection);
d1a2fee8 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
d1a2fee8 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 }
7140edaf 582
583 myAISContext()->EraseSelected (Standard_True);
d1a2fee8 584 myAISContext()->ClearCurrents();
585 }
586
587 /// <summary>
588 ///Get version
589 /// </summary>
590 float GetOCCVersion(void)
591 {
592 return (float)OCC_VERSION;
593 }
594
595 /// <summary>
596 ///set material
597 /// </summary>
598 void SetMaterial(int theMaterial)
599 {
600 if (myAISContext().IsNull())
601 {
602 return;
603 }
604 for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent (); myAISContext()->NextCurrent () )
605 {
606 myAISContext()->SetMaterial( myAISContext()->Current(), (Graphic3d_NameOfMaterial)theMaterial );
607 }
608 myAISContext()->UpdateCurrentViewer();
609 }
610
611 /// <summary>
612 ///set transparency
613 /// </summary>
614 void SetTransparency(int theTrans)
615 {
616 if (myAISContext().IsNull())
617 {
618 return;
619 }
620 for( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextSelected() )
621 {
622 myAISContext()->SetTransparency( myAISContext()->Current(), ((Standard_Real)theTrans) / 10.0 );
623 }
624 }
625
626 /// <summary>
627 ///Return true if object is selected
628 /// </summary>
629 bool IsObjectSelected(void)
630 {
631 if (myAISContext().IsNull())
632 {
633 return false;
634 }
635 myAISContext()->InitCurrent();
636 return myAISContext()->MoreCurrent() != Standard_False;
637 }
638
639 /// <summary>
640 ///Return display mode
641 /// </summary>
642 int DisplayMode(void)
643 {
644 if (myAISContext().IsNull())
645 {
646 return -1;
647 }
648 int aMode = -1;
649 bool OneOrMoreInShading = false;
650 bool OneOrMoreInWireframe = false;
651 for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
652 {
653 if ( myAISContext()->IsDisplayed( myAISContext()->Current(), 1 ) )
654 {
655 OneOrMoreInShading = true;
656 }
657 if ( myAISContext()->IsDisplayed( myAISContext()->Current(), 0 ) )
658 {
659 OneOrMoreInWireframe = true;
660 }
661 }
662 if (OneOrMoreInShading && OneOrMoreInWireframe)
663 {
664 aMode=10;
665 }
666 else if(OneOrMoreInShading)
667 {
668 aMode=1;
669 }
670 else if (OneOrMoreInWireframe)
671 {
672 aMode=0;
673 }
674
675 return aMode;
676 }
677
678 /// <summary>
679 ///Create new view
680 /// </summary>
681 /// <param name="theWnd">System.IntPtr that contains the window handle (HWND) of the control</param>
682 void CreateNewView(System::IntPtr theWnd)
683 {
684 if (myAISContext().IsNull())
685 {
686 return;
687 }
688 myView() = myAISContext()->CurrentViewer()->CreateView();
689 if (myGraphicDriver().IsNull())
690 {
fe9fc669 691 myGraphicDriver() = new OpenGl_GraphicDriver (Handle(Aspect_DisplayConnection)());
d1a2fee8 692 }
693 Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast<HWND> (theWnd.ToPointer()));
694 myView()->SetWindow(aWNTWindow);
695 Standard_Integer w=100, h=100;
696 aWNTWindow->Size(w,h);
697 if (!aWNTWindow->IsMapped())
698 {
699 aWNTWindow->Map();
700 }
701 }
702
703 /// <summary>
704 ///Set AISContext
705 /// </summary>
706 bool SetAISContext(OCCTProxy^ theViewer)
707 {
708 this->myAISContext() = theViewer->GetContext();
709 if (myAISContext().IsNull())
710 {
711 return false;
712 }
713 return true;
714 }
715
716 /// <summary>
717 ///Get AISContext
718 /// </summary>
719 Handle_AIS_InteractiveContext GetContext(void)
720 {
721 return myAISContext();
722 }
723
724public:
725 // ============================================
726 // Import / export functionality
727 // ============================================
728
729 /// <summary>
730 ///Import BRep file
731 /// </summary>
732 /// <param name="theFileName">Name of import file</param>
733 bool ImportBrep(System::String^ theFileName)
734 {
735 bool isResult = false;
736 int aLength = theFileName->Length;
737 char* aFilename = new char[aLength+1];
738 for(int i = 0; i<aLength; i++)
739 {
740 aFilename[i] = (char)theFileName->ToCharArray()[i];
741 }
742 aFilename[aLength] = '\0';
743 isResult = ImportBrep(aFilename);
744 return isResult;
745 }
746
747 /// <summary>
748 ///Import BRep file
749 /// </summary>
750 /// <param name="theFileName">Name of import file</param>
751 bool ImportBrep(char* theFileName)
752 {
753 Standard_CString aFileName = (Standard_CString) theFileName;
754 TopoDS_Shape aShape;
755 BRep_Builder aBuilder;
756 Standard_Boolean isResult = BRepTools::Read(aShape,aFileName,aBuilder);
757 if (!isResult)
758 {
759 return false;
760 }
761 if(myAISContext()->HasOpenedContext())
762 {
763 myAISContext()->CloseLocalContext();
764 }
765 myAISContext()->Display(new AIS_Shape(aShape));
766 return true;
767 }
768
d1a2fee8 769 /// <summary>
770 ///Import Step file
771 /// </summary>
772 /// <param name="theFileName">Name of import file</param>
773 bool ImportStep(char* theFileName)
774 {
775 Standard_CString aFileName = (Standard_CString) theFileName;
776 STEPControl_Reader aReader;
777 IFSelect_ReturnStatus aStatus = aReader.ReadFile(aFileName);
778 if ( aStatus == IFSelect_RetDone )
779 {
780 bool isFailsonly = false;
781 aReader.PrintCheckLoad( isFailsonly, IFSelect_ItemsByEntity );
782
783 int aNbRoot = aReader.NbRootsForTransfer();
784 aReader.PrintCheckTransfer( isFailsonly, IFSelect_ItemsByEntity );
785 for ( Standard_Integer n = 1; n <= aNbRoot; n++ )
786 {
787 Standard_Boolean ok = aReader.TransferRoot( n );
788 int aNbShap = aReader.NbShapes();
789 if ( aNbShap > 0 )
790 {
791 for ( int i = 1; i <= aNbShap; i++ )
792 {
793 TopoDS_Shape aShape = aReader.Shape( i );
794 myAISContext()->Display(new AIS_Shape(aShape));
795 }
796 }
797 }
798 }
799 else
800 {
801 return false;
802 }
803
804 return true;
805 }
806
807 /// <summary>
808 ///Import Iges file
809 /// </summary>
810 /// <param name="theFileName">Name of import file</param>
811 bool ImportIges(char* theFileName)
812 {
813 Standard_CString aFileName = (Standard_CString) theFileName;
814 IGESControl_Reader aReader;
815 int aStatus = aReader.ReadFile( aFileName );
816
817 if ( aStatus == IFSelect_RetDone )
818 {
819 aReader.TransferRoots();
820 TopoDS_Shape aShape = aReader.OneShape();
821 myAISContext()->Display(new AIS_Shape(aShape));
822 }
823 else
824 {
825 return false;
826 }
827
828 myAISContext()->UpdateCurrentViewer();
829 return true;
830 }
831
832 /// <summary>
833 ///Export BRep file
834 /// </summary>
835 /// <param name="theFileName">Name of export file</param>
836 bool ExportBRep(char* theFileName)
837 {
838 myAISContext()->InitCurrent();
839 if (!myAISContext()->MoreCurrent())
840 {
841 return false;
842 }
843
844 Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
845 Handle_AIS_Shape anIS = Handle_AIS_Shape::DownCast(anIO);
846 return BRepTools::Write (anIS->Shape(), (Standard_CString)theFileName) != Standard_False;
847 }
848
849 /// <summary>
850 ///Export Step file
851 /// </summary>
852 /// <param name="theFileName">Name of export file</param>
853 bool ExportStep(char* theFileName)
854 {
855 STEPControl_StepModelType aType = STEPControl_AsIs;
856 IFSelect_ReturnStatus aStatus;
857 STEPControl_Writer aWriter;
858 for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
859 {
860 Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
861 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
862 TopoDS_Shape aShape = anIS->Shape();
863 aStatus = aWriter.Transfer( aShape , aType );
864 if ( aStatus != IFSelect_RetDone )
865 {
866 return false;
867 }
868 }
869
870 aStatus = aWriter.Write( (Standard_CString)theFileName );
871 if ( aStatus != IFSelect_RetDone )
872 {
873 return false;
874 }
875
876 return true;
877 }
878
879 /// <summary>
880 ///Export Iges file
881 /// </summary>
882 /// <param name="theFileName">Name of export file</param>
883 bool ExportIges(char* theFileName)
884 {
885 IGESControl_Controller::Init();
886 IGESControl_Writer aWriter( Interface_Static::CVal( "XSTEP.iges.unit" ),
887 Interface_Static::IVal( "XSTEP.iges.writebrep.mode" ) );
888
889 for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
890 {
891 Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
892 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
893 TopoDS_Shape aShape = anIS->Shape();
894 aWriter.AddShape ( aShape );
895 }
896
897 aWriter.ComputeModel();
898 return aWriter.Write( (Standard_CString)theFileName) != Standard_False;
899 }
900
901 /// <summary>
902 ///Export Vrml file
903 /// </summary>
904 /// <param name="theFileName">Name of export file</param>
905 bool ExportVrml(char* theFileName)
906 {
907 TopoDS_Compound aRes;
908 BRep_Builder aBuilder;
909 aBuilder.MakeCompound( aRes );
910
911 for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
912 {
913 Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
914 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
915 TopoDS_Shape aShape = anIS->Shape();
916 if ( aShape.IsNull() )
917 {
918 return false;
919 }
920
921 aBuilder.Add( aRes, aShape );
922 }
923
924 VrmlAPI_Writer aWriter;
925 aWriter.Write( aRes, (Standard_CString)theFileName );
926
927 return true;
928 }
929
930 /// <summary>
931 ///Export Stl file
932 /// </summary>
933 /// <param name="theFileName">Name of export file</param>
934 bool ExportStl(char* theFileName)
935 {
936 TopoDS_Compound aComp;
937 BRep_Builder aBuilder;
938 aBuilder.MakeCompound( aComp );
939
940 for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
941 {
942 Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
943 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
944 TopoDS_Shape aShape = anIS->Shape();
945 if ( aShape.IsNull() )
946 {
947 return false;
948 }
949 aBuilder.Add( aComp, aShape );
950 }
951
952 StlAPI_Writer aWriter;
953 aWriter.Write( aComp, (Standard_CString)theFileName );
954 return true;
955 }
956
957 /// <summary>
958 ///Define which Import/Export function must be called
959 /// </summary>
960 /// <param name="theFileName">Name of Import/Export file</param>
961 /// <param name="theFormat">Determines format of Import/Export file</param>
962 /// <param name="theIsImport">Determines is Import or not</param>
963 bool TranslateModel(System::String^ theFileName, int theFormat, bool theIsImport)
964 {
965 bool isResult;
966 int aLength = theFileName->Length;
967 char* aFilename = new char[aLength+1];
968 for(int i = 0; i<aLength; i++)
969 {
970 aFilename[i] = (char)theFileName->ToCharArray()[i];
971 }
972 aFilename[aLength] = '\0';
973
974 if (theIsImport)
975 {
976 switch(theFormat)
977 {
978 case 0:
979 isResult = ImportBrep(aFilename);
980 break;
981 case 1:
d1a2fee8 982 isResult = ImportStep(aFilename);
983 break;
41f03605 984 case 2:
d1a2fee8 985 isResult = ImportIges(aFilename);
986 break;
987 default:
988 isResult = false;
989 }
990 }
991 else
992 {
993 switch(theFormat)
994 {
995 case 0:
996 isResult = ExportBRep(aFilename);
997 break;
41f03605 998 case 1:
d1a2fee8 999 isResult = ExportStep(aFilename);
1000 break;
41f03605 1001 case 2:
d1a2fee8 1002 isResult = ExportIges(aFilename);
1003 break;
41f03605 1004 case 3:
d1a2fee8 1005 isResult = ExportVrml(aFilename);
1006 break;
41f03605 1007 case 4:
d1a2fee8 1008 isResult = ExportStl(aFilename);
1009 break;
41f03605 1010 case 5:
d1a2fee8 1011 isResult = Dump(aFilename);
1012 break;
1013 default:
1014 isResult = false;
1015 }
1016 }
1017 return isResult;
1018 }
1019
1020 /// <summary>
1021 ///Initialize OCCTProxy
1022 /// </summary>
1023 void InitOCCTProxy(void)
1024 {
1025 myGraphicDriver()=NULL;
1026 myViewer()=NULL;
1027 myView()=NULL;
1028 myAISContext()=NULL;
1029 }
1030
1031private:
1032 // fields
1033 NCollection_Haft<Handle_V3d_Viewer> myViewer;
1034 NCollection_Haft<Handle_V3d_View> myView;
1035 NCollection_Haft<Handle_AIS_InteractiveContext> myAISContext;
15534713 1036 NCollection_Haft<Handle_OpenGl_GraphicDriver> myGraphicDriver;
d1a2fee8 1037};