Salome HOME
0020428: EDF 906 GEOM : Performance for Group creation in GEOM
authorptv <ptv@opencascade.com>
Tue, 25 Aug 2009 11:59:24 +0000 (11:59 +0000)
committerptv <ptv@opencascade.com>
Tue, 25 Aug 2009 11:59:24 +0000 (11:59 +0000)
src/GEOMBase/GEOMBase_Skeleton.cxx
src/GEOMBase/GEOMBase_Skeleton.h
src/GroupGUI/GroupGUI_GroupDlg.cxx
src/GroupGUI/GroupGUI_GroupDlg.h

index ad5d365d01fad75c413fc096e987ed8c309ac706..bed9d3411cc65ec80e942810c8cfd99b025ee294 100644 (file)
@@ -289,12 +289,37 @@ int GEOMBase_Skeleton::getConstructorId() const
   return -1;
 }
 
+//=================================================================================
+// function : setConstructorId( id )
+// purpose  :
+//=================================================================================
 void GEOMBase_Skeleton::setConstructorId( const int id )
 {
   if ( myRBGroup && myRBGroup->button( id ) )
     myRBGroup->button( id )->setChecked( true );
 }
 
+//=================================================================================
+// function : unsetConstructorId
+// purpose  :
+//=================================================================================
+void GEOMBase_Skeleton::unsetConstructorId()
+{
+  // 0020428: EDF 906 GEOM : Performance for Group creation in GEOM
+  // uncheck all buttons
+  // workaround, because setChecked( false ) does not result in Qt4
+  bool isExclusive = myRBGroup->exclusive();
+  myRBGroup->setExclusive( false );
+  QList<QAbstractButton*> btnList = myRBGroup->buttons();
+  for ( int j = 0; j < 2; j++ )
+  {
+    QList<QAbstractButton*>::const_iterator it = btnList.constBegin();
+    for ( ; it != btnList.constEnd(); ++it )
+      (*it)->setCheckable( j == 1 );
+  }
+  myRBGroup->setExclusive( isExclusive );
+}
+
 //=================================================================================
 // function : ClickOnHelp()
 // purpose  :
index a9f2c5aa2819ed98c5a916f4746c3fa291d4ccde..1d267ffc243bd8ee20bf3f8a0a78f897221b65cc 100644 (file)
@@ -81,6 +81,9 @@ protected:
     /*! set selected "constructor" radio button id
      */
     void                setConstructorId( const int );
+    /*! unset selection on all "constructor" radio buttons
+     */
+    void                unsetConstructorId();
 
     void                setHelpFileName( const QString& );
 
index ac3e610e3f765b590d932d03dd92227b9b082aab..7c17c042d34fc943c074a9aed5db1e5037374122 100644 (file)
@@ -53,7 +53,8 @@ enum { ALL_SUBSHAPES = 0, GET_IN_PLACE, SUBSHAPES_OF_SHAPE2, SUBSHAPES_OF_INVISI
 GroupGUI_GroupDlg::GroupGUI_GroupDlg( Mode mode, GeometryGUI* theGeometryGUI, QWidget* parent )
   : GEOMBase_Skeleton( theGeometryGUI, parent, false ),
     myMode( mode ),
-    myBusy( false )
+    myBusy( false ),
+    myIsShapeType( false )
 {
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
 
@@ -164,6 +165,11 @@ void GroupGUI_GroupDlg::Init()
   //mySelSubBtn->setChecked( true );
   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
 
+  //unset shape type to avoid preparation of selection before exact user shape type selection
+  //setConstructorId( -1 ); //non valid shape type
+  unsetConstructorId();
+  myIsShapeType = false;
+
   if ( myMode == CreateGroup ) {
     initName( tr( "GROUP_PREFIX" ) );
 
@@ -470,16 +476,16 @@ void GroupGUI_GroupDlg::SelectionIntoArgument()
     if (aSelList.Extent() == 1) {
       Standard_Boolean aResult = Standard_False;
       GEOM::GEOM_Object_var anObj =
-       GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aResult);
+        GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aResult);
 
       if ( aResult && !anObj->_is_nil() && GEOMBase::IsShape( anObj ) ) {
-       myMainObj = anObj;
-       myEditCurrentArgument->setText( GEOMBase::GetName( anObj ) );
-       // activate subshapes selection by default
-       myEditCurrentArgument = 0;
-       activateSelection();
-       updateState();
-       return;
+        myMainObj = anObj;
+        myEditCurrentArgument->setText( GEOMBase::GetName( anObj ) );
+        // activate subshapes selection by default
+        myEditCurrentArgument = 0;
+        activateSelection();
+        updateState();
+        return;
       }
     }
 
@@ -548,8 +554,8 @@ void GroupGUI_GroupDlg::SelectionIntoArgument()
           TopoDS_Shape aShape;
           if ( GEOMBase::GetShape(aSubObjects[i], aShape, getShapeType()) )
           {
-           CORBA::Long anIndex;
-           anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
+            CORBA::Long anIndex;
+            anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
             if ( anIndex >= 0 ) {
               //if ( myPlaceCheckBox->isChecked() && ! myMain2InPlaceIndices.IsBound( anIndex ))
               if ( subSelectionWay() != ALL_SUBSHAPES &&
@@ -560,7 +566,7 @@ void GroupGUI_GroupDlg::SelectionIntoArgument()
           }
         }
       }
-      if ( !myMainObj->_is_nil() /*&& mySelSubBtn->isChecked()*/)
+      if ( !myMainObj->_is_nil()  && myIsShapeType/*&& mySelSubBtn->isChecked()*/)
         if ( subSelectionWay() == ALL_SUBSHAPES )
           localSelection( myMainObj, getShapeType() );
         else if ( !myInPlaceObj->_is_nil() )
@@ -589,6 +595,7 @@ void GroupGUI_GroupDlg::SelectionIntoArgument()
 //=================================================================================
 void GroupGUI_GroupDlg::ConstructorsClicked( int constructorId )
 {
+  myIsShapeType = true;
   myIdList->clear();
   activateSelection();
   updateState();
@@ -608,6 +615,8 @@ void GroupGUI_GroupDlg::selectAllSubShapes()
 //   if ( !myPlaceCheckBox->isChecked() )
   if ( subSelectionWay() == ALL_SUBSHAPES )
   {
+    if ( !myIsShapeType )
+      return;
     myIdList->clear();
     GEOM::GEOM_IShapesOperations_var aShOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
     aSubShapes = aShOp->SubShapeAllIDs(myMainObj, getShapeType(), false);
@@ -713,8 +722,8 @@ void GroupGUI_GroupDlg::add()
         TopoDS_Shape aShape;
         if ( GEOMBase::GetShape(aSubObjects[i], aShape, getShapeType()) )
         {
-         CORBA::Long anIndex;
-           anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
+          CORBA::Long anIndex;
+            anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
           if ( anIndex >= 0 )
             aMapIndex.Add( anIndex );
         }
@@ -798,6 +807,7 @@ void GroupGUI_GroupDlg::setShapeType( const TopAbs_ShapeEnum theType )
   case TopAbs_SOLID:  anId = 3; break;
   }
   setConstructorId( anId );
+  myIsShapeType = true;
 }
 
 
@@ -810,7 +820,9 @@ void GroupGUI_GroupDlg::activateSelection()
   globalSelection( GEOM_ALLSHAPES );
 
   // local selection
-  if ( !myMainObj->_is_nil() && !myEditCurrentArgument/* && mySelSubBtn->isChecked()*/) {
+  if ( !myMainObj->_is_nil() && !myEditCurrentArgument/* && mySelSubBtn->isChecked()*/
+       && myIsShapeType) { // check if shape type is already choosen by user
+  
 //     if ( !myPlaceCheckBox->isChecked() )
     if ( subSelectionWay() == ALL_SUBSHAPES )
       localSelection( myMainObj, getShapeType() );
@@ -877,8 +889,8 @@ void GroupGUI_GroupDlg::updateState()
         aSubObjects[i];
         if ( GEOMBase::GetShape(aSubObjects[i], aShape, getShapeType()) )
         {
-         CORBA::Long anIndex;
-         anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
+          CORBA::Long anIndex;
+          anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
           if ( anIndex >= 0 )
             aMapIndex.Add( anIndex );
           else
index 5edccedcdb0486cc14521b1fad76282daed53644..337d0da4f08976d2376f56e19779ed4b0b7e6295 100644 (file)
@@ -91,6 +91,7 @@ private:
 private:
   Mode                                myMode;
   bool                                myBusy;
+  bool                                myIsShapeType;
   GEOM::GEOM_Object_var               myMainObj;
   GEOM::GEOM_Object_var               myGroup;
   GEOM::GEOM_Object_var               myInPlaceObj;