#ifndef NMLAYERGEOMETRY_H #define NMLAYERGEOMETRY_H #include "nmData_global.h" #include #include #include class nmDataLayer; // 单层的值快照。长度统一为米,不持有 QObject,也不依赖界面或当前分析。 struct NM_DATA_EXPORT nmLayerGeometryRow { // 默认零厚度只用于待填充记录,补齐合法边界后才能参与几何提交。 nmLayerGeometryRow(); QString m_sName; // 层名称,独立于表格行号,插入其他层时不自动改名。 QColor m_clrLayer; // 层色块和剖面填充色,不参与几何计算。 double m_dTopDepth; // 顶深,单位 m;深度增大表示向下。 double m_dBottomDepth; // 底深,单位 m;有效层必须满足 m_dBottomDepth > m_dTopDepth。 double m_dThickness; // 层自身厚度,单位 m,不包含相邻层之间的间隙。 bool m_bLegacyGap; // true 表示与下一层分离;重排时按实际间距更新,末层为 false。 }; // 分层几何的工作副本。所有几何修改先在临时副本中计算,合法后才替换自身。 // 名称、颜色编辑无需重算边界,避免仅打开/改名就改变旧工程的数值精度。 class NM_DATA_EXPORT nmLayerGeometry { public: QVector m_vecLayers; // 按从上到下的物理顺序存放,与表格行顺序一致。 // 复制持久化对象的业务字段,不接管/修改输入对象;遇到空指针返回 false,result 不变。 // 允许复制空列表或旧的无效几何,是否可提交须另行调用 isValid() 判断。 static bool fromLayers(const QVector& layers, nmLayerGeometry& result); // 检查有限数值、正厚度、厚度与边界一致、不重叠,以及厚度累计/整体跨度不溢出。 bool isValid() const; // 只累加各层厚度,历史间隙不计入总厚度;本方法不负责校验数据。 double totalThickness() const; // 按原始值精确比较,供未修改判定及外部修改检查使用;不比较格式化显示文本。 // geometryOnly 为 true 时忽略名称和颜色,仍比较边界、厚度及旧间隙标志。 bool equals(const nmLayerGeometry& other, bool geometryOnly = false) const; // 以米制首层顶深重新排列,保留各层厚度及历史间距;失败时当前副本不变。 bool setFirstTop(double top); // row 为零起始行号;调整该层厚度并重算后续边界,首层顶深和历史间距保持不变。 bool setThickness(int row, double thickness); // 在 row 前插入,row == m_vecLayers.size() 表示末尾追加;新层上方不额外创建间隙。 bool insertLayer(int row, const QString& name, double thickness, const QColor& color); // 至少保留一层;删除中间层时合并其两侧间距,删除首层时保留原首层顶深。 bool removeLayer(int row); private: // 就地重算边界,仅供临时副本调用;失败可能已改写部分行,不可直接用于正式副本。 // gaps 与 m_vecLayers 等长,表示各层上方间距;首层直接使用 firstTop。 bool relayout(double firstTop, const QVector& gaps); // 从实际顶底深度提取间距,第 0 项为零;不依赖可能与旧几何不一致的布尔标志。 QVector gaps() const; }; #endif // NMLAYERGEOMETRY_H