X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Cartesian_3D.cxx;h=6b0c68b93facfbd1f13490635d7730d58eefbac3;hb=798c6330119ff910c48e42750b82162416be9ab2;hp=b22843958ce647a57ac52b964290dbd3a426d25b;hpb=d4a710ce52f6e76786a7b3845e2f7975dc9a00b1;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_Cartesian_3D.cxx b/src/StdMeshers/StdMeshers_Cartesian_3D.cxx index b22843958..6b0c68b93 100644 --- a/src/StdMeshers/StdMeshers_Cartesian_3D.cxx +++ b/src/StdMeshers/StdMeshers_Cartesian_3D.cxx @@ -35,6 +35,7 @@ #include "utilities.h" #include "Utils_ExceptHandlers.hxx" +#include #include #include @@ -85,7 +86,10 @@ using namespace std; //#define _MY_DEBUG_ -#define ELLIPSOLID_WORKAROUND // remove it as soon as http://tracker.dev.opencascade.org/view.php?id=22809 is solved +#if OCC_VERSION_LARGE <= 0x06050300 +// workaround it required only for OCCT6.5.3 and older (see OCC22809) +#define ELLIPSOLID_WORKAROUND +#endif #ifdef ELLIPSOLID_WORKAROUND #include @@ -1610,7 +1614,7 @@ namespace intHexInd.resize( nbIntHex ); tbb::parallel_for ( tbb::blocked_range( 0, nbIntHex ), ParallelHexahedron( intersectedHex, intHexInd ), - tbb::simple_partitioner()); + tbb::simple_partitioner()); // ComputeElements() is called here for ( size_t i = 0; i < intHexInd.size(); ++i ) if ( Hexahedron * hex = intersectedHex[ intHexInd[ i ]] ) nbAdded += hex->addElements( helper ); @@ -1636,6 +1640,7 @@ namespace */ int Hexahedron::addElements(SMESH_MesherHelper& helper) { + int nbAdded = 0; // add elements resulted from hexahedron intersection //for ( size_t i = 0; i < _volumeDefs.size(); ++i ) { @@ -1661,9 +1666,10 @@ namespace break; } } + nbAdded += int ( _volumeDefs._nodes.size() > 0 ); } - return 1;//(int) _volumeDefs.size(); + return nbAdded; } //================================================================================ /*! @@ -1915,6 +1921,9 @@ bool StdMeshers_Cartesian_3D::Compute(SMESH_Mesh & theMesh, // - skip a cell, if it is too small according to the size threshold // - add a hexahedron in the mesh, if all nodes are inside // - add a polyhedron in the mesh, if some nodes are inside and some outside + + _computeCanceled = false; + try { Grid grid; @@ -1960,6 +1969,7 @@ bool StdMeshers_Cartesian_3D::Compute(SMESH_Mesh & theMesh, #endif } } + if ( _computeCanceled ) return false; #ifdef WITH_TBB { // copy partner faces and curves of not thread-safe types @@ -1994,9 +2004,13 @@ bool StdMeshers_Cartesian_3D::Compute(SMESH_Mesh & theMesh, helper.SetSubShape( solidExp.Current() ); helper.SetElementsOnShape( true ); + if ( _computeCanceled ) return false; + // create nodes on the geometry grid.ComputeNodes(helper); + if ( _computeCanceled ) return false; + // create volume elements Hexahedron hex( _hyp->GetSizeThreshold(), &grid ); int nbAdded = hex.MakeElements( helper );