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/nmWxRCWell.cpp

306 lines
11 KiB
C++

#include "nmWxRCWell.h"
#include <QListWidget>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QLineEdit>
#include <QLabel>
#include <QTableWidget>
#include <QHeaderView>
#include <QDebug>
#include <QFile>
#include "nmGUIComponentBase.h"
nmWxRCWell::nmWxRCWell(QVector<QString> wellNames, QVector<double> wellsRadius, QWidget *parent) :
m_vWellNames(wellNames), m_vWellsRadius(wellsRadius), QWidget(parent) {
this->initDefaultValue();
this->initUI();
}
void nmWxRCWell::on_selectWell(int index) {
qDebug() << index;
this->showWellDetail(index);
}
void nmWxRCWell::on_wellSkinChanged(QString v) {
int index = m_pWellListWidget->currentRow();
m_vWellsSkin[index] = v.toDouble();
}
void nmWxRCWell::on_welltTimeChanged(QString sTimeNum) {
// 根据流量段数,初始化,流量端的设置
int iTimeNum = sTimeNum.toInt();
// 初始化该井的流量段数据
// 首先这是第几口井!
int iWellIndex = m_pWellListWidget->currentRow();
m_vWellsTimeNum[iWellIndex] = iTimeNum;
// 初始化流量段数
this->initWellTimeFlow(iWellIndex, iTimeNum);
this->updateWellTimeFlow(iWellIndex);
}
void nmWxRCWell::on_timeFlowChanged(QTableWidgetItem *item) {
int row = item->row();
int column = item->column();
int iWellIndex = m_pWellListWidget->currentRow();
// 获取这口井的 流量段时间和流量数据
if (1 == column) {
// Time 变化了
QVector<double > vWellTimes = m_vWellTimes[iWellIndex];
double dNewTimeValue = m_pTimeTableWidget->item(row, column)->text().toDouble();
vWellTimes[row] = dNewTimeValue;
m_vWellTimes[iWellIndex] = vWellTimes;
return;
}
// Flow 变化了
QVector<double > vWellFlows = m_vWellFlows[iWellIndex];
double dNewTimeValue = m_pTimeTableWidget->item(row, column)->text().toDouble();
vWellFlows[row] = dNewTimeValue;
m_vWellFlows[iWellIndex] = vWellFlows;
}
void nmWxRCWell::initDefaultValue() {
// 根据井的数量初始化默认值
for (int i = 0; i < m_vWellNames.size(); i++) {
// 井的表皮系数
m_vWellsSkin.append(0);
// 井储系数
m_vWellsReservoirFactor.append(0.0232056);
// 流量段
int iTimeNum = 5;
m_vWellsTimeNum.append(iTimeNum);
// 初始化流量段默认值
QVector<double > vWellTimes;
QVector<double > vWellFlows;
vWellTimes.append(12);
vWellTimes.append(12);
vWellTimes.append(12);
vWellTimes.append(48);
vWellTimes.append(72);
vWellFlows.append(158.987);
vWellFlows.append(190.785);
vWellFlows.append(222.582);
vWellFlows.append(238.481);
vWellFlows.append(0);
// for (int i = 0; i < iTimeNum; i++) {
// vWellTimes.append(100);
// vWellFlows.append(10);
// }
m_vWellTimes.append(vWellTimes);
m_vWellFlows.append(vWellFlows);
}
}
void nmWxRCWell::initUI() {
QHBoxLayout* layout = new QHBoxLayout;
this->setLayout(layout);
QListWidget* wellListWidget = this->initListWidget();
// 坐标的列表页
layout->addWidget(wellListWidget);
QWidget* detailWidget = this->initWellDetailWidget();
// 右边的详情页
layout->addWidget(detailWidget);
// 设置宽度比例
layout->setStretchFactor(wellListWidget, 1);
layout->setStretchFactor(detailWidget, 2);
// 设置默认是第1口井
wellListWidget->setCurrentRow(0);
}
QListWidget* nmWxRCWell::initListWidget() {
m_pWellListWidget = new QListWidget;
m_pWellListWidget->addItems(m_vWellNames.toList());
connect(m_pWellListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(on_selectWell(int)));
return m_pWellListWidget;
}
QWidget* nmWxRCWell::initWellDetailWidget() {
QWidget* detailWidget = new QWidget;
QVBoxLayout* mainLayout = new QVBoxLayout;
detailWidget->setLayout(mainLayout);
// 1、井的通用设置
QGridLayout* layout = new QGridLayout;
// 显示井的半径
m_pWellRadiusEdit = new QLineEdit;
m_pWellRadiusEdit->setEnabled(false);
layout->addWidget(createLabel(tr("radius")), 0, 0);
layout->addWidget(m_pWellRadiusEdit, 0, 1);
layout->addWidget(new QLabel(tr("m")), 0, 2);
// 井的表皮系数
m_pWellSkinEdit = new QLineEdit;
connect(m_pWellSkinEdit, SIGNAL(textChanged(QString)), this, SLOT(on_wellSkinChanged(QString)));
layout->addWidget(createLabel(tr("skin")), 1, 0);
layout->addWidget(m_pWellSkinEdit, 1, 1);
layout->addWidget(new QLabel(tr("")), 1, 2);
// 井储系数
m_pWellReservoirFactorEdit = new QLineEdit;
connect(m_pWellReservoirFactorEdit, SIGNAL(textChanged(QString)), this, SLOT(on_wellReservoirFactorChanged(QString)));
layout->addWidget(createLabel(tr("RF")), 2, 0);
layout->addWidget(m_pWellReservoirFactorEdit, 2, 1);
layout->addWidget(new QLabel(tr("m3/MPa")), 2, 2);
// 井的流量段比如井的流量段时2则有2个持续时间和2个流量
m_pWellTimeEdit = new QLineEdit;
connect(m_pWellTimeEdit, SIGNAL(textChanged(QString)), this, SLOT(on_welltTimeChanged(QString)));
layout->addWidget(createLabel(tr("TimeNum")), 3, 0);
layout->addWidget(m_pWellTimeEdit, 3, 1);
layout->addWidget(new QLabel(tr("")), 3, 2);
mainLayout->addLayout(layout);
// 勾选是 统一设置,还是 单独设置
// 2、井的流量设置
m_pTimeTableWidget = new QTableWidget;
mainLayout->addWidget(m_pTimeTableWidget);
return detailWidget;
}
void nmWxRCWell::showWellDetail(int index) {
qDebug() << "show well detail " << index << m_vWellsRadius.size();
printWells();
m_pWellRadiusEdit->setText(QString::number(m_vWellsRadius[index]));
// 井的表皮系数
m_pWellSkinEdit->setText(QString::number(m_vWellsSkin[index]));
// 井储系数
m_pWellReservoirFactorEdit->setText(QString::number(m_vWellsReservoirFactor[index]));
// 井的流量段比如井的流量段时2则有2个持续时间和2个流量
m_pWellTimeEdit->setText(QString::number(m_vWellsTimeNum[index]));
this->updateWellTimeFlow(index);
}
void nmWxRCWell::initWellTimeFlow(int iWellIndex, int iTimeNum) {
QVector<double > vWellTimes;
QVector<double > vWellFlows;
// 如果数量不变,则不需要进行修改
if (iTimeNum == m_vWellTimes[iWellIndex].size()) {
return;
}
int iStartIndex = 0;
// 如果是流量段修改更大了
if (iTimeNum > m_vWellTimes[iWellIndex].size()) {
// 补齐
// 先获取旧的数据
vWellTimes = m_vWellTimes[iWellIndex];
vWellFlows = m_vWellFlows[iWellIndex];
// 补齐的index
iStartIndex = vWellTimes.size();
// 添加新的流量段数据
for (int i = iStartIndex; i < iTimeNum; i++) {
vWellTimes.append(100);
vWellFlows.append(10);
}
} else {
// 截断
for (int i = iStartIndex; i < iTimeNum; i++) {
vWellTimes.append(m_vWellTimes[iWellIndex][i]);
vWellFlows.append(m_vWellFlows[iWellIndex][i]);
}
}
m_vWellTimes[iWellIndex] = vWellTimes;
m_vWellFlows[iWellIndex] = vWellFlows;
}
void nmWxRCWell::printWells() {
for (int i = 0; i < m_vWellNames.size(); i++) {
qDebug() << "-------- NO." << i << " well --------------";
qDebug() << "well name: " << m_vWellNames[i];
qDebug() << "well radius: " << m_vWellsRadius[i];
qDebug() << "well skin: " << m_vWellsSkin[i];
qDebug() << "well factor: " << m_vWellsReservoirFactor[i];
qDebug() << "well times: " << m_vWellsTimeNum[i];
for (int j = 0; j < m_vWellsTimeNum[i]; j++) {
qDebug() << "NO.1 time, time: " << m_vWellTimes[i][j] << " flow: " << m_vWellFlows[i][j];
}
qDebug() << "----------------------";
}
}
QLabel *nmWxRCWell::createLabel(QString str) {
QLabel* pLabel = new QLabel(str);
pLabel->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
return pLabel;
}
void nmWxRCWell::on_wellReservoirFactorChanged(QString v) {
int index = m_pWellListWidget->currentRow();
m_vWellsReservoirFactor[index] = v.toDouble();
}
void nmWxRCWell::updateWellTimeFlow(int iWellIndex) {
// 获取这口井的 流量段时间和流量数据
QVector<double > vWellTimes = m_vWellTimes[iWellIndex];
QVector<double > vWellFlows = m_vWellFlows[iWellIndex];
int iTimeNum = m_vWellsTimeNum[iWellIndex];
m_pTimeTableWidget->disconnect();
m_pTimeTableWidget->clear();
m_pTimeTableWidget->setColumnCount(3);
m_pTimeTableWidget->setRowCount(iTimeNum);
QStringList headers;
headers << tr("NO.") << tr("Time") << tr("Flow");
m_pTimeTableWidget->setHorizontalHeaderLabels(headers);
m_pTimeTableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
m_pTimeTableWidget->verticalHeader()->setVisible(false);
// 填充数据
for (int row = 0; row < m_pTimeTableWidget->rowCount(); ++row) {
for (int j = 0; j < 3; j++) {
QTableWidgetItem *item = new QTableWidgetItem();
// 设置是第几段
if (j == 0) {
item->setText(QString::number(row + 1));
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
} else if (j == 1) {
item->setText(QString::number(vWellTimes[row]));
// 设置背景为白色
item->setBackgroundColor(Qt::white);
} else {
item->setText(QString::number(vWellFlows[row]));
// 设置背景为白色
item->setBackgroundColor(Qt::white);
}
item->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
m_pTimeTableWidget->setItem(row, j, item);
}
}
connect(m_pTimeTableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(on_timeFlowChanged(QTableWidgetItem *)));
}
bool nmWxRCWell::saveData(QString filePath) {
// 将数据存储到求解器目录下
QFile file(filePath);
//检查
if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qWarning("Cannot open file for writing: %s", qPrintable(file.errorString()));
return false;
}
QTextStream out(&file);
// 井的数量
out << m_vWellNames.size() << endl;
for (int i = 0; i < m_vWellNames.size(); i++) {
out << m_vWellsRadius[i] << endl;
out << m_vWellsSkin[i] << endl;
out << m_vWellsReservoirFactor[i] << endl;
out << m_vWellsTimeNum[i] << endl;
for (int j = 0; j < m_vWellsTimeNum[i]; j++) {
out << m_vWellTimes[i][j] << endl;
out << m_vWellFlows[i][j] << endl;
}
}
file.close();
return true;
}