mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-30 02:10:32 +05:00
0021144: [CEA 441] Problem with projection
care of degenerated geom EDGEs
This commit is contained in:
parent
b337ba17f3
commit
237e3eaae1
@ -1318,15 +1318,15 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
|
||||
|
||||
// Get ordered bottom edges
|
||||
list< TopoDS_Edge > orderedEdges;
|
||||
list< int > nbVertexInWires;
|
||||
list< int > nbEInW;
|
||||
SMESH_Block::GetOrderedEdges( TopoDS::Face( botSM->GetSubShape().Reversed() ),
|
||||
V000, orderedEdges, nbVertexInWires );
|
||||
// if ( nbVertexInWires.size() != 1 )
|
||||
V000, orderedEdges, nbEInW );
|
||||
// if ( nbEInW.size() != 1 )
|
||||
// RETURN_BAD_RESULT("Wrong prism geometry");
|
||||
|
||||
// Get Wall faces corresponding to the ordered bottom edges
|
||||
list< TopoDS_Face > wallFaces;
|
||||
if ( !GetWallFaces( Mesh(), shape3D, botSM->GetSubShape(), orderedEdges, wallFaces))
|
||||
if ( !GetWallFaces( Mesh(), shape3D, botSM->GetSubShape(), orderedEdges, nbEInW, wallFaces))
|
||||
return error(COMPERR_BAD_SHAPE, "Can't find side faces");
|
||||
|
||||
// Find columns of wall nodes and calculate edges' lengths
|
||||
@ -1335,7 +1335,7 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
|
||||
myParam2ColumnMaps.clear();
|
||||
myParam2ColumnMaps.resize( orderedEdges.size() ); // total nb edges
|
||||
|
||||
int iE, nbEdges = nbVertexInWires.front(); // nb outer edges
|
||||
int iE, nbEdges = nbEInW.front(); // nb outer edges
|
||||
vector< double > edgeLength( nbEdges );
|
||||
map< double, int > len2edgeMap;
|
||||
|
||||
@ -1665,6 +1665,7 @@ bool StdMeshers_PrismAsBlock::GetLayersTransformation(vector<gp_Trsf> & trsf) co
|
||||
list< TopoDS_Edge >::iterator edgeIt = orderedEdges.begin();
|
||||
for ( int iE = 0; iE < nbEdgesInWires.front(); ++iE, ++edgeIt )
|
||||
{
|
||||
if ( BRep_Tool::Degenerated( *edgeIt )) continue;
|
||||
const TParam2ColumnMap& u2colMap =
|
||||
GetParam2ColumnMap( myHelper->GetMeshDS()->ShapeToIndex( *edgeIt ), isReverse );
|
||||
isReverse = ( edgeIt->Orientation() == TopAbs_REVERSED );
|
||||
@ -1766,31 +1767,49 @@ bool StdMeshers_PrismAsBlock::IsForwardEdge(SMESHDS_Mesh* meshDS,
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
bool StdMeshers_PrismAsBlock::GetWallFaces( SMESH_Mesh* mesh,
|
||||
const TopoDS_Shape & mainShape,
|
||||
const TopoDS_Shape & bottomFace,
|
||||
const std::list< TopoDS_Edge >& bottomEdges,
|
||||
std::list< TopoDS_Face >& wallFaces)
|
||||
bool StdMeshers_PrismAsBlock::GetWallFaces( SMESH_Mesh* mesh,
|
||||
const TopoDS_Shape & mainShape,
|
||||
const TopoDS_Shape & bottomFace,
|
||||
std::list< TopoDS_Edge >& bottomEdges,
|
||||
std::list< int > & nbEInW,
|
||||
std::list< TopoDS_Face >& wallFaces)
|
||||
{
|
||||
wallFaces.clear();
|
||||
|
||||
TopTools_IndexedMapOfShape faceMap;
|
||||
TopExp::MapShapes( mainShape, TopAbs_FACE, faceMap );
|
||||
|
||||
list< TopoDS_Edge >::const_iterator edge = bottomEdges.begin();
|
||||
for ( ; edge != bottomEdges.end(); ++edge )
|
||||
list< TopoDS_Edge >::iterator edge = bottomEdges.begin();
|
||||
std::list< int >::iterator nbE = nbEInW.begin();
|
||||
int iE = 0;
|
||||
while ( edge != bottomEdges.end() )
|
||||
{
|
||||
TopTools_ListIteratorOfListOfShape ancestIt = mesh->GetAncestors( *edge );
|
||||
for ( ; ancestIt.More(); ancestIt.Next() )
|
||||
++iE;
|
||||
if ( BRep_Tool::Degenerated( *edge ))
|
||||
{
|
||||
const TopoDS_Shape& ancestor = ancestIt.Value();
|
||||
if ( ancestor.ShapeType() == TopAbs_FACE && // face
|
||||
!bottomFace.IsSame( ancestor ) && // not bottom
|
||||
faceMap.FindIndex( ancestor )) // belongs to the prism
|
||||
edge = bottomEdges.erase( edge );
|
||||
--iE;
|
||||
--(*nbE);
|
||||
}
|
||||
else
|
||||
{
|
||||
PShapeIteratorPtr fIt = myHelper->GetAncestors( *edge, *mesh, TopAbs_FACE );
|
||||
while ( fIt->more() )
|
||||
{
|
||||
wallFaces.push_back( TopoDS::Face( ancestor ));
|
||||
break;
|
||||
const TopoDS_Shape* face = fIt->next();
|
||||
if ( !bottomFace.IsSame( *face ) && // not bottom
|
||||
faceMap.FindIndex( *face )) // belongs to the prism
|
||||
{
|
||||
wallFaces.push_back( TopoDS::Face( *face ));
|
||||
break;
|
||||
}
|
||||
}
|
||||
++edge;
|
||||
}
|
||||
if ( iE == *nbE )
|
||||
{
|
||||
iE = 0;
|
||||
++nbE;
|
||||
}
|
||||
}
|
||||
return ( wallFaces.size() == bottomEdges.size() );
|
||||
|
@ -230,11 +230,12 @@ public:
|
||||
* \param bottomEdges - edges bounding the bottom face
|
||||
* \param wallFaces - faces list to fill in
|
||||
*/
|
||||
static bool GetWallFaces( SMESH_Mesh* mesh,
|
||||
const TopoDS_Shape & mainShape,
|
||||
const TopoDS_Shape & bottomFace,
|
||||
const std::list< TopoDS_Edge >& bottomEdges,
|
||||
std::list< TopoDS_Face >& wallFaces);
|
||||
bool GetWallFaces( SMESH_Mesh* mesh,
|
||||
const TopoDS_Shape & mainShape,
|
||||
const TopoDS_Shape & bottomFace,
|
||||
std::list< TopoDS_Edge >& bottomEdges,
|
||||
std::list< int > & nbEInW,
|
||||
std::list< TopoDS_Face >& wallFaces);
|
||||
|
||||
private:
|
||||
|
||||
|
@ -979,13 +979,14 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
|
||||
list< TopoDS_Edge > edges1, edges2;
|
||||
int nbE = FindFaceAssociation( face1, VV1, face2, VV2, edges1, edges2 );
|
||||
if ( !nbE ) RETURN_BAD_RESULT("FindFaceAssociation() failed");
|
||||
if ( nbE == 2 ) // only 2 edges
|
||||
// take care of proper association of propagated edges
|
||||
bool same1 = edge1.IsSame( edges1.front() );
|
||||
bool same2 = edge2.IsSame( edges2.front() );
|
||||
if ( same1 != same2 )
|
||||
{
|
||||
// take care of proper association of propagated edges
|
||||
bool same1 = edge1.IsSame( edges1.front() );
|
||||
bool same2 = edge2.IsSame( edges2.front() );
|
||||
if ( same1 != same2 )
|
||||
Reverse(edges2, nbE);
|
||||
Reverse(edges2, nbE);
|
||||
if ( nbE != 2 ) // 2 degen edges of 4 (issue 0021144)
|
||||
edges2.splice( edges2.end(), edges2, edges2.begin());
|
||||
}
|
||||
// store association
|
||||
list< TopoDS_Edge >::iterator eIt1 = edges1.begin();
|
||||
|
Loading…
Reference in New Issue
Block a user