2447 lines
61 KiB
C++
2447 lines
61 KiB
C++
|
#include <math.h>
|
|||
|
#include "OffsetGenerate1.h"
|
|||
|
#include "OCCStructDataMD.h"
|
|||
|
//#include "OCCViewer.h"
|
|||
|
#include "OCCLib.h"
|
|||
|
#include "BRepAlgoAPI_Section.hxx"
|
|||
|
#include "BaseAlgo.h"
|
|||
|
#include "Bnd_Box.hxx"
|
|||
|
#include "BRepBndLib.hxx"
|
|||
|
#include "BRepBuilderAPI_MakeFace.hxx"
|
|||
|
#include "GC_MakePlane.hxx"
|
|||
|
#include "BRepExtrema_DistShapeShape.hxx"
|
|||
|
#include "BRepAlgoAPI_Common.hxx"
|
|||
|
#include "Quantity_Color.hxx"
|
|||
|
#include "Prs3d_PointAspect.hxx"
|
|||
|
#include "Aspect_TypeOfMarker.hxx"
|
|||
|
extern OCCStructDataMD dataMD;
|
|||
|
//extern OCCViewer myOCCViewer;
|
|||
|
OffsetGenerate1::OffsetGenerate1(void)
|
|||
|
{
|
|||
|
SecBottom = 1; //剖面底线
|
|||
|
Base = 2; //基线
|
|||
|
Water = 3; //水线
|
|||
|
MainDeck = 4; //主甲板
|
|||
|
UpperDeck = 5;//上甲板
|
|||
|
FoldLine = 6; //折角线 ,
|
|||
|
ProfileLine = 7; //纵剖线,
|
|||
|
}
|
|||
|
OffsetGenerate1::~OffsetGenerate1(void)
|
|||
|
{}
|
|||
|
|
|||
|
int OffsetGenerate1::GetOffsetTableData(int upperDeckID, int foldingLinesID[], int isBilge, double BilgeHC, int shiptype, int asymmetricType,
|
|||
|
int ids[], int lens[], OffsetTablePoint *pnts)
|
|||
|
{
|
|||
|
UpperDeckID =upperDeckID ; //上甲板ID
|
|||
|
isBilge = isBilge;
|
|||
|
BilgeHC = BilgeHC;
|
|||
|
ShipType = shiptype;
|
|||
|
|
|||
|
AsymmetricType=asymmetricType;
|
|||
|
try
|
|||
|
{
|
|||
|
//CalProfile();
|
|||
|
|
|||
|
//CalAngularL(foldingLinesID);
|
|||
|
//CalUpperDeck();
|
|||
|
GetHalfShell();
|
|||
|
CalMainDeck();
|
|||
|
CalSecLine();
|
|||
|
CalBaseLine();
|
|||
|
CalWaterLine();
|
|||
|
map<int,vector<gp_Pnt>>::iterator it;
|
|||
|
it=OPoints.begin();
|
|||
|
|
|||
|
int i = 0;
|
|||
|
int j=0;
|
|||
|
int cnt=0;
|
|||
|
while(it!=OPoints.end()){
|
|||
|
ids[i] = it->first;
|
|||
|
for (j=0;j<it->second.size();j++)
|
|||
|
{
|
|||
|
pnts[cnt+j].X= it->second[j].X();
|
|||
|
pnts[cnt+j].Y = it->second[j].Y();
|
|||
|
pnts[cnt+j].Z = it->second[j].Z();
|
|||
|
////
|
|||
|
//if(ids[i] > 10000000 && ids[i] < 20000000)//最低点
|
|||
|
//{
|
|||
|
// TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(it->second[j]);
|
|||
|
// AnyCore::ASceneNodePtr aisShape=myOCCViewer.TopoShapeToASceneNode(v);//2016srq
|
|||
|
// Quantity_Color color(Quantity_NOC_RED);
|
|||
|
// Handle_Prs3d_PointAspect myPointAspect=new Prs3d_PointAspect(Aspect_TOM_O,color,2);
|
|||
|
// aisShape->Attributes()->SetPointAspect(myPointAspect);
|
|||
|
// myOCCViewer.ShowSceneNode(aisShape,false);//2016srq
|
|||
|
//
|
|||
|
//}
|
|||
|
//if(ids[i] > 20000000 && ids[i] < 30000000)//基线
|
|||
|
//{
|
|||
|
// TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(it->second[j]);
|
|||
|
// AnyCore::ASceneNodePtr aisShape=myOCCViewer.TopoShapeToASceneNode(v);//2016srq
|
|||
|
// Quantity_Color color(Quantity_NOC_RED);
|
|||
|
// Handle_Prs3d_PointAspect myPointAspect=new Prs3d_PointAspect(Aspect_TOM_X,color,2);
|
|||
|
// aisShape->Attributes()->SetPointAspect(myPointAspect);
|
|||
|
// myOCCViewer.ShowSceneNode(aisShape,false);//2016srq
|
|||
|
|
|||
|
//}
|
|||
|
//if(ids[i] > 30000000 && ids[i] < 40000000)//水线
|
|||
|
//{
|
|||
|
// TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(it->second[j]);
|
|||
|
// AnyCore::ASceneNodePtr aisShape=myOCCViewer.TopoShapeToASceneNode(v);//2016srq
|
|||
|
// Quantity_Color color(Quantity_NOC_RED);
|
|||
|
// Handle_Prs3d_PointAspect myPointAspect=new Prs3d_PointAspect(Aspect_TOM_BALL,color,2);
|
|||
|
// aisShape->Attributes()->SetPointAspect(myPointAspect);
|
|||
|
// myOCCViewer.ShowSceneNode(aisShape,false);//2016srq
|
|||
|
|
|||
|
//}
|
|||
|
//if(ids[i] > 40000000 && ids[i] < 50000000)//甲板甲板
|
|||
|
//{
|
|||
|
// TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(it->second[j]);
|
|||
|
// AnyCore::ASceneNodePtr aisShape=myOCCViewer.TopoShapeToASceneNode(v);//2016srq
|
|||
|
// Quantity_Color color(Quantity_NOC_RED);
|
|||
|
//Handle_Prs3d_PointAspect myPointAspect=new Prs3d_PointAspect(Aspect_TOM_O_PLUS,color,2);
|
|||
|
// aisShape->Attributes()->SetPointAspect(myPointAspect);
|
|||
|
// myOCCViewer.ShowSceneNode(aisShape,false);//2016srq
|
|||
|
|
|||
|
//}
|
|||
|
}
|
|||
|
cnt = cnt+j;
|
|||
|
lens[i] = j;
|
|||
|
i++;
|
|||
|
it++;
|
|||
|
}
|
|||
|
return i;
|
|||
|
}
|
|||
|
catch(Standard_Failure)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
//纵剖面线型值
|
|||
|
void OffsetGenerate1::CalProfile()
|
|||
|
{
|
|||
|
int iIndex ;
|
|||
|
|
|||
|
map<int,double>::iterator it;
|
|||
|
it=dataMD.m_mapButtocklinePos.begin();
|
|||
|
|
|||
|
int i = 0;
|
|||
|
while(it!=dataMD.m_mapButtocklinePos.end()){
|
|||
|
//根据给出的纵剖面线,然后每站求交点
|
|||
|
vector<Handle(Geom_Curve)> curvesL;
|
|||
|
vector<Handle(Geom_Curve)> curvesR;
|
|||
|
vector<gp_Pnt> psL;
|
|||
|
vector<gp_Pnt> psR;
|
|||
|
ExtracteLine(-2,it->second,curvesL,curvesR,psL,psR);
|
|||
|
if (curvesL.size() > 0){
|
|||
|
double dl,df;
|
|||
|
dl = curvesL[0]->FirstParameter();
|
|||
|
df = curvesL[0]->LastParameter();
|
|||
|
vector<gp_Pnt> ps = CalPoints(curvesL[0],dl,df);
|
|||
|
if (((ShipType == 2) && (AsymmetricType == -1)) || (ShipType == 1) || (ShipType == 4))
|
|||
|
{
|
|||
|
if (it->second < 0)
|
|||
|
{
|
|||
|
iIndex = ProfileLine*11000+it->first;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps));
|
|||
|
|
|||
|
}else
|
|||
|
{
|
|||
|
iIndex = ProfileLine*10000+it->first;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps));
|
|||
|
|
|||
|
}
|
|||
|
}else
|
|||
|
{
|
|||
|
if (it->second > 0)
|
|||
|
{
|
|||
|
iIndex = ProfileLine*11000+it->first;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps));
|
|||
|
|
|||
|
}else
|
|||
|
{
|
|||
|
iIndex = ProfileLine*10000+it->first;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps));
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
///
|
|||
|
if (it->second < 0.0001)
|
|||
|
CurProfile0 = curvesL[0];
|
|||
|
///
|
|||
|
}
|
|||
|
|
|||
|
i++;
|
|||
|
++it;
|
|||
|
}
|
|||
|
//map<string,double> mProfilePos; //纵剖线位置
|
|||
|
|
|||
|
}
|
|||
|
////////////////////////////////////////////////
|
|||
|
//折角线半宽和高度 ,根据给出的折角线,然后每站求交点
|
|||
|
//注意:折角线的高度不应超过甲板线(上甲板,无上甲板是主甲板),若超出,则填-1
|
|||
|
void OffsetGenerate1::CalAngularL(int foldingLinesID[])
|
|||
|
{
|
|||
|
int iIndex;
|
|||
|
for(int i=0;i<MAX_ARRAY_SIZE_L;i++)
|
|||
|
{
|
|||
|
if(foldingLinesID[i]>1)
|
|||
|
{
|
|||
|
//根据给出的折角线,然后每站求交点
|
|||
|
vector<gp_Pnt> ps = CalPoints(foldingLinesID[i]);
|
|||
|
if (((ShipType == 2) && (AsymmetricType == -1)) || (ShipType == 1)|| (ShipType == 4))
|
|||
|
{
|
|||
|
if (ps[0].Y() > 0)
|
|||
|
{
|
|||
|
iIndex = FoldLine *1000000+i;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps)); //去掉首尾
|
|||
|
}else
|
|||
|
{
|
|||
|
iIndex = FoldLine *1100000+i;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps)); //去掉首尾
|
|||
|
}
|
|||
|
}else
|
|||
|
{
|
|||
|
if (ps[0].Y() < 0)
|
|||
|
{
|
|||
|
iIndex = FoldLine *1000000+i;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps)); //去掉首尾
|
|||
|
}else
|
|||
|
{
|
|||
|
iIndex = FoldLine *1100000+i;
|
|||
|
OPoints.insert(pair<int,vector<gp_Pnt>>(iIndex,ps)); //去掉首尾
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}else
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
////////////////////////////////////////////////
|
|||
|
//上甲板半宽和高度 ,需要制定上甲板面,找出此面和船壳的交线,然后每站求交点
|
|||
|
void OffsetGenerate1::CalUpperDeck()
|
|||
|
{
|
|||
|
}
|
|||
|
////////////////////////////////////////////////
|
|||
|
//主甲板半宽和高度 ,需要制定主甲板面/上甲板面,找出此面和船壳的交线,然后每站求交点
|
|||
|
//SurfID 上甲板或者主甲板ID,FlagID 上甲板或者主甲板的标识
|
|||
|
void OffsetGenerate1::CalMainDeck()
|
|||
|
{
|
|||
|
|
|||
|
TopoDS_Shape mainDeck;
|
|||
|
if(dataMD.m_mapMainDeckSurf.size()==1)
|
|||
|
mainDeck=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapMainDeckSurf.begin()->first)->second;
|
|||
|
else
|
|||
|
return;
|
|||
|
|
|||
|
vector<TopoDS_Edge> edges = GetShellSectionEdges(mainDeck);
|
|||
|
|
|||
|
Bnd_Box box;
|
|||
|
double x1,x2,y1,y2,z1,z2;
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
BRepBndLib::Add(edge, box);
|
|||
|
}
|
|||
|
box.SetGap(0.0);
|
|||
|
box.Get(x1,y1,z1,x2,y2,z2);
|
|||
|
|
|||
|
//艏端点
|
|||
|
vector<gp_Pnt> pSetF;
|
|||
|
TopoDS_Face ff = CreateFace(-1, x2);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetFTmp = GetSectionPoints1(edge, ff);
|
|||
|
//pSetFTmp = CleanPoints(pSetFTmp, -1, x1);
|
|||
|
pSetF = AddPoints(pSetF, pSetFTmp);
|
|||
|
}
|
|||
|
pSetF = GetExtremePoints(pSetF, 1);
|
|||
|
OPoints.insert(make_pair(40001000,pSetF));
|
|||
|
//艉端点
|
|||
|
vector<gp_Pnt> pSetD;
|
|||
|
TopoDS_Face fd = CreateFace(-1, x1);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetDTmp = GetSectionPoints1(edge, fd);
|
|||
|
//pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
pSetD = AddPoints(pSetD, pSetDTmp);
|
|||
|
}
|
|||
|
pSetD = GetExtremePoints(pSetD, -1);
|
|||
|
OPoints.insert(make_pair(40003000,pSetD));
|
|||
|
|
|||
|
//站
|
|||
|
for(int i = 0; i < dataMD.m_mapStation.size(); i++)
|
|||
|
{
|
|||
|
double x = dataMD.m_mapStation[i];
|
|||
|
vector<gp_Pnt> pSet;
|
|||
|
TopoDS_Face f = CreateFace(-1, x);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetTmp = GetSectionPoints(edge, f);
|
|||
|
pSetTmp = CleanPoints(pSetTmp, -1, x);
|
|||
|
pSet = AddPoints(pSet, pSetTmp);
|
|||
|
}
|
|||
|
OPoints.insert(make_pair(40002000+i,pSet));
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
//SurfID 上甲板或者主甲板ID,FlagID 上甲板或者主甲板的标识
|
|||
|
void OffsetGenerate1::CalDeck()
|
|||
|
{
|
|||
|
|
|||
|
int i = 0;
|
|||
|
vector<Handle(Geom_Curve)> curvesL;
|
|||
|
vector<Handle(Geom_Curve)> curvesR;
|
|||
|
vector<gp_Pnt> psL;
|
|||
|
vector<gp_Pnt> psR;
|
|||
|
vector<gp_Pnt> ListPnt;
|
|||
|
vector<gp_Pnt> ListPnta;
|
|||
|
|
|||
|
gp_Pnt ptend;
|
|||
|
//取得两端点坐标
|
|||
|
if (dataMD.m_mapMainDeckSurf.size() > 0)
|
|||
|
{
|
|||
|
vector<Handle(Geom_Curve)> curvesL;
|
|||
|
vector<Handle(Geom_Curve)> curvesR;
|
|||
|
vector<gp_Pnt> psL;
|
|||
|
vector<gp_Pnt> psR;
|
|||
|
// ExtracteLine(dataMD.m_mapMainDeckSurf.begin()->first,-2,0,curvesL,curvesR); //怎么得到主甲板ID YY
|
|||
|
//ExtracteLine(SurfID,-2,0,curvesL,curvesR); //怎么得到主甲板ID YY
|
|||
|
if (curvesL.size() > 0)
|
|||
|
{
|
|||
|
double dlp,dfp;
|
|||
|
dlp = curvesL[0]->FirstParameter();
|
|||
|
dfp = curvesL[0]->LastParameter();
|
|||
|
gp_Pnt pt1=curvesL[0]->Value(dlp);
|
|||
|
gp_Pnt pt2=curvesL[0]->Value(dfp);
|
|||
|
if (pt1.X() > pt2.X())
|
|||
|
{
|
|||
|
ListPnt.push_back(pt2);
|
|||
|
ListPnta.push_back(pt2);
|
|||
|
ptend = pt1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ListPnt.push_back(pt1);
|
|||
|
ListPnta.push_back(pt1);
|
|||
|
ptend = pt2;
|
|||
|
}
|
|||
|
}else
|
|||
|
{
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
ListPnt.push_back(Or);
|
|||
|
ListPnta.push_back(Or);
|
|||
|
ptend = Or;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
map<int,double>::iterator it;
|
|||
|
it=dataMD.m_mapStation.begin();
|
|||
|
while(it!=dataMD.m_mapStation.end()){
|
|||
|
curvesL.clear();
|
|||
|
//ExtracteLine(SurfID,-1,it->second,curvesL,curvesR);
|
|||
|
if (curvesL.size() > 0)
|
|||
|
{
|
|||
|
double dl,df;
|
|||
|
dl = curvesL[0]->FirstParameter();
|
|||
|
df = curvesL[0]->LastParameter();
|
|||
|
gp_Pnt pt1=curvesL[0]->Value(dl);
|
|||
|
gp_Pnt pt2=curvesL[0]->Value(df);
|
|||
|
if ((ShipType == 2) && (AsymmetricType == 1))
|
|||
|
{
|
|||
|
if (pt1.Y()>pt2.Y())
|
|||
|
{
|
|||
|
ListPnt.push_back(pt2);
|
|||
|
ListPnta.push_back(pt1);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ListPnt.push_back(pt1);
|
|||
|
ListPnta.push_back(pt2);
|
|||
|
}
|
|||
|
|
|||
|
}else{
|
|||
|
if (pt1.Y()>pt2.Y())
|
|||
|
{
|
|||
|
ListPnt.push_back(pt1);
|
|||
|
ListPnta.push_back(pt2);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ListPnt.push_back(pt2);
|
|||
|
ListPnta.push_back(pt1);
|
|||
|
}
|
|||
|
}
|
|||
|
}else
|
|||
|
{
|
|||
|
ListPnt.push_back(Or);
|
|||
|
ListPnta.push_back(Or);
|
|||
|
}
|
|||
|
it++;
|
|||
|
}
|
|||
|
ListPnt.push_back(ptend);
|
|||
|
ListPnta.push_back(ptend);
|
|||
|
//OPoints.insert(pair<int,vector<gp_Pnt>>(FlagID*10000 ,ListPnt));
|
|||
|
//OPoints.insert(pair<int,vector<gp_Pnt>>(FlagID*11000 ,ListPnta));
|
|||
|
}
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
//剖面底线半宽,舭部升高的情况,需要算法 最低点
|
|||
|
void OffsetGenerate1::CalSecLine()
|
|||
|
{
|
|||
|
vector<gp_Pnt> pSetF,pSetD;
|
|||
|
OPoints.insert(make_pair(10001000,pSetF));
|
|||
|
OPoints.insert(make_pair(10003000,pSetD));
|
|||
|
//站
|
|||
|
for(int i = 0; i < dataMD.m_mapStation.size(); i++)
|
|||
|
{
|
|||
|
double x = dataMD.m_mapStation[i];
|
|||
|
vector<gp_Pnt> pSet;
|
|||
|
TopoDS_Face f = CreateFace(-1, x);
|
|||
|
vector<TopoDS_Edge> edges = GetShellSectionEdges(f);
|
|||
|
Bnd_Box box;
|
|||
|
double x1,x2,y1,y2,z1,z2;
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
BRepBndLib::Add(edge, box);
|
|||
|
}
|
|||
|
box.SetGap(0.0);
|
|||
|
box.Get(x1,y1,z1,x2,y2,z2);
|
|||
|
|
|||
|
TopoDS_Face face = CreateFace(-3, z1);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetTmp = GetSectionPoints(edge, face);
|
|||
|
pSetTmp = CleanPoints(pSetTmp, -3, z1);
|
|||
|
pSet = AddPoints(pSet, pSetTmp);
|
|||
|
}
|
|||
|
OPoints.insert(make_pair(10002000+i,pSet));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
///基线求点,基线也就是水线为0时,Z=0,时的交线在各站号的点和剖面底线一致,但不存在舭部升高
|
|||
|
void OffsetGenerate1::CalBaseLine()
|
|||
|
{
|
|||
|
TopoDS_Face face = CreateFace(-3, 0);
|
|||
|
vector<TopoDS_Edge> edges = GetShellSectionEdges(face);
|
|||
|
|
|||
|
Bnd_Box box;
|
|||
|
double x1,x2,y1,y2,z1,z2;
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
BRepBndLib::Add(edge, box);
|
|||
|
}
|
|||
|
box.SetGap(0.0);
|
|||
|
box.Get(x1,y1,z1,x2,y2,z2);
|
|||
|
|
|||
|
//艏端点
|
|||
|
vector<gp_Pnt> pSetF;
|
|||
|
TopoDS_Face ff = CreateFace(-1, x2);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetFTmp = GetSectionPoints1(edge, ff);
|
|||
|
//pSetFTmp = CleanPoints(pSetFTmp, -1, x1);
|
|||
|
pSetF = AddPoints(pSetF, pSetFTmp);
|
|||
|
}
|
|||
|
pSetF = GetExtremePoints(pSetF, 1);
|
|||
|
OPoints.insert(make_pair(20001000,pSetF));
|
|||
|
//艉端点
|
|||
|
vector<gp_Pnt> pSetD;
|
|||
|
TopoDS_Face fd = CreateFace(-1, x1);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetDTmp = GetSectionPoints1(edge, fd);
|
|||
|
//pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
pSetD = AddPoints(pSetD, pSetDTmp);
|
|||
|
}
|
|||
|
pSetD = GetExtremePoints(pSetD, -1);
|
|||
|
OPoints.insert(make_pair(20003000,pSetD));
|
|||
|
//站
|
|||
|
for(int i = 0; i < dataMD.m_mapStation.size(); i++)
|
|||
|
{
|
|||
|
double x = dataMD.m_mapStation[i];
|
|||
|
vector<gp_Pnt> pSet;
|
|||
|
TopoDS_Face f = CreateFace(-1, x);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetTmp = GetSectionPoints(edge, f);
|
|||
|
pSetTmp = CleanPoints(pSetTmp, -1, x);
|
|||
|
pSet = AddPoints(pSet, pSetTmp);
|
|||
|
}
|
|||
|
OPoints.insert(make_pair(20002000+i,pSet));
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
// 水线求点
|
|||
|
//
|
|||
|
void OffsetGenerate1::CalWaterLine()
|
|||
|
{
|
|||
|
for(int w = 1; w < dataMD.m_mapWaterlinePos.size() ; w++)
|
|||
|
{
|
|||
|
TopoDS_Face face = CreateFace(-3, dataMD.m_mapWaterlinePos[w]);
|
|||
|
vector<TopoDS_Edge> edges = GetShellSectionEdges(face);
|
|||
|
|
|||
|
Bnd_Box box;
|
|||
|
double x1,x2,y1,y2,z1,z2;
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
BRepBndLib::Add(edge, box);
|
|||
|
}
|
|||
|
box.SetGap(0.0);
|
|||
|
box.Get(x1,y1,z1,x2,y2,z2);
|
|||
|
|
|||
|
//艏端点
|
|||
|
vector<gp_Pnt> pSetF;
|
|||
|
TopoDS_Face ff = CreateFace(-1, x2);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetFTmp = GetSectionPoints1(edge, ff);
|
|||
|
//pSetFTmp = CleanPoints(pSetFTmp, -1, x1);
|
|||
|
pSetF = AddPoints(pSetF, pSetFTmp);
|
|||
|
}
|
|||
|
pSetF = GetExtremePoints(pSetF, 1);
|
|||
|
OPoints.insert(make_pair(30001000 + w * 10000,pSetF));
|
|||
|
//艉端点
|
|||
|
vector<gp_Pnt> pSetD;
|
|||
|
TopoDS_Face fd = CreateFace(-1, x1);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetDTmp = GetSectionPoints1(edge, fd);
|
|||
|
//pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
pSetD = AddPoints(pSetD, pSetDTmp);
|
|||
|
}
|
|||
|
pSetD = GetExtremePoints(pSetD, -1);
|
|||
|
OPoints.insert(make_pair(30003000 + w * 10000,pSetD));
|
|||
|
//站
|
|||
|
for(int i = 0; i < dataMD.m_mapStation.size(); i++)
|
|||
|
{
|
|||
|
double x = dataMD.m_mapStation[i];
|
|||
|
vector<gp_Pnt> pSet;
|
|||
|
TopoDS_Face f = CreateFace(-1, x);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetTmp = GetSectionPoints(edge, f);
|
|||
|
pSetTmp = CleanPoints(pSetTmp, -1, x);
|
|||
|
pSet = AddPoints(pSet, pSetTmp);
|
|||
|
}
|
|||
|
OPoints.insert(make_pair(30002000 + w * 10000 + i,pSet));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//面与船壳面的交线,返回一条此条交线,对返回的曲线进行拐点分析,如果有,进行曲线的拆分,返回多条曲线,及相应的
|
|||
|
//极值点
|
|||
|
//FreeBoard =1 取右舷 =-1 取左舷
|
|||
|
//Flag = -1 YZ平面 =-2 XZ平面 =-3 XY平面 >0 为上甲板ID或者主甲板ID
|
|||
|
//LType 判断线的类型,是否要进行拆分
|
|||
|
void OffsetGenerate1::ExtracteLine(int Flag,double Pos,vector<Handle(Geom_Curve)>& CurL,vector<Handle(Geom_Curve)>& CurR,vector<gp_Pnt>& LPnts,vector<gp_Pnt>& RPnts,int LType)
|
|||
|
{
|
|||
|
TopoDS_Shape face,shell,shellL,shellR,tempshape1,tempshape2;
|
|||
|
TopoDS_Edge secedge1,secedge2,secedge;
|
|||
|
|
|||
|
map<int,TopoDS_Shape>::iterator it;
|
|||
|
gp_Pnt Or;
|
|||
|
gp_Dir Norm;
|
|||
|
switch(Flag)
|
|||
|
{
|
|||
|
case -1:
|
|||
|
Or=gp_Pnt(Pos,0,0);
|
|||
|
Norm=gp_Dir(1, 0.,0 );
|
|||
|
break;
|
|||
|
case -2:
|
|||
|
Or=gp_Pnt(0,Pos,0.);
|
|||
|
Norm=gp_Dir(0., 1, 0.);
|
|||
|
break;
|
|||
|
case -3:
|
|||
|
Or=gp_Pnt(0,0,Pos);
|
|||
|
Norm=gp_Dir(0., 0., 1.);
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
if(Flag<0)
|
|||
|
{
|
|||
|
// gp_Pln pln(Or,Norm);
|
|||
|
// Handle(Geom_Surface)aSurface =GC_MakePlane(pln).Value();
|
|||
|
|
|||
|
// //BRepBuilderAPI_MakeFace face1 =BRepBuilderAPI_MakeFace(aSurface);// XUEFENG DELETE 202009
|
|||
|
// BRepBuilderAPI_MakeFace face1 =BRepBuilderAPI_MakeFace(aSurface, Precision::Confusion()); // XUEFENG ADDED 202009
|
|||
|
|
|||
|
// face=face1.Shape();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
it=dataMD.m_mapAllTopoShapes.find(Flag);
|
|||
|
if(it!=dataMD.m_mapAllTopoShapes.end())
|
|||
|
{
|
|||
|
face=it->second;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(dataMD.m_mapShellSurf.size()>0)
|
|||
|
{}
|
|||
|
else
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
tempshape1=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->first)->second;
|
|||
|
|
|||
|
|
|||
|
/*switch(ShipType)
|
|||
|
{
|
|||
|
case 1:
|
|||
|
case 4:
|
|||
|
shell=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->second.Src[0])->second;
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
tempshape1=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->second.Src[0])->second;
|
|||
|
tempshape2=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->second.Src[1])->second ;
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}*/
|
|||
|
|
|||
|
list<TopoDS_Edge> edgelist;
|
|||
|
list<TopoDS_Edge> edgelistL;
|
|||
|
list<TopoDS_Edge> edgelistR;
|
|||
|
|
|||
|
TopoDS_Edge tpedge;
|
|||
|
|
|||
|
/*if(ShipType==1||ShipType==4)
|
|||
|
{
|
|||
|
BRepAlgoAPI_Section sec(face,shell,Standard_False);
|
|||
|
sec.ComputePCurveOn1(Standard_True);
|
|||
|
sec.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
sec.Build();
|
|||
|
dataMD.GetInsectWirePts(sec.Shape(),edgelist);
|
|||
|
if(edgelist.size()<1)
|
|||
|
{
|
|||
|
shell=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->second.Src[1])->second;
|
|||
|
BRepAlgoAPI_Section sec(face,shell,Standard_False);
|
|||
|
sec.ComputePCurveOn1(Standard_True);
|
|||
|
sec.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
sec.Build();
|
|||
|
dataMD.GetInsectWirePts(sec.Shape(),edgelist);
|
|||
|
}
|
|||
|
|
|||
|
if(edgelist.size()>0)
|
|||
|
{
|
|||
|
secedge=dataMD.SetInsectWireToEdge(edgelist);
|
|||
|
//2016srq
|
|||
|
//Handle_AIS_Shape AISShape=new AIS_Shape(secedge);
|
|||
|
//myOCCViewer.myAISContext->Display(AISShape,true);
|
|||
|
AnyCore::ASceneNodePtr AISShape=myOCCViewer.TopoShapeToASceneNode(secedge);
|
|||
|
myOCCViewer.ShowSceneNode(AISShape,true);
|
|||
|
}
|
|||
|
|
|||
|
double df1,de1;
|
|||
|
Handle(Geom_Curve) curveL=BRep_Tool::Curve(secedge,df1,de1);
|
|||
|
CurL.push_back(curveL);*/
|
|||
|
|
|||
|
/*}
|
|||
|
else
|
|||
|
{*/
|
|||
|
BRepAlgoAPI_Section sec1(face,tempshape1,Standard_False);
|
|||
|
sec1.ComputePCurveOn1(Standard_True);
|
|||
|
sec1.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
sec1.Build();
|
|||
|
TopoDS_Shape s =sec1.Shape();
|
|||
|
dataMD.GetInsectWirePts(s,edgelistL);
|
|||
|
secedge1=dataMD.SetInsectWireToEdge(edgelistL);
|
|||
|
|
|||
|
//if (tempshape2 != null){
|
|||
|
/*BRepAlgoAPI_Section sec2(face,tempshape2,Standard_False);
|
|||
|
sec2.ComputePCurveOn1(Standard_True);
|
|||
|
sec2.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
sec2.Build();
|
|||
|
dataMD.GetInsectWirePts(sec2.Shape(),edgelistR);
|
|||
|
secedge2=dataMD.SetInsectWireToEdge(edgelistR);*/
|
|||
|
//}
|
|||
|
|
|||
|
if(edgelistL.size()>0)
|
|||
|
{
|
|||
|
secedge1=dataMD.SetInsectWireToEdge(edgelistL);
|
|||
|
|
|||
|
//2016srq
|
|||
|
/*Handle_AIS_Shape AISShape=new AIS_Shape(secedge1);
|
|||
|
myOCCViewer.myAISContext->Display(AISShape,true);*/
|
|||
|
// DELETE BY XUEFENG 20180731
|
|||
|
// FOR CODES COMBINE
|
|||
|
/*
|
|||
|
AnyCore::ASceneNodePtr AISShape=myOCCViewer.TopoShapeToASceneNode(secedge1);
|
|||
|
myOCCViewer.ShowSceneNode(AISShape,true);
|
|||
|
*/
|
|||
|
// END DELETE
|
|||
|
}
|
|||
|
/*if(edgelistR.size()>0)
|
|||
|
{
|
|||
|
secedge2=dataMD.SetInsectWireToEdge(edgelistR);
|
|||
|
//Handle_AIS_Shape AISShape=new AIS_Shape(secedge2);
|
|||
|
//myOCCViewer.myAISContext->Display(AISShape,true);
|
|||
|
AnyCore::ASceneNodePtr AISShape=myOCCViewer.TopoShapeToASceneNode(secedge2);
|
|||
|
myOCCViewer.ShowSceneNode(AISShape);
|
|||
|
}*/
|
|||
|
|
|||
|
double df1,de1;//df2,de2; upd by yu for erase warning 14.8.27
|
|||
|
Handle(Geom_Curve) curveL=BRep_Tool::Curve(secedge1,df1,de1);
|
|||
|
CurL.push_back(curveL);
|
|||
|
//Handle(Geom_Curve) curveR=BRep_Tool::Curve(secedge2,df2,de2);
|
|||
|
//CurL=SplitGeomCurve(curveL,LPnts);
|
|||
|
/*if(curveL->Value(df1).Y()>0||curveL->Value(de1).Y()>0)
|
|||
|
{
|
|||
|
CurL=SplitGeomCurve(curveL,LPnts);
|
|||
|
CurR=SplitGeomCurve(curveR,RPnts);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
CurR=SplitGeomCurve(curveL,LPnts);
|
|||
|
CurL=SplitGeomCurve(curveR,RPnts);
|
|||
|
}*/
|
|||
|
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
//针对不是和船壳面求交的情况
|
|||
|
void OffsetGenerate1::ExtracteLine(int SurfID,int Flag,double Pos,vector<Handle(Geom_Curve)>& CurL,vector<Handle(Geom_Curve)>& CurR)
|
|||
|
{
|
|||
|
TopoDS_Shape face,shell,shellL,shellR,tempshape1,tempshape2;
|
|||
|
TopoDS_Edge secedge1,secedge2,secedge;
|
|||
|
|
|||
|
map<int,TopoDS_Shape>::iterator it;
|
|||
|
gp_Pnt Or;
|
|||
|
gp_Dir Norm;
|
|||
|
switch(Flag)
|
|||
|
{
|
|||
|
case -1:
|
|||
|
Or=gp_Pnt(Pos,0,0);
|
|||
|
Norm=gp_Dir(1, 0.,0 );
|
|||
|
break;
|
|||
|
case -2:
|
|||
|
Or=gp_Pnt(0,Pos,0.);
|
|||
|
Norm=gp_Dir(0., 1, 0.);
|
|||
|
break;
|
|||
|
case -3:
|
|||
|
Or=gp_Pnt(0,0,Pos);
|
|||
|
Norm=gp_Dir(0., 0., 1.);
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
if(Flag<0)
|
|||
|
{
|
|||
|
// gp_Pln pln(Or,Norm);
|
|||
|
// Handle(Geom_Surface)aSurface =GC_MakePlane(pln).Value();
|
|||
|
|
|||
|
// //BRepBuilderAPI_MakeFace face1 =BRepBuilderAPI_MakeFace(aSurface);// XUEFENG DELETE 202009
|
|||
|
// BRepBuilderAPI_MakeFace face1 =BRepBuilderAPI_MakeFace(aSurface, Precision::Confusion()); // XUEFENG ADDED 202009
|
|||
|
|
|||
|
// face=face1.Shape();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
it=dataMD.m_mapAllTopoShapes.find(Flag);
|
|||
|
if(it!=dataMD.m_mapAllTopoShapes.end())
|
|||
|
{
|
|||
|
face=it->second;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
it=dataMD.m_mapAllTopoShapes.find(SurfID);
|
|||
|
if(it!=dataMD.m_mapAllTopoShapes.end())
|
|||
|
{
|
|||
|
shell=it->second;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
list<TopoDS_Edge> edgelist;
|
|||
|
list<TopoDS_Edge> edgelistL;
|
|||
|
list<TopoDS_Edge> edgelistR;
|
|||
|
|
|||
|
TopoDS_Edge tpedge;
|
|||
|
|
|||
|
if(ShipType==1||ShipType==4)
|
|||
|
{
|
|||
|
BRepAlgoAPI_Section sec(face,shell,Standard_False);
|
|||
|
sec.ComputePCurveOn1(Standard_True);
|
|||
|
sec.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
sec.Build();
|
|||
|
TopoDS_Shape s =sec.Shape();
|
|||
|
dataMD.GetInsectWirePts(s,edgelist);
|
|||
|
if(edgelist.size()<1)
|
|||
|
{
|
|||
|
shell=dataMD.m_mapAllTopoShapes.find(SurfID)->second;
|
|||
|
BRepAlgoAPI_Section sec(face,shell,Standard_False);
|
|||
|
sec.ComputePCurveOn1(Standard_True);
|
|||
|
sec.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
sec.Build();
|
|||
|
s =sec.Shape();
|
|||
|
dataMD.GetInsectWirePts(s,edgelist);
|
|||
|
}
|
|||
|
|
|||
|
if(edgelist.size()>0)
|
|||
|
{
|
|||
|
secedge=dataMD.SetInsectWireToEdge(edgelist);
|
|||
|
//2016srq
|
|||
|
/*Handle_AIS_Shape AISShape=new AIS_Shape(secedge);
|
|||
|
myOCCViewer.myAISContext->Display(AISShape,true);
|
|||
|
Handle_AIS_Shape AISShape1=new AIS_Shape(shell);
|
|||
|
myOCCViewer.myAISContext->Display(AISShape1,true);*/
|
|||
|
|
|||
|
// DELETE BY XUEFENG 20180731
|
|||
|
// FOR CODES COMBINE
|
|||
|
/*
|
|||
|
AnyCore::ASceneNodePtr AISShape=myOCCViewer.TopoShapeToASceneNode(secedge);
|
|||
|
myOCCViewer.ShowSceneNode(AISShape);
|
|||
|
AnyCore::ASceneNodePtr AISShape1=myOCCViewer.TopoShapeToASceneNode(shell);
|
|||
|
myOCCViewer.ShowSceneNode(AISShape1);
|
|||
|
*/
|
|||
|
// END DELETE
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
double df1,de1;
|
|||
|
Handle(Geom_Curve) curveL=BRep_Tool::Curve(secedge,df1,de1);
|
|||
|
|
|||
|
CurL.push_back(curveL);
|
|||
|
|
|||
|
//CurL = curveL;
|
|||
|
|
|||
|
//CurL=SplitGeomCurve(curveL,LPnts);
|
|||
|
//if(curveL->Value(df1).Y()>0||curveL->Value(de1).Y()>0)
|
|||
|
//{
|
|||
|
// CurL=SplitGeomCurve(curveL,LPnts);
|
|||
|
// //CurR=SplitGeomCurve(curveR,RPnts);
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
// CurR=SplitGeomCurve(curveL,LPnts);
|
|||
|
// //CurL=SplitGeomCurve(curveR,RPnts);
|
|||
|
//}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
BRepAlgoAPI_Section sec1(face,tempshape1,Standard_False);
|
|||
|
sec1.ComputePCurveOn1(Standard_True);
|
|||
|
sec1.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
|
|||
|
BRepAlgoAPI_Section sec2(face,tempshape2,Standard_False);
|
|||
|
sec2.ComputePCurveOn1(Standard_True);
|
|||
|
sec2.Approximation(TopOpeBRepTool_APPROX);
|
|||
|
|
|||
|
sec1.Build();
|
|||
|
TopoDS_Shape s =sec1.Shape();
|
|||
|
dataMD.GetInsectWirePts(s,edgelistL);
|
|||
|
secedge1=dataMD.SetInsectWireToEdge(edgelistL);
|
|||
|
|
|||
|
sec2.Build();
|
|||
|
s =sec2.Shape();
|
|||
|
dataMD.GetInsectWirePts(s,edgelistR);
|
|||
|
secedge2=dataMD.SetInsectWireToEdge(edgelistR);
|
|||
|
|
|||
|
double df1,df2,de1,de2;
|
|||
|
Handle(Geom_Curve) curveL=BRep_Tool::Curve(secedge1,df1,de1);
|
|||
|
Handle(Geom_Curve) curveR=BRep_Tool::Curve(secedge2,df2,de2);
|
|||
|
|
|||
|
/*if(curveL->Value(df1).Y()>0||curveL->Value(de1).Y()>0)
|
|||
|
{
|
|||
|
CurL=SplitGeomCurve(curveL,LPnts);
|
|||
|
CurR=SplitGeomCurve(curveR,RPnts);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
CurR=SplitGeomCurve(curveL,LPnts);
|
|||
|
CurL=SplitGeomCurve(curveR,RPnts);
|
|||
|
}*/
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 自动拆分几何曲线(通过峰值、拐点///极值点)
|
|||
|
/// </summary>
|
|||
|
/// <param name="curve"></param>
|
|||
|
/// <returns></returns>
|
|||
|
vector<Handle(Geom_Curve)> OffsetGenerate1::SplitGeomCurve(Handle(Geom_Curve) curve, vector<gp_Pnt>& pnts)
|
|||
|
{
|
|||
|
//Handle(Geom_Curve) aCur = BRep_Tool::Curve(edge,df,dl);
|
|||
|
//TopoDS_Edge
|
|||
|
map<double,gp_Pnt> mapTempPnts;
|
|||
|
map<double,gp_Pnt>::iterator it;
|
|||
|
vector<Handle(Geom_Curve)> curves;
|
|||
|
gp_Pnt beginP,endP,tempP;
|
|||
|
double tempX,tempY,tempZ,tempPara;
|
|||
|
gp_Pnt Or;
|
|||
|
gp_Dir Norm;
|
|||
|
gp_Pln pln;
|
|||
|
Geom2dLProp_CurAndInf2d curpro;
|
|||
|
Handle(Geom_BSplineCurve) myBSplCurve= Handle(Geom_BSplineCurve)::DownCast( curve);
|
|||
|
Handle(Geom_Curve) myCurve=myBSplCurve;
|
|||
|
beginP=myBSplCurve->StartPoint();
|
|||
|
endP=myBSplCurve->EndPoint();
|
|||
|
tempX=abs(beginP.X()-endP.X());
|
|||
|
tempY=abs(beginP.Y()-endP.Y());
|
|||
|
tempZ=abs(beginP.Z()-endP.Z());
|
|||
|
/*if(tempX<10e-6)
|
|||
|
{
|
|||
|
Or=gp_Pnt(beginP.X(),0,0);
|
|||
|
Norm=gp_Dir(1, 0,0 );
|
|||
|
}
|
|||
|
else if(tempY<10e-6)
|
|||
|
{
|
|||
|
Or=gp_Pnt(0,beginP.Y(),0);
|
|||
|
Norm=gp_Dir(0, 1,0 );
|
|||
|
}*/
|
|||
|
//else
|
|||
|
if(tempZ<10e-6)
|
|||
|
{
|
|||
|
Or=gp_Pnt(0,0,beginP.Z());
|
|||
|
Norm=gp_Dir(0, 0,1 );
|
|||
|
}
|
|||
|
/*else
|
|||
|
{
|
|||
|
return curves;
|
|||
|
}*/
|
|||
|
mapTempPnts.insert(make_pair(myBSplCurve->FirstParameter(),beginP));
|
|||
|
mapTempPnts.insert(make_pair(myBSplCurve->LastParameter(),endP));
|
|||
|
pln=gp_Pln(Or,Norm);
|
|||
|
Handle(Geom2d_Curve) curve2D=GeomAPI::To2d(myCurve,pln);
|
|||
|
curpro.Perform(curve2D);
|
|||
|
int num=curpro.NbPoints();
|
|||
|
|
|||
|
for(int i=1;i<=num;i++)
|
|||
|
{
|
|||
|
if(curpro.Type(i)==LProp_MinCur)
|
|||
|
{
|
|||
|
tempPara=curpro.Parameter(i);
|
|||
|
tempP=myBSplCurve->Value(tempPara);
|
|||
|
mapTempPnts.insert(make_pair(tempPara,tempP));
|
|||
|
}
|
|||
|
if(curpro.Type(i)==LProp_MaxCur)
|
|||
|
{
|
|||
|
tempPara=curpro.Parameter(i);
|
|||
|
tempP=myBSplCurve->Value(tempPara);
|
|||
|
mapTempPnts.insert(make_pair(tempPara,tempP));
|
|||
|
}
|
|||
|
}
|
|||
|
if(mapTempPnts.size()>0)
|
|||
|
{
|
|||
|
for(it=mapTempPnts.begin();it!=mapTempPnts.end();it++)
|
|||
|
{
|
|||
|
pnts.push_back(it->second);
|
|||
|
}
|
|||
|
}
|
|||
|
if(pnts.size()>0)
|
|||
|
{
|
|||
|
for(int j=0;j<pnts.size()-2;j++)
|
|||
|
{
|
|||
|
Handle(Geom_Curve) trimedCurve;
|
|||
|
dataMD.TrimEdgeBy2Points(curve,pnts[j],pnts[j+1],trimedCurve);
|
|||
|
curves.push_back(trimedCurve);
|
|||
|
TopoDS_Edge edge=BRepBuilderAPI_MakeEdge(trimedCurve);
|
|||
|
//2016srq
|
|||
|
/*Handle_AIS_Shape AISShape=new AIS_Shape(edge);
|
|||
|
myOCCViewer.myAISContext->Display(AISShape,true);*/
|
|||
|
|
|||
|
// DELETE BY XUEFENG 20180731
|
|||
|
// FOR CODES COMBINE
|
|||
|
/*
|
|||
|
AnyCore::ASceneNodePtr AISShape=myOCCViewer.TopoShapeToASceneNode(edge);
|
|||
|
myOCCViewer.ShowSceneNode(AISShape);
|
|||
|
*/
|
|||
|
// END DELETE
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
curves.push_back(curve);
|
|||
|
}
|
|||
|
////pnts = new vector<gp_Pnt>();//拐点存储
|
|||
|
////curves = new vector<Geom_Curve>();
|
|||
|
|
|||
|
return curves;
|
|||
|
}
|
|||
|
vector<gp_Pnt> OffsetGenerate1::CalPoints(int ID)
|
|||
|
{
|
|||
|
vector<gp_Pnt> listPnt;
|
|||
|
double df,dl;
|
|||
|
map<int,TopoDS_Shape>::iterator it;
|
|||
|
it=dataMD.m_mapAllTopoShapes.find(ID);
|
|||
|
if(it!=dataMD.m_mapAllTopoShapes.end())
|
|||
|
{
|
|||
|
TopoDS_Edge edge=TopoDS::Edge(it->second);
|
|||
|
Handle_Geom_Curve curve=BRep_Tool::Curve(edge,df,dl);
|
|||
|
|
|||
|
listPnt=CalPoints(curve,df,dl);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//CalPoints(Handle_Geom_Curve curve,int index)
|
|||
|
return listPnt;
|
|||
|
}
|
|||
|
//Flag 当为隧道型船舶
|
|||
|
vector<gp_Pnt> OffsetGenerate1::CalPoints(Handle_Geom_Curve curve,gp_Pnt df,gp_Pnt dl)
|
|||
|
{
|
|||
|
vector<gp_Pnt> listPnt;
|
|||
|
int length = 0;
|
|||
|
|
|||
|
gp_Pnt pt1=df;
|
|||
|
gp_Pnt pt2=dl;
|
|||
|
listPnt.push_back(pt1);
|
|||
|
|
|||
|
int i = 0;
|
|||
|
map<int,double>::iterator it;
|
|||
|
it=dataMD.m_mapStation.begin();
|
|||
|
|
|||
|
|
|||
|
while(it!=dataMD.m_mapStation.end()){
|
|||
|
|
|||
|
vector<gp_Pnt> Points = ExtractePoint(curve,0,it->second);
|
|||
|
int len = Points.size();
|
|||
|
if ((ShipType == 1))
|
|||
|
{
|
|||
|
//取左舷
|
|||
|
if (len >1)
|
|||
|
{
|
|||
|
if (Points[0].Y() > Points[len-1].Y())
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
else
|
|||
|
listPnt.push_back(Points[len-1]);
|
|||
|
}else
|
|||
|
{
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
listPnt.push_back(Or);
|
|||
|
}
|
|||
|
}
|
|||
|
if (ShipType == 4)
|
|||
|
{
|
|||
|
gp_Pnt Or1=gp_Pnt(-99999,0,0);
|
|||
|
int vFlag = 0;
|
|||
|
for (int i=0;i<len;i++)
|
|||
|
if (Points[0].Y() < 0)
|
|||
|
vFlag ++;
|
|||
|
if (vFlag == len) //判断点如果都小于0的情况
|
|||
|
{
|
|||
|
for (int i=0;i<3;i++)
|
|||
|
listPnt.push_back(Or1);
|
|||
|
}else
|
|||
|
{
|
|||
|
switch (len)
|
|||
|
{
|
|||
|
case 1:
|
|||
|
if (Points[0].Y() > 0)
|
|||
|
{
|
|||
|
listPnt.push_back(Or1);
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
}
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
if (Points[0].Y() > Points[1].Y())
|
|||
|
{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Or1);
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
listPnt.push_back(Or1);
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
}
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
case 4:
|
|||
|
case 5:
|
|||
|
if (Points[0].Y() > Points[len-1].Y())
|
|||
|
{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
listPnt.push_back(Or1);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
listPnt.push_back(Points[len-1]);
|
|||
|
listPnt.push_back(Points[len-2]);
|
|||
|
listPnt.push_back(Or1);
|
|||
|
}
|
|||
|
default:
|
|||
|
if (Points[0].Y() > Points[len-1].Y())
|
|||
|
{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
listPnt.push_back(Points[2]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
listPnt.push_back(Points[len-1]);
|
|||
|
listPnt.push_back(Points[len-2]);
|
|||
|
listPnt.push_back(Points[len-3]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if ((ShipType == 2))
|
|||
|
{
|
|||
|
//取左舷
|
|||
|
if (len >1){
|
|||
|
if (AsymmetricType == -1)
|
|||
|
{
|
|||
|
if (len >1)
|
|||
|
{
|
|||
|
if (Points[0].Y() > Points[len-1].Y()){
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[len-1]);}
|
|||
|
else{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[len-1]);}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (len >1)
|
|||
|
{
|
|||
|
if (Points[0].Y() < Points[len-1].Y()){
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[len-1]);}
|
|||
|
else{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[len-1]);}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
listPnt.push_back(Or);
|
|||
|
gp_Pnt Or1;
|
|||
|
Or1=gp_Pnt(-99999,0,0);
|
|||
|
listPnt.push_back(Or1);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
++it;
|
|||
|
}
|
|||
|
listPnt.push_back(pt2);
|
|||
|
return listPnt;
|
|||
|
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 计算水线或者纵剖线的点,给出线,根据纵向X值,得出每个X值上的点,对于首艉端点,则在调用此函数时给出
|
|||
|
///返回一组点,在调用此函数后,分解需要的点放入型值表表达变量中
|
|||
|
/// </summary>
|
|||
|
/// <param name="index">最大站点索引(全部为-1)</param>
|
|||
|
/// <param name="YZ">是半宽y还是高度z</param>
|
|||
|
/// <returns></returns>
|
|||
|
vector<gp_Pnt> OffsetGenerate1::CalPoints(Handle_Geom_Curve curve,double df,double dl,int Flag)
|
|||
|
{
|
|||
|
vector<gp_Pnt> listPnt;
|
|||
|
int length = 0;
|
|||
|
//if (index == -1) length = mStationPos.size();
|
|||
|
// else length = index;
|
|||
|
gp_Pnt pt1=curve->Value(df);
|
|||
|
gp_Pnt pt2=curve->Value(dl);
|
|||
|
listPnt.push_back(pt1);
|
|||
|
|
|||
|
int i = 0;
|
|||
|
map<int,double>::iterator it;
|
|||
|
it=dataMD.m_mapStation.begin();
|
|||
|
|
|||
|
|
|||
|
while(it!=dataMD.m_mapStation.end()){
|
|||
|
|
|||
|
vector<gp_Pnt> Points = ExtractePoint(curve,0,it->second);
|
|||
|
if (Flag == 1){
|
|||
|
int len = Points.size();
|
|||
|
if (len >2)
|
|||
|
{
|
|||
|
if (fabs(Points[0].Y()) > fabs(Points[len-1].Y()))
|
|||
|
{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
listPnt.push_back(Points[2]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
listPnt.push_back(Points[2]);
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (len = 2)
|
|||
|
{
|
|||
|
if (fabs(Points[0].Y()) > fabs(Points[1].Y()))
|
|||
|
{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
listPnt.push_back(Points[1]);
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
}
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
listPnt.push_back(Or);
|
|||
|
}
|
|||
|
else if (len == 1)
|
|||
|
{
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
for (int k=0;k<2;k++)
|
|||
|
{
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
listPnt.push_back(Or);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for (int k=0;k<3;k++)
|
|||
|
{
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
listPnt.push_back(Or);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}else{
|
|||
|
if (Points.size() > 0)
|
|||
|
listPnt.push_back(Points[0]);
|
|||
|
else
|
|||
|
{
|
|||
|
gp_Pnt Or;
|
|||
|
Or=gp_Pnt(-99999,0,0);
|
|||
|
listPnt.push_back(Or);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
++it;
|
|||
|
}
|
|||
|
listPnt.push_back(pt2);
|
|||
|
return listPnt;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 几何曲线与平面相交,求交点
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
vector<gp_Pnt> OffsetGenerate1::ExtractePoint(Handle_Geom_Curve curve,int flag,double pos)
|
|||
|
{
|
|||
|
vector<gp_Pnt> points;
|
|||
|
|
|||
|
//////////
|
|||
|
gp_Pnt Or;
|
|||
|
gp_Dir Norm;
|
|||
|
switch (flag)
|
|||
|
{
|
|||
|
case 0:
|
|||
|
Or=gp_Pnt(pos,0,0);
|
|||
|
Norm=gp_Dir(1, 0.,0 );
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
Or=gp_Pnt(0,pos,0);
|
|||
|
Norm=gp_Dir(0, 1,0 );
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
Or=gp_Pnt(0,0,pos);
|
|||
|
Norm=gp_Dir(0, 0.,1 );
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// gp_Pln pln(Or,Norm);
|
|||
|
// Handle(Geom_Surface) aSurface =GC_MakePlane(pln).Value();
|
|||
|
|
|||
|
|
|||
|
// GeomAPI_IntCS IntCS(curve,aSurface);
|
|||
|
// if (IntCS.IsDone())
|
|||
|
// {
|
|||
|
// if (IntCS.NbPoints() > 0)
|
|||
|
// {
|
|||
|
|
|||
|
// for (int j = 1; j <= IntCS.NbPoints(); j++)
|
|||
|
// {
|
|||
|
// points.push_back(IntCS.Point(j));
|
|||
|
// }
|
|||
|
// }
|
|||
|
// }
|
|||
|
return points;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取曲线中直线段与曲线段的连接点
|
|||
|
/// </summary>
|
|||
|
/// <param name="curve"></param>
|
|||
|
/// <returns></returns>
|
|||
|
vector<gp_Pnt> OffsetGenerate1::GetInflectionPoints(Handle(Geom_Curve) curve)
|
|||
|
{
|
|||
|
vector<gp_Pnt> result;
|
|||
|
vector<gp_Pnt> resultF;
|
|||
|
vector<gp_Pnt> resultB;
|
|||
|
std::vector<TopoDS_Edge> edgeSetF;
|
|||
|
std::vector<gp_Pnt> pointSetF;
|
|||
|
std::vector<TopoDS_Edge> edgeSetB;
|
|||
|
std::vector<gp_Pnt> pointSetB;
|
|||
|
int level = 1;
|
|||
|
|
|||
|
TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(curve).Edge();
|
|||
|
GProp_GProps System;
|
|||
|
BRepGProp::LinearProperties(edge,System);
|
|||
|
edgeSetF.push_back(edge);
|
|||
|
|
|||
|
double step = System.Mass() / 10000/*pow(10000.0, level)*/;
|
|||
|
step = step < 0.01 ? step : 0.01;
|
|||
|
edgeSetF = GetEdgeSet(edgeSetF, step, pointSetF);
|
|||
|
resultF = GetIntersections(edgeSetF, pointSetF, level);
|
|||
|
|
|||
|
for(int i = edgeSetF.size() - 1 ;i > -1; i--)
|
|||
|
{
|
|||
|
edgeSetB.push_back(edgeSetF[i]);
|
|||
|
}
|
|||
|
for(int i = pointSetF.size() - 1 ;i > -1; i--)
|
|||
|
{
|
|||
|
pointSetB.push_back(pointSetF[i]);
|
|||
|
}
|
|||
|
resultB = GetIntersections(edgeSetB, pointSetB, level);
|
|||
|
|
|||
|
int count = resultB.size() + resultF.size();
|
|||
|
double Y = 10000;
|
|||
|
double YMax = -10000;
|
|||
|
gp_Pnt tmp;
|
|||
|
|
|||
|
for(int i = 0; i < count; i++)
|
|||
|
{
|
|||
|
for(int j = 0; j < resultF.size(); j++)
|
|||
|
{
|
|||
|
if(resultF[j].Y() < Y && YMax < resultF[j].Y())
|
|||
|
{
|
|||
|
YMax = resultF[j].Y();
|
|||
|
tmp = resultF[j];
|
|||
|
}
|
|||
|
}
|
|||
|
for(int j = 0; j < resultB.size(); j++)
|
|||
|
{
|
|||
|
if(resultB[j].Y() < Y && YMax < resultB[j].Y())
|
|||
|
{
|
|||
|
YMax = resultB[j].Y();
|
|||
|
tmp = resultB[j];
|
|||
|
}
|
|||
|
}
|
|||
|
result.push_back(tmp);
|
|||
|
Y = YMax;
|
|||
|
YMax = -10000;
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
vector<gp_Pnt> OffsetGenerate1::GetIntersections(vector<TopoDS_Edge> &edgeSet, vector<gp_Pnt> &pointSet, int lev)
|
|||
|
{
|
|||
|
vector<gp_Pnt> result;
|
|||
|
//pointSet.clear();
|
|||
|
if (edgeSet.size() < 2)
|
|||
|
{
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
//连续直线段的长度
|
|||
|
double len = 0;
|
|||
|
bool isline = false;
|
|||
|
|
|||
|
gp_Pnt pointStart, pointEnd;
|
|||
|
|
|||
|
pointStart = pointSet[0];
|
|||
|
bool isStartPoint = true;
|
|||
|
|
|||
|
int edgeIndexStart;
|
|||
|
// int edgeBefore; upd by yu for erase warning 14.8.27
|
|||
|
|
|||
|
for(int i = 0; i < edgeSet.size(); i++)
|
|||
|
{
|
|||
|
//if (i==(edgeSet.size()-1))
|
|||
|
// break;
|
|||
|
pointEnd = pointSet[i+1];
|
|||
|
double dis = gp_Vec(pointStart,pointEnd).Magnitude();
|
|||
|
|
|||
|
double d1,d2;
|
|||
|
Handle_Geom_Curve curve = BRep_Tool::Curve(edgeSet[i], d1, d2);
|
|||
|
|
|||
|
TopExp_Explorer ex;
|
|||
|
ex.Init(edgeSet[i],TopAbs_VERTEX);
|
|||
|
gp_Pnt p1 = BRep_Tool::Pnt(TopoDS::Vertex(ex.Current()));
|
|||
|
ex.Next();
|
|||
|
gp_Pnt p2 = BRep_Tool::Pnt(TopoDS::Vertex(ex.Current()));
|
|||
|
|
|||
|
//GeomAdaptor_Curve C(curve);
|
|||
|
//GCPnts_AbscissaPoint myAlgo;
|
|||
|
//len += myAlgo.Length(C);
|
|||
|
|
|||
|
GProp_GProps System;
|
|||
|
BRepGProp::LinearProperties(edgeSet[i],System);
|
|||
|
gp_Pnt G = System.CentreOfMass ();
|
|||
|
len += System.Mass();
|
|||
|
|
|||
|
|
|||
|
if(fabs(len - dis) < len * 0.02)
|
|||
|
{
|
|||
|
isline = true;
|
|||
|
//len += dis - System.Mass();
|
|||
|
continue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(isline)
|
|||
|
{
|
|||
|
if(!isStartPoint)
|
|||
|
{
|
|||
|
if(lev - 2 < 0)
|
|||
|
{
|
|||
|
result.push_back(pointStart);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
vector<TopoDS_Edge> tmpEdgeSet;
|
|||
|
vector<gp_Pnt> tmpPointSet;
|
|||
|
tmpEdgeSet.push_back(edgeSet[edgeIndexStart]);
|
|||
|
tmpEdgeSet.push_back(edgeSet[edgeIndexStart + 1]);
|
|||
|
|
|||
|
double tmpStep = System.Mass() / pow(10.0, lev - 1);
|
|||
|
tmpEdgeSet = GetEdgeSet(tmpEdgeSet, tmpStep, tmpPointSet);
|
|||
|
|
|||
|
vector<gp_Pnt> tmpResult = GetIntersections(tmpEdgeSet, tmpPointSet, lev - 1);
|
|||
|
|
|||
|
for(int k = 0; k < tmpResult.size(); k++)
|
|||
|
{
|
|||
|
result.push_back(tmpResult[k]);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if(lev - 2 < 0)
|
|||
|
{
|
|||
|
result.push_back(pointSet[i]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
vector<TopoDS_Edge> tmpEdgeSet;
|
|||
|
vector<gp_Pnt> tmpPointSet;
|
|||
|
tmpEdgeSet.push_back(edgeSet[i - 1]);
|
|||
|
tmpEdgeSet.push_back(edgeSet[i]);
|
|||
|
|
|||
|
double tmpStep = System.Mass() / pow(10.0, lev - 1);
|
|||
|
tmpEdgeSet = GetEdgeSet(tmpEdgeSet, tmpStep, tmpPointSet);
|
|||
|
|
|||
|
vector<gp_Pnt> tmpResult = GetIntersections(tmpEdgeSet, tmpPointSet, lev - 1);
|
|||
|
|
|||
|
for(int k = 0; k < tmpResult.size(); k++)
|
|||
|
{
|
|||
|
result.push_back(tmpResult[k]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
pointStart = pointSet[i];
|
|||
|
i--;
|
|||
|
len = 0;
|
|||
|
isline = false;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pointStart = pointEnd;
|
|||
|
edgeIndexStart = i;
|
|||
|
len = 0;
|
|||
|
isStartPoint = false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if(isline && !isStartPoint)
|
|||
|
{
|
|||
|
if(lev - 2 < 0)
|
|||
|
{
|
|||
|
result.push_back(pointStart);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
vector<TopoDS_Edge> tmpEdgeSet;
|
|||
|
vector<gp_Pnt> tmpPointSet;
|
|||
|
tmpEdgeSet.push_back(edgeSet[edgeIndexStart]);
|
|||
|
tmpEdgeSet.push_back(edgeSet[edgeIndexStart + 1]);
|
|||
|
|
|||
|
TopExp_Explorer ex;
|
|||
|
ex.Init(edgeSet[edgeIndexStart],TopAbs_VERTEX);
|
|||
|
gp_Pnt p1 = BRep_Tool::Pnt(TopoDS::Vertex(ex.Current()));
|
|||
|
ex.Next();
|
|||
|
gp_Pnt p2 = BRep_Tool::Pnt(TopoDS::Vertex(ex.Current()));
|
|||
|
|
|||
|
double tmpStep = gp_Vec(p1,p2).Magnitude() / pow(10.0, lev - 1);
|
|||
|
tmpEdgeSet = GetEdgeSet(tmpEdgeSet, tmpStep, tmpPointSet);
|
|||
|
vector<gp_Pnt> tmpResult = GetIntersections(tmpEdgeSet, tmpPointSet, lev - 1);
|
|||
|
|
|||
|
for(int k = 0; k < tmpResult.size(); k++)
|
|||
|
{
|
|||
|
result.push_back(tmpResult[k]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
vector<TopoDS_Edge> OffsetGenerate1::GetEdgeSet(vector<TopoDS_Edge>& edgeSet, double step , vector<gp_Pnt>& pointSet)
|
|||
|
{
|
|||
|
vector<TopoDS_Edge> newEdgeSet;
|
|||
|
pointSet.clear();
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edgeSet.begin(); iter != edgeSet.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = *iter;
|
|||
|
double df,dl;
|
|||
|
Handle(Geom_Curve) aCur = BRep_Tool::Curve(edge,df,dl);
|
|||
|
|
|||
|
TopExp_Explorer ex(edge, TopAbs_VERTEX);
|
|||
|
gp_Pnt startPoint = BRep_Tool::Pnt(TopoDS::Vertex(ex.Current()));
|
|||
|
ex.Next();
|
|||
|
gp_Pnt endPoint = BRep_Tool::Pnt(TopoDS::Vertex(ex.Current()));
|
|||
|
|
|||
|
Standard_Real st1 = 0;
|
|||
|
Standard_Real st2 = 0;
|
|||
|
|
|||
|
double len = 0;
|
|||
|
|
|||
|
|
|||
|
//GeomAPI_ProjectPointOnCurve Projector1 (startPoint, aCur); //gp_Pnt Bpnt
|
|||
|
//GeomAPI_ProjectPointOnCurve Projector2 (endPoint, aCur); //gp_Pnt Bpnt
|
|||
|
|
|||
|
//st1 = Projector1.LowerDistanceParameter();
|
|||
|
//st2 = Projector2.LowerDistanceParameter();
|
|||
|
|
|||
|
BaseAlgo algo;
|
|||
|
st1 = algo.ProjectPointOnCurvePara(edge, startPoint);
|
|||
|
st2 = algo.ProjectPointOnCurvePara(edge, startPoint);
|
|||
|
|
|||
|
len = fabs(st2 - st1);
|
|||
|
|
|||
|
|
|||
|
double surplus = len;
|
|||
|
double head = st1;
|
|||
|
|
|||
|
while(surplus > step * 1.5)
|
|||
|
{
|
|||
|
double tail = head + step;
|
|||
|
Handle(Geom_TrimmedCurve) myTrimmed = new Geom_TrimmedCurve(aCur, head, tail);
|
|||
|
newEdgeSet.push_back(BRepBuilderAPI_MakeEdge(myTrimmed).Edge());
|
|||
|
if(pointSet.size() < 1)
|
|||
|
{
|
|||
|
pointSet.push_back(aCur->Value(head));
|
|||
|
}
|
|||
|
pointSet.push_back(aCur->Value(tail));
|
|||
|
head = tail;
|
|||
|
surplus -= step;
|
|||
|
}
|
|||
|
Handle(Geom_TrimmedCurve) myTrimmed = new Geom_TrimmedCurve(aCur, head, st2);
|
|||
|
newEdgeSet.push_back(BRepBuilderAPI_MakeEdge(myTrimmed).Edge());
|
|||
|
if(pointSet.size() < 0)
|
|||
|
{
|
|||
|
pointSet.push_back(aCur->Value(head));
|
|||
|
}
|
|||
|
pointSet.push_back(aCur->Value(st2));
|
|||
|
}
|
|||
|
|
|||
|
return newEdgeSet;
|
|||
|
}
|
|||
|
|
|||
|
//*根据站和水线位置,计算船壳相应位置的型值点 yc 20141222
|
|||
|
int OffsetGenerate1::GetOffsetTableData(int stationNum, double stations[],int waterlineNum,double waterlines[], int pNum[], OffsetTablePoint *pnts, OffsetTablePoint *zmaxPnts,double *zmins,OffsetTablePoint *yPnts)
|
|||
|
{
|
|||
|
vector<gp_Pnt> pSet;
|
|||
|
vector<gp_Pnt> zpmaxSet;
|
|||
|
vector<gp_Pnt> ypSet;
|
|||
|
OCCLib lib;
|
|||
|
BaseAlgo algo;
|
|||
|
//获取船壳
|
|||
|
TopoDS_Shape shipShell;
|
|||
|
if(dataMD.m_mapShellSurf.size()==1)
|
|||
|
shipShell=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->first)->second;
|
|||
|
if(shipShell.IsNull())
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
for(int i = 0; i < stationNum; i++)
|
|||
|
{
|
|||
|
double x = stations[i];
|
|||
|
//生成横剖面
|
|||
|
TopoDS_Face stationFace = lib.CreateFaceByPoints(gp_Pnt(x, 200, 200),gp_Pnt(x, -200, 200),gp_Pnt(x, -200, -200),gp_Pnt(x, 200, -200));
|
|||
|
Handle(Geom_Surface) aSurface = BRep_Tool::Surface(stationFace);
|
|||
|
//求交线
|
|||
|
TopoDS_Shape stationLine;
|
|||
|
BRepAlgoAPI_Section asect(stationFace,shipShell,Standard_False);
|
|||
|
asect.ComputePCurveOn1(Standard_True);
|
|||
|
asect.Approximation(Standard_True);
|
|||
|
asect.Build();
|
|||
|
TopoDS_Shape splitResult = asect.Shape();
|
|||
|
|
|||
|
for(int j = 0; j < waterlineNum; j++)
|
|||
|
{
|
|||
|
double z = waterlines[j];
|
|||
|
//生成水线面
|
|||
|
TopoDS_Face waterLineFace = lib.CreateFaceByPoints(gp_Pnt(200, 200, z),gp_Pnt(200, -200, z),gp_Pnt(-200, -200, -z),gp_Pnt(-200, 200, -z));
|
|||
|
|
|||
|
//与横剖线计算交点
|
|||
|
vector<gp_Pnt> pSetTmp;
|
|||
|
for(TopExp_Explorer ex(splitResult, TopAbs_EDGE); ex.More(); ex.Next())
|
|||
|
{
|
|||
|
double first,last;
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(ex.Current());
|
|||
|
Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, first, last);
|
|||
|
curve = new Geom_TrimmedCurve(curve, first, last);
|
|||
|
|
|||
|
GeomAPI_IntCS intcs_sn(curve, aSurface);
|
|||
|
if (!intcs_sn.IsDone())
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
int nPnt=intcs_sn.NbPoints();
|
|||
|
|
|||
|
for(int k = 0; k < nPnt; k++)
|
|||
|
{
|
|||
|
gp_Pnt pnt = intcs_sn.Point(k + 1);
|
|||
|
|
|||
|
if((abs(pnt.X() - x) < Precision::Confusion() && abs(pnt.Z() - z) < Precision::Confusion()) && !IsFindPoint(pSetTmp, pnt))
|
|||
|
{
|
|||
|
pSetTmp.push_back(pnt);
|
|||
|
}
|
|||
|
}
|
|||
|
}//for(TopExp_Explorer ex(splitResult, TopAbs_EDGE); ex.More(); ex.Next())
|
|||
|
|
|||
|
pNum[i * waterlineNum + j] = pSetTmp.size();
|
|||
|
for(int k = 0; k < pSetTmp.size(); k++)
|
|||
|
{
|
|||
|
pSet.push_back(pSetTmp[k]);
|
|||
|
}
|
|||
|
}// for(int j = 0; j < waterlineNum; j++)
|
|||
|
|
|||
|
//计算甲板边线
|
|||
|
gp_Pnt pZmax(-100,-100,-100), pZmin(100, 100, 100), pY(100,100,100);
|
|||
|
Bnd_Box box;
|
|||
|
for(TopExp_Explorer ex(splitResult, TopAbs_EDGE); ex.More(); ex.Next())
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(ex.Current());
|
|||
|
gp_Pnt p1,p2;
|
|||
|
algo.GetEdgeStartEndPoint(edge, p1,p2);
|
|||
|
|
|||
|
BRepBndLib::Add(edge, box);
|
|||
|
|
|||
|
if(p1.Z() > pZmax.Z())
|
|||
|
{
|
|||
|
pZmax = p1;
|
|||
|
}
|
|||
|
if(p2.Z() > pZmax.Z())
|
|||
|
{
|
|||
|
pZmax = p2;
|
|||
|
}
|
|||
|
|
|||
|
if(abs(p1.Y()) < Precision::Confusion())
|
|||
|
{
|
|||
|
pY = p1;
|
|||
|
}
|
|||
|
if(abs(p2.Y()) < Precision::Confusion())
|
|||
|
{
|
|||
|
pY = p2;
|
|||
|
}
|
|||
|
}
|
|||
|
zpmaxSet.push_back(pZmax);
|
|||
|
ypSet.push_back(pY);
|
|||
|
double x1,x2,y1,y2,z1,z2;
|
|||
|
box.SetGap(0.0);
|
|||
|
box.Get(x1,y1,z1,x2,y2,z2);
|
|||
|
zmins[i] = z1;
|
|||
|
}//for(int i = 0; i < stationNum; i++)
|
|||
|
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
pnts[i].X = pSet[i].X();
|
|||
|
pnts[i].Y = pSet[i].Y();
|
|||
|
pnts[i].Z = pSet[i].Z();
|
|||
|
}
|
|||
|
for(int i = 0; i < zpmaxSet.size(); i++)
|
|||
|
{
|
|||
|
zmaxPnts[i].X = zpmaxSet[i].X();
|
|||
|
zmaxPnts[i].Y = zpmaxSet[i].Y();
|
|||
|
zmaxPnts[i].Z = zpmaxSet[i].Z();
|
|||
|
}
|
|||
|
|
|||
|
for(int i = 0; i < ypSet.size(); i++)
|
|||
|
{
|
|||
|
yPnts[i].X = ypSet[i].X();
|
|||
|
yPnts[i].Y = ypSet[i].Y();
|
|||
|
yPnts[i].Z = ypSet[i].Z();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
//判断点是否在集合中
|
|||
|
bool OffsetGenerate1::IsFindPoint(vector<gp_Pnt> pSet, gp_Pnt p)
|
|||
|
{
|
|||
|
bool isfind = false;
|
|||
|
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
if(p.Distance(pSet[i]) < Precision::Confusion())
|
|||
|
{
|
|||
|
isfind = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return isfind;
|
|||
|
}
|
|||
|
|
|||
|
//*根据站和水线位置,计算船壳相应位置的型值点 yc 20141222
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 生成水线面,横剖面,纵剖面
|
|||
|
/// </summary>
|
|||
|
/// <param name="flag"> -1 x平面 =-2 y平面 =-3 z平面 </param>
|
|||
|
/// <param name="pos"> 位置 </param>
|
|||
|
/// <returns></returns>
|
|||
|
TopoDS_Face OffsetGenerate1::CreateFace(int flag, double pos)
|
|||
|
{
|
|||
|
TopoDS_Face face;
|
|||
|
gp_Pnt Or;
|
|||
|
gp_Dir Norm;
|
|||
|
switch(flag)
|
|||
|
{
|
|||
|
case -1:
|
|||
|
Or=gp_Pnt(pos,0,0);
|
|||
|
Norm=gp_Dir(1, 0.,0 );
|
|||
|
break;
|
|||
|
case -2:
|
|||
|
Or=gp_Pnt(0,pos,0.);
|
|||
|
Norm=gp_Dir(0., 1, 0.);
|
|||
|
break;
|
|||
|
case -3:
|
|||
|
Or=gp_Pnt(0,0,pos);
|
|||
|
Norm=gp_Dir(0., 0., 1.);
|
|||
|
break;
|
|||
|
default:
|
|||
|
return face;
|
|||
|
}
|
|||
|
// gp_Pln pln(Or,Norm);
|
|||
|
// Handle(Geom_Surface) aSurface =GC_MakePlane(pln).Value();
|
|||
|
|
|||
|
// //BRepBuilderAPI_MakeFace face1 =BRepBuilderAPI_MakeFace(aSurface);// XUEFENG DELETE 202009
|
|||
|
// BRepBuilderAPI_MakeFace face1 =BRepBuilderAPI_MakeFace(aSurface, Precision::Confusion()); // XUEFENG ADDED 202009
|
|||
|
|
|||
|
// face=face1.Face();
|
|||
|
return face;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 求交线
|
|||
|
/// </summary>
|
|||
|
/// <param name="shape1"> </param>
|
|||
|
/// <param name="shape2"> </param>
|
|||
|
/// <returns></returns>
|
|||
|
vector<TopoDS_Edge> OffsetGenerate1::GetSectionEdges(TopoDS_Shape shape1, TopoDS_Shape shape2)
|
|||
|
{
|
|||
|
vector<TopoDS_Edge> edges;
|
|||
|
|
|||
|
BRepAlgoAPI_Section asect(shape1,shape2,Standard_False);
|
|||
|
asect.ComputePCurveOn1(Standard_True);
|
|||
|
asect.Approximation(Standard_True);
|
|||
|
asect.Build();
|
|||
|
TopoDS_Shape splitResult = asect.Shape();
|
|||
|
|
|||
|
|
|||
|
for (TopExp_Explorer Ex(splitResult,TopAbs_EDGE); Ex.More(); Ex.Next())
|
|||
|
{
|
|||
|
TopoDS_Edge anEdge =TopoDS::Edge(Ex.Current());
|
|||
|
edges.push_back(anEdge);
|
|||
|
|
|||
|
//2016srq
|
|||
|
////Handle_AIS_Shape aisShape=new AIS_Shape(anEdge);
|
|||
|
////
|
|||
|
//// myOCCViewer.myAISContext->Display(aisShape,false);
|
|||
|
//AnyCore::ASceneNodePtr aisShape=myOCCViewer.TopoShapeToASceneNode(anEdge);
|
|||
|
//
|
|||
|
// myOCCViewer.ShowSceneNode(aisShape,false);
|
|||
|
}
|
|||
|
|
|||
|
return edges;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 求半船壳
|
|||
|
/// </summary>
|
|||
|
/// <param name="shape1"> </param>
|
|||
|
/// <returns></returns>
|
|||
|
void OffsetGenerate1::GetHalfShell()
|
|||
|
{
|
|||
|
if(dataMD.m_mapShellSurf.size()==1)
|
|||
|
{
|
|||
|
TopoDS_Shape shape2=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->first)->second;
|
|||
|
OCCLib lib;
|
|||
|
TopoDS_Solid solid = lib.CreateSolid(gp_Pnt(-1000,0,-10), 2000,100,100);
|
|||
|
BRepAlgoAPI_Common newcut(solid ,shape2);
|
|||
|
if(newcut.IsDone())
|
|||
|
{
|
|||
|
halfShell = newcut.Shape();
|
|||
|
}
|
|||
|
}
|
|||
|
return ;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 与船壳面求交线
|
|||
|
/// </summary>
|
|||
|
/// <param name="shape1"> </param>
|
|||
|
/// <returns></returns>
|
|||
|
vector<TopoDS_Edge> OffsetGenerate1::GetShellSectionEdges(TopoDS_Shape shape1)
|
|||
|
{
|
|||
|
vector<TopoDS_Edge> edges;
|
|||
|
|
|||
|
edges = GetSectionEdges(shape1, halfShell);
|
|||
|
|
|||
|
return edges;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 线面求交点
|
|||
|
/// </summary>
|
|||
|
/// <param name="shape1"> </param>
|
|||
|
/// <returns></returns>
|
|||
|
vector<gp_Pnt> OffsetGenerate1::GetSectionPoints(TopoDS_Edge edge, TopoDS_Face face)
|
|||
|
{
|
|||
|
vector<gp_Pnt> pnts;
|
|||
|
double first,last;
|
|||
|
Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, first, last);
|
|||
|
curve = new Geom_TrimmedCurve(curve, first, last);
|
|||
|
|
|||
|
Handle(Geom_Surface) aSurface = BRep_Tool::Surface(face);
|
|||
|
|
|||
|
GeomAPI_IntCS intcs_sn(curve, aSurface);
|
|||
|
if (!intcs_sn.IsDone())
|
|||
|
{
|
|||
|
return pnts;
|
|||
|
}
|
|||
|
int nPnt=intcs_sn.NbPoints();
|
|||
|
|
|||
|
for(int k = 0; k < nPnt; k++)
|
|||
|
{
|
|||
|
gp_Pnt pnt = intcs_sn.Point(k + 1);
|
|||
|
pnts.push_back(pnt);
|
|||
|
}
|
|||
|
|
|||
|
//if(pnts.size() == 0)
|
|||
|
//{
|
|||
|
// return GetSectionPoints1(edge, face);
|
|||
|
//}
|
|||
|
return pnts;
|
|||
|
}
|
|||
|
|
|||
|
vector<gp_Pnt> OffsetGenerate1::GetSectionPoints1(TopoDS_Edge edge, TopoDS_Shape face)
|
|||
|
{
|
|||
|
vector<gp_Pnt> pnts;
|
|||
|
BRepExtrema_DistShapeShape inter;
|
|||
|
inter.LoadS1(edge);
|
|||
|
inter .LoadS2(face);
|
|||
|
inter.Perform();
|
|||
|
int nPnt= inter.NbSolution();
|
|||
|
|
|||
|
for(int k = 0; k < nPnt; k++)
|
|||
|
{
|
|||
|
gp_Pnt pnt1 = inter.PointOnShape1(k+1);
|
|||
|
gp_Pnt pnt2 = inter.PointOnShape2(k + 1);
|
|||
|
//if(pnt1.Distance(pnt2) > Precision::Confusion())
|
|||
|
//{
|
|||
|
// continue;
|
|||
|
//}
|
|||
|
pnts.push_back(pnt1);
|
|||
|
}
|
|||
|
return pnts;
|
|||
|
}
|
|||
|
//根据x,y或z的值,删除点
|
|||
|
vector<gp_Pnt> OffsetGenerate1::CleanPoints(vector<gp_Pnt> pSet, int flag, double pos)
|
|||
|
{
|
|||
|
vector<gp_Pnt> pnts;
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
switch(flag)
|
|||
|
{
|
|||
|
case -1:
|
|||
|
if(abs(pSet[i].X() - pos) <Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(pSet[i]);
|
|||
|
}
|
|||
|
break;
|
|||
|
case -2:
|
|||
|
if(abs(pSet[i].Y() - pos) <Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(pSet[i]);
|
|||
|
}
|
|||
|
break;
|
|||
|
case -3:
|
|||
|
if(abs(pSet[i].Z() - pos) <Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(pSet[i]);
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
return pnts;
|
|||
|
}
|
|||
|
//合并点集合
|
|||
|
vector<gp_Pnt> OffsetGenerate1::AddPoints(vector<gp_Pnt> pSet1, vector<gp_Pnt> pSet2)
|
|||
|
{
|
|||
|
vector<gp_Pnt> pnts;
|
|||
|
for(int i = 0; i < pSet1.size(); i++)
|
|||
|
{
|
|||
|
pnts.push_back(pSet1[i]);
|
|||
|
}
|
|||
|
|
|||
|
for(int i = 0; i < pSet2.size(); i++)
|
|||
|
{
|
|||
|
bool isfind = false;
|
|||
|
for(int j = 0; j < pnts.size(); j++)
|
|||
|
{
|
|||
|
if(pSet2[i].Distance(pnts[j]) < Precision::Confusion())
|
|||
|
{
|
|||
|
isfind = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if(!isfind)
|
|||
|
{
|
|||
|
pnts.push_back(pSet2[i]);
|
|||
|
}
|
|||
|
}
|
|||
|
return pnts;
|
|||
|
}
|
|||
|
//计算极值点
|
|||
|
vector<gp_Pnt> OffsetGenerate1::GetExtremePoints(vector<gp_Pnt> pSet, int flag)
|
|||
|
{
|
|||
|
vector<gp_Pnt> pnts;
|
|||
|
double val ;
|
|||
|
switch(flag)
|
|||
|
{
|
|||
|
case 1:
|
|||
|
val = -1e10;
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
gp_Pnt p = pSet[i];
|
|||
|
if(abs(p.X() - val) < Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
else if(p.X() > val)
|
|||
|
{
|
|||
|
val = p.X();
|
|||
|
pnts.clear();
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
val = -1e10;
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
gp_Pnt p = pSet[i];
|
|||
|
if(abs(p.Y() - val) < Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
else if(p.Y() > val)
|
|||
|
{
|
|||
|
val = p.Y();
|
|||
|
pnts.clear();
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
val = -1e10;
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
gp_Pnt p = pSet[i];
|
|||
|
if(abs(p.Z() - val) < Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
else if(p.Z() > val)
|
|||
|
{
|
|||
|
val = p.Z();
|
|||
|
pnts.clear();
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case -1:
|
|||
|
val = 1e10;
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
gp_Pnt p = pSet[i];
|
|||
|
if(abs(p.X() - val) < Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
else if(p.X() < val)
|
|||
|
{
|
|||
|
val = p.X();
|
|||
|
pnts.clear();
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case -2:
|
|||
|
val = 1e10;
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
gp_Pnt p = pSet[i];
|
|||
|
if(abs(p.Y() - val) < Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
else if(p.Y() < val)
|
|||
|
{
|
|||
|
val = p.Y();
|
|||
|
pnts.clear();
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case -3:
|
|||
|
val = 1e10;
|
|||
|
for(int i = 0; i < pSet.size(); i++)
|
|||
|
{
|
|||
|
gp_Pnt p = pSet[i];
|
|||
|
if(abs(p.Z() - val) < Precision::Confusion())
|
|||
|
{
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
else if(p.Z() < val)
|
|||
|
{
|
|||
|
val = p.Z();
|
|||
|
pnts.clear();
|
|||
|
pnts.push_back(p);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
return pnts;
|
|||
|
}
|
|||
|
|
|||
|
//甲板下移76mm
|
|||
|
int OffsetGenerate1::GetMarginLineleData(int lens[], OffsetTablePoint *pnts)
|
|||
|
{
|
|||
|
TopoDS_Shape TopoShape,sshape1,sshape2, topoSolid;
|
|||
|
//GetHalfShell();
|
|||
|
if(dataMD.m_mapMainDeckSurf.size()==1)
|
|||
|
sshape1=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapMainDeckSurf.begin()->first)->second;
|
|||
|
else
|
|||
|
return -1; //Volume;
|
|||
|
if(dataMD.m_mapShellSurf.size()==1)
|
|||
|
sshape2=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->first)->second;
|
|||
|
else
|
|||
|
return -1; //Volume;
|
|||
|
|
|||
|
//gp_Trsf theTransformation;
|
|||
|
//theTransformation.SetTranslation(gp_Vec(0,0,-0.076));
|
|||
|
//sshape1= BRepBuilderAPI_Transform(sshape1, theTransformation, false);
|
|||
|
|
|||
|
vector<TopoDS_Edge> edges;
|
|||
|
//vector<TopoDS_Edge> edges = GetSectionEdges(sshape1, sshape2);
|
|||
|
//甲板外边线
|
|||
|
for(TopExp_Explorer ex(sshape1, TopAbs_EDGE); ex.More(); ex.Next())
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(ex.Current());
|
|||
|
Bnd_Box boxE;
|
|||
|
double xE1,xE2,yE1,yE2,zE1,zE2;
|
|||
|
BRepBndLib::Add(edge, boxE);
|
|||
|
boxE.SetGap(0.0);
|
|||
|
boxE.Get(xE1,yE1,zE1,xE2,yE2,zE2);
|
|||
|
|
|||
|
if(yE1 < 0 || yE2 < 0)//负半边
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
else if(abs(yE1) <Precision::Confusion() && abs(yE2) < Precision::Confusion())//y=0
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
edges.push_back(edge);
|
|||
|
}
|
|||
|
|
|||
|
Bnd_Box box;
|
|||
|
double x1,x2,y1,y2,z1,z2;
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
BRepBndLib::Add(edge, box);
|
|||
|
}
|
|||
|
box.SetGap(0.0);
|
|||
|
box.Get(x1,y1,z1,x2,y2,z2);
|
|||
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|||
|
//艉端点
|
|||
|
vector<gp_Pnt> pSetD;
|
|||
|
TopoDS_Face fd = CreateFace(-1, x1);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetDTmp = GetSectionPoints1(edge, fd);
|
|||
|
//pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
pSetD = AddPoints(pSetD, pSetDTmp);
|
|||
|
}
|
|||
|
pSetD = GetExtremePoints(pSetD, -1);
|
|||
|
double xD = 10000,zD = 0;
|
|||
|
for(int i = 0; i < pSetD.size(); i++)
|
|||
|
{
|
|||
|
if(xD > pSetD[i].X())
|
|||
|
{
|
|||
|
xD = pSetD[i].X();
|
|||
|
zD = pSetD[i].Z();
|
|||
|
}
|
|||
|
}
|
|||
|
fd = CreateFace(-3, zD - 0.076);
|
|||
|
pSetD.clear();
|
|||
|
vector<TopoDS_Edge> edgesD = GetSectionEdges(sshape2, fd);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edgesD.begin(); iter != edgesD.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetDTmp = GetSectionPoints1(edge, fd);
|
|||
|
//pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
pSetD = AddPoints(pSetD, pSetDTmp);
|
|||
|
}
|
|||
|
pSetD = GetExtremePoints(pSetD, -1);
|
|||
|
OPoints.insert(make_pair(OPoints.size(),pSetD));
|
|||
|
//------------------------------------------------------------------------------------------------------
|
|||
|
//站
|
|||
|
int count = 0;
|
|||
|
for(int i = 0; i < dataMD.m_mapStation.size(); i++)
|
|||
|
{
|
|||
|
double x = dataMD.m_mapStation[i];
|
|||
|
vector<gp_Pnt> pSet;
|
|||
|
//TopoDS_Face f = CreateFace(-1, x);
|
|||
|
//vector<TopoDS_Edge> edgesS = GetSectionEdges(sshape2, f);
|
|||
|
//if(edgesS.size() > 0)
|
|||
|
//{
|
|||
|
// Bnd_Box boxS;
|
|||
|
// double xS1,xS2,yS1,yS2,zS1,zS2;
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edgesS.begin(); iter != edgesS.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// BRepBndLib::Add(edge, boxS);
|
|||
|
// }
|
|||
|
// boxS.SetGap(0.0);
|
|||
|
// boxS.Get(xS1,yS1,zS1,xS2,yS2,zS2);
|
|||
|
// f = CreateFace(-3, zS2- 0.076);
|
|||
|
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edgesS.begin(); iter != edgesS.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// vector<gp_Pnt> pSetTmp = GetSectionPoints(edge, f);
|
|||
|
// pSetTmp = CleanPoints(pSetTmp, -1, x);
|
|||
|
// pSet = AddPoints(pSet, pSetTmp);
|
|||
|
// count++;
|
|||
|
// }
|
|||
|
//}
|
|||
|
TopoDS_Face f = CreateFace(-1, x);
|
|||
|
double z = -1;
|
|||
|
for(int k = 0; k < edges.size(); k++)
|
|||
|
{
|
|||
|
Bnd_Box boxE;
|
|||
|
double xE1,xE2,yE1,yE2,zE1,zE2;
|
|||
|
BRepBndLib::Add(edges[k], boxE);
|
|||
|
boxE.SetGap(0.0);
|
|||
|
boxE.Get(xE1,yE1,zE1,xE2,yE2,zE2);
|
|||
|
|
|||
|
if(xE2 < x || xE1 > x)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
vector<gp_Pnt> pSetTmp = GetSectionPoints(edges[k], f);
|
|||
|
if(pSetTmp.size() == 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
z = pSetTmp[0].Z();
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if(z < 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(gp_Pnt(x,100,z- 0.076), gp_Pnt(x,-100,z- 0.076));
|
|||
|
vector<gp_Pnt> pSetTmp = GetSectionPoints1(edge, sshape2);
|
|||
|
pSetTmp = CleanPoints(pSetTmp, -1, x);
|
|||
|
pSet = AddPoints(pSet, pSetTmp);
|
|||
|
OPoints.insert(make_pair(OPoints.size(),pSet));
|
|||
|
}
|
|||
|
//----------------------------------------------------------------------------------------------
|
|||
|
//艏端点
|
|||
|
vector<gp_Pnt> pSetF;
|
|||
|
TopoDS_Face ff = CreateFace(-1, x2);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetFTmp = GetSectionPoints1(edge, ff);
|
|||
|
//pSetFTmp = CleanPoints(pSetFTmp, -1, x1);
|
|||
|
pSetF = AddPoints(pSetF, pSetFTmp);
|
|||
|
}
|
|||
|
pSetF = GetExtremePoints(pSetF, 1);
|
|||
|
|
|||
|
double xF = -10000,zF = 0;
|
|||
|
for(int i = 0; i < pSetF.size(); i++)
|
|||
|
{
|
|||
|
if(xF < pSetF[i].X())
|
|||
|
{
|
|||
|
xF = pSetF[i].X();
|
|||
|
zF = pSetF[i].Z();
|
|||
|
}
|
|||
|
}
|
|||
|
ff = CreateFace(-3, zF - 0.076);
|
|||
|
pSetF.clear();
|
|||
|
vector<TopoDS_Edge> edgesF = GetSectionEdges(sshape2, ff);
|
|||
|
for(vector<TopoDS_Edge>::iterator iter = edgesF.begin(); iter != edgesF.end(); iter++)
|
|||
|
{
|
|||
|
TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
vector<gp_Pnt> pSetFTmp = GetSectionPoints1(edge, ff);
|
|||
|
//pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
pSetF = AddPoints(pSetF, pSetFTmp);
|
|||
|
}
|
|||
|
pSetF = GetExtremePoints(pSetF, 1);
|
|||
|
OPoints.insert(make_pair(OPoints.size(),pSetF));
|
|||
|
|
|||
|
map<int,vector<gp_Pnt>>::iterator it;
|
|||
|
it=OPoints.begin();
|
|||
|
|
|||
|
int i = 0;
|
|||
|
int j=0;
|
|||
|
int cnt=0;
|
|||
|
while(it!=OPoints.end()){
|
|||
|
for (j=0;j<it->second.size();j++)
|
|||
|
{
|
|||
|
if(it->second[j].Y() < 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
pnts[cnt].X= it->second[j].X();
|
|||
|
pnts[cnt].Y = it->second[j].Y();
|
|||
|
pnts[cnt++].Z = it->second[j].Z();
|
|||
|
break;
|
|||
|
}
|
|||
|
//cnt = cnt+j;
|
|||
|
//lens[i] = j;
|
|||
|
i++;
|
|||
|
it++;
|
|||
|
}
|
|||
|
lens[0] = OPoints.size();
|
|||
|
return 0;
|
|||
|
}
|
|||
|
//int OffsetGenerate1::GetMarginLineleData(int lens[], OffsetTablePoint *pnts)
|
|||
|
//{
|
|||
|
// TopoDS_Shape TopoShape,sshape1,sshape2, topoSolid;
|
|||
|
// //GetHalfShell();
|
|||
|
// if(dataMD.m_mapMainDeckSurf.size()==1)
|
|||
|
// sshape1=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapMainDeckSurf.begin()->first)->second;
|
|||
|
// else
|
|||
|
// return -1; //Volume;
|
|||
|
// if(dataMD.m_mapShellSurf.size()==1)
|
|||
|
// sshape2=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->first)->second;
|
|||
|
// else
|
|||
|
// return -1; //Volume;
|
|||
|
//
|
|||
|
// //gp_Trsf theTransformation;
|
|||
|
// //theTransformation.SetTranslation(gp_Vec(0,0,-0.076));
|
|||
|
// //sshape1= BRepBuilderAPI_Transform(sshape1, theTransformation, false);
|
|||
|
//
|
|||
|
// vector<TopoDS_Edge> edges = GetSectionEdges(sshape1, sshape2);
|
|||
|
// Bnd_Box box;
|
|||
|
// double x1,x2,y1,y2,z1,z2;
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// BRepBndLib::Add(edge, box);
|
|||
|
// }
|
|||
|
// box.SetGap(0.0);
|
|||
|
// box.Get(x1,y1,z1,x2,y2,z2);
|
|||
|
// //-----------------------------------------------------------------------------------------------------------------------------
|
|||
|
// //艉端点
|
|||
|
// vector<gp_Pnt> pSetD;
|
|||
|
// TopoDS_Face fd = CreateFace(-1, x1);
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// vector<gp_Pnt> pSetDTmp = GetSectionPoints1(edge, fd);
|
|||
|
// //pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
// pSetD = AddPoints(pSetD, pSetDTmp);
|
|||
|
// }
|
|||
|
// pSetD = GetExtremePoints(pSetD, -1);
|
|||
|
// double xD = 10000,zD = 0;
|
|||
|
// for(int i = 0; i < pSetD.size(); i++)
|
|||
|
// {
|
|||
|
// if(xD > pSetD[i].X())
|
|||
|
// {
|
|||
|
// xD = pSetD[i].X();
|
|||
|
// zD = pSetD[i].Z();
|
|||
|
// }
|
|||
|
// }
|
|||
|
// fd = CreateFace(-3, zD - 0.076);
|
|||
|
// pSetD.clear();
|
|||
|
// vector<TopoDS_Edge> edgesD = GetSectionEdges(sshape2, fd);
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edgesD.begin(); iter != edgesD.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// vector<gp_Pnt> pSetDTmp = GetSectionPoints1(edge, fd);
|
|||
|
// //pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
// pSetD = AddPoints(pSetD, pSetDTmp);
|
|||
|
// }
|
|||
|
// pSetD = GetExtremePoints(pSetD, -1);
|
|||
|
// OPoints.insert(make_pair(OPoints.size(),pSetD));
|
|||
|
// //------------------------------------------------------------------------------------------------------
|
|||
|
// //站
|
|||
|
// int count = 0;
|
|||
|
// for(int i = 0; i < dataMD.m_mapStation.size(); i++)
|
|||
|
// {
|
|||
|
// double x = dataMD.m_mapStation[i];
|
|||
|
// vector<gp_Pnt> pSet;
|
|||
|
// TopoDS_Face f = CreateFace(-1, x);
|
|||
|
// vector<TopoDS_Edge> edgesS = GetSectionEdges(sshape2, f);
|
|||
|
// if(edgesS.size() > 0)
|
|||
|
// {
|
|||
|
// Bnd_Box boxS;
|
|||
|
// double xS1,xS2,yS1,yS2,zS1,zS2;
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edgesS.begin(); iter != edgesS.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// BRepBndLib::Add(edge, boxS);
|
|||
|
// }
|
|||
|
// boxS.SetGap(0.0);
|
|||
|
// boxS.Get(xS1,yS1,zS1,xS2,yS2,zS2);
|
|||
|
// f = CreateFace(-3, zS2- 0.076);
|
|||
|
//
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edgesS.begin(); iter != edgesS.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// vector<gp_Pnt> pSetTmp = GetSectionPoints(edge, f);
|
|||
|
// pSetTmp = CleanPoints(pSetTmp, -1, x);
|
|||
|
// pSet = AddPoints(pSet, pSetTmp);
|
|||
|
// count++;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// OPoints.insert(make_pair(OPoints.size(),pSet));
|
|||
|
// }
|
|||
|
// //----------------------------------------------------------------------------------------------
|
|||
|
// //艏端点
|
|||
|
// vector<gp_Pnt> pSetF;
|
|||
|
// TopoDS_Face ff = CreateFace(-1, x2);
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edges.begin(); iter != edges.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// vector<gp_Pnt> pSetFTmp = GetSectionPoints1(edge, ff);
|
|||
|
// //pSetFTmp = CleanPoints(pSetFTmp, -1, x1);
|
|||
|
// pSetF = AddPoints(pSetF, pSetFTmp);
|
|||
|
// }
|
|||
|
// pSetF = GetExtremePoints(pSetF, 1);
|
|||
|
//
|
|||
|
// double xF = -10000,zF = 0;
|
|||
|
// for(int i = 0; i < pSetF.size(); i++)
|
|||
|
// {
|
|||
|
// if(xF < pSetF[i].X())
|
|||
|
// {
|
|||
|
// xF = pSetF[i].X();
|
|||
|
// zF = pSetF[i].Z();
|
|||
|
// }
|
|||
|
// }
|
|||
|
// ff = CreateFace(-3, zF - 0.076);
|
|||
|
// pSetF.clear();
|
|||
|
// vector<TopoDS_Edge> edgesF = GetSectionEdges(sshape2, ff);
|
|||
|
// for(vector<TopoDS_Edge>::iterator iter = edgesF.begin(); iter != edgesF.end(); iter++)
|
|||
|
// {
|
|||
|
// TopoDS_Edge edge = TopoDS::Edge(*iter);
|
|||
|
// vector<gp_Pnt> pSetFTmp = GetSectionPoints1(edge, ff);
|
|||
|
// //pSetDTmp = CleanPoints(pSetDTmp, -1, x2);
|
|||
|
// pSetF = AddPoints(pSetF, pSetFTmp);
|
|||
|
// }
|
|||
|
// pSetF = GetExtremePoints(pSetF, 1);
|
|||
|
// OPoints.insert(make_pair(OPoints.size(),pSetF));
|
|||
|
//
|
|||
|
// map<int,vector<gp_Pnt>>::iterator it;
|
|||
|
// it=OPoints.begin();
|
|||
|
//
|
|||
|
// int i = 0;
|
|||
|
// int j=0;
|
|||
|
// int cnt=0;
|
|||
|
// while(it!=OPoints.end()){
|
|||
|
// for (j=0;j<it->second.size();j++)
|
|||
|
// {
|
|||
|
// if(it->second[j].Y() < 0)
|
|||
|
// {
|
|||
|
// continue;
|
|||
|
// }
|
|||
|
// pnts[cnt].X= it->second[j].X();
|
|||
|
// pnts[cnt].Y = it->second[j].Y();
|
|||
|
// pnts[cnt++].Z = it->second[j].Z();
|
|||
|
// break;
|
|||
|
// }
|
|||
|
// //cnt = cnt+j;
|
|||
|
// //lens[i] = j;
|
|||
|
// i++;
|
|||
|
// it++;
|
|||
|
// }
|
|||
|
// lens[0] = OPoints.size();
|
|||
|
// return 0;
|
|||
|
//}
|