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/Include/nmNum/nmSubWxs/nmWellParameterPanel.h

121 lines
4.4 KiB
C

#pragma once
#include "nmSubWxs_global.h"
#include <QList>
#include <QMap>
#include <QVariant>
#include <QVector>
#include <QWidget>
class nmDataWellBase;
class nmDataPerforation;
class nmIParameterUnitService;
class nmParameterField;
struct nmWellParameterGroupInfo;
class QComboBox;
class QVBoxLayout;
/**
* @brief
* @note
*/
class NM_SUB_WXS_EXPORT nmWellParameterPanel : public QWidget
{
Q_OBJECT
public:
/** @brief 创建参数面板并注入窗口级单位服务。 */
explicit nmWellParameterPanel(
nmIParameterUnitService* pUnitService,
QWidget* pParent = nullptr);
/** @brief 解除工作副本信号连接并释放字段控件。 */
virtual ~nmWellParameterPanel();
/** @brief 绑定新的井型工作副本并创建对应分组。 */
bool setWellData(nmDataWellBase* pWell, QString& sError);
/** @brief 校验并一次性写入当前可见字段。 */
bool commitPendingEdits(QString& sError);
/** @brief 返回全部可见输入是否有效。 */
bool isInputValid();
/** @brief 将焦点移动到第一个无效字段。 */
void focusFirstInvalid();
public slots:
/** @brief 从工作副本刷新字段,不重建分组控件。 */
void reloadFromWell();
signals:
/** @brief 参数有效状态发生变化。 */
void sigValidityChanged(bool bValid);
/** @brief 返回当前输入错误,空文字表示有效。 */
void sigValidationMessageChanged(const QString& sMessage);
private slots:
/** @brief 输入过程中只刷新校验状态,不立即写工作副本。 */
void slotFieldValueEdited();
/** @brief 输入结束后批量提交当前字段。 */
void slotFieldEditingFinished();
/** @brief 保存当前射孔输入后切换到目标射孔段。 */
void slotPerforationChanged(int nIndex);
/** @brief 响应轨迹交互产生的数据变化并刷新现有字段。 */
void slotWellDataChanged();
private:
/** @brief 清空当前井型生成的全部分组和字段映射。 */
void clearGroups();
/** @brief 根据目录描述创建一个参数分组。 */
bool buildGroup(const nmWellParameterGroupInfo& oGroupInfo,
QString& sError);
/** @brief 增量同步射孔选择器并保持当前射孔索引。 */
void reloadPerforationSelector();
/** @brief 返回指定射孔在选择器中的显示名称。 */
QString perforationDisplayName(int nPerforationIndex) const;
/** @brief 仅同步当前射孔名称,不改变选择器结构和当前选中项。 */
void updateCurrentPerforationItem();
/** @brief 收集基准单位值并执行字段及关联规则校验。 */
bool collectValues(QMap<QString, QVariant>& mapValues,
QString& sError,
QVector<nmDataPerforation>* pVecPerforations = nullptr);
/** @brief 校验全部射孔并按需返回与校验完全一致的最终快照。 */
bool validatePerforationValues(
const QMap<QString, QVariant>& mapValues,
QString& sError,
QVector<nmDataPerforation>* pVecPerforations);
/** @brief 按稳定参数ID查找当前井型字段。 */
nmParameterField* field(const QString& sParameterId) const;
/** @brief 为跨射孔校验错误补充可定位的射孔序号。 */
QString perforationErrorText(int nPerforationIndex,
const QString& sRuleError) const;
/** @brief 标记指定射孔的起止字段或选择器错误。 */
void setPerforationError(int nPerforationIndex,
const QString& sError);
nmIParameterUnitService* m_pUnitService; ///< 单位服务,不拥有所有权。
nmDataWellBase* m_pWell; ///< 当前工作副本,不拥有所有权。
QVBoxLayout* m_pMainLayout; ///< 单列分组布局。
QComboBox* m_pPerforationComboBox; ///< 当前射孔选择器。
QList<nmParameterField*> m_listFields; ///< 当前井型字段。
QMap<QString, nmParameterField*> m_mapFields; ///< 稳定ID字段映射。
int m_nCurrentPerforationIndex; ///< 当前射孔索引。
bool m_bReloading; ///< 程序刷新控件标记。
bool m_bUpdatingModel; ///< 批量写工作副本标记。
};