From: msv Date: Thu, 10 Mar 2016 09:58:44 +0000 (+0300) Subject: 0027245: DRAW command to test binary persistence for shapes X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2FCR0-winwerth;p=occt-copy.git 0027245: DRAW command to test binary persistence for shapes - 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. --- diff --git a/adm/MODULES b/adm/MODULES index e2ef48470d..e65fb379ee 100644 --- a/adm/MODULES +++ b/adm/MODULES @@ -2,6 +2,6 @@ FoundationClasses TKernel TKMath 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 diff --git a/dox/user_guides/modeling_data/modeling_data.md b/dox/user_guides/modeling_data/modeling_data.md index d1b7e17997..19181cf35b 100644 --- a/dox/user_guides/modeling_data/modeling_data.md +++ b/dox/user_guides/modeling_data/modeling_data.md @@ -1247,4 +1247,19 @@ For example, in the wire in the image we want to recuperate the edges in the ord } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +@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"); + } +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/BinTools/BinTools.cxx b/src/BinTools/BinTools.cxx index a2fb60cc3d..5bcc1efc7f 100644 --- a/src/BinTools/BinTools.cxx +++ b/src/BinTools/BinTools.cxx @@ -15,7 +15,9 @@ #include +#include #include +#include #include //======================================================================= @@ -129,3 +131,64 @@ Standard_IStream& BinTools::GetBool(Standard_IStream& IS, Standard_Boolean& aVal 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(); +} diff --git a/src/BinTools/BinTools.hxx b/src/BinTools/BinTools.hxx index c5788a6e8c..633d58707c 100644 --- a/src/BinTools/BinTools.hxx +++ b/src/BinTools/BinTools.hxx @@ -20,12 +20,14 @@ #include #include -#include #include #include #include #include +#include #include + +class TopoDS_Shape; class BinTools_ShapeSet; class BinTools_Curve2dSet; class BinTools_CurveSet; @@ -56,9 +58,18 @@ public: 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 on in binary format. + Standard_EXPORT static void Write (const TopoDS_Shape& theShape, Standard_OStream& theStream); + + //! Reads a shape from and returns it in . + Standard_EXPORT static void Read (TopoDS_Shape& theShape, Standard_IStream& theStream); + + //! Writes in . + Standard_EXPORT static Standard_Boolean Write (const TopoDS_Shape& theShape, const Standard_CString theFile); + + //! Reads a shape from and returns it in . + Standard_EXPORT static Standard_Boolean Read (TopoDS_Shape& theShape, const Standard_CString theFile); protected: diff --git a/src/DBRep/DBRep.cxx b/src/DBRep/DBRep.cxx index 18e438e022..b37942f4c0 100644 --- a/src/DBRep/DBRep.cxx +++ b/src/DBRep/DBRep.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -1274,6 +1275,51 @@ static Standard_Integer XProgress (Draw_Interpretor& di, Standard_Integer argc, 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 : @@ -1326,6 +1372,13 @@ void DBRep::BasicCommands(Draw_Interpretor& theCommands) // 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); } //======================================================================= diff --git a/tests/demo/draw/binpersist_1 b/tests/demo/draw/binpersist_1 new file mode 100644 index 0000000000..286b958a56 --- /dev/null +++ b/tests/demo/draw/binpersist_1 @@ -0,0 +1,25 @@ +# 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" diff --git a/tests/demo/draw/binpersist_2 b/tests/demo/draw/binpersist_2 new file mode 100644 index 0000000000..3e8d37d1ee --- /dev/null +++ b/tests/demo/draw/binpersist_2 @@ -0,0 +1,25 @@ +# 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" diff --git a/tests/demo/draw/binpersist_3 b/tests/demo/draw/binpersist_3 new file mode 100644 index 0000000000..60756b8027 --- /dev/null +++ b/tests/demo/draw/binpersist_3 @@ -0,0 +1,26 @@ +# 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"