From: eap Date: Thu, 23 Jun 2011 12:25:04 +0000 (+0000) Subject: 0021014: EDF 1583 SMESH: Improvement of the Python Dump for the creation of groups X-Git-Tag: V6_4_0a1~190 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=a39a0e1f8439cf9c754018c5c312809475de051c;p=modules%2Fsmesh.git 0021014: EDF 1583 SMESH: Improvement of the Python Dump for the creation of groups 1) fix dump of Filter_i::SetCriteria() 2) + void Filter_i::AddWaiter( TPredicateChangeWaiter* waiter ); + void Filter_i::RemoveWaiter( TPredicateChangeWaiter* waiter ); 3) + const char* SMESH::FunctorTypeToString(SMESH::FunctorType ft); + SMESH::FunctorType SMESH::StringToFunctorType(const char* str); --- diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index 60df4fc16..f2ce323ed 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -2292,6 +2292,9 @@ void Filter_i::SetPredicate( Predicate_ptr thePredicate ) myPredicate->Register(); TPythonDump()<::iterator i = myWaiters.begin(); + for ( ; i != myWaiters.end(); ++i ) + (*i)->PredicateChanged(); } //======================================================================= @@ -2400,26 +2403,25 @@ SMESH::long_array* ::Filter_i::GetMeshInfo() SMDS_ElemIteratorPtr it; switch( GetElementType() ) { - case SMDSAbs_Node: - collectMeshInfo(aMesh->nodesIterator(),myPredicate,aRes); - break; - case SMDSAbs_Edge: - collectMeshInfo(aMesh->edgesIterator(),myPredicate,aRes); - break; - case SMDSAbs_Face: - collectMeshInfo(aMesh->facesIterator(),myPredicate,aRes); - break; - case SMDSAbs_Volume: - collectMeshInfo(aMesh->volumesIterator(),myPredicate,aRes); - break; - case SMDSAbs_All: - default: - collectMeshInfo(aMesh->elementsIterator(),myPredicate,aRes); - break; + case SMDSAbs_Node: + collectMeshInfo(aMesh->nodesIterator(),myPredicate,aRes); + break; + case SMDSAbs_Edge: + collectMeshInfo(aMesh->edgesIterator(),myPredicate,aRes); + break; + case SMDSAbs_Face: + collectMeshInfo(aMesh->facesIterator(),myPredicate,aRes); + break; + case SMDSAbs_Volume: + collectMeshInfo(aMesh->volumesIterator(),myPredicate,aRes); + break; + case SMDSAbs_All: + default: + collectMeshInfo(aMesh->elementsIterator(),myPredicate,aRes); + break; } } - return aRes._retn(); } @@ -2433,8 +2435,20 @@ SMESH::long_array* ::Filter_i::GetMeshInfo() SMESH::array_of_ElementType* Filter_i::GetTypes() { SMESH::array_of_ElementType_var types = new SMESH::array_of_ElementType; - types->length( 1 ); - types[0] = GetElementType(); + + // check if any element passes through the filter + if ( !CORBA::is_nil(myMesh) && myPredicate ) + { + const SMDS_Mesh* aMesh = MeshPtr2SMDSMesh(myMesh); + SMDS_ElemIteratorPtr it = aMesh->elementsIterator( SMDSAbs_ElementType( GetElementType() )); + bool satisfies = false; + while ( !satisfies && it->more() ) + satisfies = myPredicate->IsSatisfy( it->next()->GetID() ); + if ( satisfies ) { + types->length( 1 ); + types[0] = GetElementType(); + } + } return types._retn(); } @@ -2448,6 +2462,29 @@ SMESH::SMESH_Mesh_ptr Filter_i::GetMesh() return SMESH_Mesh::_duplicate( myMesh ); } +//================================================================================ +/*! + * \brief Stores an object to be notified on change of predicate + */ +//================================================================================ + +void Filter_i::AddWaiter( TPredicateChangeWaiter* waiter ) +{ + if ( waiter ) + myWaiters.push_back( waiter ); +} + +//================================================================================ +/*! + * \brief Removes an object to be notified on change of predicate + */ +//================================================================================ + +void Filter_i::RemoveWaiter( TPredicateChangeWaiter* waiter ) +{ + myWaiters.remove( waiter ); +} + //======================================================================= // name : getCriteria // Purpose : Retrieve criterions from predicate @@ -2748,17 +2785,20 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria { TPythonDump pd; - pd << "aCriterion = SMESH.Filter.Criterion(" << aCriterion << "," << aCompare - << "," << aThreshold << ",'" << aThresholdStr; - if (aThresholdID && strlen(aThresholdID)) - //pd << "',salome.ObjectToID(" << aThresholdID - pd << "','" << aThresholdID - << "'," << aUnary << "," << aBinary << "," << aTolerance - << "," << aTypeOfElem << "," << aPrecision << ")"; - else - pd << "',''," << aUnary << "," << aBinary << "," << aTolerance - << "," << aTypeOfElem << "," << aPrecision << ")"; + pd << "aCriterion = SMESH.Filter.Criterion(" + << aCriterion << ", " + << aCompare << ", " + << aThreshold << ", '" + << aThresholdStr << "', '"; + if (aThresholdID) pd << aThresholdID; + pd << "', " + << aUnary << ", " + << aBinary << ", " + << aTolerance << ", " + << aTypeOfElem << ", " + << aPrecision << ")"; } + TPythonDump pd; SMESH::Predicate_ptr aPredicate = SMESH::Predicate::_nil(); SMESH::NumericalFunctor_ptr aFunctor = SMESH::NumericalFunctor::_nil(); @@ -2968,10 +3008,10 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria // logical op aPredicates.push_back( aPredicate ); aBinaries.push_back( aBinary ); - TPythonDump()<<"aCriteria.append(aCriterion)"; + pd <<"aCriteria.append(aCriterion)"; } // end of for - TPythonDump()<(theFilter)) - TPythonDump()< SMESH::FT_Undefined ) + return 0; + return getFunctNames()[ ft ]; +} + +//================================================================================ +/*! + * \brief Converts a string to FunctorType. This is reverse of FunctorTypeToString() + */ +//================================================================================ + +SMESH::FunctorType SMESH::StringToFunctorType(const char* str) +{ + std::string name( str + 3 ); // skip "FT_" + const char** functNames = getFunctNames(); + int ft = SMESH::FT_Undefined; + for ( ; ft >= 0; --ft ) + if ( name == ( functNames[ft] + 3 )) + break; + + //ASSERT( strcmp( str, FunctorTypeToString( SMESH::FunctorType( ft ))) == 0 ); + + return SMESH::FunctorType( ft ); +}