diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 3d47d93ed..1936ab51c 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -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 index 000000000..f5a5a939c Binary files /dev/null and b/resources/bringTogether.png differ diff --git a/src/CurveCreator/CurveCreator_Widget.cxx b/src/CurveCreator/CurveCreator_Widget.cxx index d401b8bc6..fc31c7dd6 100644 --- a/src/CurveCreator/CurveCreator_Widget.cxx +++ b/src/CurveCreator/CurveCreator_Widget.cxx @@ -50,6 +50,8 @@ #include #include +#include + //#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 diff --git a/src/CurveCreator/CurveCreator_Widget.h b/src/CurveCreator/CurveCreator_Widget.h index 87433c553..ca5fe0f91 100644 --- a/src/CurveCreator/CurveCreator_Widget.h +++ b/src/CurveCreator/CurveCreator_Widget.h @@ -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: diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index cfcccd313..7d21059a1 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -27,6 +27,10 @@ ICON_CC_JOIN join2.png + + ICON_CC_BRING_TOGETHER + bringTogether.png + ICON_CC_NEW_POINT new_point.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index bdb86dfc0..6ed6b8082 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -5914,8 +5914,16 @@ shells and solids on the other hand. JOIN_TLT Join selected sections + + + BRING_TOGETHER + Bring together + BRING_TOGETHER_TLT + Bring together two points on the extremities of two sections + + CLEAR_ALL Clear all