From 11899ab525b3af5a4714cec5cf1abf5f06ffb108 Mon Sep 17 00:00:00 2001 From: mzn Date: Fri, 11 Nov 2005 15:50:58 +0000 Subject: [PATCH] Fix for bug PAL10409 (Filter "Belong to geom" fails if 2 geom shapes have the same name); --- idl/SMESH_Filter.idl | 11 ++- src/SMESHGUI/SMESHGUI_FilterDlg.cxx | 55 +++++++++++- src/SMESHGUI/SMESHGUI_FilterDlg.h | 8 ++ src/SMESH_I/SMESH_Filter_i.cxx | 125 +++++++++++++++++++++++++++- src/SMESH_I/SMESH_Filter_i.hxx | 11 ++- 5 files changed, 200 insertions(+), 10 deletions(-) diff --git a/idl/SMESH_Filter.idl b/idl/SMESH_Filter.idl index 7ad1cb3df..516eeb38f 100644 --- a/idl/SMESH_Filter.idl +++ b/idl/SMESH_Filter.idl @@ -157,7 +157,9 @@ module SMESH void SetElementType( in ElementType theType ); void SetShapeName( in string theName ); - string GetShapeName(); + void SetShape( in string theID, in string theName ); + string GetShapeName(); + string GetShapeID(); }; /*! @@ -169,7 +171,9 @@ module SMESH void SetTolerance( in double theToler ); double GetTolerance(); void SetShapeName( in string theName, in ElementType theType ); + void SetShape( in string theID, in string theName, in ElementType theType ); string GetShapeName(); + string GetShapeID(); }; @@ -201,7 +205,9 @@ module SMESH void SetElementType( in ElementType theType ); void SetShapeName( in string theName ); + void SetShape( in string theID, in string theName ); string GetShapeName(); + string GetShapeID(); }; /*! @@ -293,6 +299,8 @@ module SMESH * ThresholdStr - Threshold value defined as string. Used for: * 1. Diaposon of identifiers. Example: "1,2,3,5-10,12,27-29" * 2. BelongToGeom predicate for storing name of shape + * ThresholdID - One more threshold value defined as string. Used for: + * 1. BelongToGeom predicate for storing id of shape * Tolerance - Tolerance is used for comparators (EqualTo comparision) and for * "Belong to plane" and "Belong to cylinder" predicates * TypeOfElement - type of element SMESH::NODE, SMESH::FACE (used by BelongToGeom predicate only) @@ -304,6 +312,7 @@ module SMESH long Compare; double Threshold; string ThresholdStr; + string ThresholdID; long UnaryOp; long BinaryOp; double Tolerance; diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx index 95f8ed303..6e4ab9f01 100755 --- a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx @@ -790,7 +790,11 @@ void SMESHGUI_FilterTable::GetCriterion (const int theRow, theCriterion.Threshold = aTable->item(theRow, 2)->text().toDouble(); } else - theCriterion.ThresholdStr = aTable->text(theRow, 2).latin1(); + { + theCriterion.ThresholdStr = aTable->text(theRow, 2).latin1(); + if ( aCriterionType != FT_RangeOfIds ) + theCriterion.ThresholdID = aTable->text( theRow, 5 ).latin1(); + } QTableItem* anItem = aTable->item(theRow, 0); if (myAddWidgets.contains(anItem)) @@ -833,7 +837,11 @@ void SMESHGUI_FilterTable::SetCriterion (const int theRow, theCriterion.Type != FT_LyingOnGeom) aTable->setText(theRow, 2, QString("%1").arg(theCriterion.Threshold, 0, 'g', 15)); else - aTable->setText(theRow, 2, QString(theCriterion.ThresholdStr)); + { + aTable->setText(theRow, 2, QString(theCriterion.ThresholdStr)); + if ( theCriterion.Type != FT_RangeOfIds ) + aTable->setText( theRow, 5, QString( theCriterion.ThresholdID ) ); + } if (theCriterion.Compare == FT_EqualTo || theCriterion.Type == FT_BelongToPlane || @@ -1352,7 +1360,7 @@ SMESHGUI_FilterTable::Table* SMESHGUI_FilterTable::createTable (QWidget* thePar const int theType) { // create table - Table* aTable= new Table(0, 5, theParent); + Table* aTable= new Table(0, 6, theParent); QHeader* aHeaders = aTable->horizontalHeader(); @@ -1383,11 +1391,15 @@ SMESHGUI_FilterTable::Table* SMESHGUI_FilterTable::createTable (QWidget* thePar aHeaders->setLabel(2, tr("THRESHOLD_VALUE")); aHeaders->setLabel(3, tr("UNARY")); aHeaders->setLabel(4, tr("BINARY") + " "); + aHeaders->setLabel( 5, tr( "ID" ) ); // set geometry of the table for (int i = 0; i <= 4; i++) aTable->adjustColumn(i); + // set the ID column invisible + aTable->hideColumn( 5 ); + aTable->updateGeometry(); QSize aSize = aTable->sizeHint(); int aWidth = aSize.width(); @@ -1589,6 +1601,37 @@ bool SMESHGUI_FilterTable::GetThreshold (const int theRow, return false; } +//======================================================================= +// name : SMESHGUI_FilterTable::SetID +// Purpose : Set text and internal value in cell of ID value +//======================================================================= +void SMESHGUI_FilterTable::SetID( const int theRow, + const QString& theText, + const int theEntityType ) +{ + Table* aTable = myTables[ theEntityType == -1 ? GetType() : theEntityType ]; + aTable->setText( theRow, 5, theText ); +} + +//======================================================================= +// name : SMESHGUI_FilterTable::GetID +// Purpose : Get text and internal value from cell of ID value +//======================================================================= +bool SMESHGUI_FilterTable::GetID( const int theRow, + QString& theText, + const int theEntityType ) +{ + Table* aTable = myTables[ theEntityType == -1 ? GetType() : theEntityType ]; + QTableItem* anItem = aTable->item( theRow, 5 ); + if ( anItem != 0 ) + { + theText = anItem->text(); + return true; + } + else + return false; +} + /* Class : SMESHGUI_FilterDlg Description : Dialog to specify filters for VTK viewer @@ -2425,6 +2468,7 @@ SMESH::Filter::Criterion SMESHGUI_FilterDlg::createCriterion() aCriterion.UnaryOp = FT_Undefined; aCriterion.BinaryOp = FT_Undefined; aCriterion.ThresholdStr = ""; + aCriterion.ThresholdID = ""; aCriterion.TypeOfElement = SMESH::ALL; return aCriterion; @@ -2452,7 +2496,10 @@ void SMESHGUI_FilterDlg::onSelectionDone() Handle(SALOME_InteractiveObject) anIO = aList.First(); GEOM::GEOM_Object_var anObj = SMESH::IObjectToInterface(anIO); if (!anObj->_is_nil()) - myTable->SetThreshold(aRow, GEOMBase::GetName(anObj)); + { + myTable->SetThreshold(aRow, GEOMBase::GetName(anObj)); + myTable->SetID( aRow, GEOMBase::GetIORFromObject(anObj)); + } } //======================================================================= diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.h b/src/SMESHGUI/SMESHGUI_FilterDlg.h index 04dfc4a5e..d74fc689c 100755 --- a/src/SMESHGUI/SMESHGUI_FilterDlg.h +++ b/src/SMESHGUI/SMESHGUI_FilterDlg.h @@ -130,6 +130,14 @@ public: QString& theText, const int theEntityType = -1); + void SetID( const int theRow, + const QString& theText, + const int theEntityType = -1 ); + + bool GetID( const int theRow, + QString& theText, + const int theEntityType = -1 ); + void Update(); signals: diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index 2feeadf0a..cc5876cdf 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -363,6 +363,7 @@ static SMESH::Filter::Criterion createCriterion() aCriterion.UnaryOp = FT_Undefined; aCriterion.BinaryOp = FT_Undefined; aCriterion.ThresholdStr = ""; + aCriterion.ThresholdID = ""; aCriterion.Tolerance = Precision::Confusion(); aCriterion.TypeOfElement = SMESH::ALL; aCriterion.Precision = -1; @@ -395,7 +396,50 @@ static TopoDS_Shape getShapeByName( const char* theName ) return TopoDS_Shape(); } +static TopoDS_Shape getShapeByID( const char* theID ) +{ + if ( theID != 0 && theID!="" ) + { + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy(); + if ( aStudy != 0 ) + { + CORBA::Object_var obj = aStudy->ConvertIORToObject(theID); + GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow( obj ); + + if ( !aGeomObj->_is_nil() ) + { + GEOM::GEOM_Gen_var aGEOMGen = SMESH_Gen_i::GetGeomEngine(); + TopoDS_Shape aLocShape = aSMESHGen->GetShapeReader()->GetShape( aGEOMGen, aGeomObj ); + return aLocShape; + } + } + } + return TopoDS_Shape(); +} +static char* getShapeNameByID ( const char* theID ) +{ + char* aName = ""; + + if ( theID != 0 && theID!="" ) + { + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy(); + if ( aStudy != 0 ) + { + SALOMEDS::SObject_var aSObj = aStudy->FindObjectIOR( theID ); + SALOMEDS::GenericAttribute_var anAttr; + if ( !aSObj->_is_nil() && aSObj->FindAttribute( anAttr, "AttributeName") ) + { + SALOMEDS::AttributeName_var aNameAttr = SALOMEDS::AttributeName::_narrow( anAttr ); + aName = aNameAttr->Value(); + } + } + } + + return aName; +} /* FUNCTORS @@ -734,11 +778,13 @@ BelongToGeom_i::BelongToGeom_i() myBelongToGeomPtr.reset( new Controls::BelongToGeom() ); myFunctorPtr = myPredicatePtr = myBelongToGeomPtr; myShapeName = 0; + myShapeID = 0; } BelongToGeom_i::~BelongToGeom_i() { delete myShapeName; + delete myShapeID; } void BelongToGeom_i::SetGeom( GEOM::GEOM_Object_ptr theGeom ) @@ -775,11 +821,32 @@ void BelongToGeom_i::SetShapeName( const char* theName ) TPythonDump()<SetGeom( getShapeByID(myShapeID) ); + else + myBelongToGeomPtr->SetGeom( getShapeByName( myShapeName ) ); +} + char* BelongToGeom_i::GetShapeName() { return CORBA::string_dup( myShapeName ); } +char* BelongToGeom_i::GetShapeID() +{ + return CORBA::string_dup( myShapeID ); +} + /* Class : BelongToSurface_i Description : Predicate for selection on geometrical support @@ -789,12 +856,14 @@ BelongToSurface_i::BelongToSurface_i( const Handle(Standard_Type)& theSurfaceTyp myElementsOnSurfacePtr.reset( new Controls::ElementsOnSurface() ); myFunctorPtr = myPredicatePtr = myElementsOnSurfacePtr; myShapeName = 0; + myShapeID = 0; mySurfaceType = theSurfaceType; } BelongToSurface_i::~BelongToSurface_i() { delete myShapeName; + delete myShapeID; } void BelongToSurface_i::SetSurface( GEOM::GEOM_Object_ptr theGeom, ElementType theType ) @@ -827,11 +896,32 @@ void BelongToSurface_i::SetShapeName( const char* theName, ElementType theType ) TPythonDump()<SetSurface( getShapeByID(myShapeID), (SMDSAbs_ElementType)theType ); + else + myElementsOnSurfacePtr->SetSurface( getShapeByName( myShapeName ), (SMDSAbs_ElementType)theType ); +} + char* BelongToSurface_i::GetShapeName() { return CORBA::string_dup( myShapeName ); } +char* BelongToSurface_i::GetShapeID() +{ + return CORBA::string_dup( myShapeID ); +} + void BelongToSurface_i::SetTolerance( CORBA::Double theToler ) { myElementsOnSurfacePtr->SetTolerance( theToler ); @@ -894,11 +984,13 @@ LyingOnGeom_i::LyingOnGeom_i() myLyingOnGeomPtr.reset( new Controls::LyingOnGeom() ); myFunctorPtr = myPredicatePtr = myLyingOnGeomPtr; myShapeName = 0; + myShapeID = 0; } LyingOnGeom_i::~LyingOnGeom_i() { delete myShapeName; + delete myShapeID; } void LyingOnGeom_i::SetGeom( GEOM::GEOM_Object_ptr theGeom ) @@ -935,11 +1027,32 @@ void LyingOnGeom_i::SetShapeName( const char* theName ) TPythonDump()<SetGeom( getShapeByID(myShapeID) ); + else + myLyingOnGeomPtr->SetGeom( getShapeByName( myShapeName ) ); +} + char* LyingOnGeom_i::GetShapeName() { return CORBA::string_dup( myShapeName ); } +char* LyingOnGeom_i::GetShapeID() +{ + return CORBA::string_dup( myShapeID ); +} + /* Class : FreeBorders_i Description : Predicate for free borders @@ -1733,6 +1846,7 @@ static inline bool getCriteria( Predicate_i* thePred, theCriteria[ i ].Type = FT_BelongToGeom; theCriteria[ i ].ThresholdStr = aPred->GetShapeName(); + theCriteria[ i ].ThresholdID = aPred->GetShapeID(); theCriteria[ i ].TypeOfElement = aPred->GetElementType(); return true; @@ -1749,6 +1863,7 @@ static inline bool getCriteria( Predicate_i* thePred, theCriteria[ i ].Type = aFType; theCriteria[ i ].ThresholdStr = aPred->GetShapeName(); + theCriteria[ i ].ThresholdID = aPred->GetShapeID(); theCriteria[ i ].TypeOfElement = aPred->GetElementType(); theCriteria[ i ].Tolerance = aPred->GetTolerance(); @@ -1765,6 +1880,7 @@ static inline bool getCriteria( Predicate_i* thePred, theCriteria[ i ].Type = FT_LyingOnGeom; theCriteria[ i ].ThresholdStr = aPred->GetShapeName(); + theCriteria[ i ].ThresholdID = aPred->GetShapeID(); theCriteria[ i ].TypeOfElement = aPred->GetElementType(); return true; @@ -1885,6 +2001,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria int aBinary = theCriteria[ i ].BinaryOp; double aTolerance = theCriteria[ i ].Tolerance; const char* aThresholdStr = theCriteria[ i ].ThresholdStr; + const char* aThresholdID = theCriteria[ i ].ThresholdID; ElementType aTypeOfElem = theCriteria[ i ].TypeOfElement; long aPrecision = theCriteria[ i ].Precision; @@ -1948,7 +2065,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria { SMESH::BelongToGeom_ptr tmpPred = aFilterMgr->CreateBelongToGeom(); tmpPred->SetElementType( aTypeOfElem ); - tmpPred->SetShapeName( aThresholdStr ); + tmpPred->SetShape( aThresholdID, aThresholdStr ); aPredicate = tmpPred; } break; @@ -1960,7 +2077,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria tmpPred = aFilterMgr->CreateBelongToPlane(); else tmpPred = aFilterMgr->CreateBelongToCylinder(); - tmpPred->SetShapeName( aThresholdStr, aTypeOfElem ); + tmpPred->SetShape( aThresholdID, aThresholdStr, aTypeOfElem ); tmpPred->SetTolerance( aTolerance ); aPredicate = tmpPred; } @@ -1969,7 +2086,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria { SMESH::LyingOnGeom_ptr tmpPred = aFilterMgr->CreateLyingOnGeom(); tmpPred->SetElementType( aTypeOfElem ); - tmpPred->SetShapeName( aThresholdStr ); + tmpPred->SetShape( aThresholdID, aThresholdStr ); aPredicate = tmpPred; } break; @@ -2513,7 +2630,7 @@ Filter_ptr FilterLibrary_i::Copy( const char* theFilterName ) } else aCriterion.ThresholdStr = str.GetString(); - + aCriteria.push_back( aCriterion ); } diff --git a/src/SMESH_I/SMESH_Filter_i.hxx b/src/SMESH_I/SMESH_Filter_i.hxx index 2e885b7fc..a96758049 100644 --- a/src/SMESH_I/SMESH_Filter_i.hxx +++ b/src/SMESH_I/SMESH_Filter_i.hxx @@ -360,11 +360,14 @@ namespace SMESH void SetGeom( const TopoDS_Shape& theShape ); void SetShapeName( const char* theName ); + void SetShape( const char* theID, const char* theName ); char* GetShapeName(); + char* GetShapeID(); protected: Controls::BelongToGeomPtr myBelongToGeomPtr; char* myShapeName; + char* myShapeID; }; /* @@ -381,14 +384,17 @@ namespace SMESH void SetSurface( GEOM::GEOM_Object_ptr theGeom, ElementType theType ); void SetShapeName( const char* theName, ElementType theType ); + void SetShape( const char* theID, const char* theName, ElementType theType ); char* GetShapeName(); - + char* GetShapeID(); + void SetTolerance( CORBA::Double ); CORBA::Double GetTolerance(); protected: Controls::ElementsOnSurfacePtr myElementsOnSurfacePtr; char* myShapeName; + char* myShapeID; Handle(Standard_Type) mySurfaceType; }; @@ -436,11 +442,14 @@ namespace SMESH void SetGeom( const TopoDS_Shape& theShape ); void SetShapeName( const char* theName ); + void SetShape( const char* theID, const char* theName ); char* GetShapeName(); + char* GetShapeID(); protected: Controls::LyingOnGeomPtr myLyingOnGeomPtr; char* myShapeName; + char* myShapeID; }; /* -- 2.39.2