-// 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
#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"
#include <QApplication>
#include <QTableWidget>
#include <QTime>
+#include <QSplitter>
+
+#include <utilities.h>
//#define MEASURE_TIME
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")));
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) );
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()) );
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 );
if( aSectCnt > 1 )
anEnabledAct << JOIN_ALL_ID;
if( aSelSections.size() > 1 ){
- anEnabledAct << JOIN_ID;
+ anEnabledAct << JOIN_ID << BRING_TOGETHER_ID;
}
}
break;
//=================================================================================
// 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 )
{
return;
gp_Pnt aPnt;
+ OCCViewer_ViewPort3d* vp = getViewPort();
- ic->InitSelected();
- if ( pe->modifiers() == Qt::ShiftModifier )
- ic->ShiftSelect(); // Append selection
- else
- ic->Select(); // New selection
+ aPnt = CurveCreator_Utils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
- {
- OCCViewer_ViewPort3d* vp = getViewPort();
- aPnt = CurveCreator_Utils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
- }
// set the coordinates into dialog
CurveCreator::Coordinates aCoords;
aCoords.push_back( aPnt.X() );
}
}
+/**
+ * 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
*/
void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEvent* theEvent )
{
-
+ 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;
if (!theWindow->inherits("OCCViewer_ViewWindow")) return;
// 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
{
}
}
- if ( getActionMode() != ModificationMode )
- {
- // Emit selectionChanged() signal
- getOCCViewer()->performSelectionChanged();
- return;
- }
-
if ( myDragStarted ) {
bool isDragged = myDragged;
CurveCreator_ICurve::SectionToPointList aDraggedPoints;
- QMap<CurveCreator_ICurve::SectionToPoint, std::deque< float > > anInitialDragPointsCoords;
+ QMap<CurveCreator_ICurve::SectionToPoint, CurveCreator::Coordinates > anInitialDragPointsCoords;
if ( myDragged ) {
aDraggedPoints = myDragPoints;
anInitialDragPointsCoords = myInitialDragPointsCoords;
for ( ; anIt != aLast; anIt++ ) {
int aSectionId = anIt->first;
int aPointId = anIt->second;
- std::deque<float> aPos = myCurve->getPoint( aSectionId, aPointId );
+ CurveCreator::Coordinates aPos = myCurve->getPoint( aSectionId, aPointId );
aCoordList.push_back(
std::make_pair( std::make_pair( aSectionId, aPointId ), aPos ) );
double aX = myLocalPointView->item( theRow, 2 )->data( Qt::UserRole ).toDouble();
double anY = myLocalPointView->item( theRow, 3 )->data( Qt::UserRole ).toDouble();
- std::deque<float> aChangedPos;
+ CurveCreator::Coordinates aChangedPos;
aChangedPos.push_back( aX );
aChangedPos.push_back( anY );
myCurve->setPoint( aCurrSect, aPntIndex, aChangedPos );
double anYDelta = aStartPnt.Y() - anEndPnt.Y();
CurveCreator_ICurve::SectionToPointCoordsList aCoordList;
- std::deque<float> aChangedPos;
+ CurveCreator::Coordinates aChangedPos;
CurveCreator_ICurve::SectionToPointList::const_iterator anIt = myDragPoints.begin(),
aLast = myDragPoints.end();
for ( ; anIt != aLast; anIt++ ) {
* \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 );
}
}
/**
- * Returns whethe the container has the value
+ * Returns whether the container has the value
* \param theList a container of values
* \param theValue a value
*/