- 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"
- Added test cases to test the new methods.
- Updated documantation with desription of the new BinTools class methods and corresponding BRepTools class methods.
ModelingData TKG2d TKG3d TKGeomBase TKBRep
ModelingAlgorithms TKGeomAlgo TKTopAlgo TKPrim TKBO TKBool TKHLR TKFillet TKOffset TKFeat TKMesh TKXMesh TKShHealing
Visualization TKService TKV3d TKOpenGl TKMeshVS TKIVtk TKD3DHost
-ApplicationFramework TKCDF TKLCAF TKCAF TKBinL TKXmlL TKBin TKXml TKStdL TKStd FWOSPlugin TKTObj TKBinTObj TKXmlTObj TKVCAF
+ApplicationFramework TKCDF TKLCAF TKCAF TKBinL TKXmlL TKBin TKXml TKStdL TKStd TKTObj TKBinTObj TKXmlTObj TKVCAF
DataExchange TKXSBase TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP TKIGES TKXCAF TKXDEIGES TKXDESTEP TKSTL TKVRML TKXmlXCAF TKBinXCAF
Draw TKDraw TKTopTest TKViewerTest TKXSDRAW TKDCAF TKXDEDRAW TKTObjDRAW TKQADraw TKIVtkDraw DRAWEXE
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@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");
+ }
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <BinTools.hxx>
+#include <BinTools_ShapeSet.hxx>
#include <FSD_FileHeader.hxx>
+#include <OSD_OpenFile.hxx>
#include <Storage_StreamTypeMismatchError.hxx>
//=======================================================================
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 <Standard_DefineAlloc.hxx>
#include <Standard_Handle.hxx>
-#include <Standard_OStream.hxx>
#include <Standard_Real.hxx>
#include <Standard_Integer.hxx>
#include <Standard_Boolean.hxx>
#include <Standard_ExtCharacter.hxx>
+#include <Standard_OStream.hxx>
#include <Standard_IStream.hxx>
+
+class TopoDS_Shape;
class BinTools_ShapeSet;
class BinTools_Curve2dSet;
class BinTools_CurveSet;
Standard_EXPORT static Standard_IStream& GetBool (Standard_IStream& IS, Standard_Boolean& theValue);
Standard_EXPORT static Standard_IStream& GetExtChar (Standard_IStream& IS, Standard_ExtCharacter& theValue);
-
-
-
+
+ //! Writes <theShape> on <theStream> in binary format.
+ Standard_EXPORT static void Write (const TopoDS_Shape& theShape, Standard_OStream& theStream);
+
+ //! Reads a shape from <theStream> and returns it in <theShape>.
+ Standard_EXPORT static void Read (TopoDS_Shape& theShape, Standard_IStream& theStream);
+
+ //! Writes <theShape> in <theFile>.
+ Standard_EXPORT static Standard_Boolean Write (const TopoDS_Shape& theShape, const Standard_CString theFile);
+
+ //! Reads a shape from <theFile> and returns it in <theShape>.
+ Standard_EXPORT static Standard_Boolean Read (TopoDS_Shape& theShape, const Standard_CString theFile);
protected:
#include <BRepTools.hxx>
#include <BRepTools_ShapeSet.hxx>
#include <BRepTools_WireExplorer.hxx>
+#include <BinTools.hxx>
#include <DBRep.hxx>
#include <DBRep_DrawableShape.hxx>
#include <Draw.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);
}
//=======================================================================
--- /dev/null
+# test binsave and binrestore commands
+
+pload TOPTEST
+
+set file binpersist.bin
+
+box b 10 20 30 100 200 300
+
+if [regexp "Cannot write to the file $file" [binsave b $file]] {
+ puts "Error: binsave"
+} elseif [regexp "Cannot read from the file $file" [binrestore $file bb]] {
+ puts "Error: binrestore"
+} else {
+ file delete $file
+ if {[bounding b] != [bounding bb]} {
+ puts "Error: restored shape has another bounding box"
+ }
+ checkshape bb
+ checknbshapes bb -ref [nbshapes b]
+ checkprops bb -l 4800
+ checkprops bb -s 220000
+ checkprops bb -v 6000000
+}
+
+puts "TEST COMPLETED"
--- /dev/null
+# test binsave and binrestore commands
+
+pload TOPTEST
+
+set file binpersist.bin
+
+restore [locate_data_file bug23849_segment_2.brep] b
+
+if [regexp "Cannot write to the file $file" [binsave b $file]] {
+ puts "Error: binsave"
+} elseif [regexp "Cannot read from the file $file" [binrestore $file bb]] {
+ puts "Error: binrestore"
+} else {
+ file delete $file
+ if {[bounding b] != [bounding bb]} {
+ puts "Error: restored shape has another bounding box"
+ }
+ checkshape bb
+ checknbshapes bb -ref [nbshapes b]
+ checkprops bb -l 7703.49
+ checkprops bb -s 10678.2
+ checkprops bb -v 67245
+}
+
+puts "TEST COMPLETED"
--- /dev/null
+# test binsave and binrestore commands
+
+pload TOPTEST
+
+set file binpersist.bin
+
+restore [locate_data_file OCC615.brep] b
+
+if [regexp "Cannot write to the file $file" [binsave b $file]] {
+ puts "Error: binsave"
+} elseif [regexp "Cannot read from the file $file" [binrestore $file bb]] {
+ puts "Error: binrestore"
+} else {
+ file delete $file
+ if {[bounding b] != [bounding bb]} {
+ puts "Error: restored shape has another bounding box"
+ }
+ checkshape bb
+ checknbshapes bb -ref [nbshapes b]
+ checkprops bb -l 5501.4
+ checkprops bb -s 201237
+ checkprops bb -v 4.68509e+006
+ checktrinfo bb -ref [trinfo b]
+}
+
+puts "TEST COMPLETED"