From fa0176f07261b9a4c7b4672287c7c229ac427111 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 23 Jun 2011 12:29:23 +0000 Subject: [PATCH] 0021014: EDF 1583 SMESH: Improvement of the Python Dump for the creation of groups +class SMESH_GroupOnFilter_i: --- src/SMESH_I/SMESH_Group_i.cxx | 203 ++++++++++++++++++++++++++++++++-- src/SMESH_I/SMESH_Group_i.hxx | 47 +++++++- 2 files changed, 234 insertions(+), 16 deletions(-) diff --git a/src/SMESH_I/SMESH_Group_i.cxx b/src/SMESH_I/SMESH_Group_i.cxx index 6312b7389..20eb9798a 100644 --- a/src/SMESH_I/SMESH_Group_i.cxx +++ b/src/SMESH_I/SMESH_Group_i.cxx @@ -26,14 +26,16 @@ // Module : SMESH // #include "SMESH_Group_i.hxx" -#include "SMESH_Mesh_i.hxx" -#include "SMESH_Gen_i.hxx" -#include "SMESH_Group.hxx" + +#include "SMDSAbs_ElementType.hxx" #include "SMESHDS_Group.hxx" +#include "SMESHDS_GroupOnFilter.hxx" #include "SMESHDS_GroupOnGeom.hxx" -#include "SMDSAbs_ElementType.hxx" - +#include "SMESH_Comment.hxx" #include "SMESH_Filter_i.hxx" +#include "SMESH_Gen_i.hxx" +#include "SMESH_Group.hxx" +#include "SMESH_Mesh_i.hxx" #include "SMESH_PythonDump.hxx" #include CORBA_SERVER_HEADER(SMESH_Filter) @@ -48,7 +50,9 @@ using namespace SMESH; */ //============================================================================= -SMESH_GroupBase_i::SMESH_GroupBase_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ) +SMESH_GroupBase_i::SMESH_GroupBase_i( PortableServer::POA_ptr thePOA, + SMESH_Mesh_i* theMeshServant, + const int theLocalID ) : SALOME::GenericObj_i( thePOA ), myMeshServant( theMeshServant ), myLocalID( theLocalID ) @@ -58,20 +62,33 @@ SMESH_GroupBase_i::SMESH_GroupBase_i( PortableServer::POA_ptr thePOA, SMESH_Mesh // thePOA->activate_object( this ); } -SMESH_Group_i::SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ) +SMESH_Group_i::SMESH_Group_i( PortableServer::POA_ptr thePOA, + SMESH_Mesh_i* theMeshServant, + const int theLocalID ) : SALOME::GenericObj_i( thePOA ), SMESH_GroupBase_i( thePOA, theMeshServant, theLocalID ) { //MESSAGE("SMESH_Group_i; this = "<( filter )) + if ( SMESH::Predicate_i* predic_i= filt_i->GetPredicate_i() ) + predicate = predic_i->GetPredicate(); + + return predicate; +} + +//================================================================================ +/*! + * \brief Sets the filter defining group contents + */ +//================================================================================ + +void SMESH_GroupOnFilter_i::SetFilter(SMESH::Filter_ptr theFilter) +{ + if ( ! myFilter->_is_nil() ) + myFilter->UnRegister(); + + myFilter = SMESH::Filter::_duplicate( theFilter ); + + if ( SMESHDS_GroupOnFilter* grDS = dynamic_cast< SMESHDS_GroupOnFilter*>( GetGroupDS() )) + grDS->SetPredicate( GetPredicate( myFilter )); + + TPythonDump()<< _this() <<".SetFilter( "<Register(); + SMESH::DownCast< SMESH::Filter_i* >( myFilter )->AddWaiter( this ); + } +} + +//================================================================================ +/*! + * \brief Returns the filter defining group contents + */ +//================================================================================ + +SMESH::Filter_ptr SMESH_GroupOnFilter_i::GetFilter() +{ + SMESH::Filter_var f = myFilter; + TPythonDump() << f << " = " << _this() << ".GetFilter()"; + return f._retn(); +} + +#define SEPAR '^' + +//================================================================================ +/*! + * \brief Return a string to be used to store group definition in the study + */ +//================================================================================ + +std::string SMESH_GroupOnFilter_i::FilterToString() const +{ + SMESH_Comment result; + SMESH::Filter::Criteria_var criteria; + if ( !myFilter->_is_nil() && myFilter->GetCriteria( criteria.out() )) + { + result << criteria->length() << SEPAR; + for ( unsigned i = 0; i < criteria->length(); ++i ) + { + // write FunctorType as string but not as number to assure correct + // persistence if enum FunctorType is modified by insertion in the middle + SMESH::Filter::Criterion& crit = criteria[ i ]; + result << SMESH::FunctorTypeToString( SMESH::FunctorType( crit.Type )) << SEPAR; + result << SMESH::FunctorTypeToString( SMESH::FunctorType( crit.Compare )) << SEPAR; + result << crit.Threshold << SEPAR; + result << crit.ThresholdStr << SEPAR; + result << crit.ThresholdID << SEPAR; + result << SMESH::FunctorTypeToString( SMESH::FunctorType( crit.UnaryOp )) << SEPAR; + result << SMESH::FunctorTypeToString( SMESH::FunctorType( crit.BinaryOp ))<< SEPAR; + result << crit.Tolerance << SEPAR; + result << crit.TypeOfElement << SEPAR; + result << crit.Precision << SEPAR; + } + } + return result; +} + +//================================================================================ +/*! + * \brief Restore the filter by the persistent string + */ +//================================================================================ + +SMESH::Filter_ptr SMESH_GroupOnFilter_i::StringToFilter(const std::string& thePersistStr ) +{ + SMESH::Filter_var filter; + + // divide thePersistStr into sub-strings + std::vector< std::string > strVec; + std::string::size_type from = 0, to; + while ( from < thePersistStr.size() ) + { + to = thePersistStr.find( SEPAR, from ); + if ( to == std::string::npos ) + break; + strVec.push_back( thePersistStr.substr( from, to-from )); + from = to+1; + } + if ( strVec.empty() || strVec[0] == "0" ) + return filter._retn(); +#undef SEPAR + + // create Criteria + int nbCrit = atoi( strVec[0].c_str() ); + SMESH::Filter::Criteria_var criteria = new SMESH::Filter::Criteria; + criteria->length( nbCrit ); + int nbStrPerCrit = ( strVec.size() - 1 ) / nbCrit; + for ( int i = 0; i < nbCrit; ++i ) + { + SMESH::Filter::Criterion& crit = criteria[ i ]; + int iStr = 1 + i * nbStrPerCrit; + crit.Type = SMESH::StringToFunctorType( strVec[ iStr++ ].c_str() ); + crit.Compare = SMESH::StringToFunctorType( strVec[ iStr++ ].c_str() ); + crit.Threshold = atof( strVec[ iStr++ ].c_str() ); + crit.ThresholdStr = strVec[ iStr++ ].c_str(); + crit.ThresholdID = strVec[ iStr++ ].c_str(); + crit.UnaryOp = SMESH::StringToFunctorType( strVec[ iStr++ ].c_str() ); + crit.BinaryOp = SMESH::StringToFunctorType( strVec[ iStr++ ].c_str() ); + crit.Tolerance = atof( strVec[ iStr++ ].c_str() ); + crit.TypeOfElement= SMESH::ElementType( atoi( strVec[ iStr++ ].c_str() )); + crit.Precision = atoi( strVec[ iStr++ ].c_str() ); + } + + // create a filter + TPythonDump pd; + SMESH::FilterManager_i* aFilterMgr = new SMESH::FilterManager_i(); + filter = aFilterMgr->CreateFilter(); + filter->SetCriteria( criteria.inout() ); + + aFilterMgr->UnRegister(); + + pd << ""; // to avoid optimizing pd out + + return filter._retn(); +} + +SMESH_GroupOnFilter_i::~SMESH_GroupOnFilter_i() +{ + if ( ! myFilter->_is_nil() ) + { + SMESH::DownCast< SMESH::Filter_i* >( myFilter )->RemoveWaiter( this ); + myFilter->UnRegister(); + } +} + +void SMESH_GroupOnFilter_i::PredicateChanged() +{ + if ( SMESHDS_GroupOnFilter* grDS = dynamic_cast< SMESHDS_GroupOnFilter*>( GetGroupDS() )) + grDS->SetPredicate( GetPredicate( myFilter )); +} diff --git a/src/SMESH_I/SMESH_Group_i.hxx b/src/SMESH_I/SMESH_Group_i.hxx index 4d97f6cbb..16099ecdd 100644 --- a/src/SMESH_I/SMESH_Group_i.hxx +++ b/src/SMESH_I/SMESH_Group_i.hxx @@ -30,6 +30,7 @@ #include "SMESH.hxx" #include "SMESH_Mesh_i.hxx" +#include "SMESH_Filter_i.hxx" #include #include CORBA_SERVER_HEADER(SMESH_Group) @@ -50,8 +51,8 @@ class SMESH_I_EXPORT SMESH_GroupBase_i: { public: SMESH_GroupBase_i(PortableServer::POA_ptr thePOA, - SMESH_Mesh_i* theMeshServant, - const int theLocalID ); + SMESH_Mesh_i* theMeshServant, + const int theLocalID ); virtual ~SMESH_GroupBase_i(); // CORBA interface implementation @@ -110,8 +111,9 @@ class SMESH_I_EXPORT SMESH_Group_i: public SMESH_GroupBase_i { public: - SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ); - + SMESH_Group_i( PortableServer::POA_ptr thePOA, + SMESH_Mesh_i* theMeshServant, + const int theLocalID ); // CORBA interface implementation void Clear(); CORBA::Long Add( const SMESH::long_array& theIDs ); @@ -132,9 +134,42 @@ class SMESH_I_EXPORT SMESH_GroupOnGeom_i: public SMESH_GroupBase_i { public: - SMESH_GroupOnGeom_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ); - + SMESH_GroupOnGeom_i( PortableServer::POA_ptr thePOA, + SMESH_Mesh_i* theMeshServant, + const int theLocalID ); // CORBA interface implementation GEOM::GEOM_Object_ptr GetShape(); }; + +// ========================= +// Group deined by filter +// ========================= + +class SMESH_I_EXPORT SMESH_GroupOnFilter_i: + public virtual POA_SMESH::SMESH_GroupOnFilter, + public SMESH_GroupBase_i, + public SMESH::Filter_i::TPredicateChangeWaiter +{ + public: + SMESH_GroupOnFilter_i( PortableServer::POA_ptr thePOA, + SMESH_Mesh_i* theMeshServant, + const int theLocalID ); + ~SMESH_GroupOnFilter_i(); + + // Persistence + static SMESH::Filter_ptr StringToFilter(const std::string& thePersistentString ); + std::string FilterToString() const; + + static SMESH_PredicatePtr GetPredicate( SMESH::Filter_ptr ); + + // CORBA interface implementation + void SetFilter(SMESH::Filter_ptr theFilter); + SMESH::Filter_ptr GetFilter(); + + // method of SMESH::Filter_i::TPredicateChangeWaiter + virtual void PredicateChanged(); + + private: + SMESH::Filter_var myFilter; +}; #endif -- 2.39.2