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/nmData/nmVolumeData.h

90 lines
4.0 KiB
C

#ifndef NMVOLUMEDATA_H
#define NMVOLUMEDATA_H
#include "nmData_global.h"
#include <QSharedPointer>
#include <QStringList>
#include <QVector>
#include <vtkSmartPointer.h>
#include <vtkType.h>
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<nmVolumePropertyDescriptor>& 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<vtkUnstructuredGrid> m_pGrid; ///< 发布后不再写入。
QString m_sDataId; ///< 本次发布唯一 UUID,与路径及界面索引无关。
QString m_sSourceName; ///< 仅供显示的来源名称,不用于读取或身份比较。
QString m_sInitialPropertyId; ///< 构建时按活动标量优先级选定的默认属性。
QVector<nmVolumePropertyDescriptor> 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