]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Issue 0020980: EDF 1226 GEOM: Detect the Resulting Type by default
authorvsr <vsr@opencascade.com>
Mon, 13 Dec 2010 09:01:00 +0000 (09:01 +0000)
committervsr <vsr@opencascade.com>
Mon, 13 Dec 2010 09:01:00 +0000 (09:01 +0000)
Re-implement to avoid regression in existing scripts

idl/GEOM_Gen.idl
src/GEOM_I/GEOM_Object_i.cc
src/GEOM_I/GEOM_Object_i.hh
src/GEOM_SWIG/geompyDC.py
src/OperationGUI/OperationGUI_PartitionDlg.cxx

index 179ecf35a9606bd7a7b86cc7fde017b46c298a12..d6be57c546c754f0d198e3a943bba85c3e9f9286 100644 (file)
@@ -180,10 +180,19 @@ module GEOM
      *  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()
+     *  \sa GetShapeType(), GetTopologyType(), GetMaxShapeType()
      */
     shape_type GetMinShapeType();
 
+    /*!
+     *  Get a maximal 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(), GetMinShapeType()
+     */
+    shape_type GetMaxShapeType();
+    
     /*!
      *  Set name of the object.
      *  \param theName is a name which will be associated with this object.
index ad139cb773e8b6136d4b72849cb5e6669ab867a6..0dd22bdf4a0f28284cd7500133e77132296302c9 100644 (file)
@@ -141,7 +141,7 @@ GEOM::shape_type GEOM_Object_i::GetTopologyType()
   return (GEOM::shape_type)shape.ShapeType();
 }
 
-static GEOM::shape_type getMinShapeType( const TopoDS_Shape& shape )
+static GEOM::shape_type getMinMaxShapeType( const TopoDS_Shape& shape, bool ismin )
 {
   if ( shape.IsNull() )
     return GEOM::SHAPE;
@@ -153,8 +153,11 @@ static GEOM::shape_type getMinShapeType( const TopoDS_Shape& shape )
     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 )
+      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;
     }
   }
@@ -169,7 +172,17 @@ static GEOM::shape_type getMinShapeType( const TopoDS_Shape& shape )
 //=============================================================================
 GEOM::shape_type GEOM_Object_i::GetMinShapeType()
 {
-  return getMinShapeType( _impl->GetValue() );
+  return getMinMaxShapeType( _impl->GetValue(), true );
+}
+
+//=============================================================================
+/*!
+ *  GetMaxShapeType
+ */
+//=============================================================================
+GEOM::shape_type GEOM_Object_i::GetMaxShapeType()
+{
+  return getMinMaxShapeType( _impl->GetValue(), false );
 }
 
 //=============================================================================
index d47306aada225cf868ffdd3ea0ea1751024e6821..c7ed4c7583158acb50d80784cadaf9fc6e858bc0 100644 (file)
@@ -55,6 +55,8 @@ class GEOM_I_EXPORT GEOM_Object_i : public virtual POA_GEOM::GEOM_Object, public
 
   virtual GEOM::shape_type GetMinShapeType();
 
+  virtual GEOM::shape_type GetMaxShapeType();
+
   virtual void SetName(const char* theName);
 
   virtual char* GetName();
index 4c7c7919a6caae6889bf08c8527a1f95e9c77bb7..fe8904335ba9333c5c07d132e908c6d0bd185484 100644 (file)
@@ -2552,8 +2552,8 @@ class geompyDC(GEOM._objref_GEOM_Gen):
             # 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() )
+                lim = GEOM.SHAPE
+                for s in ListShapes: lim = min( lim, s.GetMaxShapeType() )
                 Limit = lim._v
                 pass
             anObj = self.BoolOp.MakePartition(ListShapes, ListTools,
@@ -2582,8 +2582,8 @@ class geompyDC(GEOM._objref_GEOM_Gen):
                                                  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() )
+                lim = GEOM.SHAPE
+                for s in ListShapes: lim = min( lim, s.GetMaxShapeType() )
                 Limit = lim._v
                 pass
             anObj = self.BoolOp.MakePartitionNonSelfIntersectedShape(ListShapes, ListTools,
index 6c4ad4bda12e58796508dc768ab6c80d13c48773..18e456af23af3f04fcf8ff4e61f17984e8a20617 100644 (file)
@@ -293,9 +293,9 @@ void OperationGUI_PartitionDlg::SelectionIntoArgument()
     GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListShapes, true);
     //myListMaterials.length( 0 ); // obsolete
     
-    GEOM::shape_type type = GEOM::SOLID;
+    GEOM::shape_type type = GEOM::SHAPE;
     for (int i = 0; i < myListShapes.length(); i++)
-      type = qMax( type, myListShapes[i]->GetMinShapeType() );
+      type = qMin( type, myListShapes[i]->GetMaxShapeType() );
     int idx = qMax( 0, GroupPoints->ComboBox1->findData( type ) );
     GroupPoints->ComboBox1->setCurrentIndex( idx );