mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-04 18:06:22 +03:00
Overall revision of of CSharp sample code: - Pure C++ project "OCC" deleted as unnecessary - C++/CLI project "shell" renamed to OCCTProxy and refactored to implement all required interface to OCCT functionality. - In About dialog, date corrected in Copyright statement - CSharp files re-layouted with 2 spaces indentation - ReadMe converted to MarkDown format and revised - Generation of names of views refactored to avoid calling C++ level - Project files corrected to run on 64-bit systems - Batch scripts refactored to use OCCT default configuration WPF front-end added to demonstrate usage of OCCT in WPF applications. WPF sample was modified, operation Export has been fixed Exception "Cannot create this file", which appeared by export to image format, has been corrected. Option "Export image to .xwd" removed.
1101 lines
25 KiB
C++
1101 lines
25 KiB
C++
// include required OCCT headers
|
|
#include <Standard_Version.hxx>
|
|
#include <Message_ProgressIndicator.hxx>
|
|
//for OCC graphic
|
|
#include <Aspect_DisplayConnection.hxx>
|
|
#include <WNT_Window.hxx>
|
|
#include <Graphic3d.hxx>
|
|
#include <Graphic3d_GraphicDRiver.hxx>
|
|
//for object display
|
|
#include <V3d_Viewer.hxx>
|
|
#include <V3d_View.hxx>
|
|
#include <AIS_InteractiveContext.hxx>
|
|
#include <AIS_Shape.hxx>
|
|
//topology
|
|
#include <TopoDS_Shape.hxx>
|
|
#include <TopoDS_Compound.hxx>
|
|
//brep tools
|
|
#include <BRep_Builder.hxx>
|
|
#include <BRepTools.hxx>
|
|
#include <MgtBRep.hxx>
|
|
#include <PTColStd_PersistentTransientMap.hxx>
|
|
//csfdb I/E
|
|
#include <FSD_File.hxx>
|
|
#include <ShapeSchema.hxx>
|
|
#include <Storage_Data.hxx>
|
|
#include <Storage_HSeqOfRoot.hxx>
|
|
#include <Storage_Root.hxx>
|
|
// iges I/E
|
|
#include <IGESControl_Reader.hxx>
|
|
#include <IGESControl_Controller.hxx>
|
|
#include <IGESControl_Writer.hxx>
|
|
#include <IFSelect_ReturnStatus.hxx>
|
|
#include <Interface_Static.hxx>
|
|
//step I/E
|
|
#include <STEPControl_Reader.hxx>
|
|
#include <STEPControl_Writer.hxx>
|
|
//for stl export
|
|
#include <StlAPI_Writer.hxx>
|
|
//for vrml export
|
|
#include <VrmlAPI_Writer.hxx>
|
|
//wrapper of pure C++ classes to ref classes
|
|
#include <NCollection_Haft.h>
|
|
|
|
// list of required OCCT libraries
|
|
#pragma comment(lib, "TKernel.lib")
|
|
#pragma comment(lib, "TKMath.lib")
|
|
#pragma comment(lib, "TKBRep.lib")
|
|
#pragma comment(lib, "PTKernel.lib")
|
|
#pragma comment(lib, "TKPShape.lib")
|
|
#pragma comment(lib, "TKShapeSchema.lib")
|
|
#pragma comment(lib, "TKXSBase.lib")
|
|
#pragma comment(lib, "TKService.lib")
|
|
#pragma comment(lib, "TKV3d.lib")
|
|
#pragma comment(lib, "TKIGES.lib")
|
|
#pragma comment(lib, "TKSTEP.lib")
|
|
#pragma comment(lib, "TKStl.lib")
|
|
#pragma comment(lib, "TKVrml.lib")
|
|
|
|
/// <summary>
|
|
/// Proxy class encapsulating calls to OCCT C++ classes within
|
|
/// C++/CLI class visible from .Net (CSharp)
|
|
/// </summary>
|
|
public ref class OCCTProxy
|
|
{
|
|
public:
|
|
// ============================================
|
|
// Viewer functionality
|
|
// ============================================
|
|
|
|
/// <summary>
|
|
///Initialize a viewer
|
|
/// </summary>
|
|
/// <param name="theWnd">System.IntPtr that contains the window handle (HWND) of the control</param>
|
|
bool InitViewer(System::IntPtr theWnd)
|
|
{
|
|
try
|
|
{
|
|
Handle(Aspect_DisplayConnection) aDisplayConnection;
|
|
myGraphicDriver() = Graphic3d::InitGraphicDriver (aDisplayConnection);
|
|
}
|
|
catch (Standard_Failure)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
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()->Init();
|
|
myViewer()->SetDefaultLights();
|
|
myViewer()->SetLightOn();
|
|
myView() = myViewer()->CreateView();
|
|
Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast<HWND> (theWnd.ToPointer()));
|
|
myView()->SetWindow(aWNTWindow);
|
|
if (!aWNTWindow->IsMapped())
|
|
{
|
|
aWNTWindow->Map();
|
|
}
|
|
myAISContext() = new AIS_InteractiveContext( myViewer() );
|
|
myAISContext()->UpdateCurrentViewer();
|
|
myView()->Redraw();
|
|
myView()->MustBeResized();
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Make dump of current view to file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of dump file</param>
|
|
bool Dump(char *theFileName)
|
|
{
|
|
if (myView().IsNull())
|
|
{
|
|
return false;
|
|
}
|
|
myView()->Redraw();
|
|
return myView()->Dump(theFileName) != Standard_False;
|
|
}
|
|
|
|
/// <summary>
|
|
///Redraw view
|
|
/// </summary>
|
|
void RedrawView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->Redraw();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Update view
|
|
/// </summary>
|
|
void UpdateView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->MustBeResized();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Set computed mode in false
|
|
/// </summary>
|
|
void SetDegenerateModeOn(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetComputedMode (Standard_False);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Set computed mode in true
|
|
/// </summary>
|
|
void SetDegenerateModeOff(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetComputedMode (Standard_True);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Fit all
|
|
/// </summary>
|
|
void WindowFitAll(int theXmin, int theYmin, int theXmax, int theYmax)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->WindowFitAll(theXmin, theYmin, theXmax, theYmax);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Current place of window
|
|
/// </summary>
|
|
/// <param name="theZoomFactor">Current zoom</param>
|
|
void Place(int theX, int theY, float theZoomFactor)
|
|
{
|
|
Quantity_Factor aZoomFactor = theZoomFactor;
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->Place(theX, theY, aZoomFactor);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Set Zoom
|
|
/// </summary>
|
|
void Zoom(int theX1, int theY1, int theX2, int theY2)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->Zoom(theX1, theY1, theX2, theY2);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Set Pan
|
|
/// </summary>
|
|
void Pan(int theX, int theY)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->Pan(theX, theY);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Rotation
|
|
/// </summary>
|
|
void Rotation(int theX, int theY)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->Rotation(theX, theY);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Start rotation
|
|
/// </summary>
|
|
void StartRotation(int theX, int theY)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->StartRotation(theX, theY);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Select by rectangle
|
|
/// </summary>
|
|
void Select(int theX1, int theY1, int theX2, int theY2)
|
|
{
|
|
if (!myAISContext().IsNull())
|
|
{
|
|
myAISContext()->Select(theX1, theY1, theX2, theY2, myView());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Select by click
|
|
/// </summary>
|
|
void Select(void)
|
|
{
|
|
if (!myAISContext().IsNull())
|
|
{
|
|
myAISContext()->Select();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Move view
|
|
/// </summary>
|
|
void MoveTo(int theX, int theY)
|
|
{
|
|
if ((!myAISContext().IsNull()) && (!myView().IsNull()))
|
|
{
|
|
myAISContext()->MoveTo(theX, theY, myView());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Select by rectangle with pressed "Shift" key
|
|
/// </summary>
|
|
void ShiftSelect(int theX1, int theY1, int theX2, int theY2)
|
|
{
|
|
if ((!myAISContext().IsNull()) && (!myView().IsNull()))
|
|
{
|
|
myAISContext()->ShiftSelect(theX1, theY1, theX2, theY2, myView());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Select by "Shift" key
|
|
/// </summary>
|
|
void ShiftSelect(void)
|
|
{
|
|
if (!myAISContext().IsNull())
|
|
{
|
|
myAISContext()->ShiftSelect();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Set background color
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
///Get background color Red
|
|
/// </summary>
|
|
int GetBGColR(void)
|
|
{
|
|
int aRed, aGreen, aBlue;
|
|
BackgroundColor(aRed, aGreen, aBlue);
|
|
return aRed;
|
|
}
|
|
|
|
/// <summary>
|
|
///Get background color Green
|
|
/// </summary>
|
|
int GetBGColG(void)
|
|
{
|
|
int aRed, aGreen, aBlue;
|
|
BackgroundColor(aRed, aGreen, aBlue);
|
|
return aGreen;
|
|
}
|
|
|
|
/// <summary>
|
|
///Get background color Blue
|
|
/// </summary>
|
|
int GetBGColB(void)
|
|
{
|
|
int aRed, aGreen, aBlue;
|
|
BackgroundColor(aRed, aGreen, aBlue);
|
|
return aBlue;
|
|
}
|
|
|
|
/// <summary>
|
|
///Update current viewer
|
|
/// </summary>
|
|
void UpdateCurrentViewer(void)
|
|
{
|
|
if (!myAISContext().IsNull())
|
|
{
|
|
myAISContext()->UpdateCurrentViewer();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Front side
|
|
/// </summary>
|
|
void FrontView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetProj(V3d_Xpos);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Top side
|
|
/// </summary>
|
|
void TopView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetProj(V3d_Zpos);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Left side
|
|
/// </summary>
|
|
void LeftView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetProj(V3d_Ypos);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Back side
|
|
/// </summary>
|
|
void BackView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetProj(V3d_Xneg);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Right side
|
|
/// </summary>
|
|
void RightView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetProj(V3d_Yneg);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Bottom side
|
|
/// </summary>
|
|
void BottomView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetProj(V3d_Zneg);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Axo side
|
|
/// </summary>
|
|
void AxoView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetProj(V3d_XposYnegZpos);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Scale
|
|
/// </summary>
|
|
float Scale(void)
|
|
{
|
|
if (myView().IsNull())
|
|
{
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
return (float)myView()->Scale();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Zoom in all view
|
|
/// </summary>
|
|
void ZoomAllView(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->FitAll();
|
|
myView()->ZFitAll();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Reset view
|
|
/// </summary>
|
|
void Reset(void)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->Reset();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Set display mode of objects
|
|
/// </summary>
|
|
/// <param name="theMode">Set current mode</param>
|
|
void SetDisplayMode(int theMode)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return;
|
|
}
|
|
AIS_DisplayMode aCurrentMode;
|
|
if (theMode == 0)
|
|
{
|
|
aCurrentMode=AIS_WireFrame;
|
|
}
|
|
else
|
|
{
|
|
aCurrentMode=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();
|
|
}
|
|
|
|
/// <summary>
|
|
///Set color
|
|
/// </summary>
|
|
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()->MoreCurrent ();myAISContext()->NextCurrent ())
|
|
{
|
|
myAISContext()->SetColor (myAISContext()->Current(),aCol.Name());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Get object color red
|
|
/// </summary>
|
|
int GetObjColR(void)
|
|
{
|
|
int aRed, aGreen, aBlue;
|
|
ObjectColor(aRed, aGreen, aBlue);
|
|
return aRed;
|
|
}
|
|
|
|
/// <summary>
|
|
///Get object color green
|
|
/// </summary>
|
|
int GetObjColG(void)
|
|
{
|
|
int aRed, aGreen, aBlue;
|
|
ObjectColor(aRed, aGreen, aBlue);
|
|
return aGreen;
|
|
}
|
|
|
|
/// <summary>
|
|
///Get object color R/G/B
|
|
/// </summary>
|
|
void ObjectColor(int& theRed, int& theGreen, int& theBlue)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return;
|
|
}
|
|
theRed=255;
|
|
theGreen=255;
|
|
theBlue=255;
|
|
Handle_AIS_InteractiveObject aCurrent ;
|
|
Quantity_Color anObjCol;
|
|
myAISContext()->InitCurrent();
|
|
if (!myAISContext()->MoreCurrent())
|
|
{
|
|
return;
|
|
}
|
|
aCurrent = myAISContext()->Current();
|
|
if ( aCurrent->HasColor () )
|
|
{
|
|
anObjCol = myAISContext()->Color(myAISContext()->Current());
|
|
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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Get object color blue
|
|
/// </summary>
|
|
int GetObjColB(void)
|
|
{
|
|
int aRed, aGreen, aBlue;
|
|
ObjectColor(aRed, aGreen, aBlue);
|
|
return aBlue;
|
|
}
|
|
|
|
/// <summary>
|
|
///Set background color R/G/B
|
|
/// </summary>
|
|
void SetBackgroundColor(int theRed, int theGreen, int theBlue)
|
|
{
|
|
if (!myView().IsNull())
|
|
{
|
|
myView()->SetBackgroundColor(Quantity_TOC_RGB, theRed/255.,theGreen/255.,theBlue/255.);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Erase objects
|
|
/// </summary>
|
|
void EraseObjects(void)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return;
|
|
}
|
|
for(myAISContext()->InitCurrent();myAISContext()->MoreCurrent();myAISContext()->NextCurrent())
|
|
{
|
|
myAISContext()->Erase(myAISContext()->Current(),Standard_True);
|
|
}
|
|
myAISContext()->ClearCurrents();
|
|
}
|
|
|
|
/// <summary>
|
|
///Get version
|
|
/// </summary>
|
|
float GetOCCVersion(void)
|
|
{
|
|
return (float)OCC_VERSION;
|
|
}
|
|
|
|
/// <summary>
|
|
///set material
|
|
/// </summary>
|
|
void SetMaterial(int theMaterial)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return;
|
|
}
|
|
for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent (); myAISContext()->NextCurrent () )
|
|
{
|
|
myAISContext()->SetMaterial( myAISContext()->Current(), (Graphic3d_NameOfMaterial)theMaterial );
|
|
}
|
|
myAISContext()->UpdateCurrentViewer();
|
|
}
|
|
|
|
/// <summary>
|
|
///set transparency
|
|
/// </summary>
|
|
void SetTransparency(int theTrans)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return;
|
|
}
|
|
for( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextSelected() )
|
|
{
|
|
myAISContext()->SetTransparency( myAISContext()->Current(), ((Standard_Real)theTrans) / 10.0 );
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Return true if object is selected
|
|
/// </summary>
|
|
bool IsObjectSelected(void)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return false;
|
|
}
|
|
myAISContext()->InitCurrent();
|
|
return myAISContext()->MoreCurrent() != Standard_False;
|
|
}
|
|
|
|
/// <summary>
|
|
///Return display mode
|
|
/// </summary>
|
|
int DisplayMode(void)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return -1;
|
|
}
|
|
int aMode = -1;
|
|
bool OneOrMoreInShading = false;
|
|
bool OneOrMoreInWireframe = false;
|
|
for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
|
|
{
|
|
if ( myAISContext()->IsDisplayed( myAISContext()->Current(), 1 ) )
|
|
{
|
|
OneOrMoreInShading = true;
|
|
}
|
|
if ( myAISContext()->IsDisplayed( myAISContext()->Current(), 0 ) )
|
|
{
|
|
OneOrMoreInWireframe = true;
|
|
}
|
|
}
|
|
if (OneOrMoreInShading && OneOrMoreInWireframe)
|
|
{
|
|
aMode=10;
|
|
}
|
|
else if(OneOrMoreInShading)
|
|
{
|
|
aMode=1;
|
|
}
|
|
else if (OneOrMoreInWireframe)
|
|
{
|
|
aMode=0;
|
|
}
|
|
|
|
return aMode;
|
|
}
|
|
|
|
/// <summary>
|
|
///Create new view
|
|
/// </summary>
|
|
/// <param name="theWnd">System.IntPtr that contains the window handle (HWND) of the control</param>
|
|
void CreateNewView(System::IntPtr theWnd)
|
|
{
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return;
|
|
}
|
|
myView() = myAISContext()->CurrentViewer()->CreateView();
|
|
if (myGraphicDriver().IsNull())
|
|
{
|
|
Handle(Aspect_DisplayConnection) aDisplayConnection;
|
|
myGraphicDriver() = Graphic3d::InitGraphicDriver (aDisplayConnection);
|
|
}
|
|
Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast<HWND> (theWnd.ToPointer()));
|
|
myView()->SetWindow(aWNTWindow);
|
|
Standard_Integer w=100, h=100;
|
|
aWNTWindow->Size(w,h);
|
|
if (!aWNTWindow->IsMapped())
|
|
{
|
|
aWNTWindow->Map();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///Set AISContext
|
|
/// </summary>
|
|
bool SetAISContext(OCCTProxy^ theViewer)
|
|
{
|
|
this->myAISContext() = theViewer->GetContext();
|
|
if (myAISContext().IsNull())
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
///Get AISContext
|
|
/// </summary>
|
|
Handle_AIS_InteractiveContext GetContext(void)
|
|
{
|
|
return myAISContext();
|
|
}
|
|
|
|
public:
|
|
// ============================================
|
|
// Import / export functionality
|
|
// ============================================
|
|
|
|
/// <summary>
|
|
///Import BRep file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of import file</param>
|
|
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);
|
|
return isResult;
|
|
}
|
|
|
|
/// <summary>
|
|
///Import BRep file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of import file</param>
|
|
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;
|
|
}
|
|
if(myAISContext()->HasOpenedContext())
|
|
{
|
|
myAISContext()->CloseLocalContext();
|
|
}
|
|
myAISContext()->Display(new AIS_Shape(aShape));
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
///Import Csfdb file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of import file</param>
|
|
bool ImportCsfdb(char* theFileName)
|
|
{
|
|
Standard_CString aFileName = (Standard_CString) theFileName;
|
|
if ( FSD_File::IsGoodFileType(aFileName) != Storage_VSOk )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
FSD_File aFileDriver;
|
|
TCollection_AsciiString aName( aFileName );
|
|
if ( aFileDriver.Open( aName, Storage_VSRead ) != Storage_VSOk )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Handle(ShapeSchema) aSchema = new ShapeSchema();
|
|
Handle(Storage_Data) data = aSchema->Read( aFileDriver );
|
|
if ( data->ErrorStatus() != Storage_VSOk )
|
|
{
|
|
return false;
|
|
}
|
|
aFileDriver.Close();
|
|
|
|
Handle(Storage_HSeqOfRoot) aRoots = data->Roots();
|
|
for ( int i = 1; i <= aRoots->Length() ; i++ )
|
|
{
|
|
Handle(Storage_Root) aStorRoot = aRoots->Value( i );
|
|
Handle(Standard_Persistent) aStandPersistent = aStorRoot->Object();
|
|
Handle(PTopoDS_HShape) aPShape = Handle(PTopoDS_HShape)::DownCast(aStandPersistent);
|
|
if ( !aPShape.IsNull() )
|
|
{
|
|
PTColStd_PersistentTransientMap aMap;
|
|
TopoDS_Shape aTShape;
|
|
MgtBRep::Translate( aPShape, aMap, aTShape, MgtBRep_WithTriangle );
|
|
myAISContext()->Display(new AIS_Shape(aTShape));
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
///Import Step file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of import file</param>
|
|
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));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
///Import Iges file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of import file</param>
|
|
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));
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
|
|
myAISContext()->UpdateCurrentViewer();
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
///Export BRep file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of export file</param>
|
|
bool ExportBRep(char* theFileName)
|
|
{
|
|
myAISContext()->InitCurrent();
|
|
if (!myAISContext()->MoreCurrent())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
|
|
Handle_AIS_Shape anIS = Handle_AIS_Shape::DownCast(anIO);
|
|
return BRepTools::Write (anIS->Shape(), (Standard_CString)theFileName) != Standard_False;
|
|
}
|
|
|
|
/// <summary>
|
|
///Export Step file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of export file</param>
|
|
bool ExportStep(char* theFileName)
|
|
{
|
|
STEPControl_StepModelType aType = STEPControl_AsIs;
|
|
IFSelect_ReturnStatus aStatus;
|
|
STEPControl_Writer aWriter;
|
|
for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
|
|
{
|
|
Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
///Export Iges file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of export file</param>
|
|
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_InteractiveObject anIO = myAISContext()->Current();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
///Export Vrml file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of export file</param>
|
|
bool ExportVrml(char* theFileName)
|
|
{
|
|
TopoDS_Compound aRes;
|
|
BRep_Builder aBuilder;
|
|
aBuilder.MakeCompound( aRes );
|
|
|
|
for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
|
|
{
|
|
Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
///Export Stl file
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of export file</param>
|
|
bool ExportStl(char* theFileName)
|
|
{
|
|
TopoDS_Compound aComp;
|
|
BRep_Builder aBuilder;
|
|
aBuilder.MakeCompound( aComp );
|
|
|
|
for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
|
|
{
|
|
Handle_AIS_InteractiveObject anIO = myAISContext()->Current();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
///Define which Import/Export function must be called
|
|
/// </summary>
|
|
/// <param name="theFileName">Name of Import/Export file</param>
|
|
/// <param name="theFormat">Determines format of Import/Export file</param>
|
|
/// <param name="theIsImport">Determines is Import or not</param>
|
|
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; i<aLength; i++)
|
|
{
|
|
aFilename[i] = (char)theFileName->ToCharArray()[i];
|
|
}
|
|
aFilename[aLength] = '\0';
|
|
|
|
if (theIsImport)
|
|
{
|
|
switch(theFormat)
|
|
{
|
|
case 0:
|
|
isResult = ImportBrep(aFilename);
|
|
break;
|
|
case 1:
|
|
isResult = ImportCsfdb(aFilename);
|
|
break;
|
|
case 2:
|
|
isResult = ImportStep(aFilename);
|
|
break;
|
|
case 3:
|
|
isResult = ImportIges(aFilename);
|
|
break;
|
|
default:
|
|
isResult = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch(theFormat)
|
|
{
|
|
case 0:
|
|
isResult = ExportBRep(aFilename);
|
|
break;
|
|
case 2:
|
|
isResult = ExportStep(aFilename);
|
|
break;
|
|
case 3:
|
|
isResult = ExportIges(aFilename);
|
|
break;
|
|
case 4:
|
|
isResult = ExportVrml(aFilename);
|
|
break;
|
|
case 5:
|
|
isResult = ExportStl(aFilename);
|
|
break;
|
|
case 6:
|
|
isResult = Dump(aFilename);
|
|
break;
|
|
default:
|
|
isResult = false;
|
|
}
|
|
}
|
|
return isResult;
|
|
}
|
|
|
|
/// <summary>
|
|
///Initialize OCCTProxy
|
|
/// </summary>
|
|
void InitOCCTProxy(void)
|
|
{
|
|
myGraphicDriver()=NULL;
|
|
myViewer()=NULL;
|
|
myView()=NULL;
|
|
myAISContext()=NULL;
|
|
}
|
|
|
|
private:
|
|
// fields
|
|
NCollection_Haft<Handle_V3d_Viewer> myViewer;
|
|
NCollection_Haft<Handle_V3d_View> myView;
|
|
NCollection_Haft<Handle_AIS_InteractiveContext> myAISContext;
|
|
NCollection_Haft<Handle_Graphic3d_GraphicDriver> myGraphicDriver;
|
|
};
|