|
|
|
|
|
#ifndef NMWXGEOMETRYLAYERDLG_H
|
|
|
|
|
|
#define NMWXGEOMETRYLAYERDLG_H
|
|
|
|
|
|
|
|
|
|
|
|
#include "iDlgBase.h"
|
|
|
|
|
|
#include "nmSubWxs_global.h"
|
|
|
|
|
|
#include "nmLayerGeometry.h"
|
|
|
|
|
|
#include <QPointer>
|
|
|
|
|
|
#include <QSet>
|
|
|
|
|
|
|
|
|
|
|
|
class QLineEdit;
|
|
|
|
|
|
class QComboBox;
|
|
|
|
|
|
class QTableWidget;
|
|
|
|
|
|
class QTableWidgetItem;
|
|
|
|
|
|
class QPushButton;
|
|
|
|
|
|
class QEvent;
|
|
|
|
|
|
class iUnitGroup;
|
|
|
|
|
|
class nmLayerGeometryDataSource;
|
|
|
|
|
|
class nmLayerCellDelegate;
|
|
|
|
|
|
class nmWxLayerGeometryPreview;
|
|
|
|
|
|
|
|
|
|
|
|
// 分层几何编辑窗口:只管理工作副本、框架单位换算和表格交互。
|
|
|
|
|
|
// 数据源由入口持有,必须比窗口活得更久;取消直接丢弃副本,确定才尝试一次性提交。
|
|
|
|
|
|
class NM_SUB_WXS_EXPORT nmWxGeometryLayerDlg : public iDlgBase
|
|
|
|
|
|
{
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
public:
|
|
|
|
|
|
// 构造仅创建界面和取得单位服务;调用方须先 initialize() 成功,再 exec()。
|
|
|
|
|
|
explicit nmWxGeometryLayerDlg(nmLayerGeometryDataSource* source, QWidget* parent = 0);
|
|
|
|
|
|
// 在 exec 前读取已保存层;失败不展示不完整的数据。
|
|
|
|
|
|
bool initialize();
|
|
|
|
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
|
|
// 收齐活动编辑器内容后校验副本,仅数据源提交成功才关闭窗口;回车同样走此入口。
|
|
|
|
|
|
virtual void accept();
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
// 双击右侧色带时定位对应层并进入选色;空白和间隙不触发其他层的颜色修改。
|
|
|
|
|
|
virtual bool eventFilter(QObject* pWatched, QEvent* pEvent);
|
|
|
|
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
|
// 接收层名/厚度编辑;非法厚度保留为待修正文本,不替换副本中的合法值。
|
|
|
|
|
|
void onItemChanged(QTableWidgetItem* item);
|
|
|
|
|
|
// 先按旧单位解析未完成的输入,再切换整张表的显示单位;失败恢复原选项。
|
|
|
|
|
|
void onUnitChanged(int index);
|
|
|
|
|
|
// 输入过程中只更新可用状态和派生显示,避免把尚未输完的顶深写入副本。
|
|
|
|
|
|
void onTopEdited();
|
|
|
|
|
|
// 结束编辑时尝试应用首层顶深,合法后重新计算边界和预览。
|
|
|
|
|
|
void onTopFinished();
|
|
|
|
|
|
// 当前层变化只更新按钮和预览高亮,不改变层的物理顺序。
|
|
|
|
|
|
void onSelectionChanged();
|
|
|
|
|
|
// 添加在末尾追加;插入在当前行之前创建新层,均复用 insertAt()。
|
|
|
|
|
|
void onAdd();
|
|
|
|
|
|
void onInsert();
|
|
|
|
|
|
// 删除当前层;允许删除该行的非法输入,但不得丢弃其他行的待修正内容。
|
|
|
|
|
|
void onDelete();
|
|
|
|
|
|
// 显式放弃当前层编辑,从所属分析重建连续层;仍需确定后才保存到工程。
|
|
|
|
|
|
void onReset();
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
// 统一布局、主题和信号连接,几何运算与持久化通过各自接口完成。
|
|
|
|
|
|
void initUI();
|
|
|
|
|
|
// 全量刷新会清空非法文本;调用前须完成有效编辑,或已经明确执行重置/删除。
|
|
|
|
|
|
void refreshTable(int selectedRow);
|
|
|
|
|
|
// 只更新顶底深度、统计及预览,保留用户正在修正的层名/厚度文本。
|
|
|
|
|
|
void refreshDerived();
|
|
|
|
|
|
// 集中设置操作可用性;输入合法性与数据源拒绝提交的状态分别处理。
|
|
|
|
|
|
void updateActions();
|
|
|
|
|
|
// 先按原显示单位提交活动编辑器,再执行单位切换/结构修改/保存。
|
|
|
|
|
|
bool finishEditing();
|
|
|
|
|
|
// 首层文本确实改变且几何计算成功时才更新副本,不回写未编辑的舍入显示值。
|
|
|
|
|
|
bool applyTop();
|
|
|
|
|
|
// 在临时副本上预判顶深输入是否有效,不改变当前工作副本。
|
|
|
|
|
|
bool topIsValid() const;
|
|
|
|
|
|
// 按 m_sDisplayUnit 解析文本并交给框架换算为米;返回 true 后输出值才可使用。
|
|
|
|
|
|
bool toMeters(const QString& text, double& value) const;
|
|
|
|
|
|
// 预检所有深度、厚度和总厚度,避免切换单位后出现溢出或正厚度下溢为零。
|
|
|
|
|
|
bool canDisplayUnit(const QString& unit) const;
|
|
|
|
|
|
// 普通显示采用框架精度;编辑起始文本采用 17 位有效数字,避免截断原值。
|
|
|
|
|
|
QString displayValue(double meters, bool fullPrecision = false) const;
|
|
|
|
|
|
// 查找当前名称列表中未占用的 LayerN,不重新编号已经存在的层。
|
|
|
|
|
|
QString nextLayerName() const;
|
|
|
|
|
|
// 结构编辑共用入口:收齐输入、选择参考厚度、插入副本、恢复表格当前行。
|
|
|
|
|
|
void insertAt(int row);
|
|
|
|
|
|
// 色带双击触发的选色入口;调用前须完成编辑校验,取消选色不修改副本。
|
|
|
|
|
|
void chooseLayerColor(int nRow);
|
|
|
|
|
|
|
|
|
|
|
|
nmLayerGeometryDataSource* m_pDataSource; // 非拥有型接口,不能在窗口中删除。
|
|
|
|
|
|
nmLayerGeometry m_oGeometry; // 底层米制副本,绝不从格式化文本重建未修改的值。
|
|
|
|
|
|
QPointer<iUnitGroup> m_pLengthUnitGroup; // 单位服务由底层框架管理。
|
|
|
|
|
|
QString m_sDisplayUnit; // 已生效的显示单位;切换成功前保留旧值解析输入。
|
|
|
|
|
|
QString m_sFirstTopDisplayText; // 上次已应用的顶深文本;作为未编辑判据,防止舍入显示值反写。
|
|
|
|
|
|
QSet<int> m_setInvalidThicknessRows; // 厚度输入无效的零起始行号;原文本留在表格中,集合非空时禁止保存。
|
|
|
|
|
|
bool m_bRefreshing; // 程序刷新期间忽略编辑/选择回调,避免递归写回。
|
|
|
|
|
|
bool m_bInitialized; // 成功载入副本后才允许用户操作。
|
|
|
|
|
|
bool m_bCommitBlocked; // 上次提交被数据源拒绝,重新编辑/重置后才允许重试。
|
|
|
|
|
|
|
|
|
|
|
|
// 以下控件均由 Qt 父子关系释放;委托由表格持有,无需手动 delete。
|
|
|
|
|
|
QLineEdit* m_pFirstTopEdit; // 首层顶深输入框,文本按 m_sDisplayUnit 解释,副本始终存米。
|
|
|
|
|
|
QComboBox* m_pLengthUnitComboBox; // 框架提供的统一长度单位列表。
|
|
|
|
|
|
QTableWidget* m_pLayerTable; // 层名称、厚度、只读顶深和只读底深。
|
|
|
|
|
|
nmLayerCellDelegate* m_pLayerDelegate; // 保留编辑精度,并支持主动结束活动单元格编辑。
|
|
|
|
|
|
nmWxLayerGeometryPreview* m_pLayerPreview; // 只接收快照的剖面显示控件。
|
|
|
|
|
|
QLineEdit* m_pLayerCountEdit; // 只读层数,可选中复制。
|
|
|
|
|
|
QLineEdit* m_pTotalThicknessEdit; // 只读累计层厚度,不含历史间隙;按统一显示单位换算,框内仅显示数值。
|
|
|
|
|
|
// 层结构操作、显式重置以及最终提交入口;颜色通过右侧色带双击修改,取消由标准按钮框处理。
|
|
|
|
|
|
QPushButton* m_pAddButton; // 在列表末尾追加一层,初始厚度取当前参考层。
|
|
|
|
|
|
QPushButton* m_pInsertButton; // 在当前行之前插入一层,需要存在当前层。
|
|
|
|
|
|
QPushButton* m_pDeleteButton; // 删除当前层;仅剩一层时禁用,避免产生空几何。
|
|
|
|
|
|
QPushButton* m_pResetButton; // 用所属分析的完整层列表重置副本,确定前不写入工程。
|
|
|
|
|
|
QPushButton* m_pOkButton; // 提交入口;输入无效或上次提交被拒绝时禁用。
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // NMWXGEOMETRYLAYERDLG_H
|