/** * * @file FITKAbsGeoCommand.h * @brief 几何命令创建基类 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-12 * */ #ifndef _FITKABS_GEO_COMMAND_H___ #define _FITKABS_GEO_COMMAND_H___ #include "FITKInterfaceGeometryAPI.h" #include "FITKGeoEnum.h" #include "FITK_Kernel/FITKCore/FITKAbstractNDataObject.h" #include "FITK_Kernel/FITKCore/FITKVarientParams.h" #include "FITK_Interface/FITKInterfaceModel/FITKModelEnum.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoShapeAgent.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKVirtualTopoManager.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKSignalTransfer.h" #include "FITK_Kernel/FITKCore/FITKAbstractDataManager.hpp" namespace Interface { class FITKGeoCommandManager; /** * @brief 虚拓扑形状. * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-22 */ class VirtualShape { public: /** * @brief 命令CommandID. * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-22 */ int CmdId{ 0 }; /** * @brief 虚拓扑ID. * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-22 */ int VirtualTopoId{ 0 }; /** * @brief 是否为空形状. * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-22 */ bool isNull() const { return CmdId <= 0 || VirtualTopoId <= 0; } /** * @brief 重置形状,置空(isNull() == true). * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-22 */ void reset() { CmdId = 0; VirtualTopoId = 0; } /** * @brief 重载运算符. * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-22 */ bool operator==(const VirtualShape& other) { return (CmdId == other.CmdId) && (VirtualTopoId == other.VirtualTopoId); } friend bool operator==(const VirtualShape& shape1, const VirtualShape& shape2); }; inline bool operator==(const VirtualShape& shape1, const VirtualShape& shape2) { return (shape1.CmdId == shape2.CmdId) && (shape1.VirtualTopoId == shape2.VirtualTopoId); } /** * @brief 几何命令抽象类 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-12 */ class FITKInterfaceGeometryAPI FITKAbsGeoCommand : public Core::FITKAbstractNDataObject, public Core::FITKVarientParams { Q_OBJECT FITKCLASS(Interface, FITKAbsGeoCommand); public: /** * @brief Construct a new FITKAbsGeoCommand object * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-12 */ explicit FITKAbsGeoCommand(); /** * @brief Destroy the FITKAbsGeoCommand object * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-12 */ virtual ~FITKAbsGeoCommand() = 0; /** * @brief 获取几何命令类型 * @return FITKGeoEnum::FITKGeometryComType * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-12 */ virtual FITKGeoEnum::FITKGeometryComType getGeometryCommandType() = 0; /** * @brief 更新模型 * @return true * @return false * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-12 */ virtual bool update() = 0; /** * @brief 执行撤销逻辑。(非必须)[虚函数] * @return 是否执行成功。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ virtual bool undo(); /** * @brief 执行重做逻辑。(非必须)[虚函数] * @return 是否执行成功。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ virtual bool redo(); /** * @brief 设置命令状态。 * @param status:状态枚举 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ void setCommandStatus(FITKGeoEnum::FITKGeoStatus status); /** * @brief 获取命令状态。 * @return 状态枚举 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ FITKGeoEnum::FITKGeoStatus getCommandStatus(); /** * @brief 获取形状代理器 * @return FITKAbsGeoShapeAgent * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-30 */ FITKAbsGeoShapeAgent* getShapeAgent(); /** * @brief 获取shape. * @param type 拓扑类型 * @param id 虚拓扑ID * @return shape * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-20 */ template T* getShapeT(Interface::FITKGeoEnum::VTopoShapeType type, int id) { auto shapeAgent = getShapeAgent(); if (shapeAgent == nullptr) return nullptr; auto manager = shapeAgent->getVirtualTopoManager(); if (manager == nullptr) return nullptr; auto shapeManager = manager->getShapeVirtualTopoManager(type); if (shapeManager == nullptr) return nullptr; auto virShape = shapeManager->getDataByID(id); if (virShape == nullptr) return nullptr; return virShape->getShapeT(); } /** * @brief 获取shape. * @param id 虚拓扑ID * @return shape * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-20 */ template T* getShapeT(int id) { auto shapeAgent = getShapeAgent(); if (shapeAgent == nullptr) return nullptr; auto manager = shapeAgent->getVirtualTopoManager(); if (manager == nullptr) return nullptr; for (int type = static_cast(FITKGeoEnum::VTopoShapeType::VSPoint); type < static_cast(FITKGeoEnum::VTopoShapeType::VSAssembly); ++type) { auto shapeManager = manager->getShapeVirtualTopoManager(static_cast(type)); if (shapeManager == nullptr) continue; auto virShape = shapeManager->getDataByID(id); if (virShape == nullptr) continue; return virShape->getShapeT(); } return nullptr; } /** * @brief 获取虚拓扑管理器。 * @return ShapeAgent中的虚拓扑管理器 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-20 */ FITKVirtualTopoManager* getVirtualTopoManager(); template /** * @brief 获取形状代理器 * @return FITKAbsGeoShapeAgent * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-30 */ T* getTShapeAgent() { return dynamic_cast(_shapeAgent); } /** * @brief 打印信息到控制台. * @param type 信息类型 1-normal 2-warning 3-error 4-info * @param msg 信息内容 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-08-28 */ void printLog(QString msg, int type = 1) { AppFrame::FITKSignalTransfer* sigTrans = FITKAPP->getSignalTransfer(); if (sigTrans) { sigTrans->outputMessageSig(type, msg); } } /** * @brief 开启或关闭引用数据计数。 * @param flag:开启或关闭。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void enableReferenceList(bool flag); /** * @brief 过去引用数据计数状态。 * @return 开启或关闭。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ bool getEnableReferenceList(); /** * @brief 获取被引用计数。 * @return 被引用次数 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ int getReferenceCount(); /** * @brief 添加一次引用计数。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void addOneReference(); /** * @brief 移除一次引用计数。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void removeOneReference(); /** * @brief 添加引用的命令ID。 * @param id:命令ID * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void addReferenceCmdID(int id); /** * @brief 添加引用的命令对象。 * @param cmd:命令对象 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void addReferenceCmdObj(FITKAbsGeoCommand* cmd, bool isSet = false); /** * @brief 移除引用的命令ID。 * @param id:命令ID * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void removeReferenceCmdID(int id); /** * @brief 移除引用的命令对象。 * @param cmd:命令对象 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void removeReferenceCmdObj(FITKAbsGeoCommand* cmd); /** * @brief 清空引用命令。[虚函数] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ virtual void clearReference(); /** * @brief 获取当前命令所引用的命令数量。 * @return 引用命令列表长度 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ int getReferenceCmdCount(); /** * @brief 根据索引获取当前命令引用的命令。 * @param index:命令索引 * @return 引用命令对象 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ FITKAbsGeoCommand* getReferenceCmdByIndex(int index); /** * @brief 获取数据的界面有效性:指是否为当前实际需要显示在模型树的数据。 * @return 是否需要显示在模型树 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ bool getDataValidInGUI(); /** * @brief 保存被编辑命令数据ID。 * @param id:被编辑命令数据ID * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ void setModifiedCmdID(int id); /** * @brief 获取被编辑命令数据ID。 * @return 被编辑命令数据ID * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ int getModifiedCmdID(); /** * @brief 是否为编辑类型命令。 * @param 是否为编辑类型 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ bool hasModifiedCommand(); protected: /** * @brief 几何形状代理器 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-30 */ FITKAbsGeoShapeAgent* _shapeAgent{}; /** * @brief 命令状态。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ FITKGeoEnum::FITKGeoStatus m_status = FITKGeoEnum::FGSNormal; /** * @brief 引用的命令列表。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ FITKGeoCommandManager* m_referenceCmdList{ nullptr }; /** * @brief 命令被引用次数。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ int m_referenceCount = 0; /** * @brief 编辑的命令数据ID。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ int m_modifiedCmdId = -1; /** * @brief 是否启用引用计数。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-07 */ bool m_enableRefer = true; }; /** * @brief 几何命令容器。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ class FITKInterfaceGeometryAPI FITKGeoCommandManager : public Core::FITKAbstractDataManager { public: /** * @brief 构造函数。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ explicit FITKGeoCommandManager() = default; /** * @brief 析构函数。 * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-09-06 */ virtual ~FITKGeoCommandManager() = default; }; } #endif