COMPASSi/trunk/code/inc/DataManager/Infrastructure.Data/Model/Geometry_M.h

597 lines
20 KiB
C
Raw Normal View History

2025-06-25 15:06:42 +08:00
#ifndef GEOMETRY_T_H
#define GEOMETRY_T_H
#include "DataManagerGlobal.h"
#include "Interfaces.h"
#include <QString>
#include <QVector>
#include <typeinfo>
#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<int> m_KnotID;
QVector<int> m_KnotDir;
QVector<int> m_KnotDirII;
QVector<double> m_KnotAX;
QVector<double> m_KnotAY;
QVector<double> m_KnotAZ;
QVector<double> m_KnotAXII;
QVector<double> m_KnotAYII;
QVector<double> m_KnotAZII;
int m_ProjIDir;
int m_ProjIIDir;
int m_ProjIKnotCnt;
int m_ProjIIKnotCnt;
QVector<double> m_ProjIKnotX;
QVector<double> m_ProjIKnotY;
QVector<double> m_ProjIKnotZ;
QVector<double> m_ProjIIKnotX;
QVector<double> m_ProjIIKnotY;
QVector<double> m_ProjIIKnotZ;
QVector<int> m_ProjIKnotDir;
QVector<int> m_ProjIKnotDirII;
QVector<int> m_ProjIIKnotDir;
QVector<int> m_ProjIIKnotDirII;
QVector<double> m_ProjIKnotAX;
QVector<double> m_ProjIKnotAY;
QVector<double> m_ProjIKnotAZ;
QVector<double> m_ProjIKnotAXII;
QVector<double> m_ProjIKnotAYII;
QVector<double> m_ProjIKnotAZII;
QVector<double> m_ProjIIKnotAX;
QVector<double> m_ProjIIKnotAY;
QVector<double> m_ProjIIKnotAZ;
QVector<double> m_ProjIIKnotAXII;
QVector<double> m_ProjIIKnotAYII;
QVector<double> 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<int>(this->m_Src, cur.Src);
IModel::copyQVectorToArray<int>(this->m_KnotID, cur.KnotID);
// int UsedBy[MAX_ARRAY_SIZE]; //被使用20170501 by czb
IModel::copyQVectorToArray<int>(this->m_KnotDir, cur.KnotDir);
IModel::copyQVectorToArray<int>(this->m_KnotDirII, cur.KnotDirII);
IModel::copyQVectorToArray<double>(this->m_KnotAX, cur.KnotAX);
IModel::copyQVectorToArray<double>(this->m_KnotAY, cur.KnotAY);
IModel::copyQVectorToArray<double>(this->m_KnotAZ, cur.KnotAZ);
// 节点切入角序列
// double KnotAX[MAX_ARRAY_SIZE];
// double KnotAY[MAX_ARRAY_SIZE];
// double KnotAZ[MAX_ARRAY_SIZE];
// 节点切出角序列
IModel::copyQVectorToArray<double>(this->m_KnotAXII, cur.KnotAXII);
IModel::copyQVectorToArray<double>(this->m_KnotAYII, cur.KnotAYII);
IModel::copyQVectorToArray<double>(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<double>(this->m_ProjIKnotX, cur.ProjIKnotX);
IModel::copyQVectorToArray<double>(this->m_ProjIKnotY, cur.ProjIKnotY);
IModel::copyQVectorToArray<double>(this->m_ProjIKnotZ, cur.ProjIKnotZ);
// double ProjIKnotX[MAX_ARRAY_SIZE];
// double ProjIKnotY[MAX_ARRAY_SIZE];
// double ProjIKnotZ[MAX_ARRAY_SIZE];
// 投影面II节点坐标序列
IModel::copyQVectorToArray<double>(this->m_ProjIIKnotX, cur.ProjIIKnotX);
IModel::copyQVectorToArray<double>(this->m_ProjIIKnotY, cur.ProjIIKnotY);
IModel::copyQVectorToArray<double>(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<int>(this->m_ProjIKnotDir, cur.ProjIKnotDir);
// IModel::copyQVectorToArray<int>(this->m_ProjIKnotDirII, cur.ProjIKnotDirII);
// IModel::copyQVectorToArray<int>(this->m_ProjIIKnotDir, cur.ProjIIKnotDir);
// IModel::copyQVectorToArray<int>(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<double>(this->m_ProjIKnotAX, cur.ProjIKnotAX);
IModel::copyQVectorToArray<double>(this->m_ProjIKnotAY, cur.ProjIKnotAY);
IModel::copyQVectorToArray<double>(this->m_ProjIKnotAZ, cur.ProjIKnotAZ);
// double ProjIKnotAX[MAX_ARRAY_SIZE];
// double ProjIKnotAY[MAX_ARRAY_SIZE];
// double ProjIKnotAZ[MAX_ARRAY_SIZE];
// 投影面I节点切出角序列
IModel::copyQVectorToArray<double>(this->m_ProjIKnotAXII, cur.ProjIKnotAXII);
IModel::copyQVectorToArray<double>(this->m_ProjIKnotAYII, cur.ProjIKnotAYII);
IModel::copyQVectorToArray<double>(this->m_ProjIKnotAZII, cur.ProjIKnotAZII);
// double ProjIKnotAXII[MAX_ARRAY_SIZE];
// double ProjIKnotAYII[MAX_ARRAY_SIZE];
// double ProjIKnotAZII[MAX_ARRAY_SIZE];
// 投影面II节点切入角序列
IModel::copyQVectorToArray<double>(this->m_ProjIIKnotAX, cur.ProjIIKnotAX);
IModel::copyQVectorToArray<double>(this->m_ProjIIKnotAY, cur.ProjIIKnotAY);
IModel::copyQVectorToArray<double>(this->m_ProjIIKnotAZ, cur.ProjIIKnotAZ);
// double ProjIIKnotAX[MAX_ARRAY_SIZE];
// double ProjIIKnotAY[MAX_ARRAY_SIZE];
// double ProjIIKnotAZ[MAX_ARRAY_SIZE];
// 投影面II节点切出角序列
IModel::copyQVectorToArray<double>(this->m_ProjIIKnotAXII, cur.ProjIIKnotAXII);
IModel::copyQVectorToArray<double>(this->m_ProjIIKnotAYII, cur.ProjIIKnotAYII);
IModel::copyQVectorToArray<double>(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<int>(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<int> 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<int>(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<double>{}(x) ^ (std::hash<double>{}(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<std::string, std::string> TypeNamePrefixDic;
static std::unordered_map<std::string, int> TypeNamePrefixId;
static std::unordered_map<std::string, int> TypeNameMaxId;
static std::unordered_map<std::string, std::string> TypeNameCn;
};
#endif