0031504: Data Exchange - Wrong output of progress indicator when writing to stl
authorakaftasev <akaftasev@opencascade.com>
Fri, 22 May 2020 10:04:49 +0000 (13:04 +0300)
committerbugmaster <bugmaster@opencascade.com>
Tue, 9 Jun 2020 16:53:08 +0000 (19:53 +0300)
Added new condition for first indicated element at Draw_ProgressIndicator::Show(),
because it’s more logical that at start progress starts at 0
Changed usage of Next() to Next(step) for increment progress to IND_THRESHOLD in RWStl::writeASCII() and RWStl::writeBinary()
Changed condition for continuation of writing and add interrupt to this function
Added possibility to use Progress indicator in writestl
Changed paremeter in constructor Message_ProgressSentry aPS() IND_THRESHOLD to 1
Changed test

src/Draw/Draw_ProgressIndicator.cxx
src/RWStl/RWStl.cxx
src/StlAPI/StlAPI_Writer.cxx
src/StlAPI/StlAPI_Writer.hxx
src/XSDRAWSTLVRML/XSDRAWSTLVRML.cxx
tests/bugs/fclasses/bug28478
tests/bugs/fclasses/bug31092
tests/de_mesh/shape_write_stl/B1 [new file with mode: 0644]

index 6c92b2d..72e6944 100644 (file)
@@ -102,8 +102,8 @@ Standard_Boolean Draw_ProgressIndicator::Show(const Standard_Boolean force)
     if ( scale.GetName().IsNull() ) continue; // skip unnamed scopes
     aText << " " << scale.GetName()->ToCString() << ": ";
 
-    // if scope has subscopes, print end of subscope as its current position
-    Standard_Real locPos = ( i >1 ? GetScope ( i-1 ).GetLast() : GetPosition() );
+    // if scope has subscopes, print end of subscope as it s current position
+    Standard_Real locPos = ( (i >1 && GetPosition()!=0) ? GetScope ( i-1 ).GetLast() : GetPosition() );
     // print progress info differently for finite and infinite scopes
     if ( scale.GetInfinite() )
     {
index 505b6f6..347e24d 100644 (file)
@@ -281,12 +281,12 @@ Standard_Boolean RWStl::writeASCII (const Handle(Poly_Triangulation)& theMesh,
   char aBuffer[512];
   memset (aBuffer, 0, sizeof(aBuffer));
 
+  const Standard_Integer NBTriangles = theMesh->NbTriangles();
   Message_ProgressSentry aPS (theProgInd, "Triangles", 0,
-                              theMesh->NbTriangles(), IND_THRESHOLD);
+                              NBTriangles, 1);
 
   const TColgp_Array1OfPnt& aNodes = theMesh->Nodes();
   const Poly_Array1OfTriangle& aTriangles = theMesh->Triangles();
-  const Standard_Integer NBTriangles = theMesh->NbTriangles();
   Standard_Integer anElem[3] = {0, 0, 0};
   for (Standard_Integer aTriIter = 1; aTriIter <= NBTriangles; ++aTriIter)
   {
@@ -330,7 +330,9 @@ Standard_Boolean RWStl::writeASCII (const Handle(Poly_Triangulation)& theMesh,
     // update progress only per 1k triangles
     if ((aTriIter % IND_THRESHOLD) == 0)
     {
-      aPS.Next();
+      if (!aPS.More())
+        return Standard_False;
+      aPS.Next(IND_THRESHOLD);
     }
   }
 
@@ -355,9 +357,10 @@ Standard_Boolean RWStl::writeBinary (const Handle(Poly_Triangulation)& theMesh,
   {
     return Standard_False;
   }
-
+  
+  const Standard_Integer aNBTriangles = theMesh->NbTriangles();
   Message_ProgressSentry aPS (theProgInd, "Triangles", 0,
-                              theMesh->NbTriangles(), IND_THRESHOLD);
+                              aNBTriangles, 1);
 
   const Standard_Size aNbChunkTriangles = 4096;
   const Standard_Size aChunkSize = aNbChunkTriangles * THE_STL_SIZEOF_FACET;
@@ -366,7 +369,6 @@ Standard_Boolean RWStl::writeBinary (const Handle(Poly_Triangulation)& theMesh,
 
   const TColgp_Array1OfPnt& aNodes = theMesh->Nodes();
   const Poly_Array1OfTriangle& aTriangles = theMesh->Triangles();
-  const Standard_Integer aNBTriangles = theMesh->NbTriangles();
 
   Standard_Character aConv[4];
   convertInteger (aNBTriangles, aConv);
@@ -431,7 +433,9 @@ Standard_Boolean RWStl::writeBinary (const Handle(Poly_Triangulation)& theMesh,
     // update progress only per 1k triangles
     if ((aTriIter % IND_THRESHOLD) == 0)
     {
-      aPS.Next();
+      if (!aPS.More())
+        return Standard_False;
+      aPS.Next(IND_THRESHOLD);
     }
   }
 
index 277e490..c25048f 100644 (file)
@@ -41,7 +41,8 @@ StlAPI_Writer::StlAPI_Writer()
 //purpose  :
 //=============================================================================
 Standard_Boolean StlAPI_Writer::Write (const TopoDS_Shape&    theShape,
-                                       const Standard_CString theFileName)
+                                       const Standard_CString theFileName,
+                                       const Handle(Message_ProgressIndicator)& theProgress)
 {
   Standard_Integer aNbNodes = 0;
   Standard_Integer aNbTriangles = 0;
@@ -125,8 +126,8 @@ Standard_Boolean StlAPI_Writer::Write (const TopoDS_Shape&    theShape,
 
   OSD_Path aPath (theFileName);
   Standard_Boolean isDone = (myASCIIMode
-       ? RWStl::WriteAscii  (aMesh, aPath)
-       : RWStl::WriteBinary (aMesh, aPath));
+    ? RWStl::WriteAscii(aMesh, aPath, theProgress)
+    : RWStl::WriteBinary(aMesh, aPath, theProgress));
 
   if (isDone && (aNbFacesNoTri > 0))
   {
index 257212e..c517e8b 100644 (file)
@@ -22,6 +22,7 @@
 #include <Standard_Handle.hxx>
 #include <Standard_Boolean.hxx>
 #include <Standard_CString.hxx>
+#include <Message_ProgressIndicator.hxx>
 
 class TopoDS_Shape;
 
@@ -45,7 +46,8 @@ public:
   //! Converts a given shape to STL format and writes it to file with a given filename.
   //! \return the error state.
   Standard_EXPORT Standard_Boolean Write (const TopoDS_Shape& theShape,
-                                          const Standard_CString theFileName);
+                                          const Standard_CString theFileName,
+                                          const Handle(Message_ProgressIndicator)& theProgress = NULL);
 
 private:
   Standard_Boolean myASCIIMode;
index 5c3630a..636c538 100644 (file)
@@ -333,7 +333,8 @@ static Standard_Integer writestl
     }
     StlAPI_Writer aWriter;
     aWriter.ASCIIMode() = isASCIIMode;
-    Standard_Boolean isOK = aWriter.Write (aShape, argv[2]);
+    Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di, 1);
+    Standard_Boolean isOK = aWriter.Write (aShape, argv[2], aProgress);
     if (!isOK)
        di << "** Error **: Mesh writing has been failed.\n";
   }
index 513f3f9..30325d8 100644 (file)
@@ -8,7 +8,7 @@ pload QAcommands
 set out [OCC28478 3 2]
 
 set expected {
-  {Progress: 0% Outer: 1 / 3}
+  {Progress: 0% Outer: 0 / 3}
   {Progress: 17% Outer: 1 / 3 Inner: 1 / 2}
   {Progress: 33% Outer: 1 / 3 Inner: 2 / 2}
   {Progress: 50% Outer: 2 / 3 Inner: 1 / 2}
index 989dfb6..0ab0052 100644 (file)
@@ -8,7 +8,7 @@ pload QAcommands
 set out [OCC28478 3 2 -inf]
 
 set expected {
-  {Progress: 0% Outer: 1 / 3}
+  {Progress: 0% Outer: 0 / 3}
   {Progress: 11% Outer: 1 / 3 Inner: 1}
   {Progress: 17% Outer: 1 / 3 Inner: 2}
   {Progress: 20% Outer: 1 / 3 Inner: 3}
diff --git a/tests/de_mesh/shape_write_stl/B1 b/tests/de_mesh/shape_write_stl/B1
new file mode 100644 (file)
index 0000000..1c09e79
--- /dev/null
@@ -0,0 +1,35 @@
+sphere s 10
+tessellate result s 100 100
+XProgress -tclOutput
+XProgress +t
+set out [writestl result s.stl]
+
+set expected {
+  {Progress: 0% Triangles: 0 / 20000}
+  {Progress: 5% Triangles: 1001 / 20000}
+  {Progress: 10% Triangles: 2001 / 20000}
+  {Progress: 15% Triangles: 3001 / 20000}
+  {Progress: 20% Triangles: 4001 / 20000}
+  {Progress: 25% Triangles: 5001 / 20000}
+  {Progress: 30% Triangles: 6001 / 20000}
+  {Progress: 35% Triangles: 7001 / 20000}
+  {Progress: 40% Triangles: 8001 / 20000}
+  {Progress: 45% Triangles: 9001 / 20000}
+  {Progress: 50% Triangles: 10001 / 20000}
+  {Progress: 55% Triangles: 11001 / 20000}
+  {Progress: 60% Triangles: 12001 / 20000}
+  {Progress: 65% Triangles: 13001 / 20000}
+  {Progress: 70% Triangles: 14001 / 20000}
+  {Progress: 75% Triangles: 15001 / 20000}
+  {Progress: 80% Triangles: 16001 / 20000}
+  {Progress: 85% Triangles: 17001 / 20000}
+  {Progress: 90% Triangles: 18001 / 20000}
+  {Progress: 95% Triangles: 19001 / 20000}
+  {Progress: 100% Triangles: 20000 / 20000}
+}
+
+if { [string compare [string trim $out] [join $expected "\n"]] } {
+  puts "Error: output (see above) does not match expected one:"
+  puts "[join $expected "\n"]"
+  puts ""
+}