#ifndef NMVOLUMEDATA_H #define NMVOLUMEDATA_H #include "nmData_global.h" #include #include #include #include #include class vtkUnstructuredGrid; class nmVolumeDataBuilder; class nmVolumeDataRenderAdapter; /** @brief 三维属性的存储关联;不包含任何求解器或 PEBI 业务约定。 */ enum NM_VOLUME_PROPERTY_ASSOCIATION { NM_VolumeProperty_CellData = 0, NM_VolumeProperty_PointData }; /** @brief 已校验的单分量属性描述;范围只统计有限值,名称不推断单位。 */ struct NM_DATA_EXPORT nmVolumePropertyDescriptor { QString m_sPropertyId; ///< 关联类型与原数组名组成的稳定身份。 QString m_sArrayName; ///< 文件中的原始名称,以 UTF-8 交给 VTK。 NM_VOLUME_PROPERTY_ASSOCIATION m_eAssociation; ///< 数组关联到单元或节点。 double m_dMinimum; ///< 全模型范围内的最小有限属性值。 double m_dMaximum; ///< 全模型范围内的最大有限属性值,常量时等于最小值。 }; /** * @brief 与数据来源无关的只读三维体网格。 * Builder 独立复制并校验后才发布;UI 只能查询元数据,渲染适配器可以共享 * 已冻结的数组,但任何下游均不得修改共享几何和数组。 */ class NM_DATA_EXPORT nmVolumeData { public: /** @brief 释放当前数据对象独占的网格容器及冻结数组引用。 */ ~nmVolumeData(); /** @brief 返回本次发布的唯一数据 ID;重复导入同一文件也生成新身份。 */ QString getDataId() const; /** @brief 返回可选来源名称;文件导入使用文件名,求解器可提供业务名称。 */ QString getSourceName() const; /** @brief 返回已校验三维网格的节点数量。 */ vtkIdType getPointCount() const; /** @brief 返回已校验三维网格的体单元数量。 */ vtkIdType getCellCount() const; /** @brief 复制 X/Y/Z 最小、最大边界;空输出指针不执行操作。 */ void getBounds(double dBounds[6]) const; /** @brief 返回只读属性目录,顺序为单元属性在前、节点属性在后。 */ const QVector& getProperties() const; /** @brief 按稳定 ID 查找只读描述;不存在时返回 nullptr。 */ const nmVolumePropertyDescriptor* findProperty(const QString& sPropertyId) const; /** @brief 返回默认着色属性 ID;没有合法标量时返回空字符串。 */ QString getInitialPropertyId() const; /** @brief 返回被跳过属性等非致命诊断,不影响合法几何发布。 */ QStringList getDiagnostics() const; private: /** @brief 只允许 Builder 创建待校验对象,普通调用者不能发布半成品。 */ nmVolumeData(); Q_DISABLE_COPY(nmVolumeData) friend class nmVolumeDataBuilder; friend class nmVolumeDataRenderAdapter; vtkSmartPointer m_pGrid; ///< 发布后不再写入。 QString m_sDataId; ///< 本次发布唯一 UUID,与路径及界面索引无关。 QString m_sSourceName; ///< 仅供显示的来源名称,不用于读取或身份比较。 QString m_sInitialPropertyId; ///< 构建时按活动标量优先级选定的默认属性。 QVector m_vecProperties; ///< 发布后不可修改的属性目录。 QStringList m_listDiagnostics; ///< 被跳过的数组等非致命诊断。 double m_dBounds[6]; ///< 有限且三轴非零跨度的原始网格边界。 }; /** @brief 导入过程的非所有权回调;实现必须允许工作线程调用。 */ class NM_DATA_EXPORT nmVolumeImportFeedback { public: /** @brief 支持通过反馈接口销毁具体回调实现。 */ virtual ~nmVolumeImportFeedback() {} /** @brief 返回线程安全的取消状态;读取、校验和复制循环均需检查。 */ virtual bool isCanceled() const = 0; /** @brief 报告 0~100 的加载进度;不得在此直接操作界面对象。 */ virtual void reportProgress(int nPercent) = 0; }; #endif // NMVOLUMEDATA_H