X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FCurveCreator%2FCurveCreator_Widget.cxx;h=8a7feb465f0b3c1df3bec85855ce94e5866a8435;hb=c4999d16551e5ac1eae8329faf1ab65cf023a844;hp=393fa49dcf3f3538f2e4c27497d0b1fc0c5673c0;hpb=5d72df656f5d6b477434dee4b8dcac754ac45c72;p=modules%2Fgeom.git diff --git a/src/CurveCreator/CurveCreator_Widget.cxx b/src/CurveCreator/CurveCreator_Widget.cxx index 393fa49dc..8a7feb465 100644 --- a/src/CurveCreator/CurveCreator_Widget.cxx +++ b/src/CurveCreator/CurveCreator_Widget.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2013-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -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" @@ -48,6 +46,9 @@ #include #include #include +#include + +#include //#define MEASURE_TIME @@ -79,11 +80,10 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent, CurveCreator_ICurve *theCurve, const int theActionFlags, const QStringList& theCoordTitles, - Qt::WindowFlags fl, - int theLocalPointRowLimit ) + Qt::WindowFlags fl ) : QWidget(parent), myNewSectionEditor(NULL), myCurve(theCurve), mySection(0), myDragStarted( false ), myDragInteractionStyle( SUIT_ViewModel::STANDARD ), - myOCCViewer( 0 ), myLocalPointRowLimit( theLocalPointRowLimit ), + myOCCViewer( 0 ), myOld2DMode(OCCViewer_ViewWindow::No2dMode) { bool isToEnableClosed = !( theActionFlags & DisableClosedSection ); @@ -119,6 +119,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"))); @@ -161,9 +162,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) ); @@ -182,18 +183,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()) ); @@ -206,8 +212,14 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent, aSectLayout->setMargin( 5 ); aSectLayout->setSpacing( 5 ); aSectLayout->addWidget(aTB); - aSectLayout->addWidget(mySectionView); - aSectLayout->addWidget( myLocalPointView ); + + QSplitter* aSplitter = new QSplitter(aSectionGroup); + aSplitter->setOrientation(Qt::Vertical); + + aSplitter->addWidget(mySectionView); + aSplitter->addWidget( myLocalPointView ); + + aSectLayout->addWidget(aSplitter); aSectionGroup->setLayout(aSectLayout); QVBoxLayout* aLay = new QVBoxLayout(); aLay->setMargin( 0 ); @@ -378,7 +390,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; @@ -941,7 +953,7 @@ void CurveCreator_Widget::SetViewer2DMode(const bool To2D) //================================================================================= // function : GeometryGUI::addCoordsByClick() -// purpose : Manage mouse press events in Additon mode +// purpose : Manage mouse press events in Addition mode //================================================================================= void CurveCreator_Widget::addCoordsByClick( QMouseEvent* pe ) { @@ -969,6 +981,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 sections(nbPoints); + std::vector iPoints(nbPoints); + std::vector nbPtsSection(nbPoints); + std::vector x(nbPoints); + std::vector 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 @@ -1005,10 +1079,18 @@ void CurveCreator_Widget::onMousePress( SUIT_ViewWindow*, QMouseEvent* theEvent */ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEvent* theEvent ) { - if ( getActionMode() != ModificationMode ) + ActionMode aMode = getActionMode(); + if ( aMode != ModificationMode ) { // Emit selectionChanged() signal getOCCViewer()->performSelectionChanged(); + + if ( aMode == AdditionMode ) + { + Handle(AIS_InteractiveContext) aCtx = getAISContext(); + if ( !aCtx.IsNull() ) + aCtx->ClearSelected( Standard_True ); + } return; } if (theEvent->button() != Qt::LeftButton) return; @@ -1038,11 +1120,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 { @@ -1059,7 +1141,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven if ( myDragStarted ) { bool isDragged = myDragged; CurveCreator_ICurve::SectionToPointList aDraggedPoints; - QMap > anInitialDragPointsCoords; + QMap anInitialDragPointsCoords; if ( myDragged ) { aDraggedPoints = myDragPoints; anInitialDragPointsCoords = myInitialDragPointsCoords; @@ -1105,7 +1187,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven for ( ; anIt != aLast; anIt++ ) { int aSectionId = anIt->first; int aPointId = anIt->second; - std::deque aPos = myCurve->getPoint( aSectionId, aPointId ); + CurveCreator::Coordinates aPos = myCurve->getPoint( aSectionId, aPointId ); aCoordList.push_back( std::make_pair( std::make_pair( aSectionId, aPointId ), aPos ) ); @@ -1195,7 +1277,7 @@ void CurveCreator_Widget::onCellChanged( int theRow, int theColumn ) double aX = myLocalPointView->item( theRow, 2 )->data( Qt::UserRole ).toDouble(); double anY = myLocalPointView->item( theRow, 3 )->data( Qt::UserRole ).toDouble(); - std::deque aChangedPos; + CurveCreator::Coordinates aChangedPos; aChangedPos.push_back( aX ); aChangedPos.push_back( anY ); myCurve->setPoint( aCurrSect, aPntIndex, aChangedPos ); @@ -1338,7 +1420,7 @@ void CurveCreator_Widget::moveSelectedPoints( const int theXPosition, double anYDelta = aStartPnt.Y() - anEndPnt.Y(); CurveCreator_ICurve::SectionToPointCoordsList aCoordList; - std::deque aChangedPos; + CurveCreator::Coordinates aChangedPos; CurveCreator_ICurve::SectionToPointList::const_iterator anIt = myDragPoints.begin(), aLast = myDragPoints.end(); for ( ; anIt != aLast; anIt++ ) { @@ -1377,16 +1459,16 @@ void CurveCreator_Widget::updateLocalPointView() CurveCreator_Utils::getSelectedPoints( aContext, myCurve, myLocalPoints ); int aNbPoints = myLocalPoints.size(); - bool isRowLimit = aNbPoints > myLocalPointRowLimit; - myLocalPointView->setVisible( getActionMode() == ModificationMode && !isRowLimit ); + //bool isRowLimit = aNbPoints > myLocalPointRowLimit; + myLocalPointView->setVisible( getActionMode() == ModificationMode/* && !isRowLimit */); - if ( !isRowLimit ) { - bool isBlocked = myLocalPointView->blockSignals(true); + //if ( !isRowLimit ) { + bool isBlocked = myLocalPointView->blockSignals(true); - myLocalPointView->setLocalPointsToTable( myLocalPoints ); + myLocalPointView->setLocalPointsToTable( myLocalPoints ); - myLocalPointView->blockSignals( isBlocked ); - } + myLocalPointView->blockSignals( isBlocked ); + //} } /** @@ -1490,7 +1572,7 @@ void CurveCreator_Widget::finishCurveModification( * \param theX the X coordinate of the point * \param theY the Y coordinate of the point */ -int CurveCreator_Widget::findLocalPointIndex( int theSectionId, float theX, float theY ) +int CurveCreator_Widget::findLocalPointIndex( int theSectionId, double theX, double theY ) { return CurveCreator_UtilsICurve::findLocalPointIndex( myCurve, theSectionId, theX, theY ); } @@ -1508,7 +1590,7 @@ void CurveCreator_Widget::convert( const CurveCreator_ICurve::SectionToPointList } /** - * Returns whethe the container has the value + * Returns whether the container has the value * \param theList a container of values * \param theValue a value */