void SmoothPos( const vector< double >& segLen, const double tol );
int Smooth(const int step, const bool isConcaveFace, bool findBest);
int Smooth(const int step, bool findBest, vector< _LayerEdge* >& toSmooth );
- int CheckNeiborsOnBoundary(vector< _LayerEdge* >* badNeibors = 0 );
+ int CheckNeiborsOnBoundary(vector< _LayerEdge* >* badNeibors = 0, bool * needSmooth = 0 );
void SmoothWoCheck();
bool SmoothOnEdge(Handle(ShapeAnalysis_Surface)& surface,
const TopoDS_Face& F,
_LayerEdge* edge = eos._edges[i];
if ( edge->_nodes.size() < 2 ) continue;
SMESH_TNodeXYZ tgtXYZ = edge->_nodes.back();
- //const gp_XYZ& prevXYZ = edge->PrevCheckPos();
- const gp_XYZ& prevXYZ = edge->PrevPos();
+ const gp_XYZ& prevXYZ = edge->PrevCheckPos();
+ //const gp_XYZ& prevXYZ = edge->PrevPos();
for ( size_t j = 0; j < edge->_simplices.size(); ++j )
if ( !edge->_simplices[j].IsForward( &prevXYZ, &tgtXYZ, vol ))
{
data.UnmarkEdges();
double vol;
+ //size_t iniNbBad = badSmooEdges.size();
for ( size_t i = 0; i < badSmooEdges.size(); ++i )
{
_LayerEdge* edge = badSmooEdges[i];
if ( edge->NbSteps() < 2 || edge->Is( _LayerEdge::MARKED ))
continue;
+
_EdgesOnShape* eos = data.GetShapeEdges( edge );
edge->InvalidateStep( edge->NbSteps(), *eos, /*restoreLength=*/true );
edge->Block( data );
edge->Set( _LayerEdge::MARKED );
+ // look for _LayerEdge's of bad _simplices
+ SMESH_TNodeXYZ tgtXYZ = edge->_nodes.back();
+ const gp_XYZ& prevXYZ = edge->PrevCheckPos();
+ for ( size_t j = 0; j < edge->_simplices.size(); ++j )
+ {
+ if ( edge->_simplices[j].IsForward( &prevXYZ, &tgtXYZ, vol ))
+ continue;
+ for ( size_t iN = 0; iN < edge->_neibors.size(); ++iN )
+ if ( edge->_simplices[j].Includes( edge->_neibors[iN]->_nodes.back() ))
+ badSmooEdges.push_back( edge->_neibors[iN] );
+ }
+
if ( eos->ShapeType() == TopAbs_VERTEX )
{
// re-smooth on analytical EDGEs
}
eoe->_edgeSmoother->Perform( data, surface, F, helper );
}
- }
- // look for _LayerEdge's of bad _simplices
- SMESH_TNodeXYZ tgtXYZ = edge->_nodes.back();
- const gp_XYZ& prevXYZ = edge->PrevCheckPos();
- for ( size_t j = 0; j < edge->_simplices.size(); ++j )
- {
- if ( edge->_simplices[j].IsForward( &prevXYZ, &tgtXYZ, vol ))
- continue;
- for ( size_t iN = 0; iN < edge->_neibors.size(); ++iN )
- if ( edge->_simplices[j].Includes( edge->_neibors[iN]->_nodes.back() ))
- badSmooEdges.push_back( edge->_neibors[iN] );
}
- }
+ } // loop on badSmooEdges
+
+
+ // check result of invalidation
int badNb = 0;
for ( size_t iEOS = 0; iEOS < eosC1.size(); ++iEOS )
gp_XYZ newPos;
for ( size_t i = iFrom; i < iTo; ++i )
{
- if ( _eos._edges[i]->Is( _LayerEdge::BLOCKED )) continue;
-
_LayerEdge* edge = _eos._edges[i];
SMDS_MeshNode* tgtNode = const_cast<SMDS_MeshNode*>( edge->_nodes.back() );
newPos = p0 * ( 1. - _leParams[i] ) + p1 * _leParams[i];
lineDir * ( curPos - pSrc0 ));
newPos = curPos + lineDir * shift / lineDir.SquareModulus();
}
+ if ( _eos._edges[i]->Is( _LayerEdge::BLOCKED ))
+ {
+ SMESH_TNodeXYZ pSrc( edge->_nodes[0] );
+ double curThick = pSrc.SquareDistance( tgtNode );
+ double newThink = ( pSrc - newPos ).SquareModulus();
+ if ( newThink > curThick )
+ continue;
+ }
edge->_pos.back() = newPos;
tgtNode->setXYZ( newPos.X(), newPos.Y(), newPos.Z() );
dumpMove( tgtNode );
*/
//================================================================================
-int _LayerEdge::CheckNeiborsOnBoundary( vector< _LayerEdge* >* badNeibors )
+int _LayerEdge::CheckNeiborsOnBoundary( vector< _LayerEdge* >* badNeibors, bool * needSmooth )
{
if ( ! Is( NEAR_BOUNDARY ))
return 0;
_LayerEdge* eN = _neibors[iN];
if ( eN->_nodes[0]->getshapeId() == _nodes[0]->getshapeId() )
continue;
+ if ( needSmooth )
+ *needSmooth |= ( eN->Is( _LayerEdge::BLOCKED ) || eN->Is( _LayerEdge::NORMAL_UPDATED ));
+
SMESH_TNodeXYZ curPosN ( eN->_nodes.back() );
SMESH_TNodeXYZ prevPosN( eN->_nodes[0] );
for ( size_t i = 0; i < eN->_simplices.size(); ++i )
int _LayerEdge::Smooth(const int step, bool findBest, vector< _LayerEdge* >& toSmooth )
{
- if ( !Is( MOVED ) || Is( SMOOTHED ))
+ if ( !Is( MOVED ) || Is( SMOOTHED ) || Is( BLOCKED ))
return 0; // shape of simplices not changed
if ( _simplices.size() < 2 )
return 0; // _LayerEdge inflated along EDGE or FACE
}
int nbBad = _simplices.size() - nbOkBefore;
+ bool bndNeedSmooth = false;
if ( nbBad == 0 )
- nbBad = CheckNeiborsOnBoundary();
+ nbBad = CheckNeiborsOnBoundary( 0, & bndNeedSmooth );
if ( nbBad > 0 )
Set( DISTORTED );
// evaluate min angle
- if ( nbBad == 0 && !findBest )
+ if ( nbBad == 0 && !findBest && !bndNeedSmooth )
{
size_t nbGoodAngles = _simplices.size();
double angle;
if ( neibor->_maxLen < neibor->_len )
{
_EdgesOnShape* eos = data.GetShapeEdges( neibor );
- neibor->InvalidateStep( neibor->NbSteps(), *eos, /*restoreLength=*/true );
+ while ( neibor->_len > neibor->_maxLen &&
+ neibor->NbSteps() > 1 )
+ neibor->InvalidateStep( neibor->NbSteps(), *eos, /*restoreLength=*/true );
neibor->SetNewLength( neibor->_maxLen, *eos, data.GetHelper() );
}
queue.push( neibor );
dumpMove( n );
if ( restoreLength )
+ {
_len -= ( nXYZ.XYZ() - curXYZ ).Modulus() / _lenFactor;
+ }
}
}
{
swapped = false;
for ( size_t j = 1; j < edge._pos.size(); ++j )
- if ( segLen[j] < segLen[j-1] )
+ if ( segLen[j] > segLen.back() )
+ {
+ segLen[j] = segLen[j-1];
+ edge._pos[j] = edge._pos[j-1];
+ }
+ else if ( segLen[j] < segLen[j-1] )
{
std::swap( segLen[j], segLen[j-1] );
std::swap( edge._pos[j], edge._pos[j-1] );