#include "nmWxRCWell.h" #include #include #include #include #include #include #include #include #include #include "nmGUIComponentBase.h" nmWxRCWell::nmWxRCWell(QVector wellNames, QVector 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 vWellTimes = m_vWellTimes[iWellIndex]; double dNewTimeValue = m_pTimeTableWidget->item(row, column)->text().toDouble(); vWellTimes[row] = dNewTimeValue; m_vWellTimes[iWellIndex] = vWellTimes; return; } // Flow 变化了 QVector 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 vWellTimes; QVector 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 vWellTimes; QVector 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 vWellTimes = m_vWellTimes[iWellIndex]; QVector 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; }