X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FControls%2FSMESH_Controls.cxx;h=3ebd18b907798734bf2ebb70ef940725c955589b;hp=2bf885a7a29a0d1500bc03e04f0818c4e2eda230;hb=2875648bdbc323df97bdb879b60673a2de776889;hpb=090aff07266d376ae028ae43434bdea7c0a0f9bb diff --git a/src/Controls/SMESH_Controls.cxx b/src/Controls/SMESH_Controls.cxx index 2bf885a7a..3ebd18b90 100644 --- a/src/Controls/SMESH_Controls.cxx +++ b/src/Controls/SMESH_Controls.cxx @@ -1,20 +1,20 @@ // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org #include "SMESH_ControlsDef.hxx" @@ -45,17 +45,18 @@ #include "SMDS_Iterator.hxx" #include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" +#include "SMDS_VolumeTool.hxx" /* - AUXILIARY METHODS + AUXILIARY METHODS */ namespace{ inline double getAngle( const gp_XYZ& P1, const gp_XYZ& P2, const gp_XYZ& P3 ) { gp_Vec v1( P1 - P2 ), v2( P3 - P2 ); - + return v1.Magnitude() < gp::Resolution() || v2.Magnitude() < gp::Resolution() ? 0 : v1.Angle( v2 ); } @@ -80,17 +81,17 @@ namespace{ return aDist; } - int getNbMultiConnection( SMDS_Mesh* theMesh, const int theId ) + int getNbMultiConnection( const SMDS_Mesh* theMesh, const int theId ) { if ( theMesh == 0 ) return 0; - + const SMDS_MeshElement* anEdge = theMesh->FindElement( theId ); if ( anEdge == 0 || anEdge->GetType() != SMDSAbs_Edge || anEdge->NbNodes() != 2 ) return 0; - + TColStd_MapOfInteger aMap; - + int aResult = 0; SMDS_ElemIteratorPtr anIter = anEdge->nodesIterator(); if ( anIter != 0 ) { @@ -103,7 +104,7 @@ namespace{ const SMDS_MeshElement* anElem = anElemIter->next(); if ( anElem != 0 && anElem->GetType() != SMDSAbs_Edge ) { int anId = anElem->GetID(); - + if ( anIter->more() ) // i.e. first node aMap.Add( anId ); else if ( aMap.Contains( anId ) ) @@ -112,7 +113,7 @@ namespace{ } } } - + return aResult; } @@ -136,7 +137,7 @@ NumericalFunctor::NumericalFunctor(): myPrecision = -1; } -void NumericalFunctor::SetMesh( SMDS_Mesh* theMesh ) +void NumericalFunctor::SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; } @@ -203,6 +204,42 @@ double NumericalFunctor::GetValue( long theId ) return 0.; } +//======================================================================= +//function : GetValue +//purpose : +//======================================================================= + +double Volume::GetValue( long theElementId ) +{ + if ( theElementId && myMesh ) { + SMDS_VolumeTool aVolumeTool; + if ( aVolumeTool.Set( myMesh->FindElement( theElementId ))) + return aVolumeTool.GetSize(); + } + return 0; +} + +//======================================================================= +//function : GetBadRate +//purpose : meaningless as it is not quality control functor +//======================================================================= + +double Volume::GetBadRate( double Value, int /*nbNodes*/ ) const +{ + return Value; +} + +//======================================================================= +//function : GetType +//purpose : +//======================================================================= + +SMDSAbs_ElementType Volume::GetType() const +{ + return SMDSAbs_Volume; +} + + /* Class : MinimumAngle Description : Functor for calculation of minimum angle @@ -212,32 +249,24 @@ double MinimumAngle::GetValue( const TSequenceOfXYZ& P ) { double aMin; - if ( P.size() == 3 ) - { - double A0 = getAngle( P( 3 ), P( 1 ), P( 2 ) ); - double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) ); - double A2 = getAngle( P( 2 ), P( 3 ), P( 1 ) ); + if (P.size() <3) + return 0.; - aMin = Min( A0, Min( A1, A2 ) ); - } - else if ( P.size() == 4 ) - { - double A0 = getAngle( P( 4 ), P( 1 ), P( 2 ) ); - double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) ); - double A2 = getAngle( P( 2 ), P( 3 ), P( 4 ) ); - double A3 = getAngle( P( 3 ), P( 4 ), P( 1 ) ); - - aMin = Min( Min( A0, A1 ), Min( A2, A3 ) ); + aMin = getAngle(P( P.size() ), P( 1 ), P( 2 )); + aMin = Min(aMin,getAngle(P( P.size()-1 ), P( P.size() ), P( 1 ))); + + for (int i=2; i 3) + aArea = getArea( P( 1 ), P( 2 ), P( 3 ) ); else return 0; + + for (int i=4; i<=P.size(); i++) + aArea += getArea(P(1),P(i-1),P(i)); + return aArea; } double Area::GetBadRate( double Value, int /*nbNodes*/ ) const { + // meaningless as it is not quality control functor return Value; } @@ -800,6 +849,7 @@ double Length::GetValue( const TSequenceOfXYZ& P ) double Length::GetBadRate( double Value, int /*nbNodes*/ ) const { + // meaningless as it is not quality control functor return Value; } @@ -818,16 +868,16 @@ double Length2D::GetValue( long theElementId) TSequenceOfXYZ P; if (GetPoints(theElementId,P)){ - + double aVal;// = GetValue( P ); const SMDS_MeshElement* aElem = myMesh->FindElement( theElementId ); SMDSAbs_ElementType aType = aElem->GetType(); - + int len = P.size(); - + switch (aType){ case SMDSAbs_All: - case SMDSAbs_Node: + case SMDSAbs_Node: case SMDSAbs_Edge: if (len == 2){ aVal = getDistance( P( 1 ), P( 2 ) ); @@ -859,7 +909,7 @@ double Length2D::GetValue( long theElementId) double L6 = getDistance(P( 3 ),P( 4 )); aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); break; - } + } else if (len == 5){ // piramids double L1 = getDistance(P( 1 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 3 )); @@ -869,7 +919,7 @@ double Length2D::GetValue( long theElementId) double L6 = getDistance(P( 2 ),P( 5 )); double L7 = getDistance(P( 3 ),P( 5 )); double L8 = getDistance(P( 4 ),P( 5 )); - + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); aVal = Max(aVal,Max(L7,L8)); break; @@ -884,7 +934,7 @@ double Length2D::GetValue( long theElementId) double L7 = getDistance(P( 1 ),P( 4 )); double L8 = getDistance(P( 2 ),P( 5 )); double L9 = getDistance(P( 3 ),P( 6 )); - + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); aVal = Max(aVal,Max(Max(L7,L8),L9)); break; @@ -902,17 +952,17 @@ double Length2D::GetValue( long theElementId) double L10= getDistance(P( 2 ),P( 6 )); double L11= getDistance(P( 3 ),P( 7 )); double L12= getDistance(P( 4 ),P( 8 )); - + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); aVal = Max(aVal,Max(Max(L7,L8),Max(L9,L10))); aVal = Max(aVal,Max(L11,L12)); break; - + } - - default: aVal=-1; + + default: aVal=-1; } - + if (aVal <0){ return 0.; } @@ -922,7 +972,7 @@ double Length2D::GetValue( long theElementId) double prec = pow( 10., (double)( myPrecision ) ); aVal = floor( aVal * prec + 0.5 ) / prec; } - + return aVal; } @@ -931,6 +981,7 @@ double Length2D::GetValue( long theElementId) double Length2D::GetBadRate( double Value, int /*nbNodes*/ ) const { + // meaningless as it is not quality control functor return Value; } @@ -963,7 +1014,7 @@ void Length2D::GetValues(TValues& theValues){ SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); long aNodeId[2]; gp_Pnt P[3]; - + double aLength; const SMDS_MeshElement* aNode; if(aNodesIter->more()){ @@ -972,24 +1023,24 @@ void Length2D::GetValues(TValues& theValues){ P[0] = P[1] = gp_Pnt(aNodes->X(),aNodes->Y(),aNodes->Z()); aNodeId[0] = aNodeId[1] = aNode->GetID(); aLength = 0; - } + } for(; aNodesIter->more(); ){ aNode = aNodesIter->next(); const SMDS_MeshNode* aNodes = (SMDS_MeshNode*) aNode; long anId = aNode->GetID(); - + P[2] = gp_Pnt(aNodes->X(),aNodes->Y(),aNodes->Z()); aLength = P[1].Distance(P[2]); - + Value aValue(aLength,aNodeId[1],anId); aNodeId[1] = anId; P[1] = P[2]; theValues.insert(aValue); } - + aLength = P[0].Distance(P[1]); - + Value aValue(aLength,aNodeId[0],aNodeId[1]); theValues.insert(aValue); } @@ -1010,6 +1061,7 @@ double MultiConnection::GetValue( long theId ) double MultiConnection::GetBadRate( double Value, int /*nbNodes*/ ) const { + // meaningless as it is not quality control functor return Value; } @@ -1031,20 +1083,19 @@ double MultiConnection2D::GetValue( long theElementId ) { TSequenceOfXYZ P; int aResult = 0; - + if (GetPoints(theElementId,P)){ - double aVal; const SMDS_MeshElement* anFaceElem = myMesh->FindElement( theElementId ); SMDSAbs_ElementType aType = anFaceElem->GetType(); - + int len = P.size(); - + TColStd_MapOfInteger aMap; int aResult = 0; - + switch (aType){ case SMDSAbs_All: - case SMDSAbs_Node: + case SMDSAbs_Node: case SMDSAbs_Edge: case SMDSAbs_Face: if (len == 3){ // triangles @@ -1074,20 +1125,21 @@ double MultiConnection2D::GetValue( long theElementId ) } } } - + aResult = Max(Max(Nb[0],Nb[1]),Nb[2]); } break; case SMDSAbs_Volume: default: aResult=0; } - + } return aResult;//getNbMultiConnection( myMesh, theId ); } double MultiConnection2D::GetBadRate( double Value, int /*nbNodes*/ ) const { + // meaningless as it is not quality control functor return Value; } @@ -1115,7 +1167,6 @@ void MultiConnection2D::GetValues(MValues& theValues){ SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); for(; anIter->more(); ){ const SMDS_MeshFace* anElem = anIter->next(); - long anElemId = anElem->GetID(); SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); long aNodeId[3]; @@ -1133,7 +1184,7 @@ void MultiConnection2D::GetValues(MValues& theValues){ aNode2 = (SMDS_MeshNode*) aNodesIter->next(); long anId = aNode2->GetID(); aNodeId[2] = anId; - + Value aValue(aNodeId[1],aNodeId[2]); MValues::iterator aItr = theValues.find(aValue); if (aItr != theValues.end()){ @@ -1165,6 +1216,37 @@ void MultiConnection2D::GetValues(MValues& theValues){ PREDICATES */ +/* + Class : BadOrientedVolume + Description : Predicate bad oriented volumes +*/ + +BadOrientedVolume::BadOrientedVolume() +{ + myMesh = 0; +} + +void BadOrientedVolume::SetMesh( const SMDS_Mesh* theMesh ) +{ + myMesh = theMesh; +} + +bool BadOrientedVolume::IsSatisfy( long theId ) +{ + if ( myMesh == 0 ) + return false; + + SMDS_VolumeTool vTool( myMesh->FindElement( theId )); + return !vTool.IsForward(); +} + +SMDSAbs_ElementType BadOrientedVolume::GetType() const +{ + return SMDSAbs_Volume; +} + + + /* Class : FreeBorders Description : Predicate for free borders @@ -1175,7 +1257,7 @@ FreeBorders::FreeBorders() myMesh = 0; } -void FreeBorders::SetMesh( SMDS_Mesh* theMesh ) +void FreeBorders::SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; } @@ -1200,7 +1282,7 @@ FreeEdges::FreeEdges() myMesh = 0; } -void FreeEdges::SetMesh( SMDS_Mesh* theMesh ) +void FreeEdges::SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; } @@ -1218,7 +1300,7 @@ bool FreeEdges::IsFreeEdge( const SMDS_MeshNode** theNodes, const int theFaceId { int anId = anElem->GetID(); - if ( i == 0 ) + if ( i == 0 ) aMap.Add( anId ); else if ( aMap.Contains( anId ) && anId != theFaceId ) return false; @@ -1238,7 +1320,12 @@ bool FreeEdges::IsSatisfy( long theId ) return false; int nbNodes = aFace->NbNodes(); - const SMDS_MeshNode* aNodes[ nbNodes ]; + //const SMDS_MeshNode* aNodes[ nbNodes ]; +#ifndef WNT + const SMDS_MeshNode* aNodes [nbNodes]; +#else + const SMDS_MeshNode** aNodes = (const SMDS_MeshNode **)new SMDS_MeshNode*[nbNodes]; +#endif int i = 0; SMDS_ElemIteratorPtr anIter = aFace->nodesIterator(); if ( anIter != 0 ) @@ -1253,13 +1340,20 @@ bool FreeEdges::IsSatisfy( long theId ) } for ( int i = 0; i < nbNodes - 1; i++ ) - if ( IsFreeEdge( &aNodes[ i ], theId ) ) + if ( IsFreeEdge( &aNodes[ i ], theId ) ) { +#ifdef WNT + delete [] aNodes; +#endif return true; + } aNodes[ 1 ] = aNodes[ nbNodes - 1 ]; - - return IsFreeEdge( &aNodes[ 0 ], theId ); - + const Standard_Boolean isFree = IsFreeEdge( &aNodes[ 0 ], theId ); +#ifdef WNT + delete [] aNodes; +#endif +// return + return isFree; } SMDSAbs_ElementType FreeEdges::GetType() const @@ -1284,7 +1378,7 @@ bool FreeEdges::Border::operator<(const FreeEdges::Border& x) const{ } inline void UpdateBorders(const FreeEdges::Border& theBorder, - FreeEdges::TBorders& theRegistry, + FreeEdges::TBorders& theRegistry, FreeEdges::TBorders& theContainer) { if(theRegistry.find(theBorder) == theRegistry.end()){ @@ -1308,7 +1402,7 @@ void FreeEdges::GetBoreders(TBorders& theBorders) if(aNodesIter->more()){ aNode = aNodesIter->next(); aNodeId[0] = aNodeId[1] = aNode->GetID(); - } + } for(; aNodesIter->more(); ){ aNode = aNodesIter->next(); long anId = aNode->GetID(); @@ -1345,9 +1439,9 @@ RangeOfIds::RangeOfIds() //======================================================================= // name : SetMesh -// Purpose : Set mesh +// Purpose : Set mesh //======================================================================= -void RangeOfIds::SetMesh( SMDS_Mesh* theMesh ) +void RangeOfIds::SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; } @@ -1391,9 +1485,9 @@ void RangeOfIds::GetRangeStr( TCollection_AsciiString& theResStr ) TCollection_AsciiString aStr; if ( aMinId != IntegerFirst() ) aStr += aMinId; - + aStr += "-"; - + if ( aMaxId != IntegerLast() ) aStr += aMaxId; @@ -1461,7 +1555,7 @@ bool RangeOfIds::SetRangeStr( const TCollection_AsciiString& theStr ) { tmpStr = aStr.Token( ",", i++ ); int aPos = tmpStr.Search( '-' ); - + if ( aPos == -1 ) { if ( tmpStr.IsIntegerValue() ) @@ -1473,14 +1567,14 @@ bool RangeOfIds::SetRangeStr( const TCollection_AsciiString& theStr ) { TCollection_AsciiString aMaxStr = tmpStr.Split( aPos ); TCollection_AsciiString aMinStr = tmpStr; - + while ( aMinStr.Search( "-" ) != -1 ) aMinStr.RemoveAll( '-' ); while ( aMaxStr.Search( "-" ) != -1 ) aMaxStr.RemoveAll( '-' ); if ( !aMinStr.IsEmpty() && !aMinStr.IsIntegerValue() || !aMaxStr.IsEmpty() && !aMaxStr.IsIntegerValue() ) return false; - + myMin.Append( aMinStr.IsEmpty() ? IntegerFirst() : aMinStr.IntegerValue() ); myMax.Append( aMaxStr.IsEmpty() ? IntegerLast() : aMaxStr.IntegerValue() ); } @@ -1527,7 +1621,7 @@ bool RangeOfIds::IsSatisfy( long theId ) if ( anElem == 0 || myType != anElem->GetType() && myType != SMDSAbs_All ) return false; } - + if ( myIds.Contains( theId ) ) return true; @@ -1549,7 +1643,7 @@ Comparator::Comparator(): Comparator::~Comparator() {} -void Comparator::SetMesh( SMDS_Mesh* theMesh ) +void Comparator::SetMesh( const SMDS_Mesh* theMesh ) { if ( myFunctor ) myFunctor->SetMesh( theMesh ); @@ -1634,7 +1728,7 @@ bool LogicalNOT::IsSatisfy( long theId ) return myPredicate && !myPredicate->IsSatisfy( theId ); } -void LogicalNOT::SetMesh( SMDS_Mesh* theMesh ) +void LogicalNOT::SetMesh( const SMDS_Mesh* theMesh ) { if ( myPredicate ) myPredicate->SetMesh( theMesh ); @@ -1661,7 +1755,7 @@ LogicalBinary::LogicalBinary() LogicalBinary::~LogicalBinary() {} -void LogicalBinary::SetMesh( SMDS_Mesh* theMesh ) +void LogicalBinary::SetMesh( const SMDS_Mesh* theMesh ) { if ( myPredicate1 ) myPredicate1->SetMesh( theMesh ); @@ -1698,10 +1792,10 @@ SMDSAbs_ElementType LogicalBinary::GetType() const */ bool LogicalAND::IsSatisfy( long theId ) { - return - myPredicate1 && - myPredicate2 && - myPredicate1->IsSatisfy( theId ) && + return + myPredicate1 && + myPredicate2 && + myPredicate1->IsSatisfy( theId ) && myPredicate2->IsSatisfy( theId ); } @@ -1712,10 +1806,10 @@ bool LogicalAND::IsSatisfy( long theId ) */ bool LogicalOR::IsSatisfy( long theId ) { - return - myPredicate1 && - myPredicate2 && - myPredicate1->IsSatisfy( theId ) || + return + myPredicate1 && + myPredicate2 && + myPredicate1->IsSatisfy( theId ) || myPredicate2->IsSatisfy( theId ); } @@ -1735,11 +1829,10 @@ void Filter::SetPredicate( PredicatePtr thePredicate ) myPredicate = thePredicate; } - -template -void FillSequence(const TIterator& theIterator, - TPredicate& thePredicate, - Filter::TIdSequence& theSequence) +template +inline void FillSequence(const TIterator& theIterator, + TPredicate& thePredicate, + Filter::TIdSequence& theSequence) { if ( theIterator ) { while( theIterator->more() ) { @@ -1751,40 +1844,46 @@ void FillSequence(const TIterator& theIterator, } } -Filter::TIdSequence -Filter::GetElementsId( SMDS_Mesh* theMesh ) +void +Filter:: +GetElementsId( const SMDS_Mesh* theMesh, + PredicatePtr thePredicate, + TIdSequence& theSequence ) { - TIdSequence aSequence; - if ( !theMesh || !myPredicate ) return aSequence; + theSequence.clear(); + + if ( !theMesh || !thePredicate ) + return; - myPredicate->SetMesh( theMesh ); + thePredicate->SetMesh( theMesh ); - SMDSAbs_ElementType aType = myPredicate->GetType(); + SMDSAbs_ElementType aType = thePredicate->GetType(); switch(aType){ - case SMDSAbs_Node:{ - FillSequence(theMesh->nodesIterator(),myPredicate,aSequence); + case SMDSAbs_Node: + FillSequence(theMesh->nodesIterator(),thePredicate,theSequence); break; - } - case SMDSAbs_Edge:{ - FillSequence(theMesh->edgesIterator(),myPredicate,aSequence); + case SMDSAbs_Edge: + FillSequence(theMesh->edgesIterator(),thePredicate,theSequence); break; - } - case SMDSAbs_Face:{ - FillSequence(theMesh->facesIterator(),myPredicate,aSequence); + case SMDSAbs_Face: + FillSequence(theMesh->facesIterator(),thePredicate,theSequence); break; - } - case SMDSAbs_Volume:{ - FillSequence(theMesh->volumesIterator(),myPredicate,aSequence); + case SMDSAbs_Volume: + FillSequence(theMesh->volumesIterator(),thePredicate,theSequence); break; - } - case SMDSAbs_All:{ - FillSequence(theMesh->edgesIterator(),myPredicate,aSequence); - FillSequence(theMesh->facesIterator(),myPredicate,aSequence); - FillSequence(theMesh->volumesIterator(),myPredicate,aSequence); + case SMDSAbs_All: + FillSequence(theMesh->edgesIterator(),thePredicate,theSequence); + FillSequence(theMesh->facesIterator(),thePredicate,theSequence); + FillSequence(theMesh->volumesIterator(),thePredicate,theSequence); break; } - } - return aSequence; +} + +void +Filter::GetElementsId( const SMDS_Mesh* theMesh, + Filter::TIdSequence& theSequence ) +{ + GetElementsId(theMesh,myPredicate,theSequence); } /* @@ -1793,9 +1892,9 @@ Filter::GetElementsId( SMDS_Mesh* theMesh ) typedef std::set TMapOfFacePtr; -/* +/* Internal class Link -*/ +*/ ManifoldPart::Link::Link( SMDS_MeshNode* theNode1, SMDS_MeshNode* theNode2 ) @@ -1832,7 +1931,7 @@ bool ManifoldPart::Link::operator<( const ManifoldPart::Link& x ) const bool ManifoldPart::IsEqual( const ManifoldPart::Link& theLink1, const ManifoldPart::Link& theLink2 ) -{ +{ return theLink1.IsEqual( theLink2 ); } @@ -1848,7 +1947,7 @@ ManifoldPart::~ManifoldPart() myMesh = 0; } -void ManifoldPart::SetMesh( SMDS_Mesh* theMesh ) +void ManifoldPart::SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; process(); @@ -1878,7 +1977,7 @@ bool ManifoldPart::process() { myMapIds.Clear(); myMapBadGeomIds.Clear(); - + myAllFacePtr.clear(); myAllFacePtrIntDMap.clear(); if ( !myMesh ) @@ -1910,7 +2009,7 @@ bool ManifoldPart::process() if ( fi == aStartIndx ) isStartTreat = true; // as result next time when fi will be equal to aStartIndx - + SMDS_MeshFace* aFacePtr = myAllFacePtr[ fi ]; if ( aMapOfTreated.Contains( aFacePtr->GetID() ) ) continue; @@ -1943,7 +2042,7 @@ static void getLinks( const SMDS_MeshFace* theFace, SMDS_MeshNode* aNode = 0; for ( ; aNodeItr->more() && i <= aNbNode; ) { - + SMDS_MeshNode* aN1 = (SMDS_MeshNode*)aNodeItr->next(); if ( i == 1 ) aNode = aN1; @@ -1967,7 +2066,7 @@ static gp_XYZ getNormale( const SMDS_MeshFace* theFace ) SMDS_MeshNode* aNode = (SMDS_MeshNode*)aNodeItr->next(); anArrOfXYZ.SetValue(i, gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) ); } - + gp_XYZ q1 = anArrOfXYZ.Value(2) - anArrOfXYZ.Value(1); gp_XYZ q2 = anArrOfXYZ.Value(3) - anArrOfXYZ.Value(1); n = q1 ^ q2; @@ -1992,7 +2091,7 @@ bool ManifoldPart::findConnected theResFaces.Clear(); if ( !theAllFacePtrInt.size() ) return false; - + if ( getNormale( theStartFace ).SquareModulus() <= gp::Resolution() ) { myMapBadGeomIds.Add( theStartFace->GetID() ); @@ -2004,7 +2103,7 @@ bool ManifoldPart::findConnected theResFaces.Add( theStartFace->GetID() ); ManifoldPart::TDataMapOfLinkFacePtr aDMapLinkFace; - expandBoundary( aMapOfBoundary, aSeqOfBoundary, + expandBoundary( aMapOfBoundary, aSeqOfBoundary, aDMapLinkFace, theNonManifold, theStartFace ); bool isDone = false; @@ -2022,7 +2121,7 @@ bool ManifoldPart::findConnected ManifoldPart::TVectorOfFacePtr aFaces; // find next - if ( myIsOnlyManifold && + if ( myIsOnlyManifold && (theNonManifold.find( aLink ) != theNonManifold.end()) ) continue; else @@ -2046,7 +2145,7 @@ bool ManifoldPart::findConnected continue; } } - + // compare normal with normals of neighbor element SMDS_MeshFace* aPrevFace = aDMapLinkFace[ aLink ]; ManifoldPart::TVectorOfFacePtr::iterator pFace = aFaces.begin(); @@ -2065,7 +2164,7 @@ bool ManifoldPart::findConnected continue; // add new element to connected and extend the boundaries. theResFaces.Add( anNextFaceID ); - expandBoundary( aMapOfBoundary, aSeqOfBoundary, + expandBoundary( aMapOfBoundary, aSeqOfBoundary, aDMapLinkFace, theNonManifold, aNextFace ); isToReset = true; } @@ -2101,7 +2200,7 @@ void ManifoldPart::expandBoundary { ManifoldPart::TVectorOfLink aLinks; getLinks( theNextFace, aLinks ); - int aNbLink = aLinks.size(); + int aNbLink = (int)aLinks.size(); for ( int i = 0; i < aNbLink; i++ ) { ManifoldPart::Link aLink = aLinks[ i ]; @@ -2177,8 +2276,8 @@ ElementsOnSurface::~ElementsOnSurface() myMesh = 0; } -void ElementsOnSurface::SetMesh( SMDS_Mesh* theMesh ) -{ +void ElementsOnSurface::SetMesh( const SMDS_Mesh* theMesh ) +{ if ( myMesh == theMesh ) return; myMesh = theMesh;