X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FSMDS_VolumeTool.cxx;h=016ca4cf5478fc4caf001f17bac1f460ff2e1669;hb=1a39b08ad98ef275f4b75e220cc4fb390381f757;hp=6de1ac68e4efc8fed87c1b479ba58b5e261ec452;hpb=560f8b2d0c2a7fdb4047f981cfac56ed3629bc1a;p=modules%2Fsmesh.git diff --git a/src/SMDS/SMDS_VolumeTool.cxx b/src/SMDS/SMDS_VolumeTool.cxx index 6de1ac68e..016ca4cf5 100644 --- a/src/SMDS/SMDS_VolumeTool.cxx +++ b/src/SMDS/SMDS_VolumeTool.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -358,6 +359,7 @@ struct XYZ { XYZ( double X, double Y, double Z ) { x = X; y = Y; z = Z; } XYZ( const XYZ& other ) { x = other.x; y = other.y; z = other.z; } XYZ( const SMDS_MeshNode* n ) { x = n->X(); y = n->Y(); z = n->Z(); } + double* data() { return &x; } inline XYZ operator-( const XYZ& other ); inline XYZ operator+( const XYZ& other ); inline XYZ Crossed( const XYZ& other ); @@ -704,9 +706,11 @@ double SMDS_VolumeTool::GetSize() const if ( !myPolyedre ) return 0.; + SaveFacet savedFacet( myCurFace ); + // split a polyhedron into tetrahedrons - SaveFacet savedFacet( myCurFace ); + bool oriOk = true; SMDS_VolumeTool* me = const_cast< SMDS_VolumeTool* > ( this ); for ( int f = 0; f < NbFaces(); ++f ) { @@ -719,8 +723,11 @@ double SMDS_VolumeTool::GetSize() const p1 = p2; } V += p1.Dot( area ); + oriOk = oriOk && IsFaceExternal( f ); } V /= 6; + if ( !oriOk && V > 0 ) + V *= -1; } else { @@ -1141,7 +1148,8 @@ bool SMDS_VolumeTool::IsFaceExternal( int faceIndex ) const bool SMDS_VolumeTool::projectNodesToNormal( int faceIndex, double& minProj, - double& maxProj ) const + double& maxProj, + double* normalXYZ ) const { minProj = std::numeric_limits::max(); maxProj = std::numeric_limits::min(); @@ -1149,6 +1157,9 @@ bool SMDS_VolumeTool::projectNodesToNormal( int faceIndex, XYZ normal; if ( !GetFaceNormal( faceIndex, normal.x, normal.y, normal.z )) return false; + if ( normalXYZ ) + memcpy( normalXYZ, normal.data(), 3*sizeof(double)); + XYZ p0 ( myCurFace.myNodes[0] ); for ( size_t i = 0; i < myVolumeNodes.size(); ++i ) { @@ -1196,11 +1207,13 @@ bool SMDS_VolumeTool::GetFaceNormal (int faceIndex, double & X, double & Y, doub XYZ aVec13( p3 - p1 ); XYZ cross = aVec12.Crossed( aVec13 ); - if ( myCurFace.myNbNodes >3*iQuad ) { - XYZ p4 ( myCurFace.myNodes[3*iQuad] ); + for ( int i = 3*iQuad; i < myCurFace.myNbNodes; i += iQuad ) + { + XYZ p4 ( myCurFace.myNodes[i] ); XYZ aVec14( p4 - p1 ); XYZ cross2 = aVec13.Crossed( aVec14 ); cross = cross + cross2; + aVec13 = aVec14; } double size = cross.Magnitude();