X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Filter_i.cxx;h=2feeadf0a18cc2dca507601d9f9e70cad2c4dbfa;hp=05d5f38482a1137aeee5e536db301aca76912719;hb=4f27e7392a109bdc465b943b8d92d969e93f129c;hpb=c38c10811a065cf5b13e8807ed71864d92ca7d80 diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index 05d5f3848..2feeadf0a 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -1,22 +1,22 @@ // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // // 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 // // @@ -67,7 +67,7 @@ using namespace SMESH::Controls; namespace SMESH { - Predicate_i* + Predicate_i* GetPredicate( Predicate_ptr thePredicate ) { return DownCast(thePredicate); @@ -103,7 +103,7 @@ static bool IsContains( const SMESHDS_Mesh* theMeshDS, TopAbs_ShapeEnum theAvoidShapeEnum = TopAbs_SHAPE ) { TopExp_Explorer anExp( theShape,theFindShapeEnum,theAvoidShapeEnum ); - + while( anExp.More() ) { const TopoDS_Shape& aShape = anExp.Current(); @@ -159,7 +159,7 @@ bool Controls::BelongToGeom::IsSatisfy( long theId ) } } } - + return false; } @@ -178,7 +178,7 @@ TopoDS_Shape Controls::BelongToGeom::GetShape() return myShape; } -const SMESHDS_Mesh* +const SMESHDS_Mesh* Controls::BelongToGeom:: GetMeshDS() const { @@ -249,7 +249,7 @@ bool Controls::LyingOnGeom::IsSatisfy( long theId ) } } } - + return false; } @@ -268,7 +268,7 @@ TopoDS_Shape Controls::LyingOnGeom::GetShape() return myShape; } -const SMESHDS_Mesh* +const SMESHDS_Mesh* Controls::LyingOnGeom:: GetMeshDS() const { @@ -276,39 +276,39 @@ GetMeshDS() const } bool Controls::LyingOnGeom::Contains( const SMESHDS_Mesh* theMeshDS, - const TopoDS_Shape& theShape, - const SMDS_MeshElement* theElem, - TopAbs_ShapeEnum theFindShapeEnum, - TopAbs_ShapeEnum theAvoidShapeEnum ) + const TopoDS_Shape& theShape, + const SMDS_MeshElement* theElem, + TopAbs_ShapeEnum theFindShapeEnum, + TopAbs_ShapeEnum theAvoidShapeEnum ) { if (IsContains(theMeshDS, theShape, theElem, theFindShapeEnum, theAvoidShapeEnum)) return true; - + TopTools_IndexedMapOfShape aSubShapes; TopExp::MapShapes( theShape, aSubShapes ); - + for (int i = 1; i <= aSubShapes.Extent(); i++) - { - const TopoDS_Shape& aShape = aSubShapes.FindKey(i); - - if( SMESHDS_SubMesh* aSubMesh = theMeshDS->MeshElements( aShape ) ){ - if( aSubMesh->Contains( theElem ) ) - return true; - - SMDS_NodeIteratorPtr aNodeIt = aSubMesh->GetNodes(); - while ( aNodeIt->more() ) - { - const SMDS_MeshNode* aNode = static_cast(aNodeIt->next()); - SMDS_ElemIteratorPtr anElemIt = aNode->GetInverseElementIterator(); - while ( anElemIt->more() ) - { - const SMDS_MeshElement* anElement = static_cast(anElemIt->next()); - if (anElement == theElem) - return true; - } - } + { + const TopoDS_Shape& aShape = aSubShapes.FindKey(i); + + if( SMESHDS_SubMesh* aSubMesh = theMeshDS->MeshElements( aShape ) ){ + if( aSubMesh->Contains( theElem ) ) + return true; + + SMDS_NodeIteratorPtr aNodeIt = aSubMesh->GetNodes(); + while ( aNodeIt->more() ) + { + const SMDS_MeshNode* aNode = static_cast(aNodeIt->next()); + SMDS_ElemIteratorPtr anElemIt = aNode->GetInverseElementIterator(); + while ( anElemIt->more() ) + { + const SMDS_MeshElement* anElement = static_cast(anElemIt->next()); + if (anElement == theElem) + return true; + } } } + } return false; } @@ -317,16 +317,16 @@ bool Controls::LyingOnGeom::Contains( const SMESHDS_Mesh* theMeshDS, AUXILIARY METHODS */ -inline -const SMDS_Mesh* +inline +const SMDS_Mesh* MeshPtr2SMDSMesh( SMESH_Mesh_ptr theMesh ) { SMESH_Mesh_i* anImplPtr = DownCast(theMesh); return anImplPtr ? anImplPtr->GetImpl().GetMeshDS() : 0; } -inline -SMESH::long_array* +inline +SMESH::long_array* toArray( const TColStd_ListOfInteger& aList ) { SMESH::long_array_var anArray = new SMESH::long_array; @@ -339,8 +339,8 @@ toArray( const TColStd_ListOfInteger& aList ) return anArray._retn(); } -inline -SMESH::double_array* +inline +SMESH::double_array* toArray( const TColStd_ListOfReal& aList ) { SMESH::double_array_var anArray = new SMESH::double_array; @@ -376,7 +376,7 @@ static TopoDS_Shape getShapeByName( const char* theName ) { SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy(); - if ( aStudy != 0 ) + if (!CORBA::is_nil(aStudy)) { SALOMEDS::Study::ListOfSObject_var aList = aStudy->FindObjectByName( theName, "GEOM" ); @@ -385,7 +385,7 @@ static TopoDS_Shape getShapeByName( const char* theName ) GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow( aList[ 0 ]->GetObject() ); if ( !aGeomObj->_is_nil() ) { - GEOM::GEOM_Gen_var aGEOMGen = SMESH_Gen_i::GetGeomEngine(); + GEOM::GEOM_Gen_var aGEOMGen = SMESH_Gen_i::GetGeomEngine(); TopoDS_Shape aLocShape = aSMESHGen->GetShapeReader()->GetShape( aGEOMGen, aGeomObj ); return aLocShape; } @@ -403,12 +403,12 @@ static TopoDS_Shape getShapeByName( const char* theName ) /* Class : Functor_i - Description : An abstact class for all functors + Description : An abstact class for all functors */ -Functor_i::Functor_i(): +Functor_i::Functor_i(): SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() ) { - PortableServer::ObjectId_var anObjectId = + PortableServer::ObjectId_var anObjectId = SMESH_Gen_i::GetPOA()->activate_object( this ); } @@ -565,6 +565,21 @@ FunctorType Area_i::GetFunctorType() return SMESH::FT_Area; } +/* + Class : Volume3D_i + Description : Functor for calculating volume of 3D element +*/ +Volume3D_i::Volume3D_i() +{ + myNumericalFunctorPtr.reset( new Controls::Volume() ); + myFunctorPtr = myNumericalFunctorPtr; +} + +FunctorType Volume3D_i::GetFunctorType() +{ + return SMESH::FT_Volume3D; +} + /* Class : Length_i Description : Functor for calculating length off edge @@ -600,7 +615,7 @@ SMESH::Length2D::Values* Length2D_i::GetValues() INFOS("Length2D_i::GetValues"); SMESH::Controls::Length2D::TValues aValues; myLength2DPtr->GetValues( aValues ); - + long i = 0, iEnd = aValues.size(); SMESH::Length2D::Values_var aResult = new SMESH::Length2D::Values(iEnd); @@ -610,11 +625,10 @@ SMESH::Length2D::Values* Length2D_i::GetValues() { const SMESH::Controls::Length2D::Value& aVal = *anIter; SMESH::Length2D::Value &aValue = aResult[ i ]; - + aValue.myLength = aVal.myLength; aValue.myPnt1 = aVal.myPntId[ 0 ]; aValue.myPnt2 = aVal.myPntId[ 1 ]; - } INFOS("Length2D_i::GetValuess~"); @@ -656,7 +670,7 @@ SMESH::MultiConnection2D::Values* MultiConnection2D_i::GetValues() INFOS("MultiConnection2D_i::GetValues"); SMESH::Controls::MultiConnection2D::MValues aValues; myMulticonnection2DPtr->GetValues( aValues ); - + long i = 0, iEnd = aValues.size(); SMESH::MultiConnection2D::Values_var aResult = new SMESH::MultiConnection2D::Values(iEnd); @@ -666,11 +680,10 @@ SMESH::MultiConnection2D::Values* MultiConnection2D_i::GetValues() { const SMESH::Controls::MultiConnection2D::Value& aVal = (*anIter).first; SMESH::MultiConnection2D::Value &aValue = aResult[ i ]; - + aValue.myPnt1 = aVal.myPntId[ 0 ]; aValue.myPnt2 = aVal.myPntId[ 1 ]; aValue.myNbConnects = (*anIter).second; - } INFOS("Multiconnection2D_i::GetValuess~"); @@ -957,7 +970,7 @@ SMESH::FreeEdges::Borders* FreeEdges_i::GetBorders() INFOS("FreeEdges_i::GetBorders"); SMESH::Controls::FreeEdges::TBorders aBorders; myFreeEdgesPtr->GetBoreders( aBorders ); - + long i = 0, iEnd = aBorders.size(); SMESH::FreeEdges::Borders_var aResult = new SMESH::FreeEdges::Borders(iEnd); @@ -967,7 +980,7 @@ SMESH::FreeEdges::Borders* FreeEdges_i::GetBorders() { const SMESH::Controls::FreeEdges::Border& aBord = *anIter; SMESH::FreeEdges::Border &aBorder = aResult[ i ]; - + aBorder.myElemId = aBord.myElemId; aBorder.myPnt1 = aBord.myPntId[ 0 ]; aBorder.myPnt2 = aBord.myPntId[ 1 ]; @@ -1290,7 +1303,7 @@ FunctorType LogicalOR_i::GetFunctorType() FilterManager_i::FilterManager_i() : SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() ) { - PortableServer::ObjectId_var anObjectId = + PortableServer::ObjectId_var anObjectId = SMESH_Gen_i::GetPOA()->activate_object( this ); } @@ -1364,6 +1377,15 @@ Area_ptr FilterManager_i::CreateArea() } +Volume3D_ptr FilterManager_i::CreateVolume3D() +{ + SMESH::Volume3D_i* aServant = new SMESH::Volume3D_i(); + SMESH::Volume3D_var anObj = aServant->_this(); + TPythonDump()<GetPredicate(),theSequence); } @@ -1654,14 +1676,14 @@ GetElementsId( Predicate_i* thePredicate, void Filter_i:: GetElementsId( Predicate_i* thePredicate, - SMESH_Mesh_ptr theMesh, - Controls::Filter::TIdSequence& theSequence ) + SMESH_Mesh_ptr theMesh, + Controls::Filter::TIdSequence& theSequence ) { if(const SMDS_Mesh* aMesh = MeshPtr2SMDSMesh(theMesh)) Controls::Filter::GetElementsId(aMesh,thePredicate->GetPredicate(),theSequence); } -SMESH::long_array* +SMESH::long_array* Filter_i:: GetElementsId( SMESH_Mesh_ptr theMesh ) { @@ -1847,7 +1869,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria SMESH::FilterManager_i* aFilter = new SMESH::FilterManager_i(); FilterManager_ptr aFilterMgr = aFilter->_this(); - + // CREATE two lists ( PREDICATES and LOG OP ) // Criterion @@ -1869,20 +1891,20 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria TPythonDump()<<"aCriteria.append(SMESH.Filter.Criterion("<< aCriterion<<","<CreateMultiConnection(); break; case SMESH::FT_MultiConnection2D: - aFunctor = aFilterMgr->CreateMultiConnection2D(); - break; + aFunctor = aFilterMgr->CreateMultiConnection2D(); + break; case SMESH::FT_Length: aFunctor = aFilterMgr->CreateLength(); break; @@ -1910,6 +1932,9 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria case SMESH::FT_Area: aFunctor = aFilterMgr->CreateArea(); break; + case SMESH::FT_Volume3D: + aFunctor = aFilterMgr->CreateVolume3D(); + break; // Predicates @@ -1947,7 +1972,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria tmpPred->SetShapeName( aThresholdStr ); aPredicate = tmpPred; } - break; + break; case SMESH::FT_RangeOfIds: { SMESH::RangeOfIds_ptr tmpPred = aFilterMgr->CreateRangeOfIds(); @@ -1961,7 +1986,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria aPredicate = aFilterMgr->CreateBadOrientedVolume(); } break; - + default: continue; } @@ -2161,6 +2186,7 @@ static inline LDOMString toString( const long theType ) case FT_Taper : return "Taper"; case FT_Skew : return "Skew"; case FT_Area : return "Area"; + case FT_Volume3D : return "Volume3D"; case FT_BelongToGeom : return "Belong to Geom"; case FT_BelongToPlane : return "Belong to Plane"; case FT_BelongToCylinder: return "Belong to Cylinder"; @@ -2196,6 +2222,7 @@ static inline SMESH::FunctorType toFunctorType( const LDOMString& theStr ) else if ( theStr.equals( "Taper" ) ) return FT_Taper; else if ( theStr.equals( "Skew" ) ) return FT_Skew; else if ( theStr.equals( "Area" ) ) return FT_Area; + else if ( theStr.equals( "Volume3D" ) ) return FT_Volume3D; else if ( theStr.equals( "Belong to Geom" ) ) return FT_BelongToGeom; else if ( theStr.equals( "Belong to Plane" ) ) return FT_BelongToPlane; else if ( theStr.equals( "Belong to Cylinder" ) ) return FT_BelongToCylinder; @@ -2313,7 +2340,7 @@ static LDOM_Node getSection( const ElementType theType, const char* aSectionName = getSectionName( theType ); if ( strcmp( aSectionName, "" ) == 0 ) return LDOM_Node(); - + LDOM_NodeList aSections = theDoc.getElementsByTagName( "section" ); LDOM_Node aNode; for ( int i = 0, n = aSections.getLength(); i < n; i++ ) @@ -2371,7 +2398,7 @@ static LDOM_Element createFilterItem( const char* theName, aCriterionItem.setAttribute( ATTR_THRESHOLD , toString( aCriteria[ i ].Threshold ) ); aCriterionItem.setAttribute( ATTR_UNARY , toString( aCriteria[ i ].UnaryOp ) ); aCriterionItem.setAttribute( ATTR_BINARY , toString( aCriteria[ i ].BinaryOp ) ); - + aCriterionItem.setAttribute( ATTR_THRESHOLD_STR, (const char*)aCriteria[ i ].ThresholdStr ); aCriterionItem.setAttribute( ATTR_TOLERANCE , toString( aCriteria[ i ].Tolerance ) ); aCriterionItem.setAttribute( ATTR_ELEMENT_TYPE , @@ -2447,7 +2474,7 @@ Filter_ptr FilterLibrary_i::Copy( const char* theFilterName ) return aRes; std::list aCriteria; - + for ( LDOM_Node aCritNode = aFilter.getFirstChild(); !aCritNode.isNull() ; aCritNode = aCritNode.getNextSibling() ) { @@ -2458,14 +2485,14 @@ Filter_ptr FilterLibrary_i::Copy( const char* theFilterName ) const char* aUnaryStr = aCrit->getAttribute( ATTR_UNARY ).GetString(); const char* aBinaryStr = aCrit->getAttribute( ATTR_BINARY ).GetString(); const char* anElemTypeStr = aCrit->getAttribute( ATTR_ELEMENT_TYPE ).GetString(); - + SMESH::Filter::Criterion aCriterion = createCriterion(); aCriterion.Type = toFunctorType( aTypeStr ); aCriterion.Compare = toFunctorType( aCompareStr ); aCriterion.UnaryOp = toFunctorType( aUnaryStr ); aCriterion.BinaryOp = toFunctorType( aBinaryStr ); - + aCriterion.TypeOfElement = toElementType( anElemTypeStr ); LDOMString str = aCrit->getAttribute( ATTR_THRESHOLD ); @@ -2492,18 +2519,18 @@ Filter_ptr FilterLibrary_i::Copy( const char* theFilterName ) SMESH::Filter::Criteria_var aCriteriaVar = new SMESH::Filter::Criteria; aCriteriaVar->length( aCriteria.size() ); - + CORBA::ULong i = 0; std::list::iterator anIter = aCriteria.begin(); - + for( ; anIter != aCriteria.end(); ++anIter ) aCriteriaVar[ i++ ] = *anIter; aRes = myFilterMgr->CreateFilter(); aRes->SetCriteria( aCriteriaVar.inout() ); - + TPythonDump()<CreateFilter(); - + LDOM_Element aFilterItem = createFilterItem( theFilterName, aFilter, myDoc ); if ( aFilterItem.isNull() ) return false; @@ -2604,12 +2631,12 @@ CORBA::Boolean FilterLibrary_i::Delete ( const char* theFilterName ) } //======================================================================= -// name : FilterLibrary_i::Replace +// name : FilterLibrary_i::Replace // Purpose : Replace existing filter with entry filter. // IMPORTANT : If filter does not exist it is not created //======================================================================= CORBA::Boolean FilterLibrary_i::Replace( const char* theFilterName, - const char* theNewName, + const char* theNewName, Filter_ptr theFilter ) { LDOM_Element aFilterItem = findFilter( theFilterName, myDoc ); @@ -2619,7 +2646,7 @@ CORBA::Boolean FilterLibrary_i::Replace( const char* theFilterName, LDOM_Element aNewItem = createFilterItem( theNewName, theFilter, myDoc ); if ( aNewItem.isNull() ) return false; - else + else { aFilterItem.ReplaceElement( aNewItem ); if(Filter_i* aFilter = DownCast(theFilter)) @@ -2636,7 +2663,7 @@ CORBA::Boolean FilterLibrary_i::Save() { if ( myFileName == 0 || strlen( myFileName ) == 0 ) return false; - + FILE* aOutFile = fopen( myFileName, "wt" ); if ( !aOutFile ) return false;