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/nmPebiRegionPressureCalcula...

95 lines
4.1 KiB
C

#ifndef NMPEBIREGIONPRESSURECALCULATOR_H
#define NMPEBIREGIONPRESSURECALCULATOR_H
#include "nmData_global.h"
#include <QPointF>
#include <QSharedPointer>
#include <QString>
#include <QVector>
#include <vtkType.h>
class nmPebiRegionPressureCalculatorPrivate;
class nmPebiResultSnapshot;
/**
* @brief 一帧区域压力的孔隙体积加权统计结果。
*
* 压力使用快照基础单位 MPa;面积和孔隙体积的单位分别为 m2 和 m3。
* m_bAvailable 为 false 时,计数仍可用于解释没有有效加权结果的原因。
*/
struct NM_DATA_EXPORT nmPebiRegionPressureStatistics
{
/** @brief 初始化为空且不可用的统计结果。 */
nmPebiRegionPressureStatistics();
/** @brief 清除所有计数和值,使对象恢复到默认状态。 */
void clear();
bool m_bAvailable; ///< 是否存在至少一个可用于压力加权的有效单元。
int m_nPressureFrameIndex; ///< 本结果对应的零基压力帧。
double m_dPressureTimeHours; ///< 压力帧求解时间,单位 h。
vtkIdType m_nIntersectingCellCount; ///< 与选区存在正面积交叠的二维单元数。
vtkIdType m_nValidCellCount; ///< 实际参与本帧压力统计的单元数。
vtkIdType m_nIgnoredCellCount; ///< 因权重或压力无效而忽略的相交单元数。
double m_dSelectedCellAreaSquareMeters; ///< 相交单元完整面积之和,单位 m2。
double m_dEffectivePoreVolumeCubicMeters; ///< 有效单元孔隙体积之和,单位 m3。
double m_dMinimumPressureMpa; ///< 有效单元最小压力,单位 MPa。
double m_dMaximumPressureMpa; ///< 有效单元最大压力,单位 MPa。
double m_dPoreVolumeWeightedPressureMpa; ///< 孔隙体积加权压力,单位 MPa。
};
/**
* @brief 在不可变 PEBI 快照上准备区域并逐帧计算压力统计。
*
* 准备阶段基于基础网格执行真实二维多边形相交判定;只要交叠面积为正,
* 整个单元即被选中。相交基础 Cell ID、完整面积和 A*h*phi 权重会被缓存,
* 后续切帧只读取已缓存单元的压力,不依赖 Mapper 或显示筛选管线。
*/
class NM_DATA_EXPORT nmPebiRegionPressureCalculator
{
public:
/** @brief 创建尚未绑定快照和区域的计算器。 */
nmPebiRegionPressureCalculator();
/** @brief 释放快照强引用和全部区域缓存。 */
~nmPebiRegionPressureCalculator();
/**
* @brief 事务式准备一份简单二维多边形选区。
* @param pSnapshot 只读结果快照,成功后由计算器保持强引用。
* @param vecPolygonPoints 按边界顺序给出的 XY 世界坐标;首点无需重复。
* @note 非有限、退化或自相交多边形会失败并保留旧区域缓存。
*/
bool prepare(
const QSharedPointer<const nmPebiResultSnapshot>& pSnapshot,
const QVector<QPointF>& vecPolygonPoints,
QString* pError = NULL);
/** @brief 清除当前区域、快照引用和所有相交单元缓存。 */
void clear();
/** @brief 返回是否已经成功准备过一份快照区域。 */
bool isPrepared() const;
/** @brief 返回当前区域所属快照 ID;未准备时为空。 */
QString getSnapshotId() const;
/** @brief 返回规范化后的区域顶点,引用在下次 prepare 或 clear 前有效。 */
const QVector<QPointF>& getPolygonPoints() const;
/** @brief 返回相交基础 VTK Cell ID,引用在下次 prepare 或 clear 前有效。 */
const QVector<vtkIdType>& getIntersectingCellIds() const;
/**
* @brief 使用缓存权重计算指定压力帧的最小、最大和加权平均值。
* @note 无相交单元或无有效权重属于成功的不可用结果,不返回伪造的零压力。
*/
bool calculateFrame(int nPressureFrameIndex,
nmPebiRegionPressureStatistics& oStatistics,
QString* pError = NULL) const;
private:
Q_DISABLE_COPY(nmPebiRegionPressureCalculator)
nmPebiRegionPressureCalculatorPrivate* m_pPrivate; ///< 独占区域缓存实现。
};
#endif // NMPEBIREGIONPRESSURECALCULATOR_H