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

798 lines
27 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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
};