|
|
#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;
|
|
|
}
|