Salome HOME
refs #1331: access to methods for testing purposes
[modules/geom.git] / src / CurveCreator / CurveCreator_Widget.cxx
index 540ebd46b7b7cf172702157c6e018bb42999819d..1906c758dbd8b613e86daf80fbbb9446f51cb7f4 100644 (file)
@@ -19,8 +19,6 @@
 
 #include "CurveCreator_Widget.h"
 #include "CurveCreator_TreeView.h"
-#include "CurveCreator_ICurve.hxx"
-#include "CurveCreator.hxx"
 #include "CurveCreator_NewSectionDlg.h"
 #include "CurveCreator_Utils.hxx"
 #include "CurveCreator_UtilsICurve.hxx"
@@ -50,6 +48,8 @@
 #include <QTime>
 #include <QSplitter>
 
+#include <utilities.h>
+
 //#define MEASURE_TIME
 
 #ifdef MEASURE_TIME
@@ -120,6 +120,7 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
   QPixmap aSplinePixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_SPLINE")));
   QPixmap aRemovePixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_DELETE")));
   QPixmap aJoinPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_JOIN")));
+  QPixmap aBringTogetherPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_BRING_TOGETHER")));
   QPixmap aStepUpPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_UP")));
   QPixmap aStepDownPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_DOWN")));
 
@@ -162,9 +163,9 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
   anAct->setCheckable(true);
   connect(anAct, SIGNAL(triggered(bool)), this, SLOT(onDetectionMode(bool)) );
   connect(anAct, SIGNAL(toggled(bool)), this, SLOT(onModeChanged(bool)) );
-  if ( !(theActionFlags & DisableDetectionMode) ) {
-    aTB->addAction(anAct);
-  }
+//  if ( !(theActionFlags & DisableDetectionMode) ) {
+//    aTB->addAction(anAct);
+//  }
   
   anAct = createAction( CLOSE_SECTIONS_ID, tr("CLOSE_SECTIONS"), QPixmap(), tr("CLOSE_SECTIONS_TLT"), 
                         QKeySequence(Qt::ControlModifier|Qt::Key_W) );
@@ -183,18 +184,23 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
                         tr("SET_SECTIONS_SPLINE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_R) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onSetSpline()) );
 
+  aTB->addSeparator();
+
   anAct = createAction( REMOVE_ID, tr("REMOVE"), aRemovePixmap, tr("REMOVE_TLT"), 
                         QKeySequence(Qt::ControlModifier|Qt::Key_Delete ) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onRemove()) );
   aTB->addAction(anAct);
   
-  aTB->addSeparator();
-
   anAct = createAction( JOIN_ID, tr("JOIN"), aJoinPixmap, tr("JOIN_TLT"), 
                         QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) );
   connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) );
   aTB->addAction(anAct);
 
+  anAct = createAction( BRING_TOGETHER_ID, tr("BRING_TOGETHER"), aBringTogetherPixmap, tr("BRING_TOGETHER_TLT"),
+                        QKeySequence(Qt::ControlModifier|Qt::Key_Equal ) );
+  connect( anAct, SIGNAL(triggered()), this, SLOT(onBringTogether()) );
+  aTB->addAction(anAct);
+
   anAct = createAction( CLEAR_ALL_ID, tr("CLEAR_ALL"), QPixmap(), tr("CLEAR_ALL_TLT"), 
                         QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Delete ) );
   connect( anAct, SIGNAL(triggered()), this, SLOT( onClearAll()) );
@@ -385,7 +391,7 @@ void CurveCreator_Widget::updateActionsStates()
           if( aSectCnt > 1 )
             anEnabledAct << JOIN_ALL_ID;
           if( aSelSections.size() > 1 ){
-            anEnabledAct << JOIN_ID;
+            anEnabledAct << JOIN_ID << BRING_TOGETHER_ID;
           }
         }
         break;
@@ -976,6 +982,68 @@ void CurveCreator_Widget::addCoordsByClick( QMouseEvent* pe )
   }
 }
 
+/**
+ * Set the same coordinates on two section extremities.
+ * Usage: build a closed contour with several sections.
+ * Works with two points selected, at the extremities of different sections.
+ * The second point gets the coordinates of the first.
+ */
+void CurveCreator_Widget::onBringTogether()
+{
+  MESSAGE("onBringTogether");
+  ActionMode aMode = getActionMode();
+  if ( aMode != ModificationMode )
+    return;
+  int nbPoints = myLocalPoints.size();
+  MESSAGE("number of selected points: " << nbPoints);
+  if (nbPoints != 2)
+    {
+      MESSAGE("works only with two points taken at the extremities of different sections, nothing done");
+      return;
+    }
+
+  CurveCreator_ICurve::SectionToPointList::const_iterator anIt = myLocalPoints.begin(),
+                                                          aLast = myLocalPoints.end();
+  std::vector<int> sections(nbPoints);
+  std::vector<int> iPoints(nbPoints);
+  std::vector<int> nbPtsSection(nbPoints);
+  std::vector<double> x(nbPoints);
+  std::vector<double> y(nbPoints);
+  int i = 0;
+  for ( ; anIt != aLast; anIt++, i++ )
+    {
+      CurveCreator_ICurve::SectionToPoint aSPoint = *anIt;
+      sections[i] = aSPoint.first;
+      iPoints[i] = aSPoint.second;
+      nbPtsSection[i] = myCurve->getNbPoints(sections[i]);
+      if ((iPoints[i] != 0) && (iPoints[i] != nbPtsSection[i]-1))
+        {
+          MESSAGE("a point is not on a section extremity, nothing done");
+          return;
+        }
+      gp_Pnt aPoint;
+      CurveCreator_UtilsICurve::getPoint( myCurve, sections[i], iPoints[i], aPoint );
+      x[i] = aPoint.X();
+      y[i] = aPoint.Y();
+      MESSAGE("point: " << sections[i] << " " << iPoints[i] << " " << x[i] << " " << y[i]);
+    }
+  if (sections[1] == sections[0])
+    {
+      MESSAGE("the two points must be at the extremities of different sections, nothing done");
+      return;
+    }
+
+  CurveCreator_ICurve::SectionToPointList aSelPoints;
+  startCurveModification( aSelPoints );
+
+  CurveCreator::Coordinates aChangedPos;
+  aChangedPos.push_back( x[0] ); // apply the first point coordinates to the second point.
+  aChangedPos.push_back( y[0] );
+  myCurve->setPoint( sections[1], iPoints[1], aChangedPos );
+
+  finishCurveModification( aSelPoints );
+}
+
 /**
  * Manage mouse press events
  * \param theWindow an owner of the signal
@@ -1022,7 +1090,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
     {
       Handle(AIS_InteractiveContext) aCtx = getAISContext();
       if ( !aCtx.IsNull() )
-        aCtx->ClearSelected();
+        aCtx->ClearSelected( Standard_True );
     }
     return;
   } 
@@ -1053,11 +1121,11 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
       // otherwise a rectangular selection.
       if ( myStartPoint == myEndPoint )
       {
-        aCtx->MoveTo( myEndPoint.x(), myEndPoint.y(), aView3d );
+        aCtx->MoveTo( myEndPoint.x(), myEndPoint.y(), aView3d, Standard_True );
         if ( aHasShift )
-          aCtx->ShiftSelect();
+          aCtx->ShiftSelect( Standard_True );
         else
-          aCtx->Select();
+          aCtx->Select( Standard_True );
       }
       else
       {