232 lines
6.7 KiB
C++
232 lines
6.7 KiB
C++
#include "AngleAdjTool.h"
|
|
#include "ui_AngleAdjTool.h"
|
|
#include "math.h"
|
|
#include <qgraphicsscene.h>
|
|
#include <qgraphicsitem.h>
|
|
|
|
#define PI 3.1415926
|
|
|
|
AngleAdjTool::AngleAdjTool(QWidget *parent) :
|
|
QDialog(parent),
|
|
Ang_UI(new Ui::AngleAdjTool)
|
|
{
|
|
Ang_UI->setupUi(this);
|
|
setWindowFlags(windowFlags()& ~Qt::WindowMaximizeButtonHint);
|
|
setFixedSize(this->width(), this->height());
|
|
this->setWindowFlags(this->windowFlags() |Qt::Dialog);
|
|
this->setWindowModality(Qt::ApplicationModal);
|
|
|
|
connect(Ang_UI->okButton, SIGNAL(clicked()), this, SLOT(accept()));
|
|
connect(Ang_UI->cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
|
|
connect(Ang_UI->cancelButton, SIGNAL(clicked()), this, SLOT(cancelAngle_SLOT()));
|
|
|
|
maxSlider = 50;
|
|
minSlider = -50;
|
|
Ang_UI->headSlider->setMinimum(minSlider);
|
|
Ang_UI->headSlider->setMaximum(maxSlider);
|
|
Ang_UI->headSlider->setSingleStep(1);
|
|
Ang_UI->tailSlider->setMinimum(minSlider);
|
|
Ang_UI->tailSlider->setMaximum(maxSlider);
|
|
Ang_UI->tailSlider->setSingleStep(1);
|
|
Ang_UI->head_spinBox->setRange(minSlider, maxSlider);
|
|
Ang_UI->tail_spinBox->setRange(minSlider, maxSlider);
|
|
Ang_UI->head_spinBox->setValue(0);
|
|
Ang_UI->tail_spinBox->setValue(0);
|
|
connect(Ang_UI->head_spinBox, SIGNAL(valueChanged(int)), Ang_UI->headSlider, SLOT(setValue(int)));
|
|
//connect(Ang_UI->headSlider, SIGNAL(valueChanged(int)), Ang_UI->head_spinBox, SLOT(setValue(int)));
|
|
connect(Ang_UI->tail_spinBox, SIGNAL(valueChanged(int)), Ang_UI->tailSlider, SLOT(setValue(int)));
|
|
connect(Ang_UI->tailSlider, SIGNAL(valueChanged(int)), Ang_UI->tail_spinBox, SLOT(setValue(int)));
|
|
connect(Ang_UI->headSlider, SIGNAL(valueChanged(int)), this, SLOT(headAdd(int)));
|
|
connect(Ang_UI->tailSlider, SIGNAL(valueChanged(int)), this, SLOT(tailAdd(int)));
|
|
connect(Ang_UI->headSlider, SIGNAL(valueChanged(int)), this, SLOT(headLinkTail_SLOT(int)));
|
|
connect(Ang_UI->headSlider, SIGNAL(valueChanged(int)), this, SLOT(calcuAngle()));
|
|
connect(Ang_UI->tailSlider, SIGNAL(valueChanged(int)), this, SLOT(calcuAngle()));
|
|
|
|
scene = new QGraphicsScene;
|
|
lineItem = new QGraphicsLineItem(0,0, 0,110);
|
|
initGraph();
|
|
scene->addItem(lineItem);
|
|
Ang_UI->graphicsView->setScene(scene);
|
|
|
|
connect(Ang_UI->head_lineEdit, SIGNAL(textChanged(QString)),this,SLOT(sdepChange_SLOT()));
|
|
connect(Ang_UI->tail_lineEdit, SIGNAL(textChanged(QString)),this,SLOT(edepChange_SLOT()));
|
|
|
|
}
|
|
|
|
AngleAdjTool::~AngleAdjTool()
|
|
{
|
|
delete Ang_UI;
|
|
delete scene;
|
|
//delete lineItem;
|
|
}
|
|
|
|
void AngleAdjTool::depCheck()
|
|
{
|
|
if(Sdep < realSdep){Sdep = realSdep;Ang_UI->head_lineEdit->setText(QString("%1").arg(Sdep));}
|
|
if(edep > realEdep){edep = realEdep;Ang_UI->tail_lineEdit->setText(QString("%1").arg(edep));}
|
|
if(edep < Sdep)edep = Sdep;
|
|
|
|
}
|
|
|
|
void AngleAdjTool::setAngDep(float rsd, float red, float sd, float ed)
|
|
{
|
|
realSdep = rsd;
|
|
realEdep = red;
|
|
Sdep = sd;
|
|
edep = ed;
|
|
|
|
depCheck();
|
|
Ang_UI->head_lineEdit->setText(QString("%1").arg(Sdep));
|
|
Ang_UI->tail_lineEdit->setText(QString("%1").arg(edep));
|
|
|
|
Ang_UI->head_lineEdit->setValidator(new QIntValidator(-99999,99999,this));
|
|
Ang_UI->tail_lineEdit->setValidator(new QIntValidator(-99999,99999,this));
|
|
}
|
|
|
|
void AngleAdjTool::setLineEditable()
|
|
{
|
|
setHeadTailValue(0,0);
|
|
Ang_UI->head_lineEdit->setEnabled(true);
|
|
Ang_UI->tail_lineEdit->setEnabled(true);
|
|
}
|
|
void AngleAdjTool::setHeadTailValue(int head, int tail)
|
|
{
|
|
Ang_UI->head_spinBox->setValue(head);
|
|
Ang_UI->tail_spinBox->setValue(tail);
|
|
}
|
|
|
|
void AngleAdjTool::setEachSetValue(float value)
|
|
{
|
|
eachSetValue = value;
|
|
}
|
|
|
|
void AngleAdjTool::calcuAngle()
|
|
{
|
|
QString t = Ang_UI->head_lineEdit->text();
|
|
float headsValue = t.toFloat();
|
|
t = Ang_UI->tail_lineEdit->text();
|
|
float tailsValue = t.toFloat();
|
|
|
|
float headOffset = Ang_UI->head_spinBox->value() / 10.0;
|
|
float tailOffset = Ang_UI->tail_spinBox->value() / 10.0;
|
|
|
|
float x = tailsValue - headsValue;
|
|
float y = tailOffset - headOffset;
|
|
float angle = atan2(y, x)*180/PI;
|
|
|
|
Ang_UI->Angle_lineEdit->setText(QString("%1").arg(angle));
|
|
|
|
emit sendAngleData(headsValue, tailsValue, headOffset, tailOffset, angle);
|
|
}
|
|
|
|
void AngleAdjTool::setSliderRange(int value)
|
|
{
|
|
maxSlider = value / 2 * 10;
|
|
minSlider = -1 * (value / 2 * 10);
|
|
Ang_UI->headSlider->setMinimum(minSlider);
|
|
Ang_UI->headSlider->setMaximum(maxSlider);
|
|
|
|
Ang_UI->tailSlider->setMinimum(minSlider);
|
|
Ang_UI->tailSlider->setMaximum(maxSlider);
|
|
|
|
Ang_UI->head_spinBox->setRange(minSlider, maxSlider);
|
|
Ang_UI->tail_spinBox->setRange(minSlider, maxSlider);
|
|
}
|
|
|
|
void AngleAdjTool::cancelAngle_SLOT()
|
|
{
|
|
emit cancelAngle();
|
|
}
|
|
|
|
void AngleAdjTool::headLinkTail_SLOT(int changeValue)
|
|
{
|
|
Ang_UI->head_lineEdit->setEnabled(false);
|
|
Ang_UI->tail_lineEdit->setEnabled(false);
|
|
int value = changeValue - Ang_UI->head_spinBox->value();
|
|
Ang_UI->head_spinBox->setValue(changeValue);
|
|
int tailSpinValue = Ang_UI->tail_spinBox->value();
|
|
int tailSpinValue_2 = tailSpinValue + value;
|
|
Ang_UI->tail_spinBox->setValue(tailSpinValue_2);
|
|
}
|
|
|
|
bool AngleAdjTool::calcuCurAve(float m_value[], int N)
|
|
{
|
|
if(N / 2 < 2) return false;
|
|
|
|
float headSum, tailSum;
|
|
headSum = 0;
|
|
//tailSum = 0;
|
|
for(int i = 0; i < N; i++)
|
|
headSum += m_value[i];
|
|
headAve = headSum / N;
|
|
/*
|
|
for(int i = N/2; i < N; i++)
|
|
tailSum += m_value[i];
|
|
tailAve = tailSum / (N - (N/2));
|
|
*/
|
|
|
|
QString t = Ang_UI->head_lineEdit->text();
|
|
float headsValue = t.toFloat();
|
|
t = Ang_UI->tail_lineEdit->text();
|
|
float tailsValue = t.toFloat();
|
|
|
|
float x = (tailsValue - headsValue) / 2;
|
|
float y = headAve - m_value[0];
|
|
float angle = atan2(y, x)*180/PI;
|
|
|
|
Ang_UI->aveAngle_lineEdit->setText(QString("%1").arg(angle));
|
|
|
|
QPainter paint;
|
|
paint.begin(Ang_UI->graphicsView);
|
|
paint.setBrush(Qt::black);
|
|
paint.drawRect(rect());
|
|
|
|
float xSet = 110 * cos(angle*PI/180.0f);
|
|
float ySet = xSet * tan(angle*PI/180.0f);
|
|
lineItem->setLine(0, 0, ySet, xSet);
|
|
lineItem->setPen(QPen(Qt::blue));
|
|
Ang_UI->graphicsView->show();
|
|
|
|
return true;
|
|
}
|
|
|
|
void AngleAdjTool::initGraph()
|
|
{
|
|
QGraphicsLineItem *lineItems[19];
|
|
|
|
int angle = -90;
|
|
for(int i = 0; i < 19; i++){
|
|
lineItems[i] = new QGraphicsLineItem(0,0,0,0);
|
|
float xSet = 130 * cos((angle + i*10) * PI / 180.0f);
|
|
float ySet = xSet * tan((angle + i*10) * PI / 180.0f);
|
|
lineItems[i]->setLine(0, 0, ySet, xSet);
|
|
lineItems[i]->setPen(QPen(Qt::lightGray));
|
|
scene->addItem(lineItems[i]);
|
|
}
|
|
}
|
|
|
|
void AngleAdjTool::tailAdd(int v)
|
|
{
|
|
Ang_UI->head_lineEdit->setEnabled(false);
|
|
Ang_UI->tail_lineEdit->setEnabled(false);
|
|
float addchange = v/10 * eachSetValue;
|
|
Ang_UI->lineEdit_2->setText(QString("%1").arg(addchange));
|
|
}
|
|
void AngleAdjTool::headAdd(int v)
|
|
{
|
|
float addchange = v/10 * eachSetValue;
|
|
Ang_UI->lineEdit->setText(QString("%1").arg(addchange));
|
|
}
|
|
|
|
void AngleAdjTool::sdepChange_SLOT()
|
|
{
|
|
QString t = Ang_UI->head_lineEdit->text();
|
|
Sdep = t.toFloat();
|
|
depCheck();
|
|
}
|
|
void AngleAdjTool::edepChange_SLOT()
|
|
{
|
|
QString t = Ang_UI->tail_lineEdit->text();
|
|
edep = t.toFloat();
|
|
depCheck();
|
|
} |