#ifndef GEOMETRY_T_H #define GEOMETRY_T_H #include "DataManagerGlobal.h" #include "Interfaces.h" #include #include #include #include "OCC/OCCModeling/DllImportOccModeling.h" #include "Hull_M.h" struct DATAMANAGER_DLL_API_EXPORTS Point3D_M : public IModel { double m_X; double m_Y; double m_Z; int m_CutDir; double m_Cut; int m_ResDir; int m_ResType; double m_Res; int m_ProjDir; int m_MirrorDir; double m_MirrorOrgin; Point3D_M(double x = 0.0, double y = 0.0, double z = 0.0, int cutDir = 0, double cut = 0.0, int resDir = 0, int resType = 0, double res = 0.0, int projDir = 0, int mirrorDir = 0, double mirrorOrgin = 0.0) : m_X(x), m_Y(y), m_Z(z), m_CutDir(cutDir), m_Cut(cut), m_ResDir(resDir), m_ResType(resType), m_Res(res), m_ProjDir(projDir), m_MirrorDir(mirrorDir), m_MirrorOrgin(mirrorOrgin) { setObjType(E_GEO_3D_OBJ_TYPE_POINT3D); } IModel* Clone() { IModel* p = new Point3D_M(); *p = *this; return p; } Point3D getGeoPoint() { Point3D p; p.ID = this->m_ID; p.CmdID = this->m_CmdID; p.Name = this->m_Name.toStdString(); // QByteArray转换为const char* p.Command = this->m_Command.toStdString(); p.Visible = this->m_Visible; p.Color = this->m_Color; p.Transparency = this->m_Transparency; p.Type = this->m_Type; // 类型(表达方式):0坐标,1曲线上截取,2曲线相交,10线引用点C/N=?,9镜像点 p.X = this->m_X; p.Y = this->m_Y; p.Z = this->m_Z; p.CutDir = this->m_CutDir; p.Cut = this->m_Cut; p.ResDir = this->m_ResDir; p.ResType = this->m_ResType; p.Res = this->m_Res; p.ProjDir = this->m_ProjDir; p.MirrorDir = this->m_MirrorDir; p.MirrorOrgin = this->m_MirrorOrgin; p.m_objType = (E_GEO_3D_OBJ_TYPE)this->m_objType; for(int ik = 0; ik < this->m_Src.size(); ik++) { p.Src[ik] = this->m_Src[ik]; } return p; } bool operator==(const Point3D_M& other) const { return m_X == other.m_X && m_Y == other.m_Y && m_Z == other.m_Z; } }; struct DATAMANAGER_DLL_API_EXPORTS Curve_M : public IModel { QVector m_KnotID; QVector m_KnotDir; QVector m_KnotDirII; QVector m_KnotAX; QVector m_KnotAY; QVector m_KnotAZ; QVector m_KnotAXII; QVector m_KnotAYII; QVector m_KnotAZII; int m_ProjIDir; int m_ProjIIDir; int m_ProjIKnotCnt; int m_ProjIIKnotCnt; QVector m_ProjIKnotX; QVector m_ProjIKnotY; QVector m_ProjIKnotZ; QVector m_ProjIIKnotX; QVector m_ProjIIKnotY; QVector m_ProjIIKnotZ; QVector m_ProjIKnotDir; QVector m_ProjIKnotDirII; QVector m_ProjIIKnotDir; QVector m_ProjIIKnotDirII; QVector m_ProjIKnotAX; QVector m_ProjIKnotAY; QVector m_ProjIKnotAZ; QVector m_ProjIKnotAXII; QVector m_ProjIKnotAYII; QVector m_ProjIKnotAZII; QVector m_ProjIIKnotAX; QVector m_ProjIIKnotAY; QVector m_ProjIIKnotAZ; QVector m_ProjIIKnotAXII; QVector m_ProjIIKnotAYII; QVector m_ProjIIKnotAZII; double m_OX; double m_OY; double m_OZ; double m_R1; double m_R2; double m_A1; double m_A2; double m_VX; double m_VY; double m_VZ; double m_P1X; double m_P1Y; double m_P1Z; double m_P2X; double m_P2Y; double m_P2Z; double m_SplitX; double m_SplitY; double m_SplitZ; double m_TrimX; double m_TrimY; double m_TrimZ; bool m_Full; int m_MirrorDir; double m_MirrorOrgin; double m_CopyOffsetX; double m_CopyOffsetY; double m_CopyOffsetZ; Curve_M(int projIDir = 0, int projIIDir = 0, bool full = false, int mirrorDir = 0, double mirrorOrgin = 0.0, double copyOffsetX = 0.0, double copyOffsetY = 0.0, double copyOffsetZ = 0.0) : m_ProjIDir(projIDir), m_ProjIIDir(projIIDir), m_Full(full), m_MirrorDir(mirrorDir), m_MirrorOrgin(mirrorOrgin), m_CopyOffsetX(copyOffsetX), m_CopyOffsetY(copyOffsetY), m_CopyOffsetZ(copyOffsetZ), m_ProjIKnotCnt(0), m_ProjIIKnotCnt(0), m_OX(0.0), m_OY(0.0), m_OZ(0.0), m_R1(0.0), m_R2(0.0), m_A1(0.0), m_A2(0.0), m_VX(0.0), m_VY(0.0), m_VZ(0.0), m_P1X(0.0), m_P1Y(0.0), m_P1Z(0.0), m_P2X(0.0), m_P2Y(0.0), m_P2Z(0.0), m_SplitX(0.0), m_SplitY(0.0), m_SplitZ(0.0), m_TrimX(0.0), m_TrimY(0.0), m_TrimZ(0.0) { setObjType(E_GEO_3D_OBJ_TYPE_CURVE); } IModel* Clone() { IModel* p = new Curve_M(); *p = *this; return p; } Curve getGeoCurve() { Curve cur; cur.ID = this->m_ID; cur.CmdID = this->m_CmdID; // QByteArray baName = this->m_Name.toLatin1(); // must // cur.Name =baName.data(); // QByteArray baCommand = this->m_Command.toLatin1(); // must // cur.Command = baCommand.data(); // QByteArray baName = this->m_Name.toLatin1(); // must // char *persistentPtr = new char[baName.size() + 1]; // +1为'\0' // memset(persistentPtr, 0, baName.size() + 1); // strcpy(persistentPtr, baName.constData()); cur.Name =this->m_Name.toStdString();// persistentPtr; // QByteArray baCommand = this->m_Command.toLatin1(); // must // char *persistentPtr1 = new char[baCommand.size() + 1]; // +1为'\0' // memset(persistentPtr1, 0, baCommand.size() + 1); // strcpy(persistentPtr1, baCommand.constData()); cur.Command = this->m_Command.toStdString();// persistentPtr1; cur.Visible = this->m_Visible; cur.Color = this->m_Color; cur.Transparency = this->m_Transparency; cur.Type = this->m_Type; IModel::copyQVectorToArray(this->m_Src, cur.Src); IModel::copyQVectorToArray(this->m_KnotID, cur.KnotID); // int UsedBy[MAX_ARRAY_SIZE]; //被使用,20170501 by czb IModel::copyQVectorToArray(this->m_KnotDir, cur.KnotDir); IModel::copyQVectorToArray(this->m_KnotDirII, cur.KnotDirII); IModel::copyQVectorToArray(this->m_KnotAX, cur.KnotAX); IModel::copyQVectorToArray(this->m_KnotAY, cur.KnotAY); IModel::copyQVectorToArray(this->m_KnotAZ, cur.KnotAZ); // 节点切入角序列 // double KnotAX[MAX_ARRAY_SIZE]; // double KnotAY[MAX_ARRAY_SIZE]; // double KnotAZ[MAX_ARRAY_SIZE]; // 节点切出角序列 IModel::copyQVectorToArray(this->m_KnotAXII, cur.KnotAXII); IModel::copyQVectorToArray(this->m_KnotAYII, cur.KnotAYII); IModel::copyQVectorToArray(this->m_KnotAZII, cur.KnotAZII); // double KnotAXII[MAX_ARRAY_SIZE]; // double KnotAYII[MAX_ARRAY_SIZE]; // double KnotAZII[MAX_ARRAY_SIZE]; cur.ProjIDir = this->m_ProjIDir; // 投影面I/II方向:0YZ,1XZ,2XY. cur.ProjIIDir = this->m_ProjIIDir; // 投影面I/II节点个数 cur.ProjIKnotCnt = this->m_ProjIKnotCnt; cur.ProjIIKnotCnt = this->m_ProjIIKnotCnt; // 投影面I节点坐标序列 IModel::copyQVectorToArray(this->m_ProjIKnotX, cur.ProjIKnotX); IModel::copyQVectorToArray(this->m_ProjIKnotY, cur.ProjIKnotY); IModel::copyQVectorToArray(this->m_ProjIKnotZ, cur.ProjIKnotZ); // double ProjIKnotX[MAX_ARRAY_SIZE]; // double ProjIKnotY[MAX_ARRAY_SIZE]; // double ProjIKnotZ[MAX_ARRAY_SIZE]; // 投影面II节点坐标序列 IModel::copyQVectorToArray(this->m_ProjIIKnotX, cur.ProjIIKnotX); IModel::copyQVectorToArray(this->m_ProjIIKnotY, cur.ProjIIKnotY); IModel::copyQVectorToArray(this->m_ProjIIKnotZ, cur.ProjIIKnotZ); // double ProjIIKnotX[MAX_ARRAY_SIZE]; // double ProjIIKnotY[MAX_ARRAY_SIZE]; // double ProjIIKnotZ[MAX_ARRAY_SIZE]; // 20170501 by czb,新增 // IModel::copyQVectorToArray(this->m_ProjIKnotDir, cur.ProjIKnotDir); // IModel::copyQVectorToArray(this->m_ProjIKnotDirII, cur.ProjIKnotDirII); // IModel::copyQVectorToArray(this->m_ProjIIKnotDir, cur.ProjIIKnotDir); // IModel::copyQVectorToArray(this->m_ProjIIKnotDirII, cur.ProjIIKnotDirII); // int ProjIKnotDir[MAX_ARRAY_SIZE];// 投影面I节点入切出方向序列:0角度,1直线切出,2新段分割点,新的edge要添加到wire中. // int ProjIKnotDirII[MAX_ARRAY_SIZE];// 投影面I节点切出方向序列:0角度,1直线切出,2新段分割点,新的edge要添加到wire中. // int ProjIIKnotDir[MAX_ARRAY_SIZE];// 投影面II节点入切出方向序列:0角度,1直线切出,2新段分割点,新的edge要添加到wire中. // int ProjIIKnotDirII[MAX_ARRAY_SIZE];// 投影面II节点切出方向序列:0角度,1直线切出,2新段分割点,新的edge要添加到wire中. // 投影面I节点切入角序列 IModel::copyQVectorToArray(this->m_ProjIKnotAX, cur.ProjIKnotAX); IModel::copyQVectorToArray(this->m_ProjIKnotAY, cur.ProjIKnotAY); IModel::copyQVectorToArray(this->m_ProjIKnotAZ, cur.ProjIKnotAZ); // double ProjIKnotAX[MAX_ARRAY_SIZE]; // double ProjIKnotAY[MAX_ARRAY_SIZE]; // double ProjIKnotAZ[MAX_ARRAY_SIZE]; // 投影面I节点切出角序列 IModel::copyQVectorToArray(this->m_ProjIKnotAXII, cur.ProjIKnotAXII); IModel::copyQVectorToArray(this->m_ProjIKnotAYII, cur.ProjIKnotAYII); IModel::copyQVectorToArray(this->m_ProjIKnotAZII, cur.ProjIKnotAZII); // double ProjIKnotAXII[MAX_ARRAY_SIZE]; // double ProjIKnotAYII[MAX_ARRAY_SIZE]; // double ProjIKnotAZII[MAX_ARRAY_SIZE]; // 投影面II节点切入角序列 IModel::copyQVectorToArray(this->m_ProjIIKnotAX, cur.ProjIIKnotAX); IModel::copyQVectorToArray(this->m_ProjIIKnotAY, cur.ProjIIKnotAY); IModel::copyQVectorToArray(this->m_ProjIIKnotAZ, cur.ProjIIKnotAZ); // double ProjIIKnotAX[MAX_ARRAY_SIZE]; // double ProjIIKnotAY[MAX_ARRAY_SIZE]; // double ProjIIKnotAZ[MAX_ARRAY_SIZE]; // 投影面II节点切出角序列 IModel::copyQVectorToArray(this->m_ProjIIKnotAXII, cur.ProjIIKnotAXII); IModel::copyQVectorToArray(this->m_ProjIIKnotAYII, cur.ProjIIKnotAYII); IModel::copyQVectorToArray(this->m_ProjIIKnotAZII, cur.ProjIIKnotAZII); // double ProjIIKnotAXII[MAX_ARRAY_SIZE]; // double ProjIIKnotAYII[MAX_ARRAY_SIZE]; // double ProjIIKnotAZII[MAX_ARRAY_SIZE]; // 20170501 by czb,新增结束 cur.OX = this->m_OX; cur.OY = this->m_OY; cur.OZ = this->m_OZ; cur.R1 = this->m_R1; cur.R2 = this->m_R2; cur.A1 = this->m_A1; cur.A2 = this->m_A2; cur.VX = this->m_VX; cur.VY = this->m_VY; cur.VZ = this->m_VZ; cur.P1X = this->m_P1X; cur.P1Y = this->m_P1Y; cur.P1Z = this->m_P1Z; cur.P2X = this->m_P2X; cur.P2Y = this->m_P2Y; cur.P2Z = this->m_P2Z; cur.Full = this->m_Full; cur.MirrorDir = this->m_MirrorDir; // 镜像面方向:1-X, 2-Y, 3-Z cur.MirrorOrgin = this->m_MirrorOrgin; // 镜像面位置,与MirrorDir匹配的分量坐标 cur.CopyOffsetX = this->m_CopyOffsetX; // 复制偏移分量,20170901 新增 by czb cur.CopyOffsetY = this->m_CopyOffsetY; // 复制偏移分量 cur.CopyOffsetZ = this->m_CopyOffsetZ; // 复制偏移分量 cur.m_objType = (E_GEO_3D_OBJ_TYPE)this->m_objType; return cur; } }; struct DATAMANAGER_DLL_API_EXPORTS Surface_M : public IModel { double m_OX; double m_OY; double m_OZ; double m_PX; double m_PY; double m_PZ; double m_AR; int m_SplitDir; double m_H; int m_MirrorDir; double m_MirrorOrgin; double m_TrimX; double m_TrimY; double m_TrimZ; double m_CopyOffsetX; double m_CopyOffsetY; double m_CopyOffsetZ; Surface_M(double ox = 0.0, double oy = 0.0, double oz = 0.0, double px = 0.0, double py = 0.0, double pz = 0.0, double ar = 0.0, int splitDir = 0, double h = 0.0, int mirrorDir = 0, double mirrorOrgin = 0.0, double trimX = 0.0, double trimY = 0.0, double trimZ = 0.0, double copyOffsetX = 0.0, double copyOffsetY = 0.0, double copyOffsetZ = 0.0) : m_OX(ox), m_OY(oy), m_OZ(oz), m_PX(px), m_PY(py), m_PZ(pz), m_AR(ar), m_SplitDir(splitDir), m_H(h), m_MirrorDir(mirrorDir), m_MirrorOrgin(mirrorOrgin), m_TrimX(trimX), m_TrimY(trimY), m_TrimZ(trimZ), m_CopyOffsetX(copyOffsetX), m_CopyOffsetY(copyOffsetY), m_CopyOffsetZ(copyOffsetZ) { setObjType(E_GEO_3D_OBJ_TYPE_SURFACE); } IModel* Clone() { IModel* p = new Surface_M(); *p = *this; return p; } Surface getGeoSurface() { Surface sur; sur.ID = this->m_ID; sur.CmdID = this->m_CmdID; // QByteArray baName = this->m_Name.toLatin1(); // must // char *persistentPtr = new char[baName.size() + 1]; // +1为'\0' // memset(persistentPtr, 0, baName.size() + 1); // strcpy(persistentPtr, baName.constData()); sur.Name = this->m_Name.toStdString();// persistentPtr; // QByteArray baCommand = this->m_Command.toLatin1(); // must // char *persistentPtr1 = new char[baCommand.size() + 1]; // +1为'\0' // memset(persistentPtr1, 0, baCommand.size() + 1); // strcpy(persistentPtr1, baCommand.constData()); sur.Command = this->m_Command.toStdString(); sur.Visible = this->m_Visible; sur.Color = this->m_Color; sur.Transparency = this->m_Transparency; sur.Type = this->m_Type; IModel::copyQVectorToArray(this->m_Src, sur.Src); sur.OX = this->m_OX; sur.OY = this->m_OY; sur.OZ = this->m_OZ; sur.PX = this->m_PX; sur.PY = this->m_PY; sur.PZ = this->m_PZ; sur.AR = this->m_AR; sur.SplitDir = this->m_SplitDir; sur.H = this->m_H; sur.MirrorDir = this->m_MirrorDir; sur.MirrorOrgin = this->m_MirrorOrgin; sur.CopyOffsetX = this->m_CopyOffsetX; // 复制偏移分量,20170901 新增 by czb sur.CopyOffsetY = this->m_CopyOffsetY; // 复制偏移分量 sur.CopyOffsetZ = this->m_CopyOffsetZ; // 复制偏移分量 sur.m_objType = (E_GEO_3D_OBJ_TYPE)this->m_objType; return sur; } }; struct DATAMANAGER_DLL_API_EXPORTS Solid_M : public IModel { /// 旋转轴端点1/球心 double m_OX; double m_OY; double m_OZ; /// 旋转轴端点2/剪切扣除点 double m_PX; double m_PY; double m_PZ; /// 旋转角度/球半径 double m_AR; double m_AR1; // 球冠高度 double m_H; double m_H1; // 长方体 double m_L; double m_B; /// 镜像面方向:1-X, 2-Y, 3-Z int MirrorDir; /// 镜像面位置,与MirrorDir匹配的分量坐标 double m_MirrorOrgin; double m_TrimX; double m_TrimY; double m_TrimZ; /// 布尔运算方式:0并,1差,2交. QVector m_BoolMode; // 20170801 新增 by czb /// 复制偏移分量 double m_CopyOffsetX; // 20170901 新增 by czb /// 复制偏移分量 double m_CopyOffsetY; /// 复制偏移分量 double m_CopyOffsetZ; Solid_M(double ox = 0.0, double oy = 0.0, double oz = 0.0, double px = 0.0, double py = 0.0, double pz = 0.0, double ar = 0.0, double ar1 = 0.0, double h = 0.0, double h1 = 0.0, double l = 0.0, double b = 0.0, int mirrorDir = 0, double mirrorOrgin = 0.0, double trimX = 0.0, double trimY = 0.0, double trimZ = 0.0, double copyOffsetX = 0.0, double copyOffsetY = 0.0, double copyOffsetZ = 0.0) : m_OX(ox), m_OY(oy), m_OZ(oz), m_PX(px), m_PY(py), m_PZ(pz), m_AR(ar), m_AR1(ar1), m_H(h), m_H1(h1), m_L(l), m_B(b), MirrorDir(mirrorDir), m_MirrorOrgin(mirrorOrgin), m_TrimX(trimX), m_TrimY(trimY), m_TrimZ(trimZ), m_CopyOffsetX(copyOffsetX), m_CopyOffsetY(copyOffsetY), m_CopyOffsetZ(copyOffsetZ) { setObjType(E_GEO_3D_OBJ_TYPE_SOLID); } IModel* Clone() { IModel* p = new Solid_M(); *p = *this; return p; } Solid getGeoSolid() { Solid solid; // QByteArray baName = itSolid->m_Name.toLatin1(); // must // char *persistentPtr = new char[baName.size() + 1]; // +1为'\0' // memset(persistentPtr, 0, baName.size() + 1); // strcpy(persistentPtr, baName.constData()); solid.Name = this->m_Name.toStdString();// persistentPtr; // QByteArray baCommand = this->m_Command.toLatin1(); // must // char *persistentPtr1 = new char[baCommand.size() + 1]; // +1为'\0' // memset(persistentPtr1, 0, baCommand.size() + 1); // strcpy(persistentPtr1, baCommand.constData()); solid.Command = this->m_Command.toStdString(); solid.ID = this->m_ID; solid.CmdID = this->m_CmdID; solid.Visible = this->m_Visible; solid.Color = this->m_Color; solid.Transparency = this->m_Transparency; solid.Type = this->m_Type; copyQVectorToArray(this->m_Src, solid.Src); solid.OX = this->m_OX; solid.OY = this->m_OY; solid.OZ = this->m_OZ; solid.PX = this->m_PX; solid.PY = this->m_PY; solid.PZ = this->m_PZ; solid.AR = this->m_AR; solid.AR1 = this->m_AR1; solid.H = this->m_H; solid.H1 = this->m_H1; solid.L = this->m_L; solid.B = this->m_B; solid.MirrorDir = this->MirrorDir; solid.MirrorOrgin = this->m_MirrorOrgin; solid.CopyOffsetX = this->m_CopyOffsetX; // 复制偏移分量,20170901 新增 by czb solid.CopyOffsetY = this->m_CopyOffsetY; // 复制偏移分量 solid.CopyOffsetZ = this->m_CopyOffsetZ; // 复制偏移分量 solid.m_objType = (E_GEO_3D_OBJ_TYPE)this->m_objType; return solid; } }; struct Point2D { public: double x; double y; public: // X属性 double getX() const { return x; } void setX(double value) { x = value; } // Y属性 double getY() const { return y; } void setY(double value) { y = value; } // == 运算符重载 bool operator==(const Point2D& other) const { return (x == other.x) && (y == other.y); } // != 运算符重载 bool operator!=(const Point2D& other) const { return (x != other.x) || (y != other.y); } // 等价于 Equals 方法(可选) bool Equals(const Point2D& other) const { return *this == other; } // GetHashCode 替代(可作为 map key 时使用) std::size_t GetHashCode() const { return std::hash{}(x) ^ (std::hash{}(y) << 1); } // ToString 方法 std::string ToString() const { return std::to_string(x) + "," + std::to_string(y); } }; struct DATAMANAGER_DLL_API_EXPORTS Empty : public IModel { public: Empty() { setObjType(E_GEO_3D_OBJ_TYPE_EMPTY); } }; class Model3D_MCommanData { public: Model3D_MCommanData() { } ~Model3D_MCommanData() { } static void reset() { TypeNameMaxId.clear(); TypeNameMaxId = { {typeid(struct Point3D_M).name(), 0}, {typeid(struct Curve_M).name(), 0}, {typeid(struct Surface_M).name(), 0}, {typeid(struct Solid_M).name(), 0}, {typeid(struct Hull_M).name(), 0}, {typeid(struct Appendage_M).name(), 0}, {typeid(struct Space_M).name(), 0} }; } static std::unordered_map TypeNamePrefixDic; static std::unordered_map TypeNamePrefixId; static std::unordered_map TypeNameMaxId; static std::unordered_map TypeNameCn; }; #endif