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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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