You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Src/nmNum/nmSubWxs/nmWxMeasureDlg.cpp

236 lines
6.5 KiB
C++

#include "nmWxMeasureDlg.h"
#include <QVBoxLayout>
#include <QHeaderView>
#include <QPushButton>
#include <QLabel>
#include <QComboBox>
#include <limits>
#include "nmDataAnalyzeManager.h"
#include "nmGUIComponentLineEdit.h"
#include "nmDataWellBase.h"
Q_DECLARE_METATYPE(double *)
Q_DECLARE_METATYPE(QString *)
nmWxMeasureDlg::nmWxMeasureDlg(QWidget* parent)
: QDialog(parent),
m_pMainLayout(NULL),
m_pFitStartButton(NULL),
m_pFitEndButton(NULL),
m_pLength(NULL),
m_pData(NULL),
m_pLengthCom(NULL)
{
this->initUI();
this->resize(400, 150);
this->setWindowTitle(tr("Measure"));
m_pFitStartButton->setEnabled(false);
m_pFitEndButton->setEnabled(false);
}
void nmWxMeasureDlg::initUI()
{
m_pMainLayout = new QVBoxLayout;
this->setLayout(m_pMainLayout);
// 构建组件
this->initPara();
this->initComponents();
// 按钮部分
m_pFitStartButton = new QPushButton(tr("Fit start to nearest well"));
m_pFitEndButton = new QPushButton(tr("Fit end to nearest well"));
QString qss = "QPushButton:disabled { color: #888888; }";
m_pFitStartButton->setStyleSheet(qss);
m_pFitEndButton->setStyleSheet(qss);
connect(m_pFitStartButton, SIGNAL(clicked()), this, SLOT(onFitStartClicked()));
connect(m_pFitEndButton, SIGNAL(clicked()), this, SLOT(onFitEndClicked()));
// 底部按钮
QHBoxLayout *bottomLayout = new QHBoxLayout();
bottomLayout->addStretch(1);
QPushButton *closeButton = new QPushButton(tr("Close"));
connect(closeButton, SIGNAL(clicked()), this, SLOT(onCloseClicked()));
bottomLayout->addWidget(closeButton);
// 将所有部件添加到主布局
m_pMainLayout->addSpacing(10);
m_pMainLayout->addSpacing(10);
m_pMainLayout->addWidget(m_pFitStartButton);
m_pMainLayout->addWidget(m_pFitEndButton);
m_pMainLayout->addStretch(1);
m_pMainLayout->addLayout(bottomLayout);
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
}
void nmWxMeasureDlg::initPara() {
m_pData = nmDataAnalyzeManager::getCurrentInstance()->getMeasureData();
m_pData->getLength().setName(tr("Length :"));
m_vecWellList = nmDataAnalyzeManager::getCurrentInstance()->getWellDataList();
}
void nmWxMeasureDlg::initComponents() {
m_pLengthCom = new nmGUIComponentLineEdit(&m_pData->getLength(), false);
m_pMainLayout->addWidget(m_pLengthCom);
}
void nmWxMeasureDlg::onFitStartClicked()
{
m_pFitStartButton->setEnabled(false);
// 先取出当前点
QPointF current = m_pData->getCurrentPoint();
// 判断 current 是否为 (0,0)
if (qFuzzyCompare(current.x(), 0.0) && qFuzzyCompare(current.y(), 0.0)) {
QPointF ref = m_pData->getStartPoint();
double minDist = std::numeric_limits<double>::max();
QPointF nearest;
for (int i = 0; i < m_vecWellList.size(); ++i) {
nmDataWellBase* pWell = m_vecWellList[i];
double x = pWell->getX().getValue().toDouble();
double y = pWell->getY().getValue().toDouble();
QPointF pt(x, y);
double dist = QLineF(ref, pt).length();
if (dist < minDist) {
minDist = dist;
nearest = pt;
}
}
m_pData->setStartPoint(nearest);
// 重新计算长度
QPointF endPt = m_pData->getEndPoint();
double newLen = QLineF(nearest, endPt).length();
nmDataAttribute lenAttr = m_pData->getLength();
lenAttr.setValue(newLen);
m_pData->setLength(lenAttr);
}
else {
QPointF startPt = current;
// 找 nearest well
double minDist = std::numeric_limits<double>::max();
QPointF nearest;
for (int i = 0; i < m_vecWellList.size(); ++i) {
nmDataWellBase* pWell = m_vecWellList[i];
double x = pWell->getX().getValue().toDouble();
double y = pWell->getY().getValue().toDouble();
QPointF pt(x, y);
double dist = QLineF(startPt, pt).length();
if (dist < minDist) {
minDist = dist;
nearest = pt;
}
}
// 更新起点和终点
m_pData->setStartPoint(startPt);
m_pData->setEndPoint(nearest);
// 重新计算长度
double newLen = QLineF(startPt, nearest).length();
nmDataAttribute lenAttr = m_pData->getLength();
lenAttr.setValue(newLen);
m_pData->setLength(lenAttr);
}
m_pData->setCurrentPoint(QPointF(0, 0));
// 刷新界面显示
updateDisplay();
}
void nmWxMeasureDlg::onFitEndClicked()
{
m_pFitEndButton->setEnabled(false);
// 先取出当前点
QPointF current = m_pData->getCurrentPoint();
// 判断 current 是否为 (0,0)
if (qFuzzyCompare(current.x(), 0.0) && qFuzzyCompare(current.y(), 0.0)) {
QPointF ref = m_pData->getEndPoint();
double minDist = std::numeric_limits<double>::max();
QPointF nearest;
for (int i = 0; i < m_vecWellList.size(); ++i) {
nmDataWellBase* pWell = m_vecWellList[i];
double x = pWell->getX().getValue().toDouble();
double y = pWell->getY().getValue().toDouble();
QPointF pt(x, y);
double dist = QLineF(ref, pt).length();
if (dist < minDist) {
minDist = dist;
nearest = pt;
}
}
m_pData->setEndPoint(nearest);
// 重新计算长度
QPointF startPt = m_pData->getStartPoint();
double newLen = QLineF(startPt, nearest).length();
nmDataAttribute lenAttr = m_pData->getLength();
lenAttr.setValue(newLen);
m_pData->setLength(lenAttr);
}
else {
QPointF startPt = current;
// 找 nearest well
double minDist = std::numeric_limits<double>::max();
QPointF nearest;
for (int i = 0; i < m_vecWellList.size(); ++i) {
nmDataWellBase* pWell = m_vecWellList[i];
double x = pWell->getX().getValue().toDouble();
double y = pWell->getY().getValue().toDouble();
QPointF pt(x, y);
double dist = QLineF(startPt, pt).length();
if (dist < minDist) {
minDist = dist;
nearest = pt;
}
}
// 更新起点和终点
m_pData->setStartPoint(startPt);
m_pData->setEndPoint(nearest);
// 重新计算长度
double newLen = QLineF(startPt, nearest).length();
nmDataAttribute lenAttr = m_pData->getLength();
lenAttr.setValue(newLen);
m_pData->setLength(lenAttr);
}
m_pData->setCurrentPoint(QPointF(0, 0));
// 刷新界面显示
updateDisplay();
}
void nmWxMeasureDlg::updateDisplay() {
m_pLengthCom->updateValueFromOrigin();
}
void nmWxMeasureDlg::closeEvent(QCloseEvent* event)
{
emit needDeleteMeasureObj();
QDialog::closeEvent(event);
}
void nmWxMeasureDlg::onCloseClicked()
{
emit needDeleteMeasureObj();
accept();
}
void nmWxMeasureDlg::resetButtons()
{
m_pFitStartButton->setEnabled(true);
m_pFitEndButton ->setEnabled(true);
}