COMPASSi/trunk/code/inc/OCC/OCCLib/Geometry.h

453 lines
12 KiB
C
Raw Permalink Normal View History

2025-06-25 15:06:42 +08:00
#pragma once
#ifndef MAX_ARRAY_SIZE_L
#define MAX_ARRAY_SIZE_L 256
#endif
/// ID前缀如下
/// 0-Point3D, 1-Curve, 2-Surface,3-Solid
/// 10-MainDeckSurf,11-ShellSurf,12-DeckSurf,13-BoundSurf,14-SubdivSurf,15-OpencargoResion
/// 16-Space,17-Appendage,18-Hull
#define MAX_SIZE_OF_OBJECT_GROUP 1000000
//#define PI 3.14159
#include "Hull.h"
// ADD BY XUEFENG 20180731
// FOR CODES COMBINE
#include "Quantity_Color.hxx"
#include <TopoDS_Shape.hxx>
// END ADD
//本数据结构定义必须同\Infrastructure\Infrastructure.Data\Model\Geometry.cs中数据结构定义完全一致意义一致
//***点
struct Point3D :public OBJ3D
{
Point3D()
{
ID = 0; //0 = ID/MAX_SIZE_OF_OBJECT_GROUP
CmdID = 0;
//Name = nullptr;
//Command = nullptr;
Visible = 0;
Color = 0;
Transparency = 0;
Type = 0;// <20><><EFBFBD><EFBFBD>(<28><><EFBFBD>ʽ):0<><30><EFBFBD><EFBFBD>,1<><31><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>ȡ,2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB>10<31><30><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>C/N=?<3F><>9<EFBFBD><39><EFBFBD><EFBFBD><EFBFBD>
memset(Src, 0, sizeof(Src));
X = 0;
Y = 0;
Z = 0;
CutDir = 0;// <20><><EFBFBD><EFBFBD><E6B7BD>:0X,1Y,2Z.<2E><>Type=1ʱʹ<CAB1><CAB9>.
Cut = 0; // <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>.<2E><>Type=1ʱʹ<CAB1><CAB9>.
ResDir = 0;// Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:0<><30>Լ<EFBFBD><D4BC>,1X,2Y,3Z.<2E><>Type=1<><31>ʹ<CAB1><CAB9>.
ResType = 0;// Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:0<><30><EFBFBD><EFBFBD>,1С<31><D0A1>,2<><32><EFBFBD><EFBFBD>,3<>ӽ<EFBFBD>.<2E><>Type=1<><31>ʹ<CAB1><CAB9>.
Res = 0;// Լ<><D4BC>ֵ.<2E><>Type=1<><31>ʹ<CAB1><CAB9>.
ProjDir = 0;//ͶӰ<CDB6><D3B0><EFBFBD><EFBFBD>1X,2Y,3Z
MirrorDir = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B7BD>1-X, 2-Y, 3-Z
MirrorOrgin = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD>MirrorDirƥ<72><C6A5>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
setObjType(E_GEO_3D_OBJ_TYPE_POINT3D);
}
~Point3D()
{
}
void clear()
{
ID = 0; //0 = ID/MAX_SIZE_OF_OBJECT_GROUP
CmdID = 0;
// if(Name != nullptr)
// {
// delete Name;
// Name = nullptr;
// }
// if(Command != nullptr)
// {
// //delete Command;
// //Command = nullptr;
// }
Visible = 0;
Color = 0;
Transparency = 0;
Type = 0;// <20><><EFBFBD><EFBFBD>(<28><><EFBFBD>ʽ):0<><30><EFBFBD><EFBFBD>,1<><31><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>ȡ,2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB>10<31><30><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>C/N=?<3F><>9<EFBFBD><39><EFBFBD><EFBFBD><EFBFBD>
memset(Src, 0, sizeof(Src));
X = 0;
Y = 0;
Z = 0;
CutDir = 0;// <20><><EFBFBD><EFBFBD><E6B7BD>:0X,1Y,2Z.<2E><>Type=1ʱʹ<CAB1><CAB9>.
Cut = 0; // <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>.<2E><>Type=1ʱʹ<CAB1><CAB9>.
ResDir = 0;// Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:0<><30>Լ<EFBFBD><D4BC>,1X,2Y,3Z.<2E><>Type=1<><31>ʹ<CAB1><CAB9>.
ResType = 0;// Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:0<><30><EFBFBD><EFBFBD>,1С<31><D0A1>,2<><32><EFBFBD><EFBFBD>,3<>ӽ<EFBFBD>.<2E><>Type=1<><31>ʹ<CAB1><CAB9>.
Res = 0;// Լ<><D4BC>ֵ.<2E><>Type=1<><31>ʹ<CAB1><CAB9>.
ProjDir = 0;//ͶӰ<CDB6><D3B0><EFBFBD><EFBFBD>1X,2Y,3Z
MirrorDir = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B7BD>1-X, 2-Y, 3-Z
MirrorOrgin = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD>MirrorDirƥ<72><C6A5>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
int ID; //0 = ID/MAX_SIZE_OF_OBJECT_GROUP
int CmdID;
// char* Name;
// char* Command;
int Visible;
int Color;
double Transparency;
int Type;// 类型(表达方式):0坐标,1曲线上截取,2曲线相交10线引用点C/N=?9镜像点
int Src[MAX_ARRAY_SIZE_L];
double X;
double Y;
double Z;
int CutDir;// 截面方向:0X,1Y,2Z.仅Type=1时使用.
double Cut; // 截面位置.仅Type=1时使用.
int ResDir;// 约束方向:0无约束,1X,2Y,3Z.仅Type=1或2时使用.
int ResType;// 约束类型:0等于,1小于,2大于,3接近.仅Type=1或2时使用.
double Res;// 约束值.仅Type=1或2时使用.
int ProjDir;//投影方向1X,2Y,3Z
int MirrorDir; // 镜像面方向1-X, 2-Y, 3-Z
double MirrorOrgin; // 镜像面位置与MirrorDir匹配的分量坐标
};
//***线
struct Curve:public OBJ3D
{
Curve() : ID(0), CmdID(0), Visible(0),
Color(0), Transparency(0.0), Type(0), ProjIDir(0), ProjIIDir(0),
ProjIKnotCnt(0), ProjIIKnotCnt(0), OX(0.0), OY(0.0), OZ(0.0),
R1(0.0), R2(0.0), A1(0.0), A2(0.0), VX(0.0), VY(0.0), VZ(0.0),
P1X(0.0), P1Y(0.0), P1Z(0.0), P2X(0.0), P2Y(0.0), P2Z(0.0),
Full(false), MirrorDir(0), MirrorOrgin(0.0), CopyOffsetX(0.0),
CopyOffsetY(0.0), CopyOffsetZ(0.0)
{
// 数值型数组清零
memset(Src, 0, sizeof(Src));
memset(KnotID, 0, sizeof(KnotID));
memset(KnotDir, 0, sizeof(KnotDir));
memset(KnotDirII, 0, sizeof(KnotDirII));
memset(KnotAX, 0, sizeof(KnotAX));
memset(KnotAY, 0, sizeof(KnotAY));
memset(KnotAZ, 0, sizeof(KnotAZ));
memset(KnotAXII, 0, sizeof(KnotAXII));
memset(KnotAYII, 0, sizeof(KnotAYII));
memset(KnotAZII, 0, sizeof(KnotAZII));
memset(ProjIKnotX, 0, sizeof(ProjIKnotX));
memset(ProjIKnotY, 0, sizeof(ProjIKnotY));
memset(ProjIKnotZ, 0, sizeof(ProjIKnotZ));
memset(ProjIIKnotX, 0, sizeof(ProjIIKnotX));
memset(ProjIIKnotY, 0, sizeof(ProjIIKnotY));
memset(ProjIIKnotZ, 0, sizeof(ProjIIKnotZ));
memset(ProjIKnotDir, 0, sizeof(ProjIKnotDir));
memset(ProjIKnotDirII, 0, sizeof(ProjIKnotDirII));
memset(ProjIIKnotDir, 0, sizeof(ProjIIKnotDir));
memset(ProjIIKnotDirII, 0, sizeof(ProjIIKnotDirII));
memset(ProjIKnotAX, 0, sizeof(ProjIKnotAX));
memset(ProjIKnotAY, 0, sizeof(ProjIKnotAY));
memset(ProjIKnotAZ, 0, sizeof(ProjIKnotAZ));
memset(ProjIKnotAXII, 0, sizeof(ProjIKnotAXII));
memset(ProjIKnotAYII, 0, sizeof(ProjIKnotAYII));
memset(ProjIKnotAZII, 0, sizeof(ProjIKnotAZII));
memset(ProjIIKnotAX, 0, sizeof(ProjIIKnotAX));
memset(ProjIIKnotAY, 0, sizeof(ProjIIKnotAY));
memset(ProjIIKnotAZ, 0, sizeof(ProjIIKnotAZ));
memset(ProjIIKnotAXII, 0, sizeof(ProjIIKnotAXII));
memset(ProjIIKnotAYII, 0, sizeof(ProjIIKnotAYII));
memset(ProjIIKnotAZII, 0, sizeof(ProjIIKnotAZII));
setObjType(E_GEO_3D_OBJ_TYPE_CURVE);
}
~Curve()
{
}
void clear()
{
// if(Name != nullptr)
// {
// delete Name;
// Name = nullptr;
// }
// if(Command != nullptr)
// {
// delete Command;
// Command = nullptr;
// }
}
int ID;
int CmdID;
// char* Name;
// char* Command;
int Visible;
int Color;
double Transparency;
int Type;
int Src[MAX_ARRAY_SIZE_L]; //依赖源
//int UsedBy[MAX_ARRAY_SIZE_L]; //被使用20170501 by czb
int KnotID[MAX_ARRAY_SIZE_L]; //将节点与依赖分开20170501 by czb
int KnotDir[MAX_ARRAY_SIZE_L];// 结入切出方向序列:0角度,1直线切出,2新段分割点新的edge要添加到wire中.
int KnotDirII[MAX_ARRAY_SIZE_L];// 节点切出方向序列:0角度,1直线切出,2新段分割点新的edge要添加到wire中.
// 节点切入角序列
double KnotAX[MAX_ARRAY_SIZE_L] ;
double KnotAY[MAX_ARRAY_SIZE_L] ;
double KnotAZ[MAX_ARRAY_SIZE_L] ;
// 节点切出角序列
double KnotAXII[MAX_ARRAY_SIZE_L] ;
double KnotAYII[MAX_ARRAY_SIZE_L] ;
double KnotAZII[MAX_ARRAY_SIZE_L] ;
int ProjIDir;// 投影面I/II方向:0YZ,1XZ,2XY.
int ProjIIDir;
//投影面I/II节点个数
int ProjIKnotCnt;
int ProjIIKnotCnt;
// 投影面I节点坐标序列
double ProjIKnotX[MAX_ARRAY_SIZE_L];
double ProjIKnotY[MAX_ARRAY_SIZE_L];
double ProjIKnotZ[MAX_ARRAY_SIZE_L];
// 投影面II节点坐标序列
double ProjIIKnotX[MAX_ARRAY_SIZE_L];
double ProjIIKnotY[MAX_ARRAY_SIZE_L];
double ProjIIKnotZ[MAX_ARRAY_SIZE_L];
//20170501 by czb新增
int ProjIKnotDir[MAX_ARRAY_SIZE_L];// 投影面I节点入切出方向序列:0角度,1直线切出,2新段分割点新的edge要添加到wire中.
int ProjIKnotDirII[MAX_ARRAY_SIZE_L];// 投影面I节点切出方向序列:0角度,1直线切出,2新段分割点新的edge要添加到wire中.
int ProjIIKnotDir[MAX_ARRAY_SIZE_L];// 投影面II节点入切出方向序列:0角度,1直线切出,2新段分割点新的edge要添加到wire中.
int ProjIIKnotDirII[MAX_ARRAY_SIZE_L];// 投影面II节点切出方向序列:0角度,1直线切出,2新段分割点新的edge要添加到wire中.
// 投影面I节点切入角序列
double ProjIKnotAX[MAX_ARRAY_SIZE_L] ;
double ProjIKnotAY[MAX_ARRAY_SIZE_L] ;
double ProjIKnotAZ[MAX_ARRAY_SIZE_L] ;
// 投影面I节点切出角序列
double ProjIKnotAXII[MAX_ARRAY_SIZE_L] ;
double ProjIKnotAYII[MAX_ARRAY_SIZE_L] ;
double ProjIKnotAZII[MAX_ARRAY_SIZE_L] ;
// 投影面II节点切入角序列
double ProjIIKnotAX[MAX_ARRAY_SIZE_L] ;
double ProjIIKnotAY[MAX_ARRAY_SIZE_L] ;
double ProjIIKnotAZ[MAX_ARRAY_SIZE_L] ;
// 投影面II节点切出角序列
double ProjIIKnotAXII[MAX_ARRAY_SIZE_L] ;
double ProjIIKnotAYII[MAX_ARRAY_SIZE_L] ;
double ProjIIKnotAZII[MAX_ARRAY_SIZE_L] ;
//20170501 by czb新增结束
double OX;
double OY;
double OZ;
double R1;
double R2;
double A1;
double A2;
double VX;
double VY;
double VZ;
double P1X;
double P1Y;
double P1Z;
double P2X;
double P2Y;
double P2Z;
bool Full;
int MirrorDir; // 镜像面方向1-X, 2-Y, 3-Z
double MirrorOrgin; // 镜像面位置与MirrorDir匹配的分量坐标
double CopyOffsetX; // 复制偏移分量,20170901 新增 by czb
double CopyOffsetY;// 复制偏移分量
double CopyOffsetZ;// 复制偏移分量
};
//***面
struct Surface:public OBJ3D
{
public:
Surface()
{
setObjType(E_GEO_3D_OBJ_TYPE_SURFACE);
}
int ID;
int CmdID;
// char* Name;
// char* Command;
int Visible;
int Color;
double Transparency;
int Type;// 类型:0网格,1放样,2扫掠,3旋转,4管道,5球面,10沿Y轴镜像,11拼接,12剪切,13拆分
int Src[MAX_ARRAY_SIZE_L];
double OX; // 镜像面X的位置坐标
double OY; // 镜像面Y的位置坐标
double OZ; // 镜像面Z的位置坐标
double PX;
double PY;
double PZ;
double AR;
int SplitDir;// 拆分结果:0Left,1Right 镜像面0-X, 1-Y, 2-Z
double H;
int MirrorDir; // 镜像面方向1-X, 2-Y, 3-Z
double MirrorOrgin; // 镜像面位置与MirrorDir匹配的分量坐标
double CopyOffsetX; // 复制偏移分量,20170901 新增 by czb
double CopyOffsetY;// 复制偏移分量
double CopyOffsetZ;// 复制偏移分量
};
//***体
struct Solid:public OBJ3D
{
public:
Solid()
{
setObjType(E_GEO_3D_OBJ_TYPE_SOLID);
}
int ID;
int CmdID;
// char* Name;
// char* Command;
int Visible;
int Color;
double Transparency;
int Type; // 类型:0围拢,1扫掠,2旋转,3球,10镜像,12剪切,7体组合,14复制
int Src[MAX_ARRAY_SIZE_L] ;
double OX;
double OY;
double OZ;
double PX;
double PY;
double PZ;
double AR;
double AR1;
double H;
double H1;
double L;
double B;
//20161112 by czb
int MirrorDir; // 镜像面方向1-X, 2-Y, 3-Z
double MirrorOrgin; // 镜像面位置与MirrorDir匹配的分量坐标
int BoolMode[MAX_ARRAY_SIZE_L];// 布尔运算方式:0并,1差,2交. 20170801 新增 by czb
double CopyOffsetX; // 复制偏移分量,20170901 新增 by czb
double CopyOffsetY;// 复制偏移分量
double CopyOffsetZ;// 复制偏移分量
};
//***肋骨
struct Frame
{
int ID;
int Num; //肋位号
int NumS;
double Dis; //肋距
};
//***横剖面型线中的型值点
struct ScPoint2D
{
double Y;
double Z;
};
//***型值表中的型值点
struct OffsetTablePoint
{
double X;
double Y;
double Z;
};
//***站
struct Station
{
int ID;
double Num;//站位号
double Pos;//站位位置
};
//***水线
struct WaterlinePos
{
int ID;
char * Num;//水线号
double Pos;//水线位置
};
//***纵剖线
struct ButtocklinePos
{
int ID;
char * Num;// 纵剖线号
double Pos;// 纵剖线位置
};
//***各类图元的显示信息
struct ModelDisplayOption
{
bool ShowName;
int Color;
};
////***OCC拓扑对象显示参数
struct OccAisVar
{
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
Quantity_Color color;//颜色
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
//AnyCore::ColorValue color;//颜色
// END DELETE
//end 2016srq
double transparency;//透明度
bool visible;//可见性
bool showName;//是否显示名字
std::string name;//名字
};
//redo undo数据对象
struct GeomTopoVar
{
std::string name;
Point3D point;
Curve curve;
Surface surface;
Solid solid;
MainDeckSurf maindecksurf;
ShellSurf shellsurf;
Hull hull;
DeckSurf decksurf;
BoundSurf boundsurf;
SubdivSurf subdivsurf;
OpenCargoRegion opencargoregion;
Space space;
Appendage appendage;
TopoDS_Shape toposhape;
};
//***重命名
struct RenameObject
{
int ID;
int CmdID;
char* Name;
char* Command;
int Visible;
int Color;
double Transparency;
int Type;
int Src[MAX_ARRAY_SIZE_L];
};