// include required OCCT headers #include #include //for OCC graphic #include #include #include //for object display #include #include #include #include //topology #include #include //brep tools #include #include // iges I/E #include #include #include #include #include //step I/E #include #include //for stl export #include //for vrml export #include //wrapper of pure C++ classes to ref classes #include // list of required OCCT libraries #pragma comment(lib, "TKernel.lib") #pragma comment(lib, "TKMath.lib") #pragma comment(lib, "TKBRep.lib") #pragma comment(lib, "TKXSBase.lib") #pragma comment(lib, "TKService.lib") #pragma comment(lib, "TKV3d.lib") #pragma comment(lib, "TKOpenGl.lib") #pragma comment(lib, "TKIGES.lib") #pragma comment(lib, "TKSTEP.lib") #pragma comment(lib, "TKStl.lib") #pragma comment(lib, "TKVrml.lib") /// /// Proxy class encapsulating calls to OCCT C++ classes within /// C++/CLI class visible from .Net (CSharp) /// public ref class OCCTProxy { public: // ============================================ // Viewer functionality // ============================================ /// ///Initialize a viewer /// /// System.IntPtr that contains the window handle (HWND) of the control bool InitViewer(System::IntPtr theWnd) { try { Handle(Aspect_DisplayConnection) aDisplayConnection; myGraphicDriver() = new OpenGl_GraphicDriver (aDisplayConnection); } catch (Standard_Failure) { return false; } myViewer() = new V3d_Viewer (myGraphicDriver()); myViewer()->SetDefaultLights(); myViewer()->SetLightOn(); myView() = myViewer()->CreateView(); Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast (theWnd.ToPointer())); myView()->SetWindow(aWNTWindow); if (!aWNTWindow->IsMapped()) { aWNTWindow->Map(); } myAISContext() = new AIS_InteractiveContext( myViewer() ); myAISContext()->UpdateCurrentViewer(); myView()->Redraw(); myView()->MustBeResized(); return true; } /// /// Make dump of current view to file /// /// Name of dump file bool Dump(char *theFileName) { if (myView().IsNull()) { return false; } myView()->Redraw(); return myView()->Dump(theFileName) != Standard_False; } /// ///Redraw view /// void RedrawView(void) { if (!myView().IsNull()) { myView()->Redraw(); } } /// ///Update view /// void UpdateView(void) { if (!myView().IsNull()) { myView()->MustBeResized(); } } /// ///Set computed mode in false /// void SetDegenerateModeOn(void) { if (!myView().IsNull()) { myView()->SetComputedMode (Standard_False); } } /// ///Set computed mode in true /// void SetDegenerateModeOff(void) { if (!myView().IsNull()) { myView()->SetComputedMode (Standard_True); } } /// ///Fit all /// void WindowFitAll(int theXmin, int theYmin, int theXmax, int theYmax) { if (!myView().IsNull()) { myView()->WindowFitAll(theXmin, theYmin, theXmax, theYmax); } } /// ///Current place of window /// /// Current zoom void Place(int theX, int theY, float theZoomFactor) { Quantity_Factor aZoomFactor = theZoomFactor; if (!myView().IsNull()) { myView()->Place(theX, theY, aZoomFactor); } } /// ///Set Zoom /// void Zoom(int theX1, int theY1, int theX2, int theY2) { if (!myView().IsNull()) { myView()->Zoom(theX1, theY1, theX2, theY2); } } /// ///Set Pan /// void Pan(int theX, int theY) { if (!myView().IsNull()) { myView()->Pan(theX, theY); } } /// ///Rotation /// void Rotation(int theX, int theY) { if (!myView().IsNull()) { myView()->Rotation(theX, theY); } } /// ///Start rotation /// void StartRotation(int theX, int theY) { if (!myView().IsNull()) { myView()->StartRotation(theX, theY); } } /// ///Select by rectangle /// void Select(int theX1, int theY1, int theX2, int theY2) { if (!myAISContext().IsNull()) { myAISContext()->Select (theX1, theY1, theX2, theY2, myView(), Standard_True); } } /// ///Select by click /// void Select(void) { if (!myAISContext().IsNull()) { myAISContext()->Select (Standard_True); } } /// ///Move view /// void MoveTo(int theX, int theY) { if ((!myAISContext().IsNull()) && (!myView().IsNull())) { myAISContext()->MoveTo (theX, theY, myView(), Standard_True); } } /// ///Select by rectangle with pressed "Shift" key /// void ShiftSelect(int theX1, int theY1, int theX2, int theY2) { if ((!myAISContext().IsNull()) && (!myView().IsNull())) { myAISContext()->ShiftSelect (theX1, theY1, theX2, theY2, myView(), Standard_True); } } /// ///Select by "Shift" key /// void ShiftSelect(void) { if (!myAISContext().IsNull()) { myAISContext()->ShiftSelect (Standard_True); } } /// ///Set background color /// void BackgroundColor(int& theRed, int& theGreen, int& theBlue) { Standard_Real R1; Standard_Real G1; Standard_Real B1; if (!myView().IsNull()) { myView()->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1); } theRed = (int)R1*255; theGreen = (int)G1*255; theBlue = (int)B1*255; } /// ///Get background color Red /// int GetBGColR(void) { int aRed, aGreen, aBlue; BackgroundColor(aRed, aGreen, aBlue); return aRed; } /// ///Get background color Green /// int GetBGColG(void) { int aRed, aGreen, aBlue; BackgroundColor(aRed, aGreen, aBlue); return aGreen; } /// ///Get background color Blue /// int GetBGColB(void) { int aRed, aGreen, aBlue; BackgroundColor(aRed, aGreen, aBlue); return aBlue; } /// ///Update current viewer /// void UpdateCurrentViewer(void) { if (!myAISContext().IsNull()) { myAISContext()->UpdateCurrentViewer(); } } /// ///Front side /// void FrontView(void) { if (!myView().IsNull()) { myView()->SetProj(V3d_Yneg); } } /// ///Top side /// void TopView(void) { if (!myView().IsNull()) { myView()->SetProj(V3d_Zpos); } } /// ///Left side /// void LeftView(void) { if (!myView().IsNull()) { myView()->SetProj(V3d_Xneg); } } /// ///Back side /// void BackView(void) { if (!myView().IsNull()) { myView()->SetProj(V3d_Ypos); } } /// ///Right side /// void RightView(void) { if (!myView().IsNull()) { myView()->SetProj(V3d_Xpos); } } /// ///Bottom side /// void BottomView(void) { if (!myView().IsNull()) { myView()->SetProj(V3d_Zneg); } } /// ///Axo side /// void AxoView(void) { if (!myView().IsNull()) { myView()->SetProj(V3d_XposYnegZpos); } } /// ///Scale /// float Scale(void) { if (myView().IsNull()) { return -1; } else { return (float)myView()->Scale(); } } /// ///Zoom in all view /// void ZoomAllView(void) { if (!myView().IsNull()) { myView()->FitAll(); myView()->ZFitAll(); } } /// ///Reset view /// void Reset(void) { if (!myView().IsNull()) { myView()->Reset(); } } /// ///Set display mode of objects /// /// Set current mode void SetDisplayMode(int theMode) { if (myAISContext().IsNull()) { return; } AIS_DisplayMode aCurrentMode; if (theMode == 0) { aCurrentMode=AIS_WireFrame; } else { aCurrentMode=AIS_Shaded; } if(myAISContext()->NbSelected()==0) { myAISContext()->SetDisplayMode (aCurrentMode, Standard_False); } else { for(myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected()) { myAISContext()->SetDisplayMode (myAISContext()->SelectedInteractive(), theMode, Standard_False); } } myAISContext()->UpdateCurrentViewer(); } /// ///Set color /// void SetColor(int theR, int theG, int theB) { if (myAISContext().IsNull()) { return; } Quantity_Color aCol = Quantity_Color(theR/255.,theG/255.,theB/255.,Quantity_TOC_RGB); for (; myAISContext()->MoreSelected(); myAISContext()->NextSelected()) { myAISContext()->SetColor (myAISContext()->SelectedInteractive(), aCol, Standard_False); } myAISContext()->UpdateCurrentViewer(); } /// ///Get object color red /// int GetObjColR(void) { int aRed, aGreen, aBlue; ObjectColor(aRed, aGreen, aBlue); return aRed; } /// ///Get object color green /// int GetObjColG(void) { int aRed, aGreen, aBlue; ObjectColor(aRed, aGreen, aBlue); return aGreen; } /// ///Get object color R/G/B /// void ObjectColor(int& theRed, int& theGreen, int& theBlue) { if (myAISContext().IsNull()) { return; } theRed=255; theGreen=255; theBlue=255; Handle(AIS_InteractiveObject) aCurrent ; myAISContext()->InitSelected(); if (!myAISContext()->MoreSelected()) { return; } aCurrent = myAISContext()->SelectedInteractive(); if ( aCurrent->HasColor () ) { Quantity_Color anObjCol; myAISContext()->Color (aCurrent, anObjCol); Quantity_Parameter r1, r2, r3; anObjCol.Values(r1, r2, r3, Quantity_TOC_RGB); theRed=(int)r1*255; theGreen=(int)r2*255; theBlue=(int)r3*255; } } /// ///Get object color blue /// int GetObjColB(void) { int aRed, aGreen, aBlue; ObjectColor(aRed, aGreen, aBlue); return aBlue; } /// ///Set background color R/G/B /// void SetBackgroundColor(int theRed, int theGreen, int theBlue) { if (!myView().IsNull()) { myView()->SetBackgroundColor(Quantity_TOC_RGB, theRed/255.,theGreen/255.,theBlue/255.); } } /// ///Erase objects /// void EraseObjects(void) { if (myAISContext().IsNull()) { return; } myAISContext()->EraseSelected (Standard_False); myAISContext()->ClearSelected (Standard_True); } /// ///Get version /// float GetOCCVersion(void) { return (float)OCC_VERSION; } /// ///set material /// void SetMaterial(int theMaterial) { if (myAISContext().IsNull()) { return; } for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected()) { myAISContext()->SetMaterial (myAISContext()->SelectedInteractive(), (Graphic3d_NameOfMaterial)theMaterial, Standard_False); } myAISContext()->UpdateCurrentViewer(); } /// ///set transparency /// void SetTransparency(int theTrans) { if (myAISContext().IsNull()) { return; } for( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() ) { myAISContext()->SetTransparency (myAISContext()->SelectedInteractive(), ((Standard_Real)theTrans) / 10.0, Standard_False); } myAISContext()->UpdateCurrentViewer(); } /// ///Return true if object is selected /// bool IsObjectSelected(void) { if (myAISContext().IsNull()) { return false; } myAISContext()->InitSelected(); return myAISContext()->MoreSelected() != Standard_False; } /// ///Return display mode /// int DisplayMode(void) { if (myAISContext().IsNull()) { return -1; } int aMode = -1; bool OneOrMoreInShading = false; bool OneOrMoreInWireframe = false; for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected()) { if ( myAISContext()->IsDisplayed( myAISContext()->SelectedInteractive(), 1 ) ) { OneOrMoreInShading = true; } if ( myAISContext()->IsDisplayed( myAISContext()->SelectedInteractive(), 0 ) ) { OneOrMoreInWireframe = true; } } if (OneOrMoreInShading && OneOrMoreInWireframe) { aMode=10; } else if(OneOrMoreInShading) { aMode=1; } else if (OneOrMoreInWireframe) { aMode=0; } return aMode; } /// ///Create new view /// /// System.IntPtr that contains the window handle (HWND) of the control void CreateNewView(System::IntPtr theWnd) { if (myAISContext().IsNull()) { return; } myView() = myAISContext()->CurrentViewer()->CreateView(); if (myGraphicDriver().IsNull()) { myGraphicDriver() = new OpenGl_GraphicDriver (Handle(Aspect_DisplayConnection)()); } Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast (theWnd.ToPointer())); myView()->SetWindow(aWNTWindow); Standard_Integer w=100, h=100; aWNTWindow->Size(w,h); if (!aWNTWindow->IsMapped()) { aWNTWindow->Map(); } } /// ///Set AISContext /// bool SetAISContext(OCCTProxy^ theViewer) { this->myAISContext() = theViewer->GetContext(); if (myAISContext().IsNull()) { return false; } return true; } /// ///Get AISContext /// Handle(AIS_InteractiveContext) GetContext(void) { return myAISContext(); } public: // ============================================ // Import / export functionality // ============================================ /// ///Import BRep file /// /// Name of import file bool ImportBrep(System::String^ theFileName) { bool isResult = false; int aLength = theFileName->Length; char* aFilename = new char[aLength+1]; for(int i = 0; iToCharArray()[i]; } aFilename[aLength] = '\0'; isResult = ImportBrep(aFilename); return isResult; } /// ///Import BRep file /// /// Name of import file bool ImportBrep(char* theFileName) { Standard_CString aFileName = (Standard_CString) theFileName; TopoDS_Shape aShape; BRep_Builder aBuilder; Standard_Boolean isResult = BRepTools::Read(aShape,aFileName,aBuilder); if (!isResult) { return false; } myAISContext()->Display (new AIS_Shape (aShape), Standard_True); return true; } /// ///Import Step file /// /// Name of import file bool ImportStep(char* theFileName) { Standard_CString aFileName = (Standard_CString) theFileName; STEPControl_Reader aReader; IFSelect_ReturnStatus aStatus = aReader.ReadFile(aFileName); if ( aStatus == IFSelect_RetDone ) { bool isFailsonly = false; aReader.PrintCheckLoad( isFailsonly, IFSelect_ItemsByEntity ); int aNbRoot = aReader.NbRootsForTransfer(); aReader.PrintCheckTransfer( isFailsonly, IFSelect_ItemsByEntity ); for ( Standard_Integer n = 1; n <= aNbRoot; n++ ) { Standard_Boolean ok = aReader.TransferRoot( n ); int aNbShap = aReader.NbShapes(); if ( aNbShap > 0 ) { for ( int i = 1; i <= aNbShap; i++ ) { TopoDS_Shape aShape = aReader.Shape( i ); myAISContext()->Display (new AIS_Shape (aShape), Standard_False); } myAISContext()->UpdateCurrentViewer(); } } } else { return false; } return true; } /// ///Import Iges file /// /// Name of import file bool ImportIges(char* theFileName) { Standard_CString aFileName = (Standard_CString) theFileName; IGESControl_Reader aReader; int aStatus = aReader.ReadFile( aFileName ); if ( aStatus == IFSelect_RetDone ) { aReader.TransferRoots(); TopoDS_Shape aShape = aReader.OneShape(); myAISContext()->Display (new AIS_Shape (aShape), Standard_False); } else { return false; } myAISContext()->UpdateCurrentViewer(); return true; } /// ///Export BRep file /// /// Name of export file bool ExportBRep(char* theFileName) { myAISContext()->InitSelected(); if (!myAISContext()->MoreSelected()) { return false; } Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive(); Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast(anIO); return BRepTools::Write (anIS->Shape(), (Standard_CString)theFileName) != Standard_False; } /// ///Export Step file /// /// Name of export file bool ExportStep(char* theFileName) { STEPControl_StepModelType aType = STEPControl_AsIs; IFSelect_ReturnStatus aStatus; STEPControl_Writer aWriter; for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() ) { Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive(); Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO); TopoDS_Shape aShape = anIS->Shape(); aStatus = aWriter.Transfer( aShape , aType ); if ( aStatus != IFSelect_RetDone ) { return false; } } aStatus = aWriter.Write( (Standard_CString)theFileName ); if ( aStatus != IFSelect_RetDone ) { return false; } return true; } /// ///Export Iges file /// /// Name of export file bool ExportIges(char* theFileName) { IGESControl_Controller::Init(); IGESControl_Writer aWriter( Interface_Static::CVal( "XSTEP.iges.unit" ), Interface_Static::IVal( "XSTEP.iges.writebrep.mode" ) ); for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() ) { Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive(); Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO); TopoDS_Shape aShape = anIS->Shape(); aWriter.AddShape ( aShape ); } aWriter.ComputeModel(); return aWriter.Write( (Standard_CString)theFileName) != Standard_False; } /// ///Export Vrml file /// /// Name of export file bool ExportVrml(char* theFileName) { TopoDS_Compound aRes; BRep_Builder aBuilder; aBuilder.MakeCompound( aRes ); for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() ) { Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive(); Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO); TopoDS_Shape aShape = anIS->Shape(); if ( aShape.IsNull() ) { return false; } aBuilder.Add( aRes, aShape ); } VrmlAPI_Writer aWriter; aWriter.Write( aRes, (Standard_CString)theFileName ); return true; } /// ///Export Stl file /// /// Name of export file bool ExportStl(char* theFileName) { TopoDS_Compound aComp; BRep_Builder aBuilder; aBuilder.MakeCompound( aComp ); for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() ) { Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive(); Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO); TopoDS_Shape aShape = anIS->Shape(); if ( aShape.IsNull() ) { return false; } aBuilder.Add( aComp, aShape ); } StlAPI_Writer aWriter; aWriter.Write( aComp, (Standard_CString)theFileName ); return true; } /// ///Define which Import/Export function must be called /// /// Name of Import/Export file /// Determines format of Import/Export file /// Determines is Import or not bool TranslateModel(System::String^ theFileName, int theFormat, bool theIsImport) { bool isResult; int aLength = theFileName->Length; char* aFilename = new char[aLength+1]; for(int i = 0; iToCharArray()[i]; } aFilename[aLength] = '\0'; if (theIsImport) { switch(theFormat) { case 0: isResult = ImportBrep(aFilename); break; case 1: isResult = ImportStep(aFilename); break; case 2: isResult = ImportIges(aFilename); break; default: isResult = false; } } else { switch(theFormat) { case 0: isResult = ExportBRep(aFilename); break; case 1: isResult = ExportStep(aFilename); break; case 2: isResult = ExportIges(aFilename); break; case 3: isResult = ExportVrml(aFilename); break; case 4: isResult = ExportStl(aFilename); break; case 5: isResult = Dump(aFilename); break; default: isResult = false; } } return isResult; } /// ///Initialize OCCTProxy /// void InitOCCTProxy(void) { myGraphicDriver()=NULL; myViewer()=NULL; myView()=NULL; myAISContext()=NULL; } private: // fields NCollection_Haft myViewer; NCollection_Haft myView; NCollection_Haft myAISContext; NCollection_Haft myGraphicDriver; };