]> OCCT Git - occt-copy.git/commitdiff
0027245: DRAW command to test binary persistence for shapes CR0-winwerth
authormsv <msv@opencascade.com>
Thu, 10 Mar 2016 09:58:44 +0000 (12:58 +0300)
committeremv <emv@opencascade.com>
Thu, 6 Jul 2017 07:08:13 +0000 (10:08 +0300)
- 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.

adm/MODULES
dox/user_guides/modeling_data/modeling_data.md
src/BinTools/BinTools.cxx
src/BinTools/BinTools.hxx
src/DBRep/DBRep.cxx
tests/demo/draw/binpersist_1 [new file with mode: 0644]
tests/demo/draw/binpersist_2 [new file with mode: 0644]
tests/demo/draw/binpersist_3 [new file with mode: 0644]

index e2ef48470dafa37682c9a898721cc94b741a67ad..e65fb379eedc8142d6764e4430c245f18238d066 100644 (file)
@@ -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
index d1b7e1799780cf6a9516ba789311fdc15e70ec84..19181cf35b6c2c96457fd002431eca1611e0cb4f 100644 (file)
@@ -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");
+  }
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index a2fb60cc3d55bcabfa1d15d92ca26efdb87033ae..5bcc1efc7f71f7fe15adda39e0bdeec735b3b7f8 100644 (file)
@@ -15,7 +15,9 @@
 
 
 #include <BinTools.hxx>
+#include <BinTools_ShapeSet.hxx>
 #include <FSD_FileHeader.hxx>
+#include <OSD_OpenFile.hxx>
 #include <Storage_StreamTypeMismatchError.hxx>
 
 //=======================================================================
@@ -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();
+}
index c5788a6e8cd5b609c76e19848da5c0b43a3420f4..633d58707c79f54dbd8a74000b55263aef0e32d0 100644 (file)
 #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;
@@ -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 <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:
 
index 18e438e0226e613122f617d4958717b8e40e76b2..b37942f4c07a556faa1a270446b7b6e6f9b0ad8c 100644 (file)
@@ -21,6 +21,7 @@
 #include <BRepTools.hxx>
 #include <BRepTools_ShapeSet.hxx>
 #include <BRepTools_WireExplorer.hxx>
+#include <BinTools.hxx>
 #include <DBRep.hxx>
 #include <DBRep_DrawableShape.hxx>
 #include <Draw.hxx>
@@ -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 (file)
index 0000000..286b958
--- /dev/null
@@ -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 (file)
index 0000000..3e8d37d
--- /dev/null
@@ -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 (file)
index 0000000..60756b8
--- /dev/null
@@ -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"