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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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