From bf8a1ec0d26ced7cdc73fcd5cd88e3a6cf963e19 Mon Sep 17 00:00:00 2001 From: l_maliakal_d Date: Tue, 25 Sep 2012 11:31:15 +0000 Subject: [PATCH] fixed constant scan widget problem git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorGui@69 af1100a4-978c-4157-bff7-07162d2ba061 --- slsDetectorGui/include/qScanWidget.h | 33 +++- slsDetectorGui/src/qScanWidget.cpp | 215 ++++++++++++++++++++++----- 2 files changed, 208 insertions(+), 40 deletions(-) diff --git a/slsDetectorGui/include/qScanWidget.h b/slsDetectorGui/include/qScanWidget.h index 317d1e21c..24e820c14 100644 --- a/slsDetectorGui/include/qScanWidget.h +++ b/slsDetectorGui/include/qScanWidget.h @@ -121,19 +121,42 @@ void SetPrecision(int value); * */ void SetNSteps(); -/** Range type: If size is changed, - * the Number of steps is calculated +/**Checks if size is zero and return FAIL if it does * */ -void RangeCalculateNumSteps(); +int RangeCheckSizeZero(); -/** Range type: If size is changed, the To is calculated +/**returns ok and number of steps if valid + * @param number of steps * */ -void RangeCalculateTo(); +int RangeCheckNumValid(int &num); + +/** Sets number of steps if from changed + * */ +void RangeFromChanged(); + +/** Sets number of steps if to changed + * */ +void RangeToChanged(); + +/** Sets s of steps if size changed + * */ +void RangeSizeChanged(); /** Set range for scan * */ void SetRangeSteps(); + +/** Range type: If size is changed, + * the Number of steps is calculated + * */ +//void RangeCalculateNumSteps(); + +/** Range type: If size is changed, the To is calculated + * */ +//void RangeCalculateTo(); + + /** Set custom steps * returns OK if set properly * */ diff --git a/slsDetectorGui/src/qScanWidget.cpp b/slsDetectorGui/src/qScanWidget.cpp index 50f4d50cb..3b748a364 100644 --- a/slsDetectorGui/src/qScanWidget.cpp +++ b/slsDetectorGui/src/qScanWidget.cpp @@ -89,6 +89,7 @@ void qScanWidget::SetupWidgetWindow(){ spinFrom->setValue(0); spinFrom->setToolTip(rangeTip); spinFrom->setMaximum(1000000); + spinFrom->setMinimum(-1000000); spinFrom->setKeyboardTracking(false); spinFrom->setFixedWidth(80); spinFrom->setDecimals(4); @@ -97,6 +98,7 @@ void qScanWidget::SetupWidgetWindow(){ spinTo->setValue(1); spinTo->setToolTip(rangeTip); spinTo->setMaximum(1000000); + spinTo->setMinimum(-1000000); spinTo->setKeyboardTracking(false); spinTo->setFixedWidth(80); spinTo->setDecimals(4); @@ -104,12 +106,15 @@ void qScanWidget::SetupWidgetWindow(){ lblSize->setToolTip(rangeTip); lblSize->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); lblSize->setFixedWidth(67); + spinSize->setMaximum(1000000); + spinSize->setMinimum(-1000000); spinSize->setValue(1); spinSize->setSingleStep(0.1); spinSize->setToolTip(rangeTip); spinSize->setKeyboardTracking(false); spinSize->setDecimals(4); - spinSize->setMinimum(0.0001); + + //spinSize->setMinimum(0.0001); layoutRange->addItem(new QSpacerItem(40,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); layoutRange->addWidget(lblFrom); layoutRange->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); @@ -188,9 +193,9 @@ void qScanWidget::Initialization(){ //precision connect(spinPrecision, SIGNAL(valueChanged(int)), this, SLOT(SetPrecision(int))); //range values - connect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeCalculateNumSteps())); - connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeCalculateNumSteps())); - connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeCalculateTo())); + connect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeFromChanged())); + connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); + connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); //custom values connect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps())); connect(btnCustom, SIGNAL(clicked()), this, SLOT(DeleteCustomSteps())); @@ -246,11 +251,13 @@ void qScanWidget::EnableSizeWidgets(){ stackedLayout->setCurrentIndex(RangeValues); - int oldNumSteps = spinSteps->value(); - //if the steps change, it calls SetRangeSteps on its own. - RangeCalculateNumSteps(); - if(oldNumSteps==spinSteps->value()) SetRangeSteps(); + //recaluculate number of steps + disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + spinSteps->setValue(1+(int)(abs((spinTo->value() - spinFrom->value()) / spinSize->value()))); + connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + spinSteps->setMinimum(2); + SetRangeSteps(); } //custom values else if(radioCustom->isChecked()){ @@ -542,12 +549,11 @@ void qScanWidget::SetNSteps(){ //check if its ok if(radioRange->isChecked()){ - double oldSize = spinSize->value(); - //calculate size = (to - from)/(num-1) - double size = (abs((spinTo->value())-(spinFrom->value()))) / (spinSteps->value()-1); - spinSize->setValue(size); - //set these positions - if(oldSize==size) SetRangeSteps(); + disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); + spinSize->setValue( (spinTo->value()-spinFrom->value()) / (spinSteps->value()-1)); + connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); + + SetRangeSteps(); }else if(radioCustom->isChecked()){ comboCustom->setMaxCount(spinSteps->value()); SetCustomSteps(); @@ -561,39 +567,178 @@ void qScanWidget::SetNSteps(){ //------------------------------------------------------------------------------------------------------------------------------------------------- -void qScanWidget::RangeCalculateNumSteps(){ +int qScanWidget::RangeCheckSizeZero(){ #ifdef VERYVERBOSE - cout << "Entering RangeCalculateNumSteps()" << endl; + cout << "Entering RangeCheckSizeZero()" << endl; #endif - //check if to=from - if(spinTo->value()==spinFrom->value()){ - spinTo->setValue( ((spinSize->value())*(spinSteps->value())) - (spinSize->value()) + (spinFrom->value()) ); - SetRangeSteps(); - }else{ - //num = ((to-from)/(size)) +1 - double size = spinSize->value(); - double numerator = abs((spinTo->value())-(spinFrom->value())); - //check if (to-from)/size is an int and that its =1 cuz numSteps minimum=2 - bool valid = (fmod(numerator,size)==0) && ((numerator/size)>0); + if((spinTo->value()-spinFrom->value())/(spinSteps->value()-1)) + return qDefs::OK; - if(valid) //calculate num steps - spinSteps->setValue( (int)(numerator / size) + 1); - else //change size instead - spinSize->setValue(numerator / (spinSteps->value()-1)); - } + return qDefs::FAIL; } //------------------------------------------------------------------------------------------------------------------------------------------------- -void qScanWidget::RangeCalculateTo(){ +int qScanWidget::RangeCheckNumValid(int &num){ #ifdef VERYVERBOSE - cout << "Entering RangeCalculateTo()" << endl; + cout << "Entering RangeCheckNumValid()" << endl; #endif - //to = size*num - size + from - spinTo->setValue( ((spinSize->value())*(spinSteps->value())) - (spinSize->value()) + (spinFrom->value()) ); + double div = abs(spinTo->value()-spinFrom->value())/(abs(spinSize->value())); + cout<<"div:"<=1 + if((floor(div)==div) && (div>0)){ + num = (int)(div) + 1; + return qDefs::OK; + } + + return qDefs::FAIL; +} + + +//------------------------------------------------------------------------------------------------------------------------------------------------- + + +void qScanWidget::RangeFromChanged(){ +#ifdef VERYVERBOSE + cout << "Entering RangeFromChanged()" << endl; +#endif + bool change = false; + int numSteps; + + disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + disconnect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeFromChanged())); + disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); + + + //check size validity + if(RangeCheckSizeZero()==qDefs::FAIL) + qDefs::Message(qDefs::WARNING,"From cannot be equal to To. Changing From back to previous value.","Scan"); + //check size validity + else if(RangeCheckNumValid(numSteps)==qDefs::FAIL) + qDefs::Message(qDefs::WARNING,"Number of Steps must be >= 2. Changing From back to previous value.","Scan"); + else change = true; + + //change it back from = to - size*num + size + if(!change) { + spinFrom->setValue(spinTo->value() - (spinSize->value() * spinSteps->value()) + spinSize->value()); +#ifdef VERBOSE + cout << "Changing From back:"<< spinFrom->value() << endl; +#endif + } + //change num steps + else{ + spinSteps->setValue(numSteps); + //size will lnever be zero here + //size should be positive + if(spinTo->value()>spinFrom->value()) + spinSize->setValue(abs(spinSize->value())); + //size should be negative + else if(spinSize->value()>0) + spinSize->setValue(-1*(spinSize->value())); + } + SetRangeSteps(); + + connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + connect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeFromChanged())); + connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); +} + + +//------------------------------------------------------------------------------------------------------------------------------------------------- + + +void qScanWidget::RangeToChanged(){ +#ifdef VERYVERBOSE + cout << "Entering RangeToChanged()" << endl; +#endif + bool change = false; + int numSteps; + + disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + disconnect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); + disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); + + //check size validity + if(RangeCheckSizeZero()==qDefs::FAIL) + qDefs::Message(qDefs::WARNING,"From cannot be equal to To. Changing To back to previous value.","Scan"); + //check size validity + else if(RangeCheckNumValid(numSteps)==qDefs::FAIL) + qDefs::Message(qDefs::WARNING,"Number of Steps must be >= 2. Changing To back to previous value.","Scan"); + else change = true; + + //change it back to = size*num - size + from + if(!change) { + spinTo->setValue((spinSize->value() * spinSteps->value()) - spinSize->value() + spinFrom->value()); +#ifdef VERBOSE + cout << "Changing To back:"<< spinTo->value() << endl; +#endif + } + //change num steps + else{ + spinSteps->setValue(numSteps); + //size will lnever be zero here + //size should be positive + if(spinTo->value()>spinFrom->value()) + spinSize->setValue(abs(spinSize->value())); + //size should be negative + else if(spinSize->value()>0) + spinSize->setValue(-1*(spinSize->value())); + + } + + SetRangeSteps(); + + connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); + connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); +} + + +//------------------------------------------------------------------------------------------------------------------------------------------------- + + +void qScanWidget::RangeSizeChanged(){ +#ifdef VERYVERBOSE + cout << "Entering RangeSizeChanged()" << endl; +#endif + bool change = false; + int numSteps; + + disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); + disconnect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); + + //check size validity + if(!spinSize->value()) + qDefs::Message(qDefs::WARNING,"Size cannot be 0. Changing Size back to previous value.","Scan"); + //check size validity + else if(RangeCheckNumValid(numSteps)==qDefs::FAIL) + qDefs::Message(qDefs::WARNING,"Number of Steps must be >= 2. Changing To back to previous value.","Scan"); + else change = true; + + //change it back size = (to-from)/(num-1) + if(!change) { + spinSize->setValue((spinTo->value()-spinFrom->value())/(spinSteps->value()-1)); +#ifdef VERBOSE + cout << "Changing Size back:"<< spinSize->value() << endl; +#endif + } + //change num steps + else{ + spinSteps->setValue(numSteps); + //in case size changed to negative + spinTo->setValue((spinSize->value() * spinSteps->value()) - spinSize->value() + spinFrom->value()); + } + + SetRangeSteps(); + + connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); + connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); + connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); }