fixed constant scan widget problem

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorGui@69 af1100a4-978c-4157-bff7-07162d2ba061
This commit is contained in:
l_maliakal_d 2012-09-25 11:31:15 +00:00
parent a79c5c6183
commit bf8a1ec0d2
2 changed files with 208 additions and 40 deletions

View File

@ -121,19 +121,42 @@ void SetPrecision(int value);
* */ * */
void SetNSteps(); void SetNSteps();
/** Range type: If size is changed, /**Checks if size is zero and return FAIL if it does
* the Number of steps is calculated
* */ * */
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 /** Set range for scan
* */ * */
void SetRangeSteps(); 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 /** Set custom steps
* returns OK if set properly * returns OK if set properly
* */ * */

View File

@ -89,6 +89,7 @@ void qScanWidget::SetupWidgetWindow(){
spinFrom->setValue(0); spinFrom->setValue(0);
spinFrom->setToolTip(rangeTip); spinFrom->setToolTip(rangeTip);
spinFrom->setMaximum(1000000); spinFrom->setMaximum(1000000);
spinFrom->setMinimum(-1000000);
spinFrom->setKeyboardTracking(false); spinFrom->setKeyboardTracking(false);
spinFrom->setFixedWidth(80); spinFrom->setFixedWidth(80);
spinFrom->setDecimals(4); spinFrom->setDecimals(4);
@ -97,6 +98,7 @@ void qScanWidget::SetupWidgetWindow(){
spinTo->setValue(1); spinTo->setValue(1);
spinTo->setToolTip(rangeTip); spinTo->setToolTip(rangeTip);
spinTo->setMaximum(1000000); spinTo->setMaximum(1000000);
spinTo->setMinimum(-1000000);
spinTo->setKeyboardTracking(false); spinTo->setKeyboardTracking(false);
spinTo->setFixedWidth(80); spinTo->setFixedWidth(80);
spinTo->setDecimals(4); spinTo->setDecimals(4);
@ -104,12 +106,15 @@ void qScanWidget::SetupWidgetWindow(){
lblSize->setToolTip(rangeTip); lblSize->setToolTip(rangeTip);
lblSize->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); lblSize->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
lblSize->setFixedWidth(67); lblSize->setFixedWidth(67);
spinSize->setMaximum(1000000);
spinSize->setMinimum(-1000000);
spinSize->setValue(1); spinSize->setValue(1);
spinSize->setSingleStep(0.1); spinSize->setSingleStep(0.1);
spinSize->setToolTip(rangeTip); spinSize->setToolTip(rangeTip);
spinSize->setKeyboardTracking(false); spinSize->setKeyboardTracking(false);
spinSize->setDecimals(4); spinSize->setDecimals(4);
spinSize->setMinimum(0.0001);
//spinSize->setMinimum(0.0001);
layoutRange->addItem(new QSpacerItem(40,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); layoutRange->addItem(new QSpacerItem(40,20,QSizePolicy::Fixed,QSizePolicy::Fixed));
layoutRange->addWidget(lblFrom); layoutRange->addWidget(lblFrom);
layoutRange->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); layoutRange->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed));
@ -188,9 +193,9 @@ void qScanWidget::Initialization(){
//precision //precision
connect(spinPrecision, SIGNAL(valueChanged(int)), this, SLOT(SetPrecision(int))); connect(spinPrecision, SIGNAL(valueChanged(int)), this, SLOT(SetPrecision(int)));
//range values //range values
connect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeCalculateNumSteps())); connect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeFromChanged()));
connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeCalculateNumSteps())); connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged()));
connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeCalculateTo())); connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged()));
//custom values //custom values
connect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps())); connect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps()));
connect(btnCustom, SIGNAL(clicked()), this, SLOT(DeleteCustomSteps())); connect(btnCustom, SIGNAL(clicked()), this, SLOT(DeleteCustomSteps()));
@ -246,11 +251,13 @@ void qScanWidget::EnableSizeWidgets(){
stackedLayout->setCurrentIndex(RangeValues); stackedLayout->setCurrentIndex(RangeValues);
int oldNumSteps = spinSteps->value(); //recaluculate number of steps
//if the steps change, it calls SetRangeSteps on its own. disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps()));
RangeCalculateNumSteps(); spinSteps->setValue(1+(int)(abs((spinTo->value() - spinFrom->value()) / spinSize->value())));
if(oldNumSteps==spinSteps->value()) SetRangeSteps(); connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps()));
spinSteps->setMinimum(2); spinSteps->setMinimum(2);
SetRangeSteps();
} }
//custom values //custom values
else if(radioCustom->isChecked()){ else if(radioCustom->isChecked()){
@ -542,12 +549,11 @@ void qScanWidget::SetNSteps(){
//check if its ok //check if its ok
if(radioRange->isChecked()){ if(radioRange->isChecked()){
double oldSize = spinSize->value(); disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged()));
//calculate size = (to - from)/(num-1) spinSize->setValue( (spinTo->value()-spinFrom->value()) / (spinSteps->value()-1));
double size = (abs((spinTo->value())-(spinFrom->value()))) / (spinSteps->value()-1); connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged()));
spinSize->setValue(size);
//set these positions SetRangeSteps();
if(oldSize==size) SetRangeSteps();
}else if(radioCustom->isChecked()){ }else if(radioCustom->isChecked()){
comboCustom->setMaxCount(spinSteps->value()); comboCustom->setMaxCount(spinSteps->value());
SetCustomSteps(); SetCustomSteps();
@ -561,39 +567,178 @@ void qScanWidget::SetNSteps(){
//------------------------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------------------------
void qScanWidget::RangeCalculateNumSteps(){ int qScanWidget::RangeCheckSizeZero(){
#ifdef VERYVERBOSE #ifdef VERYVERBOSE
cout << "Entering RangeCalculateNumSteps()" << endl; cout << "Entering RangeCheckSizeZero()" << endl;
#endif #endif
//check if to=from if((spinTo->value()-spinFrom->value())/(spinSteps->value()-1))
if(spinTo->value()==spinFrom->value()){ return qDefs::OK;
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(valid) //calculate num steps return qDefs::FAIL;
spinSteps->setValue( (int)(numerator / size) + 1);
else //change size instead
spinSize->setValue(numerator / (spinSteps->value()-1));
}
} }
//------------------------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------------------------
void qScanWidget::RangeCalculateTo(){ int qScanWidget::RangeCheckNumValid(int &num){
#ifdef VERYVERBOSE #ifdef VERYVERBOSE
cout << "Entering RangeCalculateTo()" << endl; cout << "Entering RangeCheckNumValid()" << endl;
#endif #endif
//to = size*num - size + from double div = abs(spinTo->value()-spinFrom->value())/(abs(spinSize->value()));
spinTo->setValue( ((spinSize->value())*(spinSteps->value())) - (spinSize->value()) + (spinFrom->value()) ); cout<<"div:"<<div<<endl;
//num = (to-from)/size +1 , so (to-from)/size should be an integer and >=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,"<nobr><b>From</b> cannot be equal to <b>To</b>. Changing <b>From</b> back to previous value.</nobr>","Scan");
//check size validity
else if(RangeCheckNumValid(numSteps)==qDefs::FAIL)
qDefs::Message(qDefs::WARNING,"<nobr><b>Number of Steps</b> must be >= 2. Changing <b>From</b> back to previous value.</nobr>","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(); 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,"<nobr><b>From</b> cannot be equal to <b>To</b>. Changing <b>To</b> back to previous value.</nobr>","Scan");
//check size validity
else if(RangeCheckNumValid(numSteps)==qDefs::FAIL)
qDefs::Message(qDefs::WARNING,"<nobr><b>Number of Steps</b> must be >= 2. Changing <b>To</b> back to previous value.</nobr>","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,"<nobr><b>Size</b> cannot be 0. Changing <b>Size</b> back to previous value.</nobr>","Scan");
//check size validity
else if(RangeCheckNumValid(numSteps)==qDefs::FAIL)
qDefs::Message(qDefs::WARNING,"<nobr><b>Number of Steps</b> must be >= 2. Changing <b>To</b> back to previous value.</nobr>","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()));
} }