#include // include required OCCT headers #include #include //for OCC graphic #include #include #include #include #include #include //for object display #include #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, "TKD3dHost.lib") #pragma comment(lib, "TKIGES.lib") #pragma comment(lib, "TKSTEP.lib") #pragma comment(lib, "TKStl.lib") #pragma comment(lib, "TKVrml.lib") #pragma comment(lib, "D3D9.lib") /// /// Proxy class encapsulating calls to OCCT C++ classes within /// C++/CLI class visible from .Net (CSharp) /// public ref class OCCTProxyD3D { public: OCCTProxyD3D() {} // ============================================ // Viewer functionality // ============================================ /// ///Initialize a viewer /// /// System.IntPtr that contains the window handle (HWND) of the control bool InitViewer() { myGraphicDriver() = new D3DHost_GraphicDriver(); myGraphicDriver()->ChangeOptions().buffersNoSwap = true; //myGraphicDriver()->ChangeOptions().contextDebug = true; TCollection_ExtendedString a3DName ("Visu3D"); myViewer() = new V3d_Viewer (myGraphicDriver(), a3DName.ToExtString(), "", 1000.0, V3d_XposYnegZpos, Quantity_NOC_GRAY30, V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT, Standard_True, Standard_False); myViewer()->SetDefaultLights(); myViewer()->SetLightOn(); myView() = myViewer()->CreateView(); static Handle(WNT_WClass) aWClass = new WNT_WClass ("OCC_Viewer", NULL, CS_OWNDC); Handle(WNT_Window) aWNTWindow = new WNT_Window ("OCC_Viewer", aWClass, WS_POPUP, 64, 64, 64, 64); aWNTWindow->SetVirtual (Standard_True); myView()->SetWindow(aWNTWindow); myAISContext() = new AIS_InteractiveContext (myViewer()); myAISContext()->UpdateCurrentViewer(); myView()->MustBeResized(); return true; } /// Resizes custom FBO for Direct3D output. System::IntPtr ResizeBridgeFBO (int theWinSizeX, int theWinSizeY) { Handle(WNT_Window) aWNTWindow = Handle(WNT_Window)::DownCast (myView()->Window()); aWNTWindow->SetPos (0, 0, theWinSizeX, theWinSizeY); myView()->MustBeResized(); myView()->Invalidate(); return System::IntPtr(myGraphicDriver()->D3dColorSurface (myView()->View())); } /// /// Make dump of current view to file /// /// Name of dump file bool Dump (const char* theFileName) { if (myView().IsNull()) { return false; } myView()->Redraw(); return myView()->Dump (theFileName) != Standard_False; } /// ///Redraw view /// void RedrawView() { if (!myView().IsNull()) { myView()->Redraw(); } } /// ///Update view /// void UpdateView(void) { if (!myView().IsNull()) { myView()->MustBeResized(); } } /// ///Set computed mode in false /// void SetDegenerateModeOn() { if (!myView().IsNull()) { myView()->SetComputedMode (Standard_False); } } /// ///Set computed mode in true /// void SetDegenerateModeOff() { 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()); } } /// ///Select by click /// void Select() { if (!myAISContext().IsNull()) { myAISContext()->Select(); } } /// ///Move view /// void MoveTo (int theX, int theY) { if (!myAISContext().IsNull() && !myView().IsNull()) { myAISContext()->MoveTo (theX, theY, myView()); } } /// ///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()); } } /// ///Select by "Shift" key /// void ShiftSelect() { if (!myAISContext().IsNull()) { myAISContext()->ShiftSelect(); } } /// ///Set background color /// void BackgroundColor (int& theRed, int& theGreen, int& theBlue) { if (!myView().IsNull()) { Quantity_Color aColor = myView()->BackgroundColor(); theRed = (int )aColor.Red() * 255; theGreen = (int )aColor.Green() * 255; theBlue = (int )aColor.Blue() * 255; } } /// ///Get background color Red /// int GetBGColR() { int anRgb[3]; BackgroundColor (anRgb[0], anRgb[1], anRgb[2]); return anRgb[0]; } /// ///Get background color Green /// int GetBGColG() { int anRgb[3]; BackgroundColor (anRgb[0], anRgb[1], anRgb[2]); return anRgb[1]; } /// ///Get background color Blue /// int GetBGColB() { int anRgb[3]; BackgroundColor (anRgb[0], anRgb[1], anRgb[2]); return anRgb[2]; } /// ///Update current viewer /// void UpdateCurrentViewer() { if (!myAISContext().IsNull()) { myAISContext()->UpdateCurrentViewer(); } } /// ///Front side /// void FrontView() { if (!myView().IsNull()) { myView()->SetProj (V3d_Xpos); } } /// ///Top side /// void TopView() { if (!myView().IsNull()) { myView()->SetProj (V3d_Zpos); } } /// ///Left side /// void LeftView() { if (!myView().IsNull()) { myView()->SetProj (V3d_Ypos); } } /// ///Back side /// void BackView() { if (!myView().IsNull()) { myView()->SetProj (V3d_Xneg); } } /// ///Right side /// void RightView() { if (!myView().IsNull()) { myView()->SetProj (V3d_Yneg); } } /// ///Bottom side /// void BottomView() { if (!myView().IsNull()) { myView()->SetProj (V3d_Zneg); } } /// ///Axo side /// void AxoView() { if (!myView().IsNull()) { myView()->SetProj (V3d_XposYnegZpos); } } /// ///Scale /// float Scale() { return myView().IsNull() ? -1.0f : float(myView()->Scale()); } /// ///Zoom in all view /// void ZoomAllView() { if (!myView().IsNull()) { myView()->FitAll(); myView()->ZFitAll(); } } /// ///Reset view /// void Reset() { if (!myView().IsNull()) { myView()->Reset(); } } /// ///Set display mode of objects /// /// Set current mode void SetDisplayMode (int theMode) { if (myAISContext().IsNull()) { return; } AIS_DisplayMode aCurrentMode = theMode == 0 ? AIS_WireFrame : AIS_Shaded; if (myAISContext()->NbCurrents() == 0 || myAISContext()->NbSelected() == 0) { myAISContext()->SetDisplayMode (aCurrentMode); } else { for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { myAISContext()->SetDisplayMode (myAISContext()->Current(), theMode, Standard_False); } } myAISContext()->UpdateCurrentViewer(); } /// ///Set color /// void SetColor (int theR, int theG, int theB) { if (myAISContext().IsNull()) { return; } Quantity_Color aCol (theR / 255.0, theG / 255.0, theB / 255.0, Quantity_TOC_RGB); for (; myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { myAISContext()->SetColor (myAISContext()->Current(), aCol.Name()); } } /// ///Get object color red /// int GetObjColR() { int anRgb[3]; ObjectColor (anRgb[0], anRgb[1], anRgb[2]); return anRgb[0]; } /// ///Get object color green /// int GetObjColG() { int anRgb[3]; ObjectColor (anRgb[0], anRgb[1], anRgb[2]); return anRgb[1]; } /// ///Get object color blue /// int GetObjColB() { int anRgb[3]; ObjectColor (anRgb[0], anRgb[1], anRgb[2]); return anRgb[2]; } /// ///Get object color R/G/B /// void ObjectColor (int& theRed, int& theGreen, int& theBlue) { if (myAISContext().IsNull()) { return; } theRed = 255; theGreen = 255; theBlue = 255; myAISContext()->InitCurrent(); if (!myAISContext()->MoreCurrent()) { return; } Handle(AIS_InteractiveObject) aCurrent = myAISContext()->Current(); if (aCurrent->HasColor()) { Quantity_Color anObjCol = myAISContext()->Color (myAISContext()->Current()); theRed = int(anObjCol.Red() * 255.0); theGreen = int(anObjCol.Green() * 255.0); theBlue = int(anObjCol.Blue() * 255.0); } } /// ///Set background color R/G/B /// void SetBackgroundColor (int theRed, int theGreen, int theBlue) { if (!myView().IsNull()) { myView()->SetBackgroundColor (Quantity_TOC_RGB, theRed / 255.0, theGreen / 255.0, theBlue / 255.0); } } /// ///Erase objects /// void EraseObjects() { if (myAISContext().IsNull()) { return; } for(myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { myAISContext()->Erase (myAISContext()->Current(), Standard_True); } myAISContext()->ClearCurrents(); } /// ///Get version /// float GetOCCVersion() { return (float )OCC_VERSION; } /// ///set material /// void SetMaterial (int theMaterial) { if (myAISContext().IsNull()) { return; } for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { myAISContext()->SetMaterial (myAISContext()->Current(), (Graphic3d_NameOfMaterial )theMaterial); } myAISContext()->UpdateCurrentViewer(); } /// ///set transparency /// void SetTransparency (int theTrans) { if (myAISContext().IsNull()) { return; } for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextSelected()) { myAISContext()->SetTransparency (myAISContext()->Current(), ((Standard_Real )theTrans) / 10.0); } } /// ///Return true if object is selected /// bool IsObjectSelected() { if (myAISContext().IsNull()) { return false; } myAISContext()->InitCurrent(); return myAISContext()->MoreCurrent() != Standard_False; } /// ///Return display mode /// int DisplayMode() { if (myAISContext().IsNull()) { return -1; } bool isOneOrMoreInShading = false; bool isOneOrMoreInWireframe = false; for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { if (myAISContext()->IsDisplayed (myAISContext()->Current(), AIS_Shaded)) { isOneOrMoreInShading = true; } if (myAISContext()->IsDisplayed (myAISContext()->Current(), AIS_WireFrame)) { isOneOrMoreInWireframe = true; } } if (isOneOrMoreInShading && isOneOrMoreInWireframe) { return 10; } else if (isOneOrMoreInShading) { return 1; } else if (isOneOrMoreInWireframe) { return 0; } return -1; } /// ///Set AISContext /// bool SetAISContext (OCCTProxyD3D^ theViewer) { this->myAISContext() = theViewer->GetContext(); if (myAISContext().IsNull()) { return false; } return true; } /// ///Get AISContext /// Handle_AIS_InteractiveContext GetContext() { 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; i < aLength; ++i) { aFilename[i] = (char )theFileName->ToCharArray()[i]; } aFilename[aLength] = '\0'; isResult = ImportBrep (aFilename); delete[] aFilename; return isResult; } /// ///Import BRep file /// /// Name of import file bool ImportBrep (char* theFileName) { TopoDS_Shape aShape; BRep_Builder aBuilder; if (!BRepTools::Read (aShape, theFileName, aBuilder)) { return false; } if (myAISContext()->HasOpenedContext()) { myAISContext()->CloseLocalContext(); } Handle(AIS_Shape) aPrs = new AIS_Shape (aShape); myAISContext()->SetMaterial (aPrs, Graphic3d_NOM_GOLD); myAISContext()->SetDisplayMode(aPrs, AIS_Shaded, Standard_False); myAISContext()->Display (aPrs); return true; } /// ///Import Step file /// /// Name of import file bool ImportStep (char* theFileName) { STEPControl_Reader aReader; if (aReader.ReadFile (theFileName) != IFSelect_RetDone) { return false; } bool isFailsonly = false; aReader.PrintCheckLoad( isFailsonly, IFSelect_ItemsByEntity ); int aNbRoot = aReader.NbRootsForTransfer(); aReader.PrintCheckTransfer (isFailsonly, IFSelect_ItemsByEntity); for (Standard_Integer aRootIter = 1; aRootIter <= aNbRoot; ++aRootIter) { aReader.TransferRoot (aRootIter); int aNbShap = aReader.NbShapes(); if (aNbShap > 0) { for (int aShapeIter = 1; aShapeIter <= aNbShap; ++aShapeIter) { myAISContext()->Display (new AIS_Shape (aReader.Shape (aShapeIter)), Standard_True); } } } return true; } /// ///Import Iges file /// /// Name of import file bool ImportIges (char* theFileName) { IGESControl_Reader aReader; if (aReader.ReadFile (theFileName) != IFSelect_RetDone) { return false; } aReader.TransferRoots(); TopoDS_Shape aShape = aReader.OneShape(); myAISContext()->Display (new AIS_Shape (aShape), Standard_False); myAISContext()->UpdateCurrentViewer(); return true; } /// ///Export BRep file /// /// Name of export file bool ExportBRep (char* theFileName) { myAISContext()->InitCurrent(); if (!myAISContext()->MoreCurrent()) { return false; } Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); return !anIS.IsNull() && BRepTools::Write (anIS->Shape(), theFileName); } /// ///Export Step file /// /// Name of export file bool ExportStep (char* theFileName) { STEPControl_StepModelType aType = STEPControl_AsIs; STEPControl_Writer aWriter; for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); if (anIS.IsNull()) { return false; } TopoDS_Shape aShape = anIS->Shape(); if (aWriter.Transfer (aShape, aType) != IFSelect_RetDone) { return false; } } return aWriter.Write (theFileName) == IFSelect_RetDone; } /// ///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()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); if (anIS.IsNull()) { return false; } aWriter.AddShape (anIS->Shape()); } aWriter.ComputeModel(); return aWriter.Write (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()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); if (anIS.IsNull()) { return false; } aBuilder.Add (aRes, anIS->Shape()); } VrmlAPI_Writer aWriter; aWriter.Write (aRes, 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()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) { Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); if (anIS.IsNull()) { return false; } aBuilder.Add (aComp, anIS->Shape()); } StlAPI_Writer aWriter; aWriter.Write (aComp, 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 = false; int aLength = theFileName->Length; char* aFilename = new char[aLength + 1]; for (int aCharIter = 0; aCharIter < aLength; ++aCharIter) { aFilename[aCharIter] = (char)theFileName->ToCharArray()[aCharIter]; } 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; } } 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; } } delete[] aFilename; return isResult; } /// ///Initialize OCCTProxyD3D /// void InitOCCTProxy() { myGraphicDriver().Nullify(); myViewer().Nullify(); myView().Nullify(); myAISContext().Nullify(); } private: NCollection_Haft myViewer; NCollection_Haft myView; NCollection_Haft myAISContext; NCollection_Haft myGraphicDriver; };