AnalysisSystemForRadionucli.../BaseInteractive.cpp
2024-06-04 15:25:02 +08:00

160 lines
4.0 KiB
C++

#include "BaseInteractive.h"
#include "IndependentAlg.h"
#include <QMessageBox>
BaseInteractive::BaseInteractive()
{
}
BaseInteractive::~BaseInteractive()
{
}
void BaseInteractive::AddCtrlPoint(int x)
{
if(x < baseCtrl.rg_low || x > baseCtrl.rg_high)
{
qDebug() << "Can't insert Control Point out of range";
return;
}
int i = 0;
for(; i<baseCtrl.XCtrl.size(); ++i)
{
if(baseCtrl.XCtrl[i] >= x)
{
if(baseCtrl.XCtrl[i] == x)
{
qDebug() << QString("The new control point in channel %1 exists, won't introduce twice");
return;
}
break;
}
}
// add cursor channel to control points and sort
baseCtrl.XCtrl.insert(baseCtrl.XCtrl.begin() + i, x);
baseCtrl.YCtrl.insert(baseCtrl.XCtrl.begin() + i, baseCtrl.Baseline[x-1]);
baseCtrl.YSlope.insert(baseCtrl.XCtrl.begin() + i, gNaN);
// write new baseline to stack
PushStack(baseCtrl.XCtrl, baseCtrl.YCtrl, baseCtrl.YSlope);
}
void BaseInteractive::RemoveCtrlPoint(double x)
{
if(baseCtrl.XCtrl.empty())
{
qDebug() << "No control points to be deleted";
return;
}
// find nearest control-point
int i = 1;
if(x < baseCtrl.XCtrl[0]) i = 0;
else {
for(; i<baseCtrl.XCtrl.size(); ++i)
{
if(baseCtrl.XCtrl[i] >= x)
{
if(baseCtrl.XCtrl[i] - x > x - baseCtrl.XCtrl[i-1]) --i;
break;
}
}
}
// select first of (possibly 2) nearest channels
if (i == 0 || i >= baseCtrl.XCtrl.size()-1)
{
qDebug() << "can't remove first/last control point";
return;
}
// remove this control point and update
baseCtrl.XCtrl.erase(baseCtrl.XCtrl.begin() + i);
baseCtrl.YCtrl.erase(baseCtrl.YCtrl.begin() + i);
baseCtrl.YSlope.erase(baseCtrl.YSlope.begin() + i);
// write new baseline to stack
PushStack(baseCtrl.XCtrl, baseCtrl.YCtrl, baseCtrl.YSlope);
}
void BaseInteractive::ModifyCtrlPoint(int x, double y)
{
// disable all baseline buttons
// remember windowbuttondownfcn and cursor
// set windowbuttondownfcn to baseModify and cursor to grabbing hand
// wait for return
// if baseModify changed baseline, push it to stack
int i = 0;
for(; i<baseCtrl.XCtrl.size(); ++i)
{
if(baseCtrl.XCtrl[i] == x) break;
}
if(i >= baseCtrl.XCtrl.size()) return;
baseCtrl.YCtrl[i] = y;
PushStack(baseCtrl.XCtrl, baseCtrl.YCtrl, baseCtrl.YSlope);
// revert windowbuttondownfcn and cursor
// enable baseline buttons
}
void BaseInteractive::EditSlope(double x, double dy)
{
if(baseCtrl.XCtrl.empty())
{
qDebug() << "No control points to be edited";
return;
}
// find nearest control-point
int i = 1;
int n = baseCtrl.XCtrl.size();
if(x < baseCtrl.XCtrl[0]) i = 0;
else {
for(; i<n; ++i)
{
if(baseCtrl.XCtrl[i] >= x)
{
if(baseCtrl.XCtrl[i] - x > x - baseCtrl.XCtrl[i-1]) --i;
break;
}
}
if(i == n) i = n-1;
}
// select first of (possibly 2) nearest channels
//rowvec tmp; //idx = idx(1);
//tmp << baseCtrl.XCtrl[i];
//stdvec eCp = Independ::calValues(Cal_Energy, tmp, p);
bool allowNaN;
if(i == 0 || i == n-1)
{
allowNaN = false;
}
else { allowNaN = true; }
if ( allowNaN || qIsFinite(dy) )
{
baseCtrl.YSlope[i] = dy;
// write new baseline to stack
PushStack(baseCtrl.XCtrl, baseCtrl.YCtrl, baseCtrl.YSlope);
}
else {
QMessageBox::warning(0, "Warning", "Input value invalid.");
}
}
void BaseInteractive::PushStack(stdvec cx, stdvec cy, stdvec cdy, bool modified)
{
BaseCtrlStack stack;
stack.cx = cx;
stack.cy = cy;
stack.cdy = cdy;
baseCtrl.BaseStack.push_back(stack);
baseCtrl.ReplotNeeded = modified;
//UpdateBaseControl(baseCtrl, m_para);
}