Salome HOME
curve creator: bring together two extremities of two sections of polylines
authorPaul RASCLE <paul.rascle@edf.fr>
Fri, 27 May 2016 15:03:09 +0000 (17:03 +0200)
committerPaul RASCLE <paul.rascle@edf.fr>
Fri, 27 May 2016 15:03:09 +0000 (17:03 +0200)
resources/CMakeLists.txt
resources/bringTogether.png [new file with mode: 0644]
src/CurveCreator/CurveCreator_Widget.cxx
src/CurveCreator/CurveCreator_Widget.h
src/GEOMGUI/GEOM_images.ts
src/GEOMGUI/GEOM_msg_en.ts

index 3d47d93edc22f23ef4df2f7c95802f4b251a5e97..1936ab51c57a57dce4437e17319185a499001c8d 100755 (executable)
@@ -281,6 +281,7 @@ SET( _res_files
   closedspline.png
   edit_points.png
   join2.png
+  bringTogether.png
   new_point.png
   new_section.png
   # ADVANCED_RESOURCES:
diff --git a/resources/bringTogether.png b/resources/bringTogether.png
new file mode 100644 (file)
index 0000000..f5a5a93
Binary files /dev/null and b/resources/bringTogether.png differ
index d401b8bc64782c09b6f75d513c031414c3656cc7..fc31c7dd6eff8b8950a2bf9607ad04fbebdb9b2c 100644 (file)
@@ -50,6 +50,8 @@
 #include <QTime>
 #include <QSplitter>
 
+#include <utilities.h>
+
 //#define MEASURE_TIME
 
 #ifdef MEASURE_TIME
@@ -120,6 +122,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")));
 
@@ -183,18 +186,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 +393,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 +984,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();
+  int sections[nbPoints];
+  int iPoints[nbPoints];
+  int nbPtsSection[nbPoints];
+  double x[nbPoints];
+  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) and (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
index 87433c553c36f22beb49dacaf56fe853b9d72175..ca5fe0f917866f76b92f773bcb6274fe4b07c47b 100644 (file)
@@ -115,6 +115,7 @@ protected slots:
   void     onModifySection();
   void     onCancelSection();
   void     onJoin();
+  void     onBringTogether();
   void     onRemove();
   void     onClearAll();
   void     onJoinAll();
@@ -158,7 +159,8 @@ protected:
                  CLEAR_ALL_ID, 
                  SEPARATOR_ID, 
                  MODIFICATION_MODE_ID, 
-                 DETECTION_MODE_ID 
+                 DETECTION_MODE_ID,
+                 BRING_TOGETHER_ID
   };
 
 private:
index cfcccd313b526d0aa9f64ae1c859f2be4c1d67d4..7d21059a17e3699af015302dfe3d39484d8f0271 100644 (file)
             <source>ICON_CC_JOIN</source>
             <translation>join2.png</translation>
         </message>
+        <message>
+            <source>ICON_CC_BRING_TOGETHER</source>
+            <translation>bringTogether.png</translation>
+        </message>
         <message>
             <source>ICON_CC_NEW_POINT</source>
             <translation>new_point.png</translation>
index bdb86dfc08d8a8fa372273c2ef84c278a748c1e8..6ed6b80824db38ba87e10b9089b115f53f22dfdf 100644 (file)
@@ -5914,8 +5914,16 @@ shells and solids on the other hand.</translation>
     <message>
         <source>JOIN_TLT</source>
         <translation>Join selected sections</translation>
+    </message>
+     <message>
+        <source>BRING_TOGETHER</source>
+        <translation>Bring together</translation>
     </message>
     <message>
+        <source>BRING_TOGETHER_TLT</source>
+        <translation>Bring together two points on the extremities of two sections</translation>
+    </message>
+   <message>
         <source>CLEAR_ALL</source>
         <translation>Clear all</translation>
     </message>