Salome HOME
Merge from BR_Dev_For_4_0 branch (from tag mergeto_BR_QT4_Dev_17Jan08)
[modules/geom.git] / src / TransformationGUI / TransformationGUI_MultiRotationDlg.cxx
index 9480a6b09cc5615b3e2d6a57e93b4322250533e8..170023e41ee80e9cd9b0aeb48427fbdf1c0107f9 100644 (file)
 #include <SalomeApp_Application.h>
 #include <LightApp_SelectionMgr.h>
 
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS.hxx>
+#include <TopExp.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+
 #include <GEOMImpl_Types.hxx>
 
 //=================================================================================
@@ -91,7 +98,7 @@ TransformationGUI_MultiRotationDlg::TransformationGUI_MultiRotationDlg
   layout->addWidget( GroupDimensions );
   /***************************************************************/
 
-  setHelpFileName( "multi_rotation.htm" );
+  setHelpFileName( "multi_rotation_operation_page.html" );
 
   Init();
 }
@@ -120,13 +127,13 @@ void TransformationGUI_MultiRotationDlg::Init()
   double SpecificStep1 = 5;
   double SpecificStep2 = 1;
   /* min, max, step and decimals for spin boxes & initial values */
-  initSpinBox( GroupPoints->SpinBox_DX, 1.0, MAX_NUMBER, SpecificStep2, 3 );
+  initSpinBox( GroupPoints->SpinBox_DX, 1.0, MAX_NUMBER, SpecificStep2, 10 );
   GroupPoints->SpinBox_DX->setValue( myNbTimes1 );
 
-  initSpinBox( GroupDimensions->SpinBox_DX1, COORD_MIN, COORD_MAX, SpecificStep1, 3 );
-  initSpinBox( GroupDimensions->SpinBox_DY1, 1.0, MAX_NUMBER, SpecificStep2, 3 );
-  initSpinBox( GroupDimensions->SpinBox_DX2, COORD_MIN, COORD_MAX, step, 3 );
-  initSpinBox( GroupDimensions->SpinBox_DY2, 1.0, MAX_NUMBER, SpecificStep2, 3 );
+  initSpinBox( GroupDimensions->SpinBox_DX1, COORD_MIN, COORD_MAX, SpecificStep1, 10 ); // VSR: TODO: DBL_DIGITS_DISPLAY
+  initSpinBox( GroupDimensions->SpinBox_DY1, 1.0, MAX_NUMBER, SpecificStep2, 10 );
+  initSpinBox( GroupDimensions->SpinBox_DX2, COORD_MIN, COORD_MAX, step, 10 ); // VSR: TODO: DBL_DIGITS_DISPLAY
+  initSpinBox( GroupDimensions->SpinBox_DY2, 1.0, MAX_NUMBER, SpecificStep2, 10 );
   GroupDimensions->SpinBox_DX1->setValue( myAng );
   GroupDimensions->SpinBox_DY1->setValue( myNbTimes1 );
   GroupDimensions->SpinBox_DX2->setValue( myStep );
@@ -164,7 +171,7 @@ void TransformationGUI_MultiRotationDlg::Init()
 
   connect( GroupDimensions->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( ReverseAngle() ) );
   
-  connect( myGeomGUI->getApp()->selectionMgr(), 
+  connect( myGeomGUI->getApp()->selectionMgr(),
           SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
 
   initName( tr( "GEOM_MULTIROTATION" ) );
@@ -282,14 +289,47 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
   if ( !testResult || CORBA::is_nil( aSelectedObject) || !GEOMBase::IsShape( aSelectedObject ) )
     return;
 
+  QString aName = GEOMBase::GetName( aSelectedObject );
+
   if ( myEditCurrentArgument == GroupPoints->LineEdit1 ||
        myEditCurrentArgument == GroupDimensions->LineEdit1 )
     myBase = aSelectedObject;
   else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ||
-            myEditCurrentArgument == GroupDimensions->LineEdit2 )
-    myVector = aSelectedObject;
-
-  myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) );
+            myEditCurrentArgument == GroupDimensions->LineEdit2 ) {
+    if ( testResult && !aSelectedObject->_is_nil() ) {
+      TopoDS_Shape aShape;
+         
+      if ( GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_SHAPE ) && !aShape.IsNull() ) {
+       LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
+       TColStd_IndexedMapOfInteger aMap;
+       aSelMgr->GetIndexes( firstIObject(), aMap );
+       if ( aMap.Extent() == 1 ) {
+         int anIndex = aMap( 1 );
+         aName += QString( ":edge_%1" ).arg( anIndex );
+         
+         //Find SubShape Object in Father
+         GEOM::GEOM_Object_var aFindedObject = findObjectInFather( aSelectedObject, aName );
+                 
+         if ( aFindedObject == GEOM::GEOM_Object::_nil() ) { // Object not found in study
+           GEOM::GEOM_IShapesOperations_var aShapesOp =
+             getGeomEngine()->GetIShapesOperations( getStudyId() );
+           myVector = aShapesOp->GetSubShape(aSelectedObject, anIndex);
+         }
+         else {
+           myVector = aFindedObject; // get existing object
+         }
+       }
+       else {
+         if ( aShape.ShapeType() != TopAbs_EDGE ) {
+           aSelectedObject = GEOM::GEOM_Object::_nil();
+           aName = "";
+         }
+         myVector = aSelectedObject;
+       }
+      }
+    }
+  }
+  myEditCurrentArgument->setText( aName );
 
   displayPreview();
 }
@@ -302,22 +342,21 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
 void TransformationGUI_MultiRotationDlg::SetEditCurrentArgument()
 {
   QPushButton* send = (QPushButton*)sender();
+  globalSelection( GEOM_ALLSHAPES );
   
   if ( send == GroupPoints->PushButton1 ) {
     myEditCurrentArgument = GroupPoints->LineEdit1;
-    globalSelection( GEOM_ALLSHAPES );
   }
   else if ( send == GroupPoints->PushButton2 ) {
     myEditCurrentArgument = GroupPoints->LineEdit2;
-    globalSelection( GEOM_LINE  );
+    localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE );
   }
   else if ( send == GroupDimensions->PushButton1 ) {
     myEditCurrentArgument = GroupDimensions->LineEdit1;
-    globalSelection( GEOM_ALLSHAPES );
   }
   else if ( send == GroupDimensions->PushButton2 ) {
     myEditCurrentArgument = GroupDimensions->LineEdit2;
-    globalSelection( GEOM_LINE  );
+    localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE );
   }
 
   myEditCurrentArgument->setFocus();
@@ -457,13 +496,21 @@ bool TransformationGUI_MultiRotationDlg::execute( ObjectList& objects )
   return res;
 }
 
-
 //=================================================================================
-// function : closeEvent
-// purpose  :
+// function : addSubshapeToStudy
+// purpose  : virtual method to add new SubObjects if local selection
 //=================================================================================
-void TransformationGUI_MultiRotationDlg::closeEvent( QCloseEvent* e )
+void TransformationGUI_MultiRotationDlg::addSubshapesToStudy()
 {
-  // myGeomGUI->SetState( -1 );
-  GEOMBase_Skeleton::closeEvent( e );
+  QMap<QString, GEOM::GEOM_Object_var> objMap;
+  
+  switch ( getConstructorId() ) {
+  case 0:
+    objMap[GroupPoints->LineEdit2->text()] = myVector;
+    break;
+  case 1:
+    objMap[GroupDimensions->LineEdit2->text()] = myVector;
+    break;
+  }
+  addSubshapesToFather( objMap );
 }