Salome HOME
Container servant hold information about SSL mode or not
[modules/geom.git] / src / TransformationGUI / TransformationGUI_MultiTranslationDlg.cxx
index 352f88c2e27158f6c26725cf48bb80e477a6bd80..6d9c3262015d037a5dd37002ad8b35a6e86477df 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -82,10 +82,10 @@ TransformationGUI_MultiTranslationDlg::TransformationGUI_MultiTranslationDlg
   GroupPoints = new DlgRef_2Sel2Spin1Check(centralWidget());
   GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTITRANSLATION_SIMPLE"));
   GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
-  GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR_U"));
-  GroupPoints->TextLabel3->setText(tr("GEOM_STEP_U"));
-  GroupPoints->TextLabel4->setText(tr("GEOM_NB_TIMES_U"));
-  GroupPoints->CheckButton1->setText(tr("GEOM_REVERSE_U"));
+  GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR"));
+  GroupPoints->TextLabel3->setText(tr("GEOM_STEP"));
+  GroupPoints->TextLabel4->setText(tr("GEOM_NB_TIMES"));
+  GroupPoints->CheckButton1->setText(tr("GEOM_REVERSE_DIRECTION"));
   GroupPoints->PushButton1->setIcon(image2);
   GroupPoints->PushButton2->setIcon(image2);
   GroupPoints->LineEdit1->setReadOnly(true);
@@ -142,7 +142,7 @@ void TransformationGUI_MultiTranslationDlg::Init()
   int SpecificStep = 1;
   // init variables
   myStepU = myStepV = 50.0;
-  myNbTimesU = myNbTimesV = 2;
+  myNbTimesU = myNbTimesV = 3;
 
   // min, max, step and decimals for spin boxes & initial values
   initSpinBox(GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" );
@@ -239,15 +239,21 @@ void TransformationGUI_MultiTranslationDlg::ConstructorsClicked (int constructor
       GroupDimensions->hide();
       GroupPoints->show();
 
-      GroupPoints->LineEdit1->setText("");
-      GroupPoints->LineEdit2->setText("");
-      myBase.nullify();
-      myVectorU.nullify();
+      //GroupPoints->LineEdit1->setText("");
+      //GroupPoints->LineEdit2->setText("");
+      //myBase.nullify();
+      //myVectorU.nullify();
+
+      if ( myBase ) GroupDimensions->LineEdit1->setText( GEOMBase::GetName( myBase.get() ) );
+      if ( myVectorU ) GroupDimensions->LineEdit2->setText( GEOMBase::GetName( myVectorU.get() ) );
 
       GroupPoints->SpinBox_DX->setValue(myStepU);
       GroupPoints->SpinBox_DY->setValue(myNbTimesU);
 
-      GroupPoints->PushButton1->click();
+      if ( !myBase )
+       GroupPoints->PushButton1->click();
+      else if ( !myVectorU )
+       GroupPoints->PushButton2->click();
       break;
     }
   case 1: // Translate double
@@ -255,19 +261,28 @@ void TransformationGUI_MultiTranslationDlg::ConstructorsClicked (int constructor
       GroupPoints->hide();
       GroupDimensions->show();
 
-      GroupDimensions->LineEdit1->setText("");
-      GroupDimensions->LineEdit2->setText("");
-      GroupDimensions->LineEdit3->setText("");
-      myBase.nullify();
-      myVectorU.nullify();
-      myVectorV.nullify();
+      //GroupDimensions->LineEdit1->setText("");
+      //GroupDimensions->LineEdit2->setText("");
+      //GroupDimensions->LineEdit3->setText("");
+      //myBase.nullify();
+      //myVectorU.nullify();
+      //myVectorV.nullify();
+
+      if ( myBase ) GroupDimensions->LineEdit1->setText( GEOMBase::GetName( myBase.get() ) );
+      if ( myVectorU ) GroupDimensions->LineEdit2->setText( GEOMBase::GetName( myVectorU.get() ) );
+      if ( myVectorV ) GroupDimensions->LineEdit3->setText( GEOMBase::GetName( myVectorV.get() ) );
 
       GroupDimensions->SpinBox_DX1->setValue(myStepU);
       GroupDimensions->SpinBox_DY1->setValue(myNbTimesU);
       GroupDimensions->SpinBox_DX2->setValue(myStepV);
       GroupDimensions->SpinBox_DY2->setValue(myNbTimesV);
 
-      GroupDimensions->PushButton1->click();
+      if ( !myBase )
+       GroupDimensions->PushButton1->click();
+      else if ( !myVectorU )
+       GroupDimensions->PushButton2->click();
+      else if ( !myVectorV )
+       GroupDimensions->PushButton3->click();
       break;
     }
   }
@@ -320,58 +335,71 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument()
   erasePreview();
 
   TopAbs_ShapeEnum aNeedType = ( myEditCurrentArgument == GroupPoints->LineEdit2 ||
-                                myEditCurrentArgument == GroupDimensions->LineEdit2 ||
-                                myEditCurrentArgument == GroupDimensions->LineEdit3 ) ?
+                                 myEditCurrentArgument == GroupDimensions->LineEdit2 ||
+                                 myEditCurrentArgument == GroupDimensions->LineEdit3 ) ?
     TopAbs_EDGE : TopAbs_SHAPE;
   GEOM::GeomObjPtr aSelectedObject = getSelected( aNeedType );
   TopoDS_Shape aShape;
   if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) {
     QString aName = GEOMBase::GetName( aSelectedObject.get() );
     myEditCurrentArgument->setText( aName );
-    if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
+
+    if ( myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
       myBase = aSelectedObject;
-      if ( !myVectorU )
-       GroupPoints->PushButton2->click();
+
+      // recompute myStepU (Mantis issue 0021718)
+      GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations();
+      double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
+      anOper->GetBoundingBox(myBase.get(), true, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
+      if (anOper->IsDone()) {
+        myStepU = floor(1.5 * (Xmax - Xmin));
+        myStepV = floor(1.5 * (Ymax - Ymin));
+        GroupPoints->SpinBox_DX->setValue(myStepU);
+        GroupDimensions->SpinBox_DX1->setValue(myStepU);
+        GroupDimensions->SpinBox_DX2->setValue(myStepV);
+      }
+
+      if ( myEditCurrentArgument == GroupPoints->LineEdit1 && !myVectorU )
+        GroupPoints->PushButton2->click();
+      if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
+       if ( !myVectorU )
+         GroupDimensions->PushButton2->click();
+       else if ( !myVectorV )
+         GroupDimensions->PushButton3->click();
+      }
     }
     else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) {
       myVectorU = aSelectedObject;
       if ( !myBase )
-       GroupPoints->PushButton1->click();
-    }
-    else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
-      myBase = aSelectedObject;
-      if ( !myVectorU )
-       GroupDimensions->PushButton2->click();
-      else if ( !myVectorV )
-       GroupDimensions->PushButton3->click();
+        GroupPoints->PushButton1->click();
     }
     else if ( myEditCurrentArgument == GroupDimensions->LineEdit2 ) {
       myVectorU = aSelectedObject;
       if ( !myVectorV )
-       GroupDimensions->PushButton3->click();
+        GroupDimensions->PushButton3->click();
       else if ( !myBase )
-       GroupDimensions->PushButton1->click();
+        GroupDimensions->PushButton1->click();
     }
     else if ( myEditCurrentArgument == GroupDimensions->LineEdit3 ) {
       myVectorV = aSelectedObject;
       if ( !myBase )
-       GroupDimensions->PushButton1->click();
+        GroupDimensions->PushButton1->click();
       else if ( !myVectorU )
-       GroupDimensions->PushButton2->click();
+        GroupDimensions->PushButton2->click();
     }
 
     // clear selection
-    disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
-    myGeomGUI->getApp()->selectionMgr()->clearSelected();
-    connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
-           this, SLOT(SelectionIntoArgument()));
+    // disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
+    // myGeomGUI->getApp()->selectionMgr()->clearSelected();
+    // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
+    //         this, SLOT(SelectionIntoArgument()));
   }
   else {
     if ( myEditCurrentArgument == GroupPoints->LineEdit1 ||
-        myEditCurrentArgument == GroupDimensions->LineEdit1 )
+         myEditCurrentArgument == GroupDimensions->LineEdit1 )
       myBase.nullify();
     else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ||
-             myEditCurrentArgument == GroupDimensions->LineEdit2 )
+              myEditCurrentArgument == GroupDimensions->LineEdit2 )
       myVectorU.nullify();
     else if ( myEditCurrentArgument == GroupDimensions->LineEdit3 )
       myVectorV.nullify();
@@ -401,7 +429,7 @@ void TransformationGUI_MultiTranslationDlg::SetEditCurrentArgument()
   else if (send == GroupPoints->PushButton2) {
     myEditCurrentArgument = GroupPoints->LineEdit2;
 
-    localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
+    localSelection(TopAbs_EDGE);
 
     GroupPoints->PushButton1->setDown(false);
     GroupPoints->LineEdit1->setEnabled(false);
@@ -417,7 +445,7 @@ void TransformationGUI_MultiTranslationDlg::SetEditCurrentArgument()
   else if (send == GroupDimensions->PushButton2) {
     myEditCurrentArgument = GroupDimensions->LineEdit2;
 
-    localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
+    localSelection(TopAbs_EDGE);
 
     GroupDimensions->PushButton1->setDown(false);
     GroupDimensions->PushButton3->setDown(false);
@@ -427,7 +455,7 @@ void TransformationGUI_MultiTranslationDlg::SetEditCurrentArgument()
   else if (send == GroupDimensions->PushButton3) {
     myEditCurrentArgument = GroupDimensions->LineEdit3;
 
-    localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
+    localSelection(TopAbs_EDGE);
 
     GroupDimensions->PushButton1->setDown(false);
     GroupDimensions->PushButton2->setDown(false);
@@ -474,7 +502,7 @@ void TransformationGUI_MultiTranslationDlg::enterEvent (QEvent*)
 // function : TextValueChangedInSpinBox
 // purpose  :
 //=================================================================================
-void TransformationGUI_MultiTranslationDlg::TextValueChangedInSpinBox( const QString& s)
+void TransformationGUI_MultiTranslationDlg::TextValueChangedInSpinBox( const QString& )
 {
   QObject* send = (QObject*)sender();
   bool isDigit = true;
@@ -587,7 +615,7 @@ void TransformationGUI_MultiTranslationDlg::ReverseStepV()
 //=================================================================================
 GEOM::GEOM_IOperations_ptr TransformationGUI_MultiTranslationDlg::createOperation()
 {
-  return getGeomEngine()->GetITransformOperations(getStudyId());
+  return getGeomEngine()->GetITransformOperations();
 }
 
 //=================================================================================
@@ -597,18 +625,20 @@ GEOM::GEOM_IOperations_ptr TransformationGUI_MultiTranslationDlg::createOperatio
 bool TransformationGUI_MultiTranslationDlg::isValid (QString& msg)
 {
   bool ok = false;
-  switch ( getConstructorId() ) {
+  switch (getConstructorId()) {
   case 0:
     ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) &&
          GroupPoints->SpinBox_DY->isValid( msg, !IsPreview() ) &&
-         myBase && myVectorU;
+         myBase;
+         //myBase && myVectorU; // Mantis issue 0021718
     break;
   case 1:
     ok = GroupDimensions->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
          GroupDimensions->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
          GroupDimensions->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
          GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
-         myBase && myVectorU && myVectorV;
+         myBase;
+         //myBase && myVectorU && myVectorV; // Mantis issue 0021718
     break;
   default:
     break;
@@ -625,44 +655,39 @@ bool TransformationGUI_MultiTranslationDlg::execute (ObjectList& objects)
   bool res = false;
 
   GEOM::GEOM_Object_var anObj;
-
   QStringList aParameters;
 
   GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation());
 
   switch (getConstructorId()) {
   case 0:
-    if ( myBase && myVectorU ) {
-      createPathPreview ( myVectorU.get() );
-      anObj = anOper->MultiTranslate1D(myBase.get(), myVectorU.get(), myStepU, myNbTimesU);
-      if(!IsPreview()) {
-        aParameters<<GroupPoints->SpinBox_DX->text();
-        aParameters<<GroupPoints->SpinBox_DY->text();
-      }
-      res = true;
+    createPathPreview(myVectorU.get());
+    anObj = anOper->MultiTranslate1D(myBase.get(), myVectorU.get(), myStepU, myNbTimesU);
+    if (!IsPreview()) {
+      aParameters << GroupPoints->SpinBox_DX->text();
+      aParameters << GroupPoints->SpinBox_DY->text();
     }
+    res = true;
     break;
   case 1:
-    if ( myBase && myVectorU && myVectorV ) {
-      createPathPreview ( myVectorU.get() );
-      createPathPreview ( myVectorV.get() );
-      anObj = anOper->MultiTranslate2D(myBase.get(),
-                                       myVectorU.get(), myStepU, myNbTimesU,
-                                       myVectorV.get(), myStepV, myNbTimesV);
-      if(!IsPreview()) {
-        aParameters<<GroupDimensions->SpinBox_DX1->text();
-        aParameters<<GroupDimensions->SpinBox_DY1->text();
-        aParameters<<GroupDimensions->SpinBox_DX2->text();
-        aParameters<<GroupDimensions->SpinBox_DY2->text();
-      }
-      res = true;
+    createPathPreview(myVectorU.get());
+    createPathPreview(myVectorV.get());
+    anObj = anOper->MultiTranslate2D(myBase.get(),
+                                    myVectorU.get(), myStepU, myNbTimesU,
+                                    myVectorV.get(), myStepV, myNbTimesV);
+    if (!IsPreview()) {
+      aParameters << GroupDimensions->SpinBox_DX1->text();
+      aParameters << GroupDimensions->SpinBox_DY1->text();
+      aParameters << GroupDimensions->SpinBox_DX2->text();
+      aParameters << GroupDimensions->SpinBox_DY2->text();
     }
+    res = true;
     break;
   }
 
   if (!anObj->_is_nil()) {
-    if(!IsPreview())
-      anObj->SetParameters(aParameters.join(":").toLatin1().constData());
+    if (!IsPreview())
+      anObj->SetParameters(aParameters.join(":").toUtf8().constData());
     objects.push_back(anObj._retn());
   }
 
@@ -688,12 +713,22 @@ void TransformationGUI_MultiTranslationDlg::addSubshapesToStudy()
   }
 }
 
+//=================================================================================
+// function : getSourceObjects
+// purpose  : virtual method to get source objects
+//=================================================================================
+QList<GEOM::GeomObjPtr> TransformationGUI_MultiTranslationDlg::getSourceObjects()
+{
+  QList<GEOM::GeomObjPtr> res;
+  res << myBase << myVectorU << myVectorV;
+  return res;
+}
+
 //=================================================================================
 // function : restoreSubShapes
 // purpose  :
 //=================================================================================
-void TransformationGUI_MultiTranslationDlg::restoreSubShapes (SALOMEDS::Study_ptr   theStudy,
-                                                              SALOMEDS::SObject_ptr theSObject)
+void TransformationGUI_MultiTranslationDlg::restoreSubShapes (SALOMEDS::SObject_ptr theSObject)
 {
   if (mainFrame()->CheckBoxRestoreSS->isChecked()) {
     // we pass here the first operation argument (object) through the list of arguments
@@ -702,7 +737,7 @@ void TransformationGUI_MultiTranslationDlg::restoreSubShapes (SALOMEDS::Study_pt
     GEOM::ListOfGO_var anArgs = new GEOM::ListOfGO;
     anArgs->length(1);
     anArgs[0] = myBase.copy();
-    getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, anArgs,
+    getGeomEngine()->RestoreSubShapesSO(theSObject, anArgs,
                                         /*theFindMethod=*/GEOM::FSM_MultiTransformed,
                                         /*theInheritFirstArg=*/true,
                                         mainFrame()->CheckBoxAddPrefix->isChecked());
@@ -716,16 +751,18 @@ void TransformationGUI_MultiTranslationDlg::restoreSubShapes (SALOMEDS::Study_pt
 void TransformationGUI_MultiTranslationDlg::createPathPreview ( GEOM::GEOM_Object_ptr thePath )
 {
   if ( IsPreview() ) {
+    if (thePath->_is_nil()) return;
     TopoDS_Shape aShape;
     GEOMBase::GetShape( thePath, aShape, TopAbs_SHAPE );
     TopoDS_Edge anEdge = TopoDS::Edge( aShape );
     ShapeAnalysis_Edge aShapeAnal;
     TopoDS_Vertex aFirst = aShapeAnal.FirstVertex( anEdge );
     TopoDS_Vertex aLast = aShapeAnal.LastVertex( anEdge );
+    if ( BRep_Tool::Pnt(aFirst).IsEqual( BRep_Tool::Pnt(aLast), Precision::Confusion() ) ) return;
     TopoDS_Shape aVector = BRepBuilderAPI_MakeEdge(BRep_Tool::Pnt(aFirst), BRep_Tool::Pnt(aLast)).Shape();
     const char* aName = "tmpVector";
     Handle(GEOM_AISVector) anIO = new GEOM_AISVector( aVector, aName );
-
+    
     // add Prs to preview
     SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
     SOCC_Prs* aPrs = dynamic_cast<SOCC_Prs*>(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0));