From 29f934cead03513f5eb94d4975b5647b2f8eead7 Mon Sep 17 00:00:00 2001 From: emv Date: Tue, 14 Jun 2016 16:13:39 +0300 Subject: [PATCH] 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" - Updated documantation with description of the new BinTools class methods and corresponding BRepTools class methods. --- .../modeling_data/modeling_data.md | 15 +++++ src/BinTools/BinTools.cdl | 15 ++++- src/BinTools/BinTools.cxx | 65 +++++++++++++++++++ src/DBRep/DBRep.cxx | 51 +++++++++++++++ 4 files changed, 145 insertions(+), 1 deletion(-) diff --git a/dox/user_guides/modeling_data/modeling_data.md b/dox/user_guides/modeling_data/modeling_data.md index 1cd63326b3..5cb4ab7e8b 100644 --- a/dox/user_guides/modeling_data/modeling_data.md +++ b/dox/user_guides/modeling_data/modeling_data.md @@ -1237,4 +1237,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.cdl b/src/BinTools/BinTools.cdl index 934d73854a..ec64d95fac 100644 --- a/src/BinTools/BinTools.cdl +++ b/src/BinTools/BinTools.cdl @@ -26,7 +26,8 @@ uses TopLoc, BRep, BRepTools, - TopTools + TopTools, + TopoDS is class ShapeSet; @@ -66,5 +67,17 @@ is 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 on in binary format. + + Read (theShape : out Shape from TopoDS; theStream : out IStream from Standard); + ---Purpose: Reads a shape from and returns it in . + + Write (theShape : Shape from TopoDS; theFile : CString from Standard) returns Boolean from Standard; + ---Purpose: Writes in . + + Read (theShape : out Shape from TopoDS; theFile : CString from Standard) returns Boolean from Standard; + ---Purpose: Reads a shape from and returns it in . + end BinTools; diff --git a/src/BinTools/BinTools.cxx b/src/BinTools/BinTools.cxx index 4ce69f2fbd..ce368f6b92 100644 --- a/src/BinTools/BinTools.cxx +++ b/src/BinTools/BinTools.cxx @@ -14,8 +14,12 @@ // commercial license or contractual agreement. #include +#include #include +#include #include +#include +#include //======================================================================= //function : PutBool @@ -129,3 +133,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/DBRep/DBRep.cxx b/src/DBRep/DBRep.cxx index 8b19ffc385..143d6c1a7f 100644 --- a/src/DBRep/DBRep.cxx +++ b/src/DBRep/DBRep.cxx @@ -43,6 +43,7 @@ #include #include #include +#include // memory management #include @@ -1271,6 +1272,49 @@ 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 : @@ -1323,6 +1367,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); } //======================================================================= -- 2.39.5