+//=============================================================================
+/*!
+ * GetTopologyType
+ */
+//=============================================================================
+GEOM::shape_type GEOM_Object_i::GetTopologyType()
+{
+ TopoDS_Shape shape = _impl->GetValue();
+ if(shape.IsNull()) return GEOM::SHAPE;
+
+ if ( shape.ShapeType() == TopAbs_COMPOUND || shape.ShapeType() == TopAbs_COMPSOLID ) {
+ TopoDS_Shape shape_i;
+ TopoDS_Iterator It (shape, Standard_True, Standard_False);
+ for (; It.More(); It.Next()) {
+ if ( !shape_i.IsNull() ) return (GEOM::shape_type)shape.ShapeType();
+ shape_i = It.Value();
+ }
+ if ( !shape_i.IsNull() )
+ return (GEOM::shape_type) shape_i.ShapeType();
+ }
+
+ return (GEOM::shape_type)shape.ShapeType();
+}
+
+static GEOM::shape_type getMinMaxShapeType( const TopoDS_Shape& shape, bool ismin )
+{
+ 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)getMinMaxShapeType( sub_shape, ismin );
+ if ( stype == GEOM::SHAPE ) continue;
+ if ( ismin && stype > ret )
+ ret = stype;
+ else if ( !ismin && ( ret < GEOM::SOLID || stype < ret ) )
+ ret = stype;
+ }
+ }
+
+ return ret;
+}
+
+//=============================================================================
+/*!
+ * GetMinShapeType
+ */
+//=============================================================================
+GEOM::shape_type GEOM_Object_i::GetMinShapeType()
+{
+ return getMinMaxShapeType( _impl->GetValue(), true );
+}
+
+//=============================================================================
+/*!
+ * GetMaxShapeType
+ */
+//=============================================================================
+GEOM::shape_type GEOM_Object_i::GetMaxShapeType()
+{
+ return getMinMaxShapeType( _impl->GetValue(), false );
+}
+