mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-28 02:10:35 +05:00
23295: [CEA 1870] Impossible to mesh the inside of the 2D skin of an object meshed with quadrangles
This commit is contained in:
parent
5535f6364f
commit
ab2525d905
@ -142,7 +142,7 @@ SMESH_DeviceActor
|
|||||||
if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<<this);
|
if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<<this);
|
||||||
|
|
||||||
myMapper->Delete();
|
myMapper->Delete();
|
||||||
|
myPlaneCollection->Delete();
|
||||||
myProperty->Delete();
|
myProperty->Delete();
|
||||||
|
|
||||||
myExtractGeometry->Delete();
|
myExtractGeometry->Delete();
|
||||||
|
@ -906,8 +906,9 @@ TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
|
|||||||
}
|
}
|
||||||
else if ( ! intersection.IsParallel() && intersection.NbPoints() > 0 )
|
else if ( ! intersection.IsParallel() && intersection.NbPoints() > 0 )
|
||||||
{
|
{
|
||||||
|
double tol = 1e-4 * Sqrt( fNorm.Modulus() );
|
||||||
gp_Pnt intersectionPoint = intersection.Point(1);
|
gp_Pnt intersectionPoint = intersection.Point(1);
|
||||||
if ( !SMESH_MeshAlgos::IsOut( *face, intersectionPoint, tolerance ))
|
if ( !SMESH_MeshAlgos::IsOut( *face, intersectionPoint, tol ))
|
||||||
u2inters.insert(make_pair( intersection.ParamOnConic(1), TInters( *face, fNorm )));
|
u2inters.insert(make_pair( intersection.ParamOnConic(1), TInters( *face, fNorm )));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1133,14 +1134,11 @@ bool SMESH_MeshAlgos::IsOut( const SMDS_MeshElement* element, const gp_Pnt& poin
|
|||||||
|
|
||||||
// get ordered nodes
|
// get ordered nodes
|
||||||
|
|
||||||
vector< SMESH_TNodeXYZ > xyz;
|
vector< SMESH_TNodeXYZ > xyz; xyz.reserve( element->NbNodes()+1 );
|
||||||
|
|
||||||
SMDS_ElemIteratorPtr nodeIt = element->interlacedNodesElemIterator();
|
SMDS_ElemIteratorPtr nodeIt = element->interlacedNodesElemIterator();
|
||||||
while ( nodeIt->more() )
|
for ( int i = 0; nodeIt->more(); ++i )
|
||||||
{
|
xyz.push_back( SMESH_TNodeXYZ( nodeIt->next() ));
|
||||||
SMESH_TNodeXYZ node = nodeIt->next();
|
|
||||||
xyz.push_back( node );
|
|
||||||
}
|
|
||||||
|
|
||||||
int i, nbNodes = (int) xyz.size(); // central node of biquadratic is missing
|
int i, nbNodes = (int) xyz.size(); // central node of biquadratic is missing
|
||||||
|
|
||||||
@ -1171,8 +1169,23 @@ bool SMESH_MeshAlgos::IsOut( const SMDS_MeshElement* element, const gp_Pnt& poin
|
|||||||
|
|
||||||
// check if the point lays on face plane
|
// check if the point lays on face plane
|
||||||
gp_Vec n2p( xyz[0], point );
|
gp_Vec n2p( xyz[0], point );
|
||||||
if ( fabs( n2p * faceNorm ) > tol )
|
double dot = n2p * faceNorm;
|
||||||
return true; // not on face plane
|
if ( Abs( dot ) > tol ) // not on face plane
|
||||||
|
{
|
||||||
|
bool isOut = true;
|
||||||
|
if ( nbNodes > 3 ) // maybe the face is not planar
|
||||||
|
{
|
||||||
|
double elemThick = 0;
|
||||||
|
for ( i = 1; i < nbNodes; ++i )
|
||||||
|
{
|
||||||
|
gp_Vec n2n( xyz[0], xyz[i] );
|
||||||
|
elemThick = Max( elemThick, Abs( n2n * faceNorm ));
|
||||||
|
}
|
||||||
|
isOut = Abs( dot ) > elemThick + tol;
|
||||||
|
}
|
||||||
|
if ( isOut )
|
||||||
|
return isOut;
|
||||||
|
}
|
||||||
|
|
||||||
// check if point is out of face boundary:
|
// check if point is out of face boundary:
|
||||||
// define it by closest transition of a ray point->infinity through face boundary
|
// define it by closest transition of a ray point->infinity through face boundary
|
||||||
@ -1184,7 +1197,7 @@ bool SMESH_MeshAlgos::IsOut( const SMDS_MeshElement* element, const gp_Pnt& poin
|
|||||||
normSize = plnNorm.Magnitude();
|
normSize = plnNorm.Magnitude();
|
||||||
if ( normSize <= tol ) return false; // point coincides with the first node
|
if ( normSize <= tol ) return false; // point coincides with the first node
|
||||||
plnNorm /= normSize;
|
plnNorm /= normSize;
|
||||||
// for each node of the face, compute its signed distance to the plane
|
// for each node of the face, compute its signed distance to the cutting plane
|
||||||
vector<double> dist( nbNodes + 1);
|
vector<double> dist( nbNodes + 1);
|
||||||
for ( i = 0; i < nbNodes; ++i )
|
for ( i = 0; i < nbNodes; ++i )
|
||||||
{
|
{
|
||||||
@ -1194,12 +1207,12 @@ bool SMESH_MeshAlgos::IsOut( const SMDS_MeshElement* element, const gp_Pnt& poin
|
|||||||
dist.back() = dist.front();
|
dist.back() = dist.front();
|
||||||
// find the closest intersection
|
// find the closest intersection
|
||||||
int iClosest = -1;
|
int iClosest = -1;
|
||||||
double rClosest = 0, distClosest = 1e100;;
|
double rClosest = 0, distClosest = 1e100;
|
||||||
gp_Pnt pClosest;
|
gp_Pnt pClosest;
|
||||||
for ( i = 0; i < nbNodes; ++i )
|
for ( i = 0; i < nbNodes; ++i )
|
||||||
{
|
{
|
||||||
double r;
|
double r;
|
||||||
if ( fabs( dist[i]) < tol )
|
if ( fabs( dist[i] ) < tol )
|
||||||
r = 0.;
|
r = 0.;
|
||||||
else if ( fabs( dist[i+1]) < tol )
|
else if ( fabs( dist[i+1]) < tol )
|
||||||
r = 1.;
|
r = 1.;
|
||||||
@ -1208,17 +1221,14 @@ bool SMESH_MeshAlgos::IsOut( const SMDS_MeshElement* element, const gp_Pnt& poin
|
|||||||
else
|
else
|
||||||
continue; // no intersection
|
continue; // no intersection
|
||||||
gp_Pnt pInt = xyz[i] * (1.-r) + xyz[i+1] * r;
|
gp_Pnt pInt = xyz[i] * (1.-r) + xyz[i+1] * r;
|
||||||
gp_Vec p2int ( point, pInt);
|
gp_Vec p2int( point, pInt);
|
||||||
if ( p2int * ray > -tol ) // right half-space
|
double intDist = p2int.SquareMagnitude();
|
||||||
|
if ( intDist < distClosest )
|
||||||
{
|
{
|
||||||
double intDist = p2int.SquareMagnitude();
|
iClosest = i;
|
||||||
if ( intDist < distClosest )
|
rClosest = r;
|
||||||
{
|
pClosest = pInt;
|
||||||
iClosest = i;
|
distClosest = intDist;
|
||||||
rClosest = r;
|
|
||||||
pClosest = pInt;
|
|
||||||
distClosest = intDist;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( iClosest < 0 )
|
if ( iClosest < 0 )
|
||||||
|
Loading…
Reference in New Issue
Block a user