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
## Enumeration ShapeType as a dictionary
# @ingroup l1_geompy_auxiliary
-ShapeType = {"COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8}
+ShapeType = {"AUTO":-1, "COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8}
## Raise an Error, containing the Method_name, if Operation is Failed
## @ingroup l1_geompy_auxiliary
# in order to avoid possible intersection between shapes from
# this compound.
# @param Limit Type of resulting shapes (corresponding to TopAbs_ShapeEnum).
+ # If this parameter is set to -1 ("Auto"), most appropriate shape limit
+ # type will be detected automatically.
# @param KeepNonlimitShapes: if this parameter == 0, then only shapes of
# target type (equal to Limit) are kept in the result,
# else standalone shapes of lower dimension
#
# @ref tui_partition "Example"
def MakePartition(self, ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[],
- Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[],
+ Limit=ShapeType["AUTO"], RemoveWebs=0, ListMaterials=[],
KeepNonlimitShapes=0):
# Example: see GEOM_TestAll.py
+ if Limit == ShapeType["AUTO"]:
+ # automatic detection of the most appropriate shape limit type
+ lim = GEOM.SOLID
+ for s in ListShapes: lim = max( lim, s.GetMinShapeType() )
+ Limit = lim._v
+ pass
anObj = self.BoolOp.MakePartition(ListShapes, ListTools,
ListKeepInside, ListRemoveInside,
Limit, RemoveWebs, ListMaterials,
# @ref swig_todo "Example"
def MakePartitionNonSelfIntersectedShape(self, ListShapes, ListTools=[],
ListKeepInside=[], ListRemoveInside=[],
- Limit=ShapeType["SHAPE"], RemoveWebs=0,
+ Limit=ShapeType["AUTO"], RemoveWebs=0,
ListMaterials=[], KeepNonlimitShapes=0):
+ if Limit == ShapeType["AUTO"]:
+ # automatic detection of the most appropriate shape limit type
+ lim = GEOM.SOLID
+ for s in ListShapes: lim = max( lim, s.GetMinShapeType() )
+ Limit = lim._v
+ pass
anObj = self.BoolOp.MakePartitionNonSelfIntersectedShape(ListShapes, ListTools,
ListKeepInside, ListRemoveInside,
Limit, RemoveWebs, ListMaterials,
# @ref tui_partition "Example 1"
# \n @ref swig_Partition "Example 2"
def Partition(self, ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[],
- Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[],
+ Limit=ShapeType["AUTO"], RemoveWebs=0, ListMaterials=[],
KeepNonlimitShapes=0):
# Example: see GEOM_TestOthers.py
anObj = self.MakePartition(ListShapes, ListTools,
{
/* 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();
if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListShapes, true);
//myListMaterials.length( 0 ); // obsolete
+
+ 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;
}
}
}
}
-
+
myEditCurrentArgument->setText( aString );
}