- Added new static methods Read and Write in BinTools class to store/retrieve a shape in binary format.
- Added new draw commands "binsave" and "binrestore"
- Updated documantation with description of the new BinTools class methods and corresponding BRepTools class methods.
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@subsection occt_modat_5_6 Storage of shapes
+**BRepTools** and **BinTools** packages contain methods *Read* and *Write* allowing to read and write a Shape to/from a stream or a file.
+The methods provided by **BRepTools** package use ASCII storage format; **BinTools** package use binary format.
+Each of these methods has two arguments:
+- a *TopoDS_Shape* object to be read/written;
+- a stream object or a file name to read from/write to.
+
+The following sample code reads a shape from ASCII file and writes it to a binary one:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
+ TopoDS_Shape aShape;
+ if (BRepTools::Read (aShape, "source_file.txt")) {
+ BinTools::Write (aShape, "result_file.bin");
+ }
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TopLoc,
BRep,
BRepTools,
- TopTools
+ TopTools,
+ TopoDS
is
class ShapeSet;
GetExtChar (IS : out IStream from Standard; theValue : out ExtCharacter from Standard) returns IStream;
---C++: return &
+ Write (theShape : Shape from TopoDS; theStream : out OStream from Standard);
+ ---Purpose: Writes <theShape> on <theStream> in binary format.
+
+ Read (theShape : out Shape from TopoDS; theStream : out IStream from Standard);
+ ---Purpose: Reads a shape from <theStream> and returns it in <theShape>.
+
+ Write (theShape : Shape from TopoDS; theFile : CString from Standard) returns Boolean from Standard;
+ ---Purpose: Writes <theShape> in <theFile>.
+
+ Read (theShape : out Shape from TopoDS; theFile : CString from Standard) returns Boolean from Standard;
+ ---Purpose: Reads a shape from <theFile> and returns it in <theShape>.
+
end BinTools;
// commercial license or contractual agreement.
#include <BinTools.ixx>
+#include <BinTools_ShapeSet.hxx>
#include <FSD_FileHeader.hxx>
+#include <OSD_OpenFile.hxx>
#include <Storage_StreamTypeMismatchError.hxx>
+#include <BinTools_ShapeSet.hxx>
+#include <OSD_OpenFile.hxx>
//=======================================================================
//function : PutBool
aValue = (Standard_Boolean)IS.get();
return IS;
}
+
+//=======================================================================
+//function : Write
+//purpose :
+//=======================================================================
+
+void BinTools::Write (const TopoDS_Shape& theShape, Standard_OStream& theStream)
+{
+ BinTools_ShapeSet aShapeSet(Standard_True);
+ aShapeSet.SetFormatNb (3);
+ aShapeSet.Add (theShape);
+ aShapeSet.Write (theStream);
+ aShapeSet.Write (theShape, theStream);
+}
+
+//=======================================================================
+//function : Read
+//purpose :
+//=======================================================================
+
+void BinTools::Read (TopoDS_Shape& theShape, Standard_IStream& theStream)
+{
+ BinTools_ShapeSet aShapeSet(Standard_True);
+ aShapeSet.Read (theStream);
+ aShapeSet.Read (theShape, theStream, aShapeSet.NbShapes());
+}
+
+//=======================================================================
+//function : Write
+//purpose :
+//=======================================================================
+
+Standard_Boolean BinTools::Write (const TopoDS_Shape& theShape, const Standard_CString theFile)
+{
+ ofstream aStream;
+ aStream.precision (15);
+ OSD_OpenStream (aStream, theFile, ios::out | ios::binary);
+ if (!aStream.good())
+ return Standard_False;
+
+ Write (theShape, aStream);
+ aStream.close();
+ return aStream.good();
+}
+
+//=======================================================================
+//function : Read
+//purpose :
+//=======================================================================
+
+Standard_Boolean BinTools::Read (TopoDS_Shape& theShape, const Standard_CString theFile)
+{
+ filebuf aBuf;
+ OSD_OpenFileBuf (aBuf, theFile, ios::in | ios::binary);
+ if (!aBuf.is_open())
+ return Standard_False;
+
+ Standard_IStream aStream (&aBuf);
+ Read (theShape, aStream);
+ return aStream.good();
+}
#include <BRepGProp.hxx>
#include <TColStd_Array1OfReal.hxx>
#include <Draw_ProgressIndicator.hxx>
+#include <BinTools.hxx>
// memory management
#include <Standard.hxx>
return 0;
}
+//=======================================================================
+// binsave
+//=======================================================================
+static Standard_Integer binsave(Draw_Interpretor& di, Standard_Integer n, const char** a)
+{
+ if (n <= 2) return 1;
+
+ TopoDS_Shape aShape = DBRep::Get (a[1]);
+ if (aShape.IsNull())
+ {
+ di << a[1] << " is not a shape";
+ return 1;
+ }
+
+ if (!BinTools::Write (aShape, a[2]))
+ {
+ di << "Cannot write to the file " << a[2];
+ return 1;
+ }
+
+ di << a[1];
+ return 0;
+}
+
+//=======================================================================
+// binrestore
+//=======================================================================
+static Standard_Integer binrestore(Draw_Interpretor& di, Standard_Integer n, const char** a)
+{
+ if (n <= 2) return 1;
+
+ TopoDS_Shape aShape;
+ if (!BinTools::Read (aShape, a[1]))
+ {
+ di << "Cannot read from the file " << a[1];
+ return 1;
+ }
+
+ DBRep::Set (a[2], aShape);
+ di << a[2];
+ return 0;
+}
+
//=======================================================================
//function : BasicCommands
//purpose :
// Add command for DRAW-specific ProgressIndicator
theCommands.Add ( "XProgress","XProgress [+|-t] [+|-g]: switch on/off textual and graphical mode of Progress Indicator",XProgress,"DE: General");
+
+ theCommands.Add("binsave", "binsave shape filename\n"
+ "\t\tsave the shape in the binary format file",
+ __FILE__, binsave, g);
+ theCommands.Add("binrestore", "binrestore filename shape\n"
+ "\t\trestore the shape from the binary format file",
+ __FILE__, binrestore, g);
}
//=======================================================================