#ifndef NMVOLUMESCENECONTROLLER_H #define NMVOLUMESCENECONTROLLER_H #include "nmSubWxs_global.h" #include "nmVolumeData.h" #include "nmVolumeSliceSettings.h" #include "nmVTKMeshLayer.h" class nmWxVTKRenderContainerWidget; class nmVolumeSceneControllerPrivate; /** * @brief 外部三维模型的独立场景控制器。 * setData 只准备隐藏候选,不移动相机、不 Render;窗口完成数据源事务时再调用 * activate。控制器清理仅移除自身图层,不清空容器的其他业务图层。 */ class NM_SUB_WXS_EXPORT nmVolumeSceneController { public: /** @param pContainer 非所有权容器,必须比本控制器存活更久且位于 GUI 线程。 */ explicit nmVolumeSceneController(nmWxVTKRenderContainerWidget* pContainer); /** @brief 仅删除仍归本控制器所有的图层,然后释放数据和适配器。 */ ~nmVolumeSceneController(); /** @brief 事务式准备隐藏场景;失败保留旧数据、相机和图层,成功后需 activate。 */ bool setData(const QSharedPointer& pData, QString* pError = nullptr); /** @brief 显示已准备模型,设置边界和拾取目标;是否适配相机由调用者决定。 */ void activate(bool bFitCamera); /** @brief 只隐藏本控制器图层,保留数据及显示设置,不主动渲染。 */ void hide(); /** @brief 解除当前模型引用并移除自有图层,不主动 Render。 */ void clear(); /** @brief 数据及所有已注册图层均有效时返回 true。 */ bool hasData() const; /** @brief 按稳定 ID 原子切换着色属性;失败保留原属性,成功至多 Render 一次。 */ bool applyProperty(const QString& sPropertyId, QString* pError = nullptr); /** @brief 复用结果窗口的网格显示模式,立即生效,不重算截面或移动相机。 */ void setMeshDisplayMode(nmVTKMeshLayer::DisplayMode eMode); /** @brief 返回完整模型与截面共用的显示模式,供底部工具栏同步。 */ nmVTKMeshLayer::DisplayMode getMeshDisplayMode() const; /** @brief 更新色标响应式布局,不触发渲染,供容器 Resize 通知使用。 */ void setViewportSize(int nWidth, int nHeight); /** @brief 保存色标显隐偏好;无标量时始终隐藏,重复设置不渲染。 */ void setScalarBarVisible(bool bVisible); /** @brief 返回色标显隐偏好,供 QAction 同步勾选状态。 */ bool isScalarBarVisible() const; /** @brief 返回当前模型是否选中了可用于着色的合法属性。 */ bool hasScalarProperty() const; /** @brief 返回当前只读数据,用于参数目录及平面范围初始化。 */ QSharedPointer getData() const; /** @brief 返回最后成功应用的切片参数;首次切片前返回模型中心默认参数。 */ nmVolumeSliceSettings getSliceSettings() const; /** @brief 启用或停用切片;首次启用计算中心截面,后续复用已有截面。 */ bool setSliceEnabled(bool bEnabled, QString* pError = nullptr); /** @brief 事务式应用参数,成功后启用切片;失败保留旧画面及参数。 */ bool applySliceSettings(const nmVolumeSliceSettings& oSettings, QString* pError = nullptr); /** @brief 立即更新辅助平面及参照模型偏好,不执行切片计算。 */ void setSliceDisplayOptions(bool bShowPlane, bool bShowSource); /** @brief 返回当前是否显示截面,供菜单同步勾选状态。 */ bool isSliceEnabled() const; /** @brief 返回当前切片是否为合法的空截面,供界面显示无交集提示。 */ bool isSliceEmpty() const; /** @brief 返回当前数据成功提交截面的次数,便于观察及验证预览不重算。 */ unsigned int getSliceRevision() const; private: Q_DISABLE_COPY(nmVolumeSceneController) nmVolumeSceneControllerPrivate* m_pPrivate; ///< 独占的场景状态,仅 GUI 线程访问。 }; #endif // NMVOLUMESCENECONTROLLER_H