-// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
return &theEdgeMarker;
}
//! Clear edge sumbesh if something happens on face
- void ProcessEvent(const int event,
+ void ProcessEvent(const int /*event*/,
const int eventType,
- SMESH_subMesh* faceSubMesh,
+ SMESH_subMesh* /*faceSubMesh*/,
EventListenerData* edgesHolder,
const SMESH_Hypothesis* /*hyp*/)
{
if ( nbWire > 2 || nbEdgesInWire.front() < 1 ) return 0;
// remove degenerated EDGEs
+ TopTools_MapOfShape degenVV;
list<TopoDS_Edge>::iterator edge = edges.begin();
while ( edge != edges.end() )
if ( SMESH_Algo::isDegenerated( *edge ))
+ {
+ degenVV.Add( SMESH_MesherHelper::IthVertex( 0, *edge ));
+ degenVV.Add( SMESH_MesherHelper::IthVertex( 1, *edge ));
edge = edges.erase( edge );
+ }
else
+ {
++edge;
+ }
int nbEdges = edges.size();
// find VERTEXes between continues EDGEs
double len1 = (++l2i)->first;
double len2 = (++l2i)->first;
if ( len1 - len0 > len2 - len1 )
- deviation2sideInd.insert( make_pair( 0., len2sideInd.begin()->second ));
+ deviation2sideInd.insert( std::make_pair( 0., len2sideInd.begin()->second ));
else
- deviation2sideInd.insert( make_pair( 0., len2sideInd.rbegin()->second ));
+ deviation2sideInd.insert( std::make_pair( 0., len2sideInd.rbegin()->second ));
+ }
+
+ double minDevi = deviation2sideInd.begin()->first;
+ int iMinCurv = deviation2sideInd.begin()->second;
+ if ( sides.size() == 3 && degenVV.Size() == 1 &&
+ minDevi / sides[ iMinCurv ]->Length() > 1e-3 )
+ {
+ // a triangle with curved sides and a degenerated EDGE (IPAL54585);
+ // use a side opposite to the degenerated EDGE as an elliptic one
+ for ( size_t iS = 0; iS < sides.size(); ++iS )
+ if ( degenVV.Contains( sides[ iS ]->FirstVertex() ))
+ {
+ deviation2sideInd.clear();
+ deviation2sideInd.insert( std::make_pair( 0.,( iS + 1 ) % sides.size() ));
+ break;
+ }
}
int iCirc = deviation2sideInd.rbegin()->second;
*/
//================================================================================
- bool isCornerInsideCircle(const StdMeshers_FaceSidePtr& CircSide,
- const StdMeshers_FaceSidePtr& LinSide1,
- const StdMeshers_FaceSidePtr& LinSide2)
+ bool isCornerInsideCircle(const StdMeshers_FaceSidePtr& /*CircSide*/,
+ const StdMeshers_FaceSidePtr& /*LinSide1*/,
+ const StdMeshers_FaceSidePtr& /*LinSide2*/)
{
// if ( CircSide && LinSide1 && LinSide2 )
// {
{
// find the center and a point most distant from it
- double maxDist = 0, normPar;
+ double maxDist = 0, normPar = 0;
gp_XY uv1, uv2;
for ( int i = 0; i < 32; ++i )
{
void StdMeshers_RadialQuadrangle_1D2D::SubmeshRestored(SMESH_subMesh* faceSubMesh)
{
if ( !faceSubMesh->IsEmpty() )
+ SetEventListener( faceSubMesh );
+}
+
+//=======================================================================
+/*!
+ * \brief Sets event listener to a submesh
+ * \param subMesh - submesh where algo is set
+ *
+ * This method is called when a submesh gets HYP_OK algo_state.
+ */
+//=======================================================================
+
+void StdMeshers_RadialQuadrangle_1D2D::SetEventListener(SMESH_subMesh* faceSubMesh)
+{
+ for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() )
{
- for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() )
- {
- TEdgeMarker::markEdge( TopoDS::Edge( e.Current() ), faceSubMesh );
- }
+ TEdgeMarker::markEdge( TopoDS::Edge( e.Current() ), faceSubMesh );
}
}
quad->side[1] = linSide1;
quad->side[2] = StdMeshers_FaceSide::New( circSide.get(), centerNode, ¢erUV );
quad->side[3] = linSide2;
+ quad->face = F;
myQuadList.push_back( quad );
else
ok = StdMeshers_Quadrangle_2D::computeTriangles( aMesh, F, quad );
+ if ( helper.HasDegeneratedEdges() )
+ {
+ StdMeshers_Quadrangle_2D::myNeedSmooth = true;
+ StdMeshers_Quadrangle_2D::smooth( quad );
+ }
+
StdMeshers_Quadrangle_2D::myHelper = 0;
return ok;
if( aResMap.count(sm) )
return false;
- vector<int>& aResVec =
- aResMap.insert( make_pair(sm, vector<int>(SMDSEntity_Last,0))).first->second;
+ vector<smIdType>& aResVec =
+ aResMap.insert( make_pair(sm, vector<smIdType>(SMDSEntity_Last,0))).first->second;
myHelper = new SMESH_MesherHelper( aMesh );
myHelper->SetSubShape( aShape );
for ( TopExp_Explorer edge( aShape, TopAbs_EDGE ); edge.More() && !isQuadratic ; edge.Next() )
{
sm = aMesh.GetSubMesh( edge.Current() );
- vector<int>& nbElems = aResMap[ sm ];
+ vector<smIdType>& nbElems = aResMap[ sm ];
if ( SMDSEntity_Quad_Edge < (int) nbElems.size() )
isQuadratic = nbElems[ SMDSEntity_Quad_Edge ];
}
- int nbCircSegments = 0;
+ smIdType nbCircSegments = 0;
for ( int iE = 0; iE < circSide->NbEdges(); ++iE )
{
sm = aMesh.GetSubMesh( circSide->Edge( iE ));
- vector<int>& nbElems = aResMap[ sm ];
+ vector<smIdType>& nbElems = aResMap[ sm ];
if ( SMDSEntity_Quad_Edge < (int) nbElems.size() )
nbCircSegments += ( nbElems[ SMDSEntity_Edge ] + nbElems[ SMDSEntity_Quad_Edge ]);
}
- int nbQuads = nbCircSegments * ( layerPositions.size() - 1 );
- int nbTria = nbCircSegments;
- int nbNodes = ( nbCircSegments - 1 ) * ( layerPositions.size() - 2 );
+ smIdType nbQuads = nbCircSegments * ( layerPositions.size() - 1 );
+ smIdType nbTria = nbCircSegments;
+ smIdType nbNodes = ( nbCircSegments - 1 ) * ( layerPositions.size() - 2 );
if ( isQuadratic )
{
nbNodes += (( nbCircSegments - 1 ) * ( layerPositions.size() - 1 ) + // radial
if ( linSide1 )
{
// evaluation for linSides
- vector<int> aResVec(SMDSEntity_Last, 0);
+ vector<smIdType> aResVec(SMDSEntity_Last, 0);
if ( isQuadratic ) {
aResVec[SMDSEntity_Node ] = 2 * ( layerPositions.size() - 1 ) + 1;
aResVec[SMDSEntity_Quad_Edge] = layerPositions.size() - 1;
}
if( toCheckAll && nbFoundFaces != 0 ) return true;
return false;
-};
+}