From: vsr Date: Wed, 6 Oct 2010 19:50:35 +0000 (+0000) Subject: PAL20980 EDF 1226 GEOM: Detect the Resulting Type by default X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=1b2fda6acc5d2e9a0896f264c39812fbedad38e7;p=modules%2Fgeom.git PAL20980 EDF 1226 GEOM: Detect the Resulting Type by default --- diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 4cef6701a..7b27e134a 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -175,6 +175,15 @@ module GEOM */ shape_type GetTopologyType(); + /*! + * Get a minimal type of the top-level shapes contained in the object. + * This function is useful for the compounds only; for simple shapes it + * exactly the same value as GetShapeType(). + * Note, that compounds are procesed recursively. + * \sa GetShapeType(), GetTopologyType() + */ + shape_type GetMinShapeType(); + /*! * Set name of the object. * \param theName is a name which will be associated with this object. diff --git a/src/GEOM_I/GEOM_Object_i.cc b/src/GEOM_I/GEOM_Object_i.cc index 0adae0632..ad139cb77 100644 --- a/src/GEOM_I/GEOM_Object_i.cc +++ b/src/GEOM_I/GEOM_Object_i.cc @@ -141,6 +141,37 @@ GEOM::shape_type GEOM_Object_i::GetTopologyType() return (GEOM::shape_type)shape.ShapeType(); } +static GEOM::shape_type getMinShapeType( const TopoDS_Shape& shape ) +{ + if ( shape.IsNull() ) + return GEOM::SHAPE; + + GEOM::shape_type ret = (GEOM::shape_type)shape.ShapeType(); + + if ( shape.ShapeType() == TopAbs_COMPOUND || shape.ShapeType() == TopAbs_COMPSOLID ) { + TopoDS_Iterator it(shape, Standard_True, Standard_False); + for (; it.More(); it.Next()) { + TopoDS_Shape sub_shape = it.Value(); + if ( sub_shape.IsNull() ) continue; + GEOM::shape_type stype = (GEOM::shape_type)sub_shape.ShapeType(); + if ( stype != GEOM::SHAPE && stype > ret ) + ret = stype; + } + } + + return ret; +} + +//============================================================================= +/*! + * GetMinShapeType + */ +//============================================================================= +GEOM::shape_type GEOM_Object_i::GetMinShapeType() +{ + return getMinShapeType( _impl->GetValue() ); +} + //============================================================================= /*! * SetName diff --git a/src/GEOM_I/GEOM_Object_i.hh b/src/GEOM_I/GEOM_Object_i.hh index 7b56a603c..d47306aad 100644 --- a/src/GEOM_I/GEOM_Object_i.hh +++ b/src/GEOM_I/GEOM_Object_i.hh @@ -53,6 +53,8 @@ class GEOM_I_EXPORT GEOM_Object_i : public virtual POA_GEOM::GEOM_Object, public virtual GEOM::shape_type GetTopologyType(); + virtual GEOM::shape_type GetMinShapeType(); + virtual void SetName(const char* theName); virtual char* GetName(); diff --git a/src/OperationGUI/OperationGUI_PartitionDlg.cxx b/src/OperationGUI/OperationGUI_PartitionDlg.cxx index b6fac51c7..f5b02efa7 100644 --- a/src/OperationGUI/OperationGUI_PartitionDlg.cxx +++ b/src/OperationGUI/OperationGUI_PartitionDlg.cxx @@ -119,11 +119,17 @@ void OperationGUI_PartitionDlg::Init() { /* type for sub shape selection */ GroupPoints->ComboBox1->addItem( tr( "GEOM_RECONSTRUCTION_LIMIT_SOLID" ) ); + GroupPoints->ComboBox1->setItemData(GroupPoints->ComboBox1->count()-1, GEOM::SOLID); GroupPoints->ComboBox1->addItem( tr( "GEOM_RECONSTRUCTION_LIMIT_SHELL" ) ); + GroupPoints->ComboBox1->setItemData(GroupPoints->ComboBox1->count()-1, GEOM::SHELL); GroupPoints->ComboBox1->addItem( tr( "GEOM_RECONSTRUCTION_LIMIT_FACE" ) ); + GroupPoints->ComboBox1->setItemData(GroupPoints->ComboBox1->count()-1, GEOM::FACE); GroupPoints->ComboBox1->addItem( tr( "GEOM_RECONSTRUCTION_LIMIT_WIRE" ) ); + GroupPoints->ComboBox1->setItemData(GroupPoints->ComboBox1->count()-1, GEOM::WIRE); GroupPoints->ComboBox1->addItem( tr( "GEOM_RECONSTRUCTION_LIMIT_EDGE" ) ); + GroupPoints->ComboBox1->setItemData(GroupPoints->ComboBox1->count()-1, GEOM::EDGE); GroupPoints->ComboBox1->addItem( tr( "GEOM_RECONSTRUCTION_LIMIT_VERTEX" ) ); + GroupPoints->ComboBox1->setItemData(GroupPoints->ComboBox1->count()-1, GEOM::VERTEX); GroupPoints->CheckButton1->setChecked( false ); mainFrame()->GroupBoxPublish->show(); @@ -270,6 +276,13 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument() if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) { GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListShapes, true); myListMaterials.length( 0 ); + + GEOM::shape_type type = GEOM::SOLID; + for (int i = 0; i < myListShapes.length(); i++) + type = qMax( type, myListShapes[i]->GetMinShapeType() ); + int idx = qMax( 0, GroupPoints->ComboBox1->findData( type ) ); + GroupPoints->ComboBox1->setCurrentIndex( idx ); + if ( !myListShapes.length() ) return; } @@ -278,7 +291,7 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument() if ( !myListTools.length() ) return; } - + myEditCurrentArgument->setText( aString ); }