Salome HOME
Fix negative volume of valid but small polyhedron
authoreap <eap@opencascade.com>
Mon, 17 Feb 2020 18:34:19 +0000 (21:34 +0300)
committereap <eap@opencascade.com>
Mon, 17 Feb 2020 18:34:19 +0000 (21:34 +0300)
https://salome-platform.org/forum/forum_10/547695356

src/SMDS/SMDS_VolumeTool.cxx
src/SMESH_I/SMESH_PythonDump.cxx

index ba0798484370c812af7ed4d082129541118d6375..21accdc9da2d9f4dbe4ef2af020b3992526e26ee 100644 (file)
@@ -706,11 +706,22 @@ double SMDS_VolumeTool::GetSize() const
     if ( !myPolyedre )
       return 0.;
 
+    SaveFacet savedFacet( myCurFace );
+
+    // get an origin not lying in plane of any facet
+    int faceIndex = std::max( myCurFace.myIndex, 0 );
+    setFace( faceIndex );
+    double minProj, maxProj;
+    XYZ normal, origin;
+    projectNodesToNormal( faceIndex, minProj, maxProj, normal.data());
+    GetFaceBaryCenter( faceIndex, origin.x, origin.y, origin.z );
+    origin.x += normal.x * ( maxProj - minProj ) * 1e-1;
+    origin.y += normal.y * ( maxProj - minProj ) * 1e-2;
+    origin.z += normal.z * ( maxProj - minProj ) * 1e-3;
+
     // split a polyhedron into tetrahedrons
 
-    SaveFacet savedFacet( myCurFace );
     SMDS_VolumeTool* me = const_cast< SMDS_VolumeTool* > ( this );
-    XYZ origin( 1 + 1e-6, 22 + 2e-6, 333 + 3e-6 ); // for invalid poly: avoid lying on a facet plane
     for ( int f = 0; f < NbFaces(); ++f )
     {
       me->setFace( f );
index 7be8cb7ef69616f74e2f3b1e4bb7c395c5b6edbb..391b555273b393a6655c00e004955934a5b74571 100644 (file)
@@ -696,7 +696,7 @@ namespace SMESH
 //function : DumpPython
 //purpose  :
 //=======================================================================
-Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Boolean  isPublished,
+Engines::TMPFile* SMESH_Gen_i::DumpPythonCORBA::Boolean  isPublished,
                                            CORBA::Boolean  isMultiFile,
                                            CORBA::Boolean& isValidScript)
 {