/** * * @file FITKCoordinateSystem.h * @brief 坐标系定义 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 * */ #ifndef __FITKCOORDINATE_SYSTEM_H___ #define __FITKCOORDINATE_SYSTEM_H___ #include "FITKInterfaceModelAPI.h" #include "FITK_Kernel/FITKCore/FITKAbstractNDataObject.h" #include "FITK_Kernel/FITKCore/FITKAbstractDataManager.hpp" namespace Core { class FITKPoint; } namespace Interface { /** * @brief 定义坐标系 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ class FITKInerfaceModelAPI FITKCoordinateSystem : public Core::FITKAbstractNDataObject { Q_OBJECT FITKCLASS(Interface, FITKCoordinateSystem); public: /** * @brief 坐标系类型 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ enum FCSysType { FCSCartesian, ///< 笛卡尔坐标系 FCSCylinder, ///< 圆柱坐标系 FCSSphere, ///< 球坐标系 }; Q_ENUM(FCSysType); public: /** * @brief Construct a new FITKCoordinateSystem object * @param[i] sysType 坐标系类型 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ explicit FITKCoordinateSystem(FCSysType sysType); /** * @brief Destroy the FITKCoordinateSystem object * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual ~FITKCoordinateSystem(); /*** * @brief 获取坐标系类型 * @return FCSysType * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ FCSysType getSysType(); /** * @brief 设置原点 * @param[i] x x 坐标 * @param[i] y y 坐标 * @param[i] z z 坐标 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void setOrigin(const double x, const double y, const double z); /** * @brief 设置第一点 * @param[i] x x 坐标 * @param[i] y y 坐标 * @param[i] z z 坐标 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void setPoint1(const double x, const double y, const double z); /** * @brief 设置第二点 * @param[i] x x 坐标 * @param[i] y y 坐标 * @param[i] z z 坐标 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void setPoint2(const double x, const double y, const double z); /** * @brief 获取原点坐标 * @param[o] origin 原点坐标 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void getOrigin(double* origin ); /** * @brief 获取第一轴线方向 * @param[o] dir 第一轴线方向 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void getDirection1(double* dir ); /** * @brief 获取第二轴线方向 * @param[o] dir 第二轴线方向 * @param[i] vertialToD1 是否垂直于第一轴线 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void getDirection2(double* dir, bool vertialToD1 = true ); /** * @brief 获取第三轴线方向 * @param[o] dir 第三轴线方向 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void getDirection3(double* dir ); /** * @brief 获取在某一点的坐标系的三个方向,默认是局部坐标系的三个方向 * @param[i] pxyz 输入点坐标位置 * @param[o] dirs 三个轴线方向,9个分量,dx1,dy1,dz1,dx2,dy2,dz2,dx3,dx3,dz3 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ virtual void get3DirectionAtPoint(const double* pxyz, double* dirs); /** * @brief 复制数据对象,深拷贝,数据id不拷贝 * @param[i] obj 被拷贝的对象 * @return true * @return false * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-30 */ virtual bool copy(FITKAbstractDataObject* obj) override; protected: /** * @brief 坐标轴类型 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ FCSysType _sysType{ FCSCartesian }; /** * @brief 原点坐标 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ Core::FITKPoint* _originPt{}; /** * @brief 第一点坐标 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ Core::FITKPoint* _xPt{}; /** * @brief 第二点坐标 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-05-25 */ Core::FITKPoint* _yPt{}; }; /** * @brief 定义坐标系管理器 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-06-06 */ class FITKInerfaceModelAPI FITKCoordinateSystemManager : public Core::FITKAbstractDataManager { public: /** * @brief Construct a new FITKCoordinateSystemManager object * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-06-06 */ explicit FITKCoordinateSystemManager() = default; /** * @brief Destroy the FITKCoordinateSystemManager object * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-06-06 */ virtual ~FITKCoordinateSystemManager() = default; template /** * @brief 根据ID获取坐标系,并转换坐标系类型 * @param[i] id 坐标系ID * @return T* * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-06-06 */ T* getCoordinateSystemT(const int id) { return dynamic_cast(this->getDataByID(id)); } /** * @brief 根据类型获取全部坐标系 * @param[i] type 坐标系类型 * @return QList * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-06-06 */ QList getCoordinateSystems(FITKCoordinateSystem::FCSysType type); }; } #endif