COMPASSi/trunk/code/inc/OCC/OCCModeling/OCCStructDataMD.h

798 lines
27 KiB
C
Raw Normal View History

2025-06-25 15:06:42 +08:00
#pragma once
#include "Stdafx.h"
#include "Stdafx_M.h"
//#include <list>
//#include <map>
//#include <vector>
#include "OCC/OCCLib/Geometry.h"
#include "OCC/OCCLib/Hull.h"
#include "OCC/OCCLib/SplitAllInsectionCurves.h"
//#include ".\cxml\xml.h"
//2016srq
//#include "ISession_Text.h"
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
/*
#include "Node/AStoctNodePtrDef.h"
#include "Scene/AScenePtrDef.h"
#include "Style/AStylePtrDef.h"
*/
// END DELETE
//end
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
#include "Prs3d_Presentation.hxx"
#include <TopAbs_Orientation.hxx>
//#include "Handle_AIS_Shape.hxx" // XUEFENG DELETE 202009
#include "AIS_Shape.hxx" // XUEFENG ADDED 202009
#include <string> // XUEFENG ADDED 202009
#include "Graphic3d_NameOfMaterial.hxx"
#include "Quantity_Color.hxx"
// END ADDED
#include "OCC/OCCLib/Calculation.h"
// Lvxj
#include "dl_dxf.h"
#include "dl_creationadapter.h"
#include "test_creationclass.h"
#include <QList>
// Lvxj
//
//using namespace std;
//using namespace JWXml;
class SpaceCurve
{
public:
SpaceCurve(){};
~SpaceCurve(){};
public:
vector<gp_Pnt> pSet; //节点坐标
vector<gp_Vec> dSet_in; //切入方向矢量
vector<gp_Vec> dSet_out; //切出方向矢量
int count_first;
int count_second;//双向投影
int flag;// 1,多段线
vector<int> Type; //点类型0-非分段点,>0-分段点
/// 0-无限制(c2) //20170501 by czb
/// 1-角度(c1) //20170501 by czb
/// 2-折点(c0) //20170501 by czb
/// 3-多段线(c0)
vector<int> flag_in; //切入标志 20170501 by czb 新增对应KnotDir
vector<int> flag_out; //切出标志对应KnotDirII
};
// Lvxj
//高度表单元
class HeightTableCell
{
public:
int rowIndex;
int colIndex;
char stationName[32];
char blName[32];
vector<gp_Pnt> data;
};
//半宽表单元
class HalfBreadthTableCell
{
public:
int rowIndex;
int colIndex;
char stationName[32];
char wlName[32];
vector<gp_Pnt> data;
};
// Lvxj
class OCCStructDataMD
{
public:
OCCStructDataMD(void);
~OCCStructDataMD(void);
public:
void clearData();
//***初始化数据
void InitList();
//***初始化船舶主尺度信息loa船长、lpp垂线间长b船宽d船深t 设计吃水f0x初始肋位nfrm肋骨个数frm肋骨数据nsta站个数sta站nwl水线个数wl水线nbl纵剖线个数bl纵剖线
void ResetPrincipal(double loa,double lpp, double b, double d,double t, double f0x,int iFrame, int nfrm, Frame frm[],
int nsta, Station sta[],int nwl, WaterlinePos wl[],int nbl,ButtocklinePos bl[]);//主尺度
//***Undo Redo flag:0:UNDO,1:REDO
void UnRedo(int flag, int cmdID);
void UnRedoPreAction(int cmdID,int id);
void UnRedoAfterAction(int cmdID,int id);
//***显示横剖面位置
void ShowSectionPos(double x,bool bdrawprofle);//型线
//***删除垃圾图元
void DelObj(int cmdID,int nid);
//删除垃圾点图元
void DelPoint( int ID);
//删除垃圾线图元
void DelCurve(int ID);
//删除垃圾面图元
void DelSurface(int ID);
//删除垃圾体图元
void DelSolid(int ID);
//删除垃圾主甲板面
void DelMainDeckSurf(int ID);
//删除垃圾外板面
void DelShellSurf(int ID);
//删除垃圾主船体
void DelHull(int ID);
//删除垃圾平台面
void DelDeckSurf(int ID);
//删除垃圾上建外围面
void DelBoundSurf(int ID);
//删除垃圾分舱面
void DelSubdivSurf(int ID);
//删除垃圾开敞客货区
void DelOpenCargoRegion(int ID);
//删除垃圾舱室
void DelSpace(int ID);
//删除垃圾附体
void DelAppendage(int ID);
//删除进水力点
void DelHydroInletPoint(int ID);
void DelHydroLimitAng(int ID);
//修改时根据ID重新验证生成图元
BOOL ModifyObj(int cmdID,int id);
//增加舱室
void InsertSpace( Space& space);// 舱室
//简单点验证
BOOL CheckSimplePoint(Point3D *pnt);
//相交点验证
BOOL CheckCrossPoint(Point3D *pnt);
//线上点验证
BOOL CheckOnLinePoint(Point3D *pnt);
//线面交点验证
BOOL CheckLineFacePoint(Point3D *pnt);
////线引用点C/N=?
BOOL CheckLineRefPoint(Point3D *pnt);
//20161117 by czb镜像点
TopoDS_Shape CheckMirrorPoint(Point3D& pnt);
//增加topo点
BOOL AddTopoPoint(int cmdID,Point3D pnt,bool bchecked=false);
//创建折线
TopoDS_Wire CreatePolyline(vector<gp_Pnt>& pSet);
//增加静水力点
BOOL AddTopoInletPoint(int cmdID, HydroInletPoint& pnt,bool bchecked=false);
//***极限静倾角
BOOL AddLimitAng(int cmdID, HydroLimitAng& limit);
//***限界线
BOOL AddMarginLine(int cmdID, MarginLine& margin);
//***浸水开口
BOOL AddImmersionOpen(int cmdID, ImmersionOpen& Iopen1);
//***线验证
BOOL CheckCurve(int cmdID,Curve& crv);
//20161117 by czb镜像线
TopoDS_Shape CheckMirrorCurve(Curve& crv);
//20170901 by czb复制线
TopoDS_Shape CheckCopyCurve(Curve& crv);
//基本样条曲线验证
TopoDS_Shape CheckSpaceCurve( Curve& crv,int linetype=0);//linetype =0 =1 临时显示 =2样条曲线双投影曲线中的第一条=3样条曲线双投影曲线中的第二条
TopoDS_Shape CheckSpaceCurve1( Curve& crv,int linetype);
SpaceCurve GetSpaceCurve( Curve& crv, int linetype);
//TopoDS_Wire CreateWire( SpaceCurve& curve, int startId, int count);
TopoDS_Edge CreateEdge( SpaceCurve& curve, int startId, int count);
TopoDS_Edge CreateEdge2( SpaceCurve& curve, int startId, int count);
//折线
TopoDS_Shape CheckPolygon( Curve& crv);
//椭圆弧
TopoDS_Shape CheckEllipse( Curve& crv);
//三点椭圆弧
TopoDS_Shape CheckEllipse1( Curve& crv);
//抛物线
TopoDS_Shape CheckParabola( Curve& crv);
//三点抛物线
TopoDS_Shape CheckParabola1(gp_Pnt p1, gp_Pnt p2, gp_Pnt p3, bool full);
//双投影曲线
TopoDS_Shape CheckDProjectCurve( Curve& crv);
//拼接线
TopoDS_Shape CheckJoinCurve( Curve& crv);
//剪切线
TopoDS_Shape CheckTrimCurve( Curve& crv);
//面相交线
TopoDS_Shape CheckInterFaceCurve( Curve& crv);
// XUEFENG ADDED 20211008
TopoDS_Shape CheckBoundCurve(Curve& crv);
//基本样条曲线分段数据获取
vector<Handle_TColgp_HArray1OfPnt> GetHarryList( Curve& crv, vector<TColgp_Array1OfVec*> &vectorList, vector<Handle_TColStd_HArray1OfBoolean> &boolList,int linetype=0);//linetype =0 样条曲线双投影曲线中的第一条 =1 临时显示 =2样条曲线双投影曲线中的第一条=3样条曲线双投影曲线中的第二条
//两直线点之间数据插值
void AddPointforStraight( vector<gp_Pnt> &pntlist,int & i,gp_Pnt startp,gp_Pnt endp);
//***面验证
BOOL CheckSurface(int cmdID, Surface& srf);
//网格面,用居工算法
TopoDS_Shape CheckGeneralSurface( Surface& srf);
//放样面验证
TopoDS_Shape CheckLoftSurface( Surface& srf);
//扫掠面验证
TopoDS_Shape CheckSweptSurface( Surface& srf);
TopoDS_Shape CreateSweptSurface(TopoDS_Shape gEdge, TopoDS_Shape bEdge);
//旋转面
TopoDS_Shape CheckRotationSurface( Surface& srf);
//4管道,
TopoDS_Shape CheckPipedSurface( Surface& srf);
//5球面,
TopoDS_Shape CheckSphereSurface( Surface& srf);
//镜像面
TopoDS_Shape CheckMirrorSurface( Surface& srf);
//复制面
TopoDS_Shape CheckCopySurface( Surface& srf);
//缝合面
TopoDS_Shape CheckJoinSurface( Surface& srf);
//剪切面
TopoDS_Shape CheckTrimSurface( Surface& srf);
TopoDS_Shape CheckTrimSurfaceTranslateOcc( Surface& srf);
TopoDS_Shape CheckTrimSurfaceTranslateInsec( Surface& srf);
TopoDS_Shape CheckTrimSurfaceTranslate( Surface& srf);
TopoDS_Shape CheckTrimSurfaceByTranslate(TopoDS_Shape TopoSrf,TopoDS_Shape TopoTemp,gp_Pnt ptcut,bool & bfindsec);
//拆分面
TopoDS_Shape CheckSpliteSurface( Surface& srf);
//双投影临时面
TopoDS_Shape CheckTempSurface( Surface& srf);
//***体验证
BOOL CheckSolid(int cmdID, Solid& sld);
//组合体
TopoDS_Shape CheckSolidBool(Solid &sld); //20170801 新增 by czb
//围拢体
TopoDS_Shape CheckCell( Solid& sld);
TopoDS_Shape CloseSolid( Solid& sld);
vector<int> ClearEdges(map<int, TopoDS_Edge>& edges);
//TopoDS_Shape CloseSolid1(Solid sld);
//扫掠体
TopoDS_Shape CheckSweptCell( Solid& sld);
//旋转体
TopoDS_Shape CheckRotationCell( Solid& sld);
//圆球
TopoDS_Shape CheckSphereCell( Solid& sld);
//圆柱
TopoDS_Shape CheckCylinderCell( Solid& sld);
//圆罐
TopoDS_Shape CheckRTankCell( Solid& sld);
//长方体
TopoDS_Shape CheckCubeCell( Solid& sld);
//剪切体
TopoDS_Shape CheckTrimSolid( Solid& sld);
//镜像体
TopoDS_Shape CheckMirrorSolid( Solid& sld);
//复制体
TopoDS_Shape CheckCopySolid( Solid& sld);
//***船壳模型
// 主甲板面
BOOL CheckMainDeckSurf(int cmdID, MainDeckSurf& srf);
// 外板面
BOOL CheckShellSurf(int cmdID, ShellSurf& srf);
// 主船体
BOOL CheckHull(int cmdID, Hull& srf);
// 平台面
BOOL CheckDeckSurf(int cmdID, DeckSurf& srf);
// 上建外围面
BOOL CheckBoundSurf(int cmdID, BoundSurf& srf);
// 分舱面
BOOL CheckSubdivSurf(int cmdID, SubdivSurf& srf);
//获取槽型舱壁的边线,dir1:=0横向 =1纵向 dir2 =0水平 =1 垂向
TopoDS_Wire GetCorrugatedEdgeByRegion(double v,int dir1,int dir2,double s,double a,double d,double f,double x1,double x2,double y1,double y2,double z1,double z2);
// 开敞客货区
BOOL CheckOpenCargoRegion(int cmdID, OpenCargoRegion& srf);
// 舱室
BOOL CheckSpace(int cmdID, Space& sld);
// 附体
BOOL CheckAppendage(int cmdID, Appendage& sld);
//体的bool运算
TopoDS_Shape TopoSolidBrepAlgo(int type,TopoDS_Shape solid1,TopoDS_Shape solid2);
TopoDS_Shape TopoSolidBool(int type,TopoDS_Shape solid1,TopoDS_Shape solid2);
TopoDS_Shape SplitShell(TopoDS_Shape& solid1,TopoDS_Shape& solid2, vector<TopoDS_Face>& faceIn, vector<TopoDS_Face>& faceOut, vector<TopoDS_Face>& faceOn);
//肋位
BOOL CheckFrameRuler();
BOOL CheckFrameRulerPriv();
//临时对象显隐
void ShowTempCurve(bool show, Curve& crv, int npnt, Point3D pnt[]);
//***查询
//查询两点距离
double Get2PointDistance(int id1,int id2);
//查询曲面面积
double GetS(int id);
//查询体的体积
double GetV(int id);
//查询船体总吨位(有主甲板和船壳围城的封闭船体)
double GetTonnageV1();
//判断点集合是不是顺时针
bool IsClockwise(vector<gp_Pnt>& pointSet);
//判断线是不是顺时针
bool IsClockwise(gp_Pnt delPT,TopoDS_Shape face);
//写XML
//void BuilderXmlData(CXml &xml, CSplitAllInsectionCurves& m_tool );
//写网格面数据到XML
BOOL WriteXMLData( CSplitAllInsectionCurves& m_tool);
//获取系统路径
std::string GetSystemPath();
//获取图元显示信息
OccAisVar ReturnOccDisplayVars(int id);
//获取图元的形心信息
gp_Pnt ReturnOccPropVars(TopoDS_Shape toposhape,int id);
//int转为Quantity_Color或RGB
//2016srq
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
Quantity_Color TransIntToRGB(int color);
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
//AnyCore::ColorValue TransIntToRGB(int color);
// END DELETE
//反色
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
Quantity_Color ReverseRGB(Quantity_Color color);
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
//AnyCore::ColorValue ReverseRGB(AnyCore::ColorValue color); //20171001 added by czb
// END DELETE
//角度弧度转换
double ConvertDegreesToRadians(double degrees);
//截取抛物线上的一段
TopoDS_Edge ParabSegMent(gp_Parab Parab,gp_Dir dir,gp_Pnt p1,gp_Pnt p2);
//拓扑对象的显示
// DELETE BY XUEFENG 20190402
//bool OccDisplayAis(int ID,TopoDS_Shape tppoint); //20170601 by czb,返回true表示可见false表示不可见
// END DELETE
// ADDED BY XUEFENG 20190402
bool OccDisplayAis(int id,TopoDS_Shape toposhape,int fitWin=1);
// END ADDED
//求交线并将交线转为B样条曲线
Handle(Geom_BSplineCurve) GetIntersectionOf2Toposhapes(TopoDS_Shape shape1,TopoDS_Shape shape2,bool &bsucess);
//拓扑存为Brep。path:保存路径,从上层界面获取ids[]topo_compound里面依次存的拓扑对象对应的id,要返回给上层界面
bool SaveTopoToStep(char* path,int ids[]);
//拓扑存为Brep。path:保存路径,从上层界面获取20161227 新增 by czb
bool SaveTopoToStep2(char* path);
//获取拓扑对象保存为brep格式时的OCIDXids[]topo_compound里面依次存的拓扑对象对应的id,要返回给上层界面20161214 新增 by czb
void GetOCIDXOfTopo(int ids[]);
//拓扑存为Brep。path:保存路径,从上层界面获取
bool SaveTopoToBrep(char* path);
//从step读取topo对象。path:文件路径,从上层界面获取ids[]topo_compound里面依次存的拓扑对象对应的id,从上层界面获取
bool LoadTopoFromStep(char* path, QVector<int> ids);
//拓扑存为Iges。path:保存路径,从上层界面获取ids[]topo_compound里面依次存的拓扑对象对应的id,要返回给上层界面 目的JAVA用3dmax->三方工具->flash
bool SaveTopoToIges(char* path,int ids[]);
//从Iges读取topo对象。path:文件路径,从上层界面获取ids[]topo_compound里面依次存的拓扑对象对应的id,从上层界面获取
bool LoadTopoFromIges(char* path,int ids[]);
//由交线得到wire的ege序列
void GetInsectWirePts(TopoDS_Shape splitResult,list<TopoDS_Edge>&edgeList );
//将交线wire的无序edge序列转为有序
void GetInsectWirePts(vector<TopoDS_Edge>& edgeSet,list<TopoDS_Edge>&edgeList);
//将交线的有序序列转为拓扑线
TopoDS_Edge SetInsectWireToEdge(list<TopoDS_Edge>&edgeList);
//将交线的有序序列转为拓扑线上的组成B样条的点集合
vector<gp_Pnt> SetInsectWireToEdgePnts(list<TopoDS_Edge>&edgeList);
//由两点截取曲线上的一段
bool TrimEdgeBy2Points(Handle(Geom_Curve) curve, gp_Pnt& pt1, gp_Pnt& pt2,Handle(Geom_Curve)& newCurve );
//所有类型CURVE转为样条曲线 扫掠面不支持抛物线和圆弧
Handle(Geom_BSplineCurve) ConvertToBSplineCurve( TopoDS_Edge edge ); //20170601 by czb
//所有类型CURVE转为样条曲线 扫掠面不支持抛物线和圆弧
TopoDS_Edge ConvertToBSplineTopo( TopoDS_Edge edge );
//将曲面转为样条曲面
TopoDS_Shape ConvertToBSplineSurfTopo( TopoDS_Face edge );
BOOL GetTrimSurfaceAllOf2Toposhapes(TopoDS_Shape shape1,TopoDS_Shape shape2,TopoDS_Shape &leftSurface,TopoDS_Shape &rightSurface);
//根据交线区分面的集合
TopoDS_Shape GetCutResult(map<int, TopoDS_Face>& mapFace,TopoDS_Shape& InterSecLine);
//计算联通的面的集合
void GetFaceSet( vector<int> &resultSet, map<int,bool>& mapFaceSign, map<int,vector<int>>& mapConnectFace, vector<int>& tempFaceSet);
// 判断重边
bool CheckTwoEdgeOverlapByLinePointProject(TopoDS_Edge& tedgeA,TopoDS_Edge& tedgeB);
vector<TopoDS_Edge> GetIntersectionLines(TopoDS_Shape& line, TopoDS_Face& face);
//void GetEdgeStartEndPoint( TopoDS_Edge& edge, gp_Pnt& sp, gp_Pnt& ep);
//void GetWireSingleEdges(map<int, TopoDS_Edge>& mapEdge,vector<int>& edgeIndex);
//void GetWireSingleEdges(map<int, TopoDS_Edge>& mapEdge,vector<vector<int>>& edgeIndex);
//*舱室生成 yc 20140818
vector<gp_Pnt> CreatePointSet(vector<gp_Pnt2d> p2dSet, double d);
TopoDS_Shell CreateSplitShell(vector<gp_Pnt> pSet1, vector<gp_Pnt> pSet2);
vector<gp_Pnt2d> ConvertPoint2dSet(double* values);
TopoDS_Shape MakeCabin( Space& space);
TopoDS_Shape CreateHull();
//*/
TopoDS_Edge RebuildEdge(TopoDS_Edge edge, gp_Pnt startP, gp_Pnt endP, bool isReverse);
//*舱室生成 布尔操作yc 20140929
TopoDS_Shape MakeCabin1( Space& space);
vector<gp_Pnt2d> ConvertPoint2dSet(double* values, double width, double height);
TopoDS_Face CutEndFace(TopoDS_Face face, TopoDS_Shape shell, vector<gp_Pnt> pSet,bool isLeft);
bool IsReversed(TopoDS_Solid solid);
///* 特殊单元体
TopoDS_Shape MakeRegularCabin ( Space& space);
//计算浸水开口
double GetImmersionOpenPos(double X, double Y, double oppositZ);
//写计算接口参数xml
void SetCalParaXml(string nodeName, vector<double> step, double max = 0, double min = 0, double dai = 0);
void SetCalParaXml(string nodeName, vector<double> step, vector<double> c, double max = 0, double min = 0, double dai = 0);
void SetCalParaXml( string nodeName, double w = 0, double l = 0, double t = 0 );
void RefreshShape(TopoDS_Shape& shape);
//计算船壳静水力数据
void ShellHydrostaticCalculation();
//计算数据
//加载模型的静水力计算结果文件到临时文件夹中
void LoadCalculationXML(char* file);
//保存模型的静水力计算结果文件
void SaveCalculationXML(char* file);
//关闭静水力计算进程
void CloseCalculation();
//获取已计算舱室id
vector<int> GetCalculatedCompID();
//获取已计算船壳id
vector<int> GetCalculated();
//获取已计算点id
vector<int> GetCalculatedPointID();
//将船体表面主甲板和外板面模型写到brep中保存在临时文件中
void WriteHull();
//将临时舱室静水力结果文件根据舱室id拆分成独立的结果文件
void SplitResultCompXML();
//将临时点静水力结果文件根据点d拆分成独立的结果文件
void SplitResultPointXML();
//将临时船壳静水力结果文件根据拆分成独立的结果文件
void SplitResultXML();
//将独立的舱室静水力结果文件合成完整的舱室静水力结果文件
void RebuildResultCompXML();
//将独立的船壳静水力结果文件合成完整船的壳静水力结果文件
void RebuildResultXML();
//将独立的舱室静水力结果文件合成完整的舱室静水力结果文件
void RebuildResultPointXML();
//保存静水力计算中船长,船宽和设计吃水
void SaveCalPara(double w, double l, double t);
//极限静倾角计算接口
void SetDeckBilgePoint(int Cnt, Point3D addDeck[], Point3D addBilge[]);
//进水点计算接口
void SetInletPoint(int delpnts,Point3D delpnt[],int addpnts,Point3D addpnt[], int updCnt, int oldIDs[], Point3D newIDs[]);
//
TopoDS_Edge RebuildEdge(TopoDS_Edge edge);
//导出计算数据文件
bool ExportSpace(string fileName, string path,vector<int>& ids);
//bool ExportHull(char* fileName, char* path, int count, int ids[]);
bool ExportHull(string fileName, string path, vector<int>& ids);
bool ExportSolidSTL(char* fileNameWithExtension, char* path, int count, int ids[]); //20190601 added by czb
// 数据接口 Lvxj
//导入型值表
void ImportOffsetData(bool bImportCtrlPnt,float xSubSectionLen);
//导出型值表
void ExportOffsetData(double* shipSize,double* expParam, int* expType);
//导出所有型值
void ExportAllOffsetData(double* shipSize,double* expParam, int* expType);
//导出指定型值
void ExportSpecialOffsetData(double* shipSize,double* expParam, int* expType);
//导入CAD
void ImportCAD(char* fileName);
//导入IGES
long ImportIGES(char* fileName, int impType, float*transfromParams);
//将IGES读入的内容缓存到xml中方便界面层读取。
void WriteIGESXML(char* fileName);
//导出IGES
void ExportIGES(char* fileName,int expOption,int selectCnt,int* selectLst);
//转换CAD型线
void TransfCADLine(int selectedCnt, int* selectLst, int lineType, float* fCADPar, int lens[], Point3D *pnts);
//计算两条线交点
int GetIntersectPnt(int selectedCnt, int* selectLst,double *pPnt);
//求平面剪裁面与船体表面的交线
void CalCurveBetweenPlaneAndSurface(TopoDS_Shape& tShape,gp_Pln& gPln,vector<TopoDS_Edge>&intersectCurve);
//求交线与平面剪裁面的交点
void CalIntersectPntCS(TopoDS_Edge&tEg,gp_Pln& gPln,vector<gp_Pnt>&pntLst);
//世界坐标系转换得到dxf文件边界位置
gp_Pnt setWorldCoordinate(vector<BlockObj> ::iterator myblock, Point2D32f mypoint);
// 数据接口 Lvxj
//合并文件
void CombineFile(string file, string fileAll);
//判断是否为体
bool IsSolid(TopoDS_Shape solid);
//计算体积
double GetV(TopoDS_Shape topo);
//主船体来自面组合
TopoDS_Shape CreateHullFromSurf( Hull& srf);
//主船体来自体组合
TopoDS_Shape CreateHullFromSolid( Hull& srf);
//重命名
BOOL CheckRename(int cmdID,RenameObject& o);
Handle(Geom_BSplineCurve) ConcatBSpline( vector<Handle(Geom_BSplineCurve)>& splList,bool bAngleContinue=true);
// 生成首尾端带切矢的样条曲线
Handle(Geom_BSplineCurve) MakeBSpline( vector<gp_Pnt>& pSet, bool bStart, bool bEnd, gp_Vec vStart, gp_Vec vEnd);
// 生成首尾端带切矢的样条曲线
Handle(Geom_BSplineCurve) MakeBSpline2( vector<gp_Pnt>& pSet, bool bStart, bool bEnd, gp_Vec vStart, gp_Vec vEnd);
// 生成节点带切矢的样条曲线
Handle(Geom_BSplineCurve) MakeBSpline(vector<gp_Pnt>& pSet, vector<bool> bSet, vector<gp_Vec> vSet);
// 生成多段线的样条曲线by czb 20161230
Handle(Geom_BSplineCurve) MakePolyBSpline(vector<gp_Pnt>& pSet);
Handle(Geom_BSplineCurve) BuildEdge( vector<gp_Pnt>& pSet, vector<bool>& bSet, vector<gp_Vec>& vSet);
////获取曲线首尾端点和肋位或站位点 type=1,肋位;type=2,站位
int GetCurvePointByFS(int curveID, int xlen, double xSet[], int lens[], Point3D *pnts);
int GetCurvePointByFSEx(int curveID, int xlen, vector<double>& xSet,vector<Point3D>& pnts);
///获取所有肋位
vector<double> GetAllF();
///获取所有站位
vector<double> GetAllS();
double GetSTLCoefficient();
public:
map<int ,Point3D> m_mapPoints;//所有点图元集合
map<int,Point3D>::iterator ptit;
map<int,Curve> m_mapCurves;//所有线图元集合
map<int,Curve>::iterator cvit;
map<int,Surface> m_mapSurfaces;//所有面图元集合
map<int,Surface>::iterator sfit;
map<int,Solid> m_mapSolids;//所有体图元集合
map<int,Solid>::iterator sdit;
map<int,TopoDS_Shape> m_mapAllTopoShapes;//所有topo对象集合
map<int,TopoDS_Shape>::iterator tpit;
//2016srq
//2016srq
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
map<int,Handle_AIS_Shape> m_mapTempAisShapes;// 曲线非引用点临时对象集合(shape)保存曲线高亮时,其临时显示的点集合
map<int,Handle_AIS_Shape> m_mapAllAis;//所有occ显示对象集合
map<int,Handle_AIS_Shape>::iterator aisit;
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
/*
map<int,AnyCore::ASceneNodePtr> m_mapTempAisShapes;// 曲线非引用点临时对象集合(shape)保存曲线高亮时,其临时显示的点集合
map<int,AnyCore::ASceneNodePtr> m_mapAllAis;//所有occ显示对象集合
map<int,AnyCore::ASceneNodePtr>::iterator aisit;
*/
// END DELETE
map<int,MainDeckSurf> m_mapMainDeckSurf;// 主甲板面集合
map<int,ShellSurf> m_mapShellSurf;// 外板面集合
map<int,Hull> m_mapHull;// 主船体
map<int,DeckSurf> m_mapDeckSurf;// 平台面集合
map<int,BoundSurf> m_mapBoundSurf;// 上建外围面集合
map<int,SubdivSurf> m_mapSubdivSurf; // 分舱面集合
map<int,OpenCargoRegion> m_mapOpenCargoRegion;// 开敞客货区集合
map<int,Space> m_mapSpace;// 舱室集合
map<int,Appendage> m_mapAppendage;// 附体集合
//add by Yu 2014/8/30
map<int,HydroInletPoint> m_mapInletPoint;// 静水力点集合
map<int,HydroLimitAng> m_mapLimitAng;// 极限静倾角集合
map<int,MarginLine> m_mapMarginLine;//限界线
map<int,ImmersionOpen> m_mapImmersionOpen; //浸水开口
// ADDED BY XUEFENG 20230604
bool b_isAisFrameCreated;
// END ADDED
TopoDS_Shape m_shapeTopoFrame;//肋位
//2016srq
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
Handle_AIS_Shape m_shapeAisFrame;
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
//AnyCore::ASceneNodePtr m_shapeAisFrame;
// END DELETE
double m_numF0x;//站初始位置
int m_iFrame; //肋骨定义是递减还是递增 '0 递减 1 递增
map<int,Frame> m_mapFrameRuler;//站
map<int,double> m_mapStation;//站集合
map<int,double> m_mapWaterlinePos;//水线集合
map<int,double> m_mapButtocklinePos;//纵剖线集合
TopoDS_Shape m_shapeTopoProfile;//型线
//2016srq
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
Handle_AIS_Shape m_shapeAisProfile;
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
//AnyCore::ASceneNodePtr m_shapeAisProfile;
// END DELETE
map<int,std::string> m_mapAllNames;// 所有拓扑对象对应的名字集合
map<int,std::string>::iterator csit;
//redo undo
map<int,map<int,GeomTopoVar>> m_mapUndoPre;
map<int,map<int,GeomTopoVar>> m_mapUndoAfter;
map<int,map<int,GeomTopoVar>>::iterator undoit;
map<int,GeomTopoVar>::iterator undosubit;
//曲线临时显示对象
map<int,TopoDS_Shape> m_maptopoTempShowCurve ;
//2016srq
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
map<int,Handle_AIS_Shape> m_mapaisTempShowCurve;
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
//map<int,AnyCore::ASceneNodePtr> m_mapaisTempShowCurve ;
// END DELETE
map<int,Point3D> m_mapTempShowPoints;
string errorinfo;//返回上层的错误信息
int m_curInteractType;//设置图形交互类型(可选择对象类型) type可选择对象类型:0所有图元,1屏幕任意位置,2曲线节点(knot)
int m_preselid;//上个选中的线的ID
double m_shipLength;//船长
double m_shipWidth;//船宽
double m_shipDepth;//船深
double m_shipLpp;//垂线间长
double m_t; //设计吃水
int AutoCrossFlag;//网格面生成时,交点的来源判断,=1线线求交 =2依赖生成
/// 船舶数据每类图元的颜色显示属性
/// 0-点1-线2-面3-体4-主甲板5-外板
/// 6~9-待定
/// 10-舱室11-附体12-主船体
// 14-高亮色13-背景色 20171001 by czb
ModelDisplayOption displayOptions[15]; //20171001 by czb, 13->15
//2016srq
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
Graphic3d_NameOfMaterial m_shipMaterial;
// END ADDED
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
//AnyCore::AFaceStylePtr m_shipMaterial;
//AnyCore::APointStylePtr m_pointStyle;
// END DELETE
bool bCtrlSelect;//是不是CTRL多选
bool m_bshowPoint;
bool m_bshowCurve;
bool m_bshowSurface;
bool m_bshowSolid;
bool m_bshowMainDeck;
bool m_bshowShell;
bool m_bshowDeck;
bool m_bshowBound;
bool m_bshowSubdiv;
bool m_bshowOpenCargoRegion;
bool m_bshowSpace;
bool m_bshowAppendage;
bool m_bshowFrameRuler;
bool m_bshowProfile;
bool m_bshowHull;
bool m_bshowMainHull; //主船体
bool m_bshowSpaceElement; //舱室单元体
//2016srq
//map<int,Handle_ISession_Text> m_mapTextFrameDisplay;//肋位号
//map<int,Handle_ISession_Text> m_mapTextDisplay;//显示文本列表
//map<int,Handle_ISession_Text>::iterator txtit;
// DELETE BY XUEFENG 20180731
// FOR CODES COMBINE
/*
map<int,AnyCore::ATextNodePtr> m_mapTextFrameDisplay;//肋位号
map<int,AnyCore::ATextNodePtr> m_mapTextDisplay;//显示文本列表
map<int,AnyCore::ATextNodePtr> m_mapCurveNodeTextDisplay;//显示曲线节点序号20170801 新增 by czb
map<int,AnyCore::ATextNodePtr>::iterator txtit;
*/
// END DELETE
//二维CAD图纸边界 Lvxj
float m_cadLeft;
float m_cadRight;
float m_cadTop;
float m_cadBottom;
float m_lastCADHeight;
// ADDED BY XUEFENG 20180731
// FOR CODES COMBINE
/* NOT EXIST IN 7.6.0
map<int,Handle_Prs3d_Presentation> m_mapTextFrameDisplay;
map<int,Handle_Prs3d_Presentation> m_mapTextDisplay;
map<int,Handle_Prs3d_Presentation> m_mapCurveNodeTextDisplay;
map<int,Handle_Prs3d_Presentation>::iterator txtit;
*/
// XUEFENG ADDED for OCC 7.6.0
map<int,Handle(Prs3d_Presentation)> m_mapTextFrameDisplay;
map<int,Handle(Prs3d_Presentation)> m_mapTextDisplay;
map<int,Handle(Prs3d_Presentation)> m_mapCurveNodeTextDisplay;
map<int,Handle(Prs3d_Presentation)>::iterator txtit;
// END ADDED
// END ADDED
// XUEFENG ADDED 202009
// FOR OCC 7.1.0
// BRepTools::Read need UTF-8 filepath.
private:
int preNUm(unsigned char byte);
bool isUtf8(unsigned char* data, int len);
bool isGBK(unsigned char* data, int len);
std::string GbkToUtf8(const char *src_str);
// END ADDED
};