#include "Stdafx.h" #include "DllImportViewControl.h" //#include "OCCViewer.h" //2016srq //#include "ISession_Text.h" //#include "Quantity_Color.hxx" // DELETE BY XUEFENG 20180731 // FOR CODES COMBINE /* #include "Style/AFaceStyle.h" #include "Style/APointStyle.h" #include "Node/ATextNode.h" #include "Node/APointNode.h" #include "Node/AScreenWidget.h" #include "Render/ARenderWindow.h" #include "DataType/ACamera.h" #include "TopoShape/ATopoShapeImpl.h" #include "Geometry/ARenderableGeometry.h" #include "View/ARenderer.h" #include "DataType/ASceneEnvironment.h" using namespace AnyCore; //end */ // END DELETE // ADDED BY XUEFENG 20180731 // FOR CODES COMBINE #include "Prs3d_PointAspect.hxx" // #include "AIS_Drawer.hxx" // XUEFENG DELETE 202009 #include "CCS_AISShape.h" #include "Graphic3d_Group.hxx" #include "Graphic3d_AspectText3d.hxx" #include "Prs3d_Root.hxx" // END ADDED #include "BaseAlgo.h" //extern OCCViewer myOCCViewer; extern OCCStructDataMD dataMD; /* DLLEXPORT BOOL InitView(int viewsize,HWND hwnd[]) { if( myOCCViewer.InitViewer(viewsize, hwnd)) { myOCCViewer.AxoViewF(0); return TRUE; } else return FALSE; } DLLEXPORT void RedrawView(int flag) { myOCCViewer.RedrawView(flag); } DLLEXPORT void UpdateView(int flag) { myOCCViewer.UpdateView(flag); } // ADDED BY XUEFENG 20181201 DLLEXPORT void ResetView() { myOCCViewer.ResetView(); } // END ADDED DLLEXPORT void ZoomWheel(float delta,int flag) { myOCCViewer.ZoomWheel(delta,flag); //myOCCViewer.DepthFitAll(flag); //20170801 added by czb bool fflag; int ID= myOCCViewer.GetCurrentSelectedId(fflag); int type=ID/MAX_SIZE_OF_OBJECT_GROUP; if ( myOCCViewer.GetNumofSelected()==1 && type>=1 &&type<2) { // DELETE BY XUEFENG 20181020 Why Add? //ShowPointOnLine(ID);//如果只选中一根线,则要显示线上的点 // END DELETE } } DLLEXPORT void StartRotation(int x,int y,int flag) { myOCCViewer.StartRotation(x,y,flag); //myOCCViewer.DepthFitAll(flag); //20170801 added by czb bool fflag; int ID= myOCCViewer.GetCurrentSelectedId(fflag); int type=ID/MAX_SIZE_OF_OBJECT_GROUP; if ( myOCCViewer.GetNumofSelected()==1 && type>=1 &&type<2) { // DELETE BY XUEFENG 20181020 //ShowPointOnLine(ID);//如果只选中一根线,则要显示线上的点 // END DELETE } } DLLEXPORT void Rotation(int x, int y,int flag) { myOCCViewer.Rotation(x,y,flag); //myOCCViewer.DepthFitAll(flag); //20170801 added by czb bool fflag; int ID= myOCCViewer.GetCurrentSelectedId(fflag); int type=ID/MAX_SIZE_OF_OBJECT_GROUP; if ( myOCCViewer.GetNumofSelected()==1 && type>=1 &&type<2) { // DELETE BY XUEFENG 20181020 //ShowPointOnLine(ID);//如果只选中一根线,则要显示线上的点 // END DELETE } } DLLEXPORT void Select() { myOCCViewer.Select(); //myOCCViewer.DepthFitAll(2); } DLLEXPORT void MoveTo(int x,int y ,int flag) { if(dataMD.m_mapAllTopoShapes.size()>0) { myOCCViewer.MoveTo(x,y,flag); // myOCCViewer.DepthFitAll(flag); } } DLLEXPORT void Pan(int x, int y, int flag) { myOCCViewer.Pan(x,y,flag); //myOCCViewer.DepthFitAll(flag); //20170801 added by czb bool fflag; int ID= myOCCViewer.GetCurrentSelectedId(fflag); int type=ID/MAX_SIZE_OF_OBJECT_GROUP; if ( myOCCViewer.GetNumofSelected()==1 && type>=1 &&type<2) { // DELETE BY XUEFENG 20181020 //ShowPointOnLine(ID);//如果只选中一根线,则要显示线上的点 // END DELETE } } DLLEXPORT void FitAll(int flag,bool isUpdate) { myOCCViewer.FitAll(flag,isUpdate); // myOCCViewer.DepthFitAll(flag); //20170801 added by czb bool fflag; int ID= myOCCViewer.GetCurrentSelectedId(fflag); int type=ID/MAX_SIZE_OF_OBJECT_GROUP; if ( myOCCViewer.GetNumofSelected()==1 && type>=1 &&type<2) { // DELETE BY XUEFENG 20181020 //ShowPointOnLine(ID);//如果只选中一根线,则要显示线上的点 // END DELETE } } DLLEXPORT void WindowFitAll(int myXmin, int myYmin, int myXmax, int myYmax) { myOCCViewer.WindowFitAll(myXmin,myYmin,myXmax,myYmax); } DLLEXPORT void SetDisplayMode(int mode) { dataMD.m_bshowPoint=(bool)(mode & 1); dataMD.m_bshowCurve=(bool)(mode & 2); dataMD.m_bshowSurface=(bool)(mode & 4); dataMD.m_bshowSolid=(bool)(mode & 8); dataMD.m_bshowMainDeck=(bool)(mode & 16); dataMD.m_bshowShell=(bool)(mode & 32); dataMD.m_bshowDeck=(bool)(mode & 64); dataMD.m_bshowBound=(bool)(mode & 128); dataMD.m_bshowSubdiv=(bool)(mode & 256); dataMD.m_bshowOpenCargoRegion=(bool)(mode & 512); dataMD.m_bshowSpace=(bool)(mode & 1024); dataMD.m_bshowAppendage=(bool)(mode & 2048); dataMD.m_bshowFrameRuler=(bool)(mode & 4096); dataMD.m_bshowHull=(bool)(mode & 8192); dataMD.m_bshowMainHull = (bool)(mode&16384); dataMD.m_bshowSpaceElement = (bool)(mode & 0x8000); RedrawTypeObjProps(); } DLLEXPORT void SetAISDisplayMode(int aMode) { myOCCViewer.SetAISDisplayMode(aMode); } DLLEXPORT void SetViewDirection(int flag, int dir) { // dir--0前,1后,2顶,3底,4左,5右,6侧前,7侧后*** switch (dir) { case 0: myOCCViewer.FrontView(flag); break; case 1: myOCCViewer.BackView(flag); break; case 2: myOCCViewer.TopView (flag); break; case 3: myOCCViewer.BottomView(flag); break; case 4: myOCCViewer.LeftView(flag); break; case 5: myOCCViewer.RightView(flag); break; case 6: myOCCViewer.AxoViewF(flag); break; case 7: myOCCViewer.AxoViewB(flag); break; default: break; } //myOCCViewer.DepthFitAll(flag); //20170801 added by czb bool fflag; int ID= myOCCViewer.GetCurrentSelectedId(fflag); int type=ID/MAX_SIZE_OF_OBJECT_GROUP; if ( myOCCViewer.GetNumofSelected()==1 && type>=1 &&type<2) { ShowPointOnLine(ID);//如果只选中一根线,则要显示线上的点 } } //打开或关闭定时器 Lvxj DLLEXPORT void EnableTimer(bool isTimerEnable) { myOCCViewer.EnAbleTimer(isTimerEnable); } DLLEXPORT BOOL SelectOneMode(int x, int y,int ids[],int flag, double &rx, double &ry, double &rz,bool bctrlselect) { } DLLEXPORT BOOL SelectFrameMode(int prex,int prey,int x,int y,int flag,int IDs[],double &rx, double &ry, double &rz,bool bctrlselect) { } DLLEXPORT BOOL SelectOppositeFrameMode(int prex,int prey,int x,int y,int flag,int IDs[],double &rx, double &ry, double &rz,bool bctrlselect) { } DLLEXPORT bool HiLight( int id []) { return true; } */ DLLEXPORT void SetObjVisible(int n,int ids[], int visibles[]) { } DLLEXPORT void SetInteractType(int type) { //设置图形交互类型(可选择对象类型) type可选择对象类型:0所有图元,1屏幕任意位置,2曲线节点(knot) dataMD.m_curInteractType=type; } DLLEXPORT int GenShapeLine2(double x, ScPoint2D *pt,bool withDeck, int dir, double v) { std::map pitmap; std::map::iterator ptit; std::map pitmap2; std::map::iterator ptit2; TopoDS_Edge tpinsecedge; double dF,dL; double dF2,dL2; gp_Pnt fp,ep,fp2,ep2,tempp; TopoDS_Shape TopoShape,sshape1,sshape2,sshapeship,sshapetemp; double step=0.2; int ptnum=0; BRepBuilderAPI_MakeWire wiretest ; TopExp_Explorer ex; bool insertbehind=false; if(dataMD.m_mapMainDeckSurf.size()==1) sshape1=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapMainDeckSurf.begin()->first)->second; else return ptnum; if(dataMD.m_mapShellSurf.size()==1) sshape2=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->first)->second; else return ptnum; double miny=-100; double maxy=100; double minx=x; double maxx=x; double minz=-50; double maxz=100; gp_Pnt p1; gp_Pnt p2; gp_Pnt p3; p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,miny,maxz); p3=gp_Pnt(minx,maxy,maxz); gp_Lin aLin(p1,gp_Vec(p1,p2)); double dist = aLin.Distance(p3); if(dist < Precision::Confusion()) { } else { TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); if(!aE.IsNull()) { //计算拉伸方向 gp_Lin aDLin = aLin.Normal(p3); double x,y,z; aDLin.Direction().Coord(x,y,z); sshapetemp = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); } } //缝合后求交 BRepOffsetAPI_Sewing aMethod; aMethod.Add(sshape1); aMethod.Add(sshape2); aMethod.Perform(); sshapeship = aMethod.SewedShape(); BRepAlgoAPI_Section sec1(sshapeship,sshapetemp,Standard_False); sec1.ComputePCurveOn1(Standard_True); sec1.Approximation(TopOpeBRepTool_APPROX); BOOL bDone = TRUE; try { sec1.Build(); } catch(Standard_Failure) { bDone = FALSE; } if(!bDone || !sec1.IsDone()) { return ptnum; } TopoDS_Shape splitResult = sec1.Shape(); list edgeList; dataMD.GetInsectWirePts( splitResult,edgeList ); //方法一、船壳甲板线弯曲!!!! //tpinsecedge=dataMD.SetInsectWireToEdge(edgeList); //Handle(Geom_Curve) aCur= BRep_Tool::Curve(tpinsecedge,dF,dL); //if(dir==0)//返回所有点 //{ // int k=(int)(dL-dF)/step; // if (k>0) // { // fp=aCur->Value(dF); // ep=aCur->Value(dL); // for(int i=0;iValue(dF+step*i); // (pt+ptnum)->Y=pt1.Y(); // (pt+ptnum)->Z=pt1.Z(); // ptnum++; // } // } //} //else if(dir==1)//返回与y= v?的交点 //{ // gp_Pnt Or=gp_Pnt(0,0,0.); // gp_Dir Norm=gp_Dir(0., 1, 0.); // gp_Pln pln(Or,Norm); // Handle(Geom_Surface) aSurface =GC_MakePlane(pln).Value(); // GeomAPI_IntCS intcs_sn(aCur, aSurface); // if (!intcs_sn.IsDone()) // { // dataMD.errorinfo="交点生成失败 "; // return 0; // } // int nPnt=intcs_sn.NbPoints(); // if (nPnt<= 0) // { // dataMD.errorinfo="不能相交,没有交点 "; // return 0; // } // for(int i=1;i<=nPnt;i++) // { // gp_Pnt interpt = intcs_sn.Point(i); // BRepBuilderAPI_MakeVertex newv(interpt); // if(!newv.IsDone()) // { // dataMD.errorinfo="生成交点失败"; // return 0; // } // if(abs(interpt.X())<10e-14) // interpt.SetX(0.0); // if(abs(interpt.Y())<10e-14) // interpt.SetY(0.0); // if(abs(interpt.Z())<10e-14) // interpt.SetZ(0.0); // (pt+ptnum)->Y=interpt.Y(); // (pt+ptnum)->Z=interpt.Z(); // ptnum++; // } //} //else if(dir==2)//返回与z= v?的交点 //{ // gp_Pnt Or=gp_Pnt(0,0,1); // gp_Dir Norm=gp_Dir(0.,0, 1); // gp_Pln pln(Or,Norm); // Handle(Geom_Surface) aSurface =GC_MakePlane(pln).Value(); // GeomAPI_IntCS intcs_sn(aCur, aSurface); // if (!intcs_sn.IsDone()) // { // dataMD.errorinfo="交点生成失败 "; // return 0; // } // int nPnt=intcs_sn.NbPoints(); // if (nPnt<= 0) // { // dataMD.errorinfo="不能相交,没有交点 "; // return 0; // } // for(int i=1;i<=nPnt;i++) // { // gp_Pnt interpt = intcs_sn.Point(i); // BRepBuilderAPI_MakeVertex newv(interpt); // if(!newv.IsDone()) // { // dataMD.errorinfo="生成交点失败"; // return 0; // } // if(abs(interpt.X())<10e-14) // interpt.SetX(0.0); // if(abs(interpt.Y())<10e-14) // interpt.SetY(0.0); // if(abs(interpt.Z())<10e-14) // interpt.SetZ(0.0); // (pt+ptnum)->Y=interpt.Y(); // (pt+ptnum)->Z=interpt.Z(); // ptnum++; // } //} //else //{ // return 0; //} ////方法二、测试无问题, //list::iterator iter1,iter2; //int i=0; //if(dir==0) //{ // if(edgeList.size()>2) // { // iter1 = edgeList.begin(); // iter2=edgeList.begin(); // iter2++; // Handle(Geom_Curve) aBeginCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); // Handle(Geom_Curve) aNextCur = BRep_Tool::Curve(TopoDS::Edge(*iter2),dF2,dL2); // fp=aBeginCur->Value(dF); // ep=aBeginCur->Value(dL); // fp2=aNextCur->Value(dF2); // ep2=aNextCur->Value(dL2); // if(abs(fp.Distance(fp2))<10e-5) // { // tempp=ep; // } // else if(abs(fp.Distance(ep2))<10e-5) // { // tempp=ep; // } // else if(abs(ep.Distance(fp2))<10e-5) // { // tempp=fp; // } // else if(abs(ep.Distance(ep2))<10e-5) // { // tempp=fp; // } // for(iter1 = edgeList.begin();iter1 != edgeList.end(); iter1++) // { // Handle(Geom_Curve) aCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); // int k=(int)((dL-dF)/step); // k=k>0?k:1; // k=k>15?15:k; // if(k>0) // { // fp=aCur->Value(dF); // ep=aCur->Value(dL); // if(abs(fp.Distance(tempp))<10e-5) // { // for(i=0;iValue(dF+step*i); // if(i==0) // { // if(ptnum==0) // { // (pt+ptnum)->Y=fp.Y(); // (pt+ptnum)->Z=fp.Z(); // ptnum++; // } // } // else // { // (pt+ptnum)->Y=pt1.Y(); // (pt+ptnum)->Z=pt1.Z(); // ptnum++; // } // } // if(i==k) // { // (pt+ptnum)->Y=ep.Y(); // (pt+ptnum)->Z=ep.Z(); // ptnum++; // } // tempp=ep; // } // else // { // for(i=0;iValue(dL-step*i); // if(i==0) // { // if(ptnum==0) // { // (pt+ptnum)->Y=ep.Y(); // (pt+ptnum)->Z=ep.Z(); // ptnum++; // } // } // else // { // (pt+ptnum)->Y=pt1.Y(); // (pt+ptnum)->Z=pt1.Z(); // ptnum++; // } // } // if(i==k) // { // (pt+ptnum)->Y=fp.Y(); // (pt+ptnum)->Z=fp.Z(); // ptnum++; // } // tempp=fp; // } // } // } // double b1=(pt+ptnum-1)->Y-(pt)->Y; // double b2=(pt+ptnum-1)->Z-(pt)->Z; // if((abs(b1)<10e-5)&&(abs(b2)<10e-5)) // ptnum--; // } //} //else if(dir==1)//返回与y= v?的交点 //{ // Handle(Geom_Surface) aSurface; // TopoDS_Shape aface; // double miny,maxy,minx,maxx,minz,maxz; // minz=-0.2*dataMD.m_shipDepth<-1?-0.2*dataMD.m_shipDepth:-100; // maxz=1.2*dataMD.m_shipDepth>1?1.2*dataMD.m_shipDepth:100; // minx=x; // maxx=x; // maxy=v; // miny=-100; // p1=gp_Pnt(minx,miny,minz); // p2=gp_Pnt(minx,maxy,minz); // p3=gp_Pnt(minx,maxy,maxz); // gp_Lin aLin(p1,gp_Vec(p1,p2)); // double dist = aLin.Distance(p3); // if(dist < Precision::Confusion()) // return FALSE; // TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); // if(!aE.IsNull()) // { // //计算拉伸方向 // gp_Lin aDLin = aLin.Normal(p3); // double x,y,z; // aDLin.Direction().Coord(x,y,z); // aface = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); // aSurface=BRep_Tool::Surface(TopoDS::Face(aface)); // } // if(edgeList.size()>0) // { // for(iter1 = edgeList.begin();iter1 != edgeList.end(); iter1++) // { // Handle(Geom_Curve) aCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); // GeomAPI_IntCS intcs_sn(aCur, aSurface); // if (!intcs_sn.IsDone()) // { // dataMD.errorinfo="交点生成失败 "; // return 0; // } // int nPnt=intcs_sn.NbPoints(); // if (nPnt<= 0) // { // continue; // } // for(int i=1;i<=nPnt;i++) // { // gp_Pnt interpt = intcs_sn.Point(i); // BRepBuilderAPI_MakeVertex newv(interpt); // if(abs(interpt.X())<10e-14) // interpt.SetX(0.0); // if(abs(interpt.Y())<10e-14) // interpt.SetY(0.0); // if(abs(interpt.Z())<10e-14) // interpt.SetZ(0.0); // (pt+ptnum)->Y=interpt.Y(); // (pt+ptnum)->Z=interpt.Z(); // ptnum++; // } // } // } //} //else if(dir==2)//返回与z= v?的交点 //{ // Handle(Geom_Surface) aSurface; // TopoDS_Shape aface; // double miny,maxy,minx,maxx,minz,maxz; // miny=-dataMD.m_shipWidth<-1?-dataMD.m_shipWidth:-100; // maxy=dataMD.m_shipWidth>1?dataMD.m_shipWidth:100; // minx=x; // maxx=x; // minz=-100; // maxz=v; // p1=gp_Pnt(minx,miny,minz); // p2=gp_Pnt(minx,miny,maxz); // p3=gp_Pnt(minx,maxy,maxz); // gp_Lin aLin(p1,gp_Vec(p1,p2)); // double dist = aLin.Distance(p3); // if(dist < Precision::Confusion()) // return FALSE; // TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); // if(!aE.IsNull()) // { // //计算拉伸方向 // gp_Lin aDLin = aLin.Normal(p3); // double x,y,z; // aDLin.Direction().Coord(x,y,z); // aface = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); // aSurface=BRep_Tool::Surface(TopoDS::Face(aface)); // } // if(edgeList.size()>0) // { // for(iter1 = edgeList.begin();iter1 != edgeList.end(); iter1++) // { // Handle(Geom_Curve) aCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); // GeomAPI_IntCS intcs_sn(aCur, aSurface); // if (!intcs_sn.IsDone()) // { // dataMD.errorinfo="交点生成失败 "; // return 0; // } // int nPnt=intcs_sn.NbPoints(); // if (nPnt<= 0) // { // continue; // } // for(int i=1;i<=nPnt;i++) // { // gp_Pnt interpt = intcs_sn.Point(i); // BRepBuilderAPI_MakeVertex newv(interpt); // if(abs(interpt.X())<10e-14) // interpt.SetX(0.0); // if(abs(interpt.Y())<10e-14) // interpt.SetY(0.0); // if(abs(interpt.Z())<10e-14) // interpt.SetZ(0.0); // (pt+ptnum)->Y=interpt.Y(); // (pt+ptnum)->Z=interpt.Z(); // ptnum++; // } // } // } //} //else //{ // return 0; //} //方法三 list::iterator iter1,iter2; int i=0; if(dir==0) { if(edgeList.size()>2) { iter1 = edgeList.begin(); iter2=edgeList.begin(); iter2++; Handle(Geom_Curve) aBeginCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); Handle(Geom_Curve) aNextCur = BRep_Tool::Curve(TopoDS::Edge(*iter2),dF2,dL2); fp=aBeginCur->Value(dF); ep=aBeginCur->Value(dL); fp2=aNextCur->Value(dF2); ep2=aNextCur->Value(dL2); if(abs(fp.Distance(fp2))<10e-5) { tempp=ep; } else if(abs(fp.Distance(ep2))<10e-5) { tempp=ep; } else if(abs(ep.Distance(fp2))<10e-5) { tempp=fp; } else if(abs(ep.Distance(ep2))<10e-5) { tempp=fp; } for(iter1 = edgeList.begin();iter1 != edgeList.end(); iter1++) { Handle(Geom_Curve) aCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); int k=(int)((dL-dF)/step); k=k>0?k:1; k=k>15?15:k; if(k>0) { fp=aCur->Value(dF); ep=aCur->Value(dL); if(abs(fp.Distance(tempp))<10e-5) { for(i=0;iValue(dF+step*i); if(i==0) { if(ptnum==0) { (pt+ptnum)->Y=fp.Y(); (pt+ptnum)->Z=fp.Z(); ptnum++; } } else { (pt+ptnum)->Y=pt1.Y(); (pt+ptnum)->Z=pt1.Z(); ptnum++; } } if(i==k) { (pt+ptnum)->Y=ep.Y(); (pt+ptnum)->Z=ep.Z(); ptnum++; } tempp=ep; } else { for(i=0;iValue(dL-step*i); if(i==0) { if(ptnum==0) { (pt+ptnum)->Y=ep.Y(); (pt+ptnum)->Z=ep.Z(); ptnum++; } } else { (pt+ptnum)->Y=pt1.Y(); (pt+ptnum)->Z=pt1.Z(); ptnum++; } } if(i==k) { (pt+ptnum)->Y=fp.Y(); (pt+ptnum)->Z=fp.Z(); ptnum++; } tempp=fp; } } } double b1=(pt+ptnum-1)->Y-(pt)->Y; double b2=(pt+ptnum-1)->Z-(pt)->Z; if((abs(b1)<10e-5)&&(abs(b2)<10e-5)) ptnum--; } } else if(dir==1)//返回与y= v?的交点 { tpinsecedge=dataMD.SetInsectWireToEdge(edgeList); Handle(Geom_Curve) aCur= BRep_Tool::Curve(tpinsecedge,dF,dL); Handle(Geom_Surface) aSurface; TopoDS_Shape aface; double miny,maxy,minx,maxx,minz,maxz; minz=-0.2*dataMD.m_shipDepth<-1?-0.2*dataMD.m_shipDepth:-100; maxz=1.2*dataMD.m_shipDepth>1?1.2*dataMD.m_shipDepth:100; minx=-100; maxx=100; maxy=v; miny=v; p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,miny,maxz); p3=gp_Pnt(maxx,miny,maxz); gp_Lin aLin(p1,gp_Vec(p1,p2)); double dist = aLin.Distance(p3); if(dist < Precision::Confusion()) return FALSE; TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); if(!aE.IsNull()) { //计算拉伸方向 gp_Lin aDLin = aLin.Normal(p3); double x,y,z; aDLin.Direction().Coord(x,y,z); aface = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); aSurface=BRep_Tool::Surface(TopoDS::Face(aface)); } GeomAPI_IntCS intcs_sn(aCur, aSurface); if (!intcs_sn.IsDone()) { dataMD.errorinfo="交点生成失败 "; return 0; } int nPnt=intcs_sn.NbPoints(); for(int i=1;i<=nPnt;i++) { gp_Pnt interpt = intcs_sn.Point(i); BRepBuilderAPI_MakeVertex newv(interpt); if(abs(interpt.X())<10e-14) interpt.SetX(0.0); if(abs(interpt.Y())<10e-14) interpt.SetY(0.0); if(abs(interpt.Z())<10e-14) interpt.SetZ(0.0); (pt+ptnum)->Y=interpt.Y(); (pt+ptnum)->Z=interpt.Z(); ptnum++; } } else if(dir==2)//返回与z= v?的交点 { tpinsecedge=dataMD.SetInsectWireToEdge(edgeList); Handle(Geom_Curve) aCur= BRep_Tool::Curve(tpinsecedge,dF,dL); Handle(Geom_Surface) aSurface; TopoDS_Shape aface; double miny,maxy,minx,maxx,minz,maxz; miny=-dataMD.m_shipWidth<-1?-dataMD.m_shipWidth:-100; maxy=dataMD.m_shipWidth>1?dataMD.m_shipWidth:100; minx=-100; maxx=100; minz=v; maxz=v; p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,maxy,minz); p3=gp_Pnt(maxx,maxy,minz); gp_Lin aLin(p1,gp_Vec(p1,p2)); double dist = aLin.Distance(p3); if(dist < Precision::Confusion()) return FALSE; TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); if(!aE.IsNull()) { //计算拉伸方向 gp_Lin aDLin = aLin.Normal(p3); double x,y,z; aDLin.Direction().Coord(x,y,z); aface = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); aSurface=BRep_Tool::Surface(TopoDS::Face(aface)); } GeomAPI_IntCS intcs_sn(aCur, aSurface); if (!intcs_sn.IsDone()) { dataMD.errorinfo="交点生成失败 "; return 0; } int nPnt=intcs_sn.NbPoints(); for(int i=1;i<=nPnt;i++) { gp_Pnt interpt = intcs_sn.Point(i); BRepBuilderAPI_MakeVertex newv(interpt); if(abs(interpt.X())<10e-14) interpt.SetX(0.0); if(abs(interpt.Y())<10e-14) interpt.SetY(0.0); if(abs(interpt.Z())<10e-14) interpt.SetZ(0.0); (pt+ptnum)->Y=interpt.Y(); (pt+ptnum)->Z=interpt.Z(); ptnum++; } } else { return 0; } /*Handle_AIS_Shape AISShape=new AIS_Shape(splitResult); myOCCViewer.myAISContext->SetColor(AISShape,Quantity_Color(1,0,0,Quantity_TOC_RGB), false); myOCCViewer.myAISContext->SetTransparency(AISShape,1,false); myOCCViewer.myAISContext->SetMaterial(AISShape, Graphic3d_NOM_SILVER, false); myOCCViewer.myAISContext->Display(AISShape,false);*/ return ptnum; } DLLEXPORT int GenShapeLine(OffsetTablePoint *pt,int dir1, double v1, int dir2, double v2) { BaseAlgo algo; std::map pitmap; std::map::iterator ptit; std::map pitmap2; std::map::iterator ptit2; TopoDS_Edge tpinsecedge; double dF,dL; gp_Pnt fp,ep,fp2,ep2,tempp; TopoDS_Shape TopoShape,sshape1,sshape2,sshapeship,sshapetemp; double step=0.2; int ptnum=0; BRepBuilderAPI_MakeWire wiretest ; TopExp_Explorer ex; bool insertbehind=false; if(dataMD.m_mapMainDeckSurf.size()==1) sshape1=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapMainDeckSurf.begin()->first)->second; else return ptnum; if(dataMD.m_mapShellSurf.size()==1) sshape2=dataMD.m_mapAllTopoShapes.find(dataMD.m_mapShellSurf.begin()->first)->second; else return ptnum; double miny,maxy; double minx,maxx; double minz,maxz; BRepBuilderAPI_MakeFace face; if(dir1==0) { miny=-100; maxy=100; minx=v1; maxx=v1; minz=-50; maxz=50; } else if(dir1==1) { miny=v1; maxy=v1; minx=-200; maxx=500; minz=-50; maxz=50; } else if(dir1==2) { miny=-100; maxy=100; minx=-200; maxx=500; minz=v1; maxz=v1; } gp_Pnt p1; gp_Pnt p2; gp_Pnt p3; if(dir1==0) { p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,miny,maxz); p3=gp_Pnt(minx,maxy,maxz); } else if(dir1==1) { p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,miny,maxz); p3=gp_Pnt(maxx,miny,maxz); } else if(dir1==2) { p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,maxy,minz); p3=gp_Pnt(maxx,maxy,minz); } gp_Lin aLin(p1,gp_Vec(p1,p2)); double dist = aLin.Distance(p3); if(dist < Precision::Confusion()) return ptnum; TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); if(!aE.IsNull()) { //计算拉伸方向 gp_Lin aDLin = aLin.Normal(p3); double x,y,z; aDLin.Direction().Coord(x,y,z); sshapetemp = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); } //缝合后求交 BRepOffsetAPI_Sewing aMethod; aMethod.Add(sshape1); aMethod.Add(sshape2); aMethod.Perform(); sshapeship = aMethod.SewedShape(); BRepAlgoAPI_Section sec1(sshapeship,sshapetemp,Standard_False); sec1.ComputePCurveOn1(Standard_True); sec1.Approximation(TopOpeBRepTool_APPROX); BOOL bDone = TRUE; try { sec1.Build(); } catch(Standard_Failure) { bDone = FALSE; } if(!bDone || !sec1.IsDone()) { return ptnum; } TopoDS_Shape splitResult = sec1.Shape(); list edgeList; dataMD.GetInsectWirePts( splitResult,edgeList ); map mapEdge; for (TopExp_Explorer Ex(splitResult,TopAbs_EDGE); Ex.More(); Ex.Next()) { mapEdge.insert(make_pair(mapEdge.size(), TopoDS::Edge(Ex.Current()))); } vector> edgeIndex; algo.GetWireSingleEdges(mapEdge,edgeIndex); list::iterator iter1,iter2; int i=0; if(dir2==-1) { //if(edgeList.size()>2) //{ //iter1 = edgeList.begin(); //iter2=edgeList.begin(); //iter2++; //Handle(Geom_Curve) aBeginCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); //Handle(Geom_Curve) aNextCur = BRep_Tool::Curve(TopoDS::Edge(*iter2),dF2,dL2); //fp=aBeginCur->Value(dF); //ep=aBeginCur->Value(dL); //fp2=aNextCur->Value(dF2); //ep2=aNextCur->Value(dL2); //if(abs(fp.Distance(fp2))<10e-5) //{ // tempp=ep; //} //else if(abs(fp.Distance(ep2))<10e-5) //{ // tempp=ep; //} //else if(abs(ep.Distance(fp2))<10e-5) //{ // tempp=fp; //} //else if(abs(ep.Distance(ep2))<10e-5) //{ // tempp=fp; //} //for(iter1 = edgeList.begin();iter1 != edgeList.end(); iter1++) //{ // Handle(Geom_Curve) aCur = BRep_Tool::Curve(TopoDS::Edge(*iter1),dF,dL); // int k=(int)((dL-dF)/step); // k=k>0?k:1; // k=k>15?15:k; // if(k>0) // { // fp=aCur->Value(dF); // ep=aCur->Value(dL); // if(abs(fp.Distance(tempp))<10e-5) // { // for(i=0;iValue(dF+step*i); // if(i==0) // { // if(ptnum==0) // { // (pt+ptnum)->X=fp.X(); // (pt+ptnum)->Y=fp.Y(); // (pt+ptnum)->Z=fp.Z(); // ptnum++; // } // } // else // { // (pt+ptnum)->X=fp.X(); // (pt+ptnum)->Y=pt1.Y(); // (pt+ptnum)->Z=pt1.Z(); // ptnum++; // } // } // if(i==k) // { // (pt+ptnum)->X=fp.X(); // (pt+ptnum)->Y=ep.Y(); // (pt+ptnum)->Z=ep.Z(); // ptnum++; // } // tempp=ep; // } // else // { // for(i=0;iValue(dL-step*i); // if(i==0) // { // if(ptnum==0) // { // (pt+ptnum)->X=fp.X(); // (pt+ptnum)->Y=ep.Y(); // (pt+ptnum)->Z=ep.Z(); // ptnum++; // } // } // else // { // (pt+ptnum)->X=fp.X(); // (pt+ptnum)->Y=pt1.Y(); // (pt+ptnum)->Z=pt1.Z(); // ptnum++; // } // } // if(i==k) // { // (pt+ptnum)->X=fp.X(); // (pt+ptnum)->Y=fp.Y(); // (pt+ptnum)->Z=fp.Z(); // ptnum++; // } // tempp=fp; // } // } //} //double b3=(pt+ptnum-1)->X-(pt)->X; //double b1=(pt+ptnum-1)->Y-(pt)->Y; //double b2=(pt+ptnum-1)->Z-(pt)->Z; //if((abs(b1)<10e-5)&&(abs(b2)<10e-5)&&(abs(b3)<10e-5)) // ptnum--; //} for(int i = 0; i < edgeIndex.size(); i++) { vector edgesID = edgeIndex[i]; gp_Pnt startp; for(int j = 0; j < edgesID.size(); j++) { //加首不加尾 int firstID =edgesID[j]; int lastID = edgesID[(j + 1 )% edgesID.size()]; TopoDS_Edge ef = mapEdge[firstID]; TopoDS_Edge el = mapEdge[lastID]; gp_Pnt p01,p02,p11,p12; double df,dl,df1,dl1; Handle(Geom_Curve) aCurf= BRep_Tool::Curve(ef,df,dl); p01 = aCurf->Value(df); p02 = aCurf->Value(dl); Handle(Geom_Curve) aCurl= BRep_Tool::Curve(el,df1,dl1); p11 = aCurl->Value(df1); p12 = aCurl->Value(dl1); double step = (dl - df) / 15; step = step > 0.2 ? step : 0.2; //algo.GetEdgeStartEndPoint(ef,p01,p02); //algo.GetEdgeStartEndPoint(el,p11,p12); double f , l; if(p02.Distance(p11) < Precision::Confusion() || p02.Distance(p12) < Precision::Confusion()) { f = df; l = dl; if(j == 0) { startp = aCurf->Value(f); } } else { f= dl; l = df; step = -1* step; if(j == 0) { startp = aCurf->Value(f); } } int count = 0; bool isMore = true; while(isMore) { double u = f + step * count; gp_Pnt p = aCurf->Value(u); (pt+ptnum)->X=p.X(); (pt+ptnum)->Y=p.Y(); (pt+ptnum)->Z=p.Z(); count++; ptnum++; isMore = (l > f) ? !(l < f + count * step || abs(l - f - count * step ) < Precision::Confusion()) : !(l > f + count * step || abs(l - f -count * step ) < Precision::Confusion()) ; } } (pt+ptnum)->X=startp.X(); (pt+ptnum)->Y=startp.Y(); (pt+ptnum)->Z=startp.Z(); ptnum++; } } else if(dir2==0)//返回与x= v?的交点 { tpinsecedge=dataMD.SetInsectWireToEdge(edgeList); Handle(Geom_Curve) aCur= BRep_Tool::Curve(tpinsecedge,dF,dL); Handle(Geom_Surface) aSurface; TopoDS_Shape aface; double miny,maxy,minx,maxx,minz,maxz; minz=-0.2*dataMD.m_shipDepth<-1?-0.2*dataMD.m_shipDepth:-100; maxz=1.2*dataMD.m_shipDepth>1?1.2*dataMD.m_shipDepth:100; miny=-100; maxy=100; minx=v2; maxx=v2; p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,miny,maxz); p3=gp_Pnt(minx,maxy,maxz); gp_Lin aLin(p1,gp_Vec(p1,p2)); double dist = aLin.Distance(p3); if(dist < Precision::Confusion()) return FALSE; TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); if(!aE.IsNull()) { //计算拉伸方向 gp_Lin aDLin = aLin.Normal(p3); double x,y,z; aDLin.Direction().Coord(x,y,z); aface = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); aSurface=BRep_Tool::Surface(TopoDS::Face(aface)); } GeomAPI_IntCS intcs_sn(aCur, aSurface); if (!intcs_sn.IsDone()) { dataMD.errorinfo="交点生成失败 "; return 0; } int nPnt=intcs_sn.NbPoints(); for(int i=1;i<=nPnt;i++) { gp_Pnt interpt = intcs_sn.Point(i); BRepBuilderAPI_MakeVertex newv(interpt); if(abs(interpt.X())<10e-14) interpt.SetX(0.0); if(abs(interpt.Y())<10e-14) interpt.SetY(0.0); if(abs(interpt.Z())<10e-14) interpt.SetZ(0.0); (pt+ptnum)->X=v2; (pt+ptnum)->Y=interpt.Y(); (pt+ptnum)->Z=interpt.Z(); ptnum++; } } else if(dir2==1)//返回与y= v?的交点 { tpinsecedge=dataMD.SetInsectWireToEdge(edgeList); Handle(Geom_Curve) aCur= BRep_Tool::Curve(tpinsecedge,dF,dL); Handle(Geom_Surface) aSurface; TopoDS_Shape aface; double miny,maxy,minx,maxx,minz,maxz; minz=-0.2*dataMD.m_shipDepth<-1?-0.2*dataMD.m_shipDepth:-100; maxz=1.2*dataMD.m_shipDepth>1?1.2*dataMD.m_shipDepth:100; minx=-100; maxx=100; maxy=v2; miny=v2; p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,miny,maxz); p3=gp_Pnt(maxx,miny,maxz); gp_Lin aLin(p1,gp_Vec(p1,p2)); double dist = aLin.Distance(p3); if(dist < Precision::Confusion()) return FALSE; TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); if(!aE.IsNull()) { //计算拉伸方向 gp_Lin aDLin = aLin.Normal(p3); double x,y,z; aDLin.Direction().Coord(x,y,z); aface = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); aSurface=BRep_Tool::Surface(TopoDS::Face(aface)); } GeomAPI_IntCS intcs_sn(aCur, aSurface); if (!intcs_sn.IsDone()) { dataMD.errorinfo="交点生成失败 "; return 0; } int nPnt=intcs_sn.NbPoints(); for(int i=1;i<=nPnt;i++) { gp_Pnt interpt = intcs_sn.Point(i); BRepBuilderAPI_MakeVertex newv(interpt); if(abs(interpt.X())<10e-14) interpt.SetX(0.0); if(abs(interpt.Y())<10e-14) interpt.SetY(0.0); if(abs(interpt.Z())<10e-14) interpt.SetZ(0.0); (pt+ptnum)->Y=v2; (pt+ptnum)->X=interpt.X(); (pt+ptnum)->Z=interpt.Z(); ptnum++; } } else if(dir2==2)//返回与z= v?的交点 { tpinsecedge=dataMD.SetInsectWireToEdge(edgeList); Handle(Geom_Curve) aCur= BRep_Tool::Curve(tpinsecedge,dF,dL); Handle(Geom_Surface) aSurface; TopoDS_Shape aface; double miny,maxy,minx,maxx,minz,maxz; miny=-dataMD.m_shipWidth<-1?-dataMD.m_shipWidth:-100; maxy=dataMD.m_shipWidth>1?dataMD.m_shipWidth:100; minx=-100; maxx=100; minz=v2; maxz=v2; p1=gp_Pnt(minx,miny,minz); p2=gp_Pnt(minx,maxy,minz); p3=gp_Pnt(maxx,maxy,minz); gp_Lin aLin(p1,gp_Vec(p1,p2)); double dist = aLin.Distance(p3); if(dist < Precision::Confusion()) return FALSE; TopoDS_Edge aE = BRepBuilderAPI_MakeEdge(p1,p2); if(!aE.IsNull()) { //计算拉伸方向 gp_Lin aDLin = aLin.Normal(p3); double x,y,z; aDLin.Direction().Coord(x,y,z); aface = BRepPrimAPI_MakePrism(aE,gp_Vec(dist * x,dist * y,dist * z)); aSurface=BRep_Tool::Surface(TopoDS::Face(aface)); } GeomAPI_IntCS intcs_sn(aCur, aSurface); if (!intcs_sn.IsDone()) { dataMD.errorinfo="交点生成失败 "; return 0; } int nPnt=intcs_sn.NbPoints(); for(int i=1;i<=nPnt;i++) { gp_Pnt interpt = intcs_sn.Point(i); BRepBuilderAPI_MakeVertex newv(interpt); if(abs(interpt.X())<10e-14) interpt.SetX(0.0); if(abs(interpt.Y())<10e-14) interpt.SetY(0.0); if(abs(interpt.Z())<10e-14) interpt.SetZ(0.0); (pt+ptnum)->X=interpt.X(); (pt+ptnum)->Y=interpt.Y(); (pt+ptnum)->Z=v2; ptnum++; } } else { return 0; } return ptnum; } // Added by XUEFENG 20180926 // 三角显示 DLLEXPORT bool ShowMeshTriOrNot(bool flag) { return true; } // End Added DLLEXPORT void SetOptions(bool autoCross,ModelDisplayOption displayOptions[]) { } DLLEXPORT void ShowSectionPos(double x,bool bdrawprofle) { dataMD.ShowSectionPos(x,bdrawprofle); } DLLEXPORT void ShowTempCurve(bool show, Curve crv, int npnt, Point3D pnt[]) { dataMD.ShowTempCurve(show,crv,npnt,pnt); } void ClearAisTempmodel() { } void ShowFrameRulerModel() { } void ShowProfileModel() { } //曲线上显示节点,ID:曲线ID,颜色为“点”对象的颜色 void ShowPointOnLine(int ID, bool isHighLight) { } void PixelToModel(int x, int y,double &rx,double &ry,double &rz,int flag,BOOL bWCS) { //2016srq // V3d_Coordinate XEye,YEye,ZEye,XAt,YAt,ZAt; // myOCCViewer.view[flag]->Eye(XEye,YEye,ZEye);//视点 // myOCCViewer.view[flag]->At(XAt,YAt,ZAt);//VRC原点 // gp_Pnt EyePoint(XEye,YEye,ZEye); // gp_Pnt AtPoint(XAt,YAt,ZAt); // // gp_Vec EyeVector(EyePoint,AtPoint); // gp_Dir EyeDir(EyeVector);//视线 // // gp_Pln PlaneOfTheView = gp_Pln(AtPoint,EyeDir);//视平面 // // //屏幕点转换为模型空间(或世界坐标系)的点。 // Standard_Real X,Y,Z; // myOCCViewer.view[flag]->Convert((int)x,(int)y,X,Y,Z); // //但点可能不在视平面上,因此要将点投影到视平面,再计算视平面上的点。 // gp_Pnt ConvertedPoint(X,Y,Z); // gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project(PlaneOfTheView,ConvertedPoint); // // gp_Pnt ResultPoint = ElSLib::Value(ConvertedPointOnPlane.X(), // ConvertedPointOnPlane.Y(), // PlaneOfTheView); // //#ifdef _VERBOSE_DEBUG // DTRACE("\n Eye [%.4f,%.4f,%.4f] At [%.4f,%.4f,%.4f],viewpoint [%.4f,%.4f,%.4f],result [%.4f,%.4f,%.4f].", // XEye,YEye,ZEye,XAt,YAt,ZAt,X,Y,Z,ResultPoint.X(),ResultPoint.Y(),ResultPoint.Z()); //#endif // // rx=ResultPoint.X(); // ry=ResultPoint.Y() ; // rz=ResultPoint.Z(); // DELETE BY XUEFENG 20180731 // FOR CODES COMBINE /* auto pt = myOCCViewer.m_Renderer->ScreenPoint2WorldPoint(AnyCore::Vector2(x, y)); rx = pt.x; ry = pt.y; rz = pt.z; */ // END DELETE } void RedrawTypeObjProps() { } // ADDED by GUAN 202009~12 // MERGED by XUEFENG 202101 // Added by XUEFENG // FOR DEBUG HULL // 20200820 // 可参考Opencascade论坛上的 // https://www.opencascade.com/content/how-render-bspline-surface-using-glunurbs #include "Geom_BSplineSurface.hxx" #include "TColStd_Array1OfReal.hxx" #include "TColStd_Array1OfInteger.hxx" #include // #include #include // #include "BRepMesh_IncrementalMesh.hxx" #include "BRepBuilderAPI_Copy.hxx" #include "StlAPI_Writer.hxx" // XUEFENG ADDED 202009 int preNUm(unsigned char byte) { unsigned char mask = 0x80; int num = 0; for (int i = 0; i < 8; i++) { if ((byte & mask) == mask) { mask = mask >> 1; num++; } else { break; } } return num; } bool isUtf8(unsigned char* data, int len) { int num = 0; int i = 0; while (i < len) { if ((data[i] & 0x80) == 0x00) { // 0XXX_XXXX i++; continue; } else if ((num = preNUm(data[i])) > 2) { // 110X_XXXX 10XX_XXXX // 1110_XXXX 10XX_XXXX 10XX_XXXX // 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX // 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX // 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX // preNUm() 返回首个字节8个bits中首 0bit前面1bit的个数,该数量也是该字符所使用的字节数 i++; for(int j = 0; j < num - 1; j++) { //判断后面num - 1 个字节是不是都是10开 if ((data[i] & 0xc0) != 0x80) { return false; } i++; } } else { //其他情况说明不是utf-8 return false; } } return true; } bool isGBK(unsigned char* data, int len) { int i = 0; while (i < len) { if (data[i] <= 0x7f) { //编码小于等于127,只有一个字节的编码,兼容ASCII i++; continue; } else { //大于127的使用双字节编码 if (data[i] >= 0x81 && data[i] <= 0xfe && data[i + 1] >= 0x40 && data[i + 1] <= 0xfe && data[i + 1] != 0xf7) { i += 2; continue; } else { return false; } } } return true; } // GBK to UTF-8 std::string GbkToUtf8(const char *src_str) { /* int len = MultiByteToWideChar(CP_ACP, 0, src_str, -1, NULL, 0); wchar_t* wstr = new wchar_t[len + 1]; memset(wstr, 0, len + 1); MultiByteToWideChar(CP_ACP, 0, src_str, -1, wstr, len); len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); char* str = new char[len + 1]; memset(str, 0, len + 1); WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL); std::string strTemp = str; if (wstr) delete[] wstr; if (str) delete[] str; return strTemp; */ return ""; } // END ADDED DLLEXPORT bool DebugHullForDoctorGUAN(int id) { /* string filePath = "."; if(strlen(path) == 0) { filePath = tempPath; } else { string s(path); filePath = s+"\\"; } */ ofstream FileHull; FileHull.open("Surface.txt",ios::out); FileHull.close(); ///// cqr-20180724 map::iterator tpit1; //c tpit1=dataMD.m_mapAllTopoShapes.find(id); //c if(tpit1!=dataMD.m_mapAllTopoShapes.end()) //c { TopoDS_Shape sss = dataMD.m_mapAllTopoShapes.find(id)->second; //TopoDS_Shape h; //h = cp.Shape(); // 20200602 by czb, begin BRepBuilderAPI_Copy cp(sss); BRepTools::Clean(cp); //BRepMesh_IncrementalMesh myMesh(cp, 2, Standard_False, 0.5); //cqr-20200716 BRepMesh_IncrementalMesh myMesh(cp, dataMD.GetSTLCoefficient()*250, Standard_False, 0.1); //cqr-20200716 myMesh.Perform(); // 20200602 by czb, end try { StlAPI_Writer stlW; //stlW.SetCoefficient(GetSTLCoefficient()); //// 20200602 by czb, 相对精度修改为绝对精度,使得船体与舱室的网格大小一致 //stlW.RelativeMode() == Standard_False; //stlW.SetDeflection(0.001); //stlW.Write(h,(filePath + ".\\" +"hull.stl").c_str()); // XUEFENG ADDED 202102 cqr-20210315从OCCViewer中复制过来并修改 char pFileName[256]; // int pos = GetCurrentDirectory(256, pFileName); memset(pFileName, 0, sizeof(pFileName)); // 清空数值,以防止多个主船体时此次有前面主船体的hull名 cqr-20210315 strcat(pFileName,"Surface.txt"); Standard_CString tmpFileName = (Standard_CString)pFileName; Standard_Boolean result = false; int len = strlen(tmpFileName); bool isutf8 = isUtf8((unsigned char*)tmpFileName, len); bool isgbk = isGBK((unsigned char*)tmpFileName, len); if(isutf8==false && isgbk==true) // Chinese path { std::string mystr = GbkToUtf8(tmpFileName); char myUTF8Filepath[1024]; strcpy(myUTF8Filepath, mystr.c_str()); //result = BRepTools::Read(shapeCompound, myUTF8Filepath, aBuilder); stlW.Write(cp, myUTF8Filepath); } else if(isutf8==true && isgbk==true) // English path { //result = BRepTools::Read(shapeCompound, aFileName, aBuilder); stlW.Write(cp, tmpFileName); } } catch(Standard_Failure) { } /* finally //pj change ע�͵�finally { } */ } return true; //myOCCViewer.DebugHullForDoctorGUAN(flag); map::iterator it; int type; if(dataMD.m_mapAllTopoShapes.size()>0) { ofstream ofs; ofs.open("Surface.txt", ios::out); ofs << "VARIABLES='X','Y','Z','NX','NY','NZ'" << endl; // /*ofs.open("out.stl", ios::out); string s_normal = " facet normal "; string s_outer = " outer loop"; string s_vertex = " vertex "; string s_endloop = " endloop"; string s_endfacet = " endfacet"; string s; ofs << "solid" << endl;*/ // int nu=16; int nv=16; double* sur=new double[nu*nv]; int Con=1; for(it=dataMD.m_mapAllTopoShapes.begin();it!=dataMD.m_mapAllTopoShapes.end();++it) { int realHullID = it->first; type=it->first/MAX_SIZE_OF_OBJECT_GROUP; if(type >=18 && type<19) { memset(sur,0,nu*nv*sizeof(int)); /*ofs << "ZONE T='1',I=" << nv << "J=" << nu << ",K=1,F=POINT"<< endl;*/ TopoDS_Shape hullShape = it->second; //TopoDS_Shell HullShell = (TopoDS_Shell)hullShape; for (TopExp_Explorer faceExp(hullShape, TopAbs_FACE); faceExp.More(); faceExp.Next()){ TopoDS_Face tmpFace = TopoDS::Face(faceExp.Current()); Handle_Geom_Surface tmpSurface = BRep_Tool::Surface(tmpFace); //// //TopLoc_Location loc; ////BRepMesh_IncrementalMesh myMesh(tmpFace, 10, Standard_True, 5); //BRepMesh_IncrementalMesh myMesh(tmpFace, 0.02, Standard_False, 0.5); //Handle_Poly_Triangulation triFace = BRep_Tool::Triangulation(tmpFace, loc); ////BRepMesh_IncrementalMesh myMesh(triFace, 2, Standard_False, 0.5); //Standard_Integer nTriangles = triFace->NbTriangles(); //gp_Trsf myTrsf = loc.Transformation();// //bool myInvert = (tmpFace.Orientation()==TopAbs_REVERSED);// //if(myTrsf.IsNegative())// // myInvert =! myInvert;// //gp_Pnt vertex1; //gp_Pnt vertex2; //gp_Pnt vertex3; //Standard_Integer nVertexIndex1 = 0; //Standard_Integer nVertexIndex2 = 0; //Standard_Integer nVertexIndex3 = 0; //TColgp_Array1OfPnt nodes(1, triFace->NbNodes()); //Poly_Array1OfTriangle triangles(1, triFace->NbTriangles()); //nodes = triFace->Nodes(); //triangles = triFace->Triangles(); //for (Standard_Integer i = 1; i <= nTriangles; i++) //{ // Poly_Triangle aTriangle = triangles.Value(i); // aTriangle.Get(nVertexIndex1, nVertexIndex2, nVertexIndex3); // vertex1 = nodes.Value(nVertexIndex1); // vertex2 = nodes.Value(myInvert? nVertexIndex3:nVertexIndex2); // vertex3 = nodes.Value(myInvert? nVertexIndex2:nVertexIndex3); // gp_XYZ vector12(vertex2.XYZ() - vertex1.XYZ()); // gp_XYZ vector13(vertex3.XYZ() - vertex1.XYZ()); // gp_XYZ normal = vector12.Crossed(vector13); // Standard_Real rModulus = normal.Modulus(); // if (rModulus > gp::Resolution()) // { // normal.Normalize(); // } // else // { // normal.SetCoord(0., 0., 0.); // } // ofs << s_normal << normal.X() <<" " << normal.Y() << " " << normal.Z() << endl; // ofs << s_outer << endl; // ofs << s_vertex << vertex1.X() <<" " << vertex1.Y() << " " << vertex1.Z() << endl; // ofs << s_vertex << vertex2.X() <<" " << vertex2.Y() << " " << vertex2.Z() << endl; // ofs << s_vertex << vertex3.X() <<" " << vertex3.Y() << " " << vertex3.Z() << endl; // ofs << s_endloop << endl; // ofs << s_endfacet << endl; //} //ofs << flush; //// Handle_Geom_BSplineSurface myBSplineSurface = GeomConvert::SurfaceToBSplineSurface(tmpSurface); { //Standard_Integer vdegree = myBSplineSurface->VDegree(); //Standard_Integer myVKnotsNumber = myBSplineSurface->NbVKnots(); // bool myInvert = (tmpFace.Orientation()==TopAbs_REVERSED);// //bool myInvert = (myBSplineSurface.Orientation()==TopAbs_REVERSED);// Standard_Real us = 0.0; Standard_Real ue = 0.0; Standard_Real vs = 0.0; Standard_Real ve = 0.0; myBSplineSurface->Bounds(us,ue,vs,ve); Standard_Real uu = 0.0; Standard_Real vv = 0.0; gp_Pnt aP00; gp_Pnt aP01; gp_Pnt aP10; gp_Pnt aP11; Standard_Real Lu0,Lu1,Lv0,Lv1, Lu, Lv, xx,yy, zz; myBSplineSurface->D0(us, vs, aP00); myBSplineSurface->D0(us, ve, aP01); myBSplineSurface->D0(ue, vs, aP10); myBSplineSurface->D0(ue, ve, aP11); xx=aP10.X()-aP00.X(); yy=aP10.Y()-aP00.Y(); zz=aP10.Z()-aP00.Z(); Lu0=sqrt(xx*xx+yy*yy+zz*zz); xx=aP11.X()-aP01.X(); yy=aP11.Y()-aP01.Y(); zz=aP11.Z()-aP01.Z(); Lu1=sqrt(xx*xx+yy*yy+zz*zz); xx=aP01.X()-aP00.X(); yy=aP01.Y()-aP00.Y(); zz=aP01.Z()-aP00.Z(); Lv0=sqrt(xx*xx+yy*yy+zz*zz); xx=aP11.X()-aP10.X(); yy=aP11.Y()-aP10.Y(); zz=aP11.Z()-aP10.Z(); Lv1=sqrt(xx*xx+yy*yy+zz*zz); Lu=Lu0; if(LuNbUPoles(); Standard_Integer Nj=myBSplineSurface->NbVPoles(); TColgp_Array2OfPnt poles(1,Ni,1,Nj); myBSplineSurface->Poles(poles); for(int i=1;i<=Ni;i++) { for(int j=1;j<=Nj;j++) { aP=poles(i,j); cout << aP.X() << "\t" << aP.Y() << "\t" << aP.Z() << endl; } } }*/ for(int i=0;iD1(uu, vv, aP, aDu, aDv); if(myInvert==false) { normal = aDu.Crossed(aDv); } else { normal = -aDu.Crossed(aDv); } //normal = aDu.Crossed(aDv); rModulus = sqrt(normal.X()*normal.X()+normal.Y()*normal.Y()+normal.Z()*normal.Z()); if (rModulus > 1.0e-9) //gp::Resolution() { normal.Normalize(); } else { normal.SetCoord(0., 0., 0.); } if (fabs(normal.X())<1.0e-6) { normal.SetCoord(0.0,normal.Y(),normal.Z()); } if (fabs(normal.Y())<1.0e-6) { normal.SetCoord(normal.X(),0.0,normal.Z()); } if (fabs(normal.Z())<1.0e-6) { normal.SetCoord(normal.X(),normal.Y(),0.0); } ofs << aP.X() << "\t" << aP.Y() << "\t" << aP.Z() << "\t" << normal.X() << "\t" << normal.Y() << "\t" << normal.Z() << endl; } } ofs << flush; } } //ofs << "endsolid" << endl; // 显示目前不能直接显示。 dataMD.m_bshowHull = true; dataMD.OccDisplayAis(realHullID+1, hullShape, true); } } ofs.close(); } return true; } // End Added // Added by GUAN // FOR DEBUG HULL // 20210103 // 可参考Opencascade论坛上的 // https://www.opencascade.com/content/how-render-bspline-surface-using-glunurbs #include "Geom_BSplineSurface.hxx" #include "TColStd_Array1OfReal.hxx" #include "TColStd_Array1OfInteger.hxx" #include // #include #include // #include "BRepMesh_IncrementalMesh.hxx" void Check_uv(int i, int Mark, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert); void Check_uv2(int i, int Mark, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert); gp_Vec Cal_normal(int i, int Mark, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert, int k, int n);// gp_Vec Cal_normal2(int i, int Mark, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert, int k, int n);// void Check_normal(int i, int ii, int j, int jj, vector us, vector ue, vector vs, vector ve, vector sur1, vector surInvert, int Mark, vector modefiedu, vector modefiedv); Handle_Geom_BSplineSurface Modefy_sur(int i, int Mark, vector sur1, Standard_Real* temp, vector modefiedu, vector modefiedv); Standard_Real Cal_sita(int i, int ii, int j, int jj, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface sur1, Handle_Geom_BSplineSurface sur2, vector surInvert, int n, Standard_Real* normala, int Mark, Standard_Real* sita); Standard_Real Cal_sita_Modify(int i, int ii, int j, int jj, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface sur1, Handle_Geom_BSplineSurface sur2, vector surInvert, int n, int Mark, Standard_Real* sita); void Modefy_sur2(int i, int Mark, vector sur1, Standard_Real* temp, vector modefiedu, vector modefiedv); DLLEXPORT bool DebugHullForDoctorGUAN2(int id) { //myOCCViewer.DebugHullForDoctorGUAN(flag); map::iterator it; int type; if(dataMD.m_mapAllTopoShapes.size()>0) { /*ofstream ofs; ofs.open("Surface2.txt", ios::out); ofs << "VARIABLES='X','Y','Z','NX','NY','NZ'" << endl;*/ // /*ofs.open("out.stl", ios::out); string s_normal = " facet normal "; string s_outer = " outer loop"; string s_vertex = " vertex "; string s_endloop = " endloop"; string s_endfacet = " endfacet"; string s; ofs << "solid" << endl;*/ // int nu=16; int nv=16; double* sur=new double[nu*nv]; int Con=0; vector us; vector ue; vector vs; vector ve; vector edge; vector sur1; vector surInvert; vector modefiedu; vector modefiedv; vector marked; for(it=dataMD.m_mapAllTopoShapes.begin();it!=dataMD.m_mapAllTopoShapes.end();++it) { int realHullID = it->first; type=it->first/MAX_SIZE_OF_OBJECT_GROUP; if(type >=18 && type<19) { memset(sur,0,nu*nv*sizeof(int)); TopoDS_Shape hullShape = it->second; for (TopExp_Explorer faceExp(hullShape, TopAbs_FACE); faceExp.More(); faceExp.Next()) { TopoDS_Face tmpFace = TopoDS::Face(faceExp.Current()); Handle_Geom_Surface tmpSurface = BRep_Tool::Surface(tmpFace); //// Handle_Geom_BSplineSurface myBSplineSurface = GeomConvert::SurfaceToBSplineSurface(tmpSurface); { //Standard_Integer vdegree = myBSplineSurface->VDegree(); //Standard_Integer myVKnotsNumber = myBSplineSurface->NbVKnots(); // bool myInvert = (tmpFace.Orientation()==TopAbs_REVERSED);// //tmpFace. Standard_Real us0 = 0.0; Standard_Real ue0 = 0.0; Standard_Real vs0 = 0.0; Standard_Real ve0 = 0.0; myBSplineSurface->Bounds(us0,ue0,vs0,ve0); gp_Pnt aP00; gp_Pnt aP01; gp_Pnt aP10; gp_Pnt aP11; myBSplineSurface->D0(us0, vs0, aP00); myBSplineSurface->D0(us0, ve0, aP01); myBSplineSurface->D0(ue0, vs0, aP10); myBSplineSurface->D0(ue0, ve0, aP11); us.push_back(us0); ue.push_back(ue0); vs.push_back(vs0); ve.push_back(ve0); //edge:00-10-11-01-00 edge.push_back(aP00); edge.push_back(aP10); edge.push_back(aP11); edge.push_back(aP01); edge.push_back(aP00); sur1.push_back(myBSplineSurface); surInvert.push_back(myInvert); modefiedu.push_back(false); modefiedv.push_back(false); // marked.push_back(false); marked.push_back(false); marked.push_back(false); marked.push_back(false); Con++; //cout<< Con << "\t" << myBSplineSurface->NbUPoles() << "\t" << myBSplineSurface->NbVPoles() << "\t" << myBSplineSurface->NbUKnots() << "\t" << myBSplineSurface->NbVKnots() <VDegree(); // //Standard_Integer myVKnotsNumber = myBSplineSurface->NbVKnots(); // // // bool myInvert = surInvert[k];// // //bool myInve[k]rt = (myBSplineSurface.Orientation()==TopAbs_REve[k]RSED);// // Standard_Real uu = 0.0; // Standard_Real vv = 0.0; // gp_Pnt aP00; // gp_Pnt aP01; // gp_Pnt aP10; // gp_Pnt aP11; // Standard_Real Lu0,Lu1,Lv0,Lv1, Lu, Lv, xx,yy, zz; // myBSplineSurface->D0(us[k], vs[k], aP00); // myBSplineSurface->D0(us[k], ve[k], aP01); // myBSplineSurface->D0(ue[k], vs[k], aP10); // myBSplineSurface->D0(ue[k], ve[k], aP11); // xx=aP10.X()-aP00.X(); // yy=aP10.Y()-aP00.Y(); // zz=aP10.Z()-aP00.Z(); // Lu0=sqrt(xx*xx+yy*yy+zz*zz); // xx=aP11.X()-aP01.X(); // yy=aP11.Y()-aP01.Y(); // zz=aP11.Z()-aP01.Z(); // Lu1=sqrt(xx*xx+yy*yy+zz*zz); // xx=aP01.X()-aP00.X(); // yy=aP01.Y()-aP00.Y(); // zz=aP01.Z()-aP00.Z(); // Lv0=sqrt(xx*xx+yy*yy+zz*zz); // xx=aP11.X()-aP10.X(); // yy=aP11.Y()-aP10.Y(); // zz=aP11.Z()-aP10.Z(); // Lv1=sqrt(xx*xx+yy*yy+zz*zz); // Lu=Lu0; // if(LuNbUPoles(); // Standard_Integer Nj=myBSplineSurface->NbVPoles(); // TColgp_Array2OfPnt poles(1,Ni,1,Nj); // myBSplineSurface->Poles(poles); // for(int i=1;i<=Ni;i++) // { // for(int j=1;j<=Nj;j++) // { // aP=poles(i,j); // cout << aP.X() << "\t" << aP.Y() << "\t" << aP.Z() << endl; // } // } // }*/ // for(int i=0;iD1(uu, vv, aP, aDu, aDv); // if(myInvert==false) // { // normal = aDu.Crossed(aDv); // } // else // { // normal = -aDu.Crossed(aDv); // } // //normal = aDu.Crossed(aDv); // rModulus = sqrt(normal.X()*normal.X()+normal.Y()*normal.Y()+normal.Z()*normal.Z()); // if (rModulus > 1.0e-9) //gp::Resolution() // { // normal.Normalize(); // } // else // { // normal.SetCoord(0., 0., 0.); // } // if (fabs(normal.X())<1.0e-6) // { // normal.SetCoord(0.0,normal.Y(),normal.Z()); // } // if (fabs(normal.Y())<1.0e-6) // { // normal.SetCoord(normal.X(),0.0,normal.Z()); // } // if (fabs(normal.Z())<1.0e-6) // { // normal.SetCoord(normal.X(),normal.Y(),0.0); // } // ofs << aP.X() << "\t" << aP.Y() << "\t" << aP.Z() << "\t" << normal.X() << "\t" << normal.Y() << "\t" << normal.Z() << endl; // } // } // ofs << flush; // } //} //////////////////////////////////////////////////////////// // 显示目前不能直接显示。 dataMD.m_bshowHull = true; dataMD.OccDisplayAis(realHullID+1, hullShape, true); } } //ofs.close(); } return true; } void Check_uv(int i, int Mark, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert)// { Standard_Integer Num; if(Mark==0)//00-10 vs[i] { Num = myBSplineSurface->NbUKnots(); //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==1)//10-11 ue[i] { Num = myBSplineSurface->NbVKnots(); //cout<< "\t" << vs[i] << "\t" << ve[i]; } else if(Mark==2)//11-01 ve[i] { Num = myBSplineSurface->NbUKnots(); //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==3)//01-00 us[i] { Num = myBSplineSurface->NbVKnots(); //cout<< "\t" << vs[i] << "\t" << ve[i]; } /*cout<< "\t" << Num << "\t" << myBSplineSurface->NbUPoles() << "\t" << myBSplineSurface->NbVPoles();*/ //Deleted by GUAN, 20210309 //cout<< "\t" << Num << "\t" << myBSplineSurface->NbUPoles() << "\t" << myBSplineSurface->NbVPoles() << "\t" << myBSplineSurface->NbUKnots() << "\t" << myBSplineSurface->NbVKnots(); //End Delete } void Check_uv2(int i, int Mark, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert)// { Standard_Integer Num; if(Mark==0)//00-10 vs[i] { Num = myBSplineSurface->NbUKnots(); //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==1)//10-11 ue[i] { Num = myBSplineSurface->NbVKnots(); //cout<< "\t" << vs[i] << "\t" << ve[i]; } else if(Mark==2)//11-01 ve[i] { Num = myBSplineSurface->NbUKnots(); //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==3)//01-00 us[i] { Num = myBSplineSurface->NbVKnots(); } /*cout<< "\t" << Num << "\t" << myBSplineSurface->NbUPoles() << "\t" << myBSplineSurface->NbVPoles();*/ //Deleted by GUAN, 20210309 //cout<< "\t" << Num << "\t" << myBSplineSurface->NbUPoles() << "\t" << myBSplineSurface->NbVPoles()<< "\t" << myBSplineSurface->NbUKnots() << "\t" << myBSplineSurface->NbVKnots(); //End Delete } void Check_normal(int i, int ii, int j, int jj, vector us, vector ue, vector vs, vector ve, vector sur1, vector surInvert, int Mark, vector modefiedu, vector modefiedv) { int n=4;//8 Standard_Real normala[3]; Standard_Real temp[3]; Standard_Real sita[9];//n+1 Standard_Real average, average1; average1=Cal_sita(i, ii, j, jj,us,ue,vs,ve, sur1[i], sur1[j], surInvert, n, normala, Mark, sita); /*if(i==61&j==62) { int nn=3; nn+=4; }*/ // Deleted by GUAN, 20210309 /*cout<< "修正前:"; for(int k=0;k<=n;k++) { cout<=1.0 && average1<=30.0)//0.01 { average=average1; Handle_Geom_BSplineSurface sur; Standard_Real kk = -0.01;//-0.001 Standard_Real dk = kk; int Cn=0; temp[0]=0.0; temp[1]=0.0; temp[2]=0.0; Standard_Real amini=average1; Standard_Real tpi[3]={0.0,0.0,0.0}; Standard_Real sitami[9]; while(average>1.0 && Cn<30)//0.01 100 { temp[0]=normala[0]*dk; temp[1]=normala[1]*dk; temp[2]=normala[2]*dk; dk+=kk; Cn+=1; if(Cn==15 && average>average1)//50 { kk = 0.01; dk = kk; temp[0]=normala[0]*dk; temp[1]=normala[1]*dk; temp[2]=normala[2]*dk; } sur=Modefy_sur(i, ii, sur1, temp, modefiedu, modefiedv); average=Cal_sita_Modify(i, ii, j, jj,us,ue,vs,ve, sur, sur1[j], surInvert, n, Mark, sita); if(average1.0 && Cn<30)//0.01 100 { temp[0]=normala[0]*dk; temp[1]=normala[1]*dk; temp[2]=normala[2]*dk; dk+=kk; Cn+=1; if(Cn==15 && average>amini)//50 { kk = 0.01; dk = kk; temp[0]=normala[0]*dk; temp[1]=normala[1]*dk; temp[2]=normala[2]*dk; } sur=Modefy_sur(j, jj, sur1, temp, modefiedu, modefiedv); average=Cal_sita_Modify(i, ii, j, jj,us,ue,vs,ve, sur1[i], sur, surInvert, n, Mark, sita); if(average us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface sur1, Handle_Geom_BSplineSurface sur2, vector surInvert, int n, Standard_Real* normala, int Mark, Standard_Real* sita) { gp_Vec normal1; gp_Vec normal2; Standard_Real rModulus1; Standard_Real rModulus2; Standard_Real PI_VALUE=3.1415926535898; //#include "StdAfx.h"PI->PI_VALUE Standard_Real temp, Csita, sum, average, nx,ny,nz; normala[0]=0.0; normala[1]=0.0; normala[2]=0.0; int Con=0; sum=0.0; for(int k=0;k<=n;k++) { normal1=Cal_normal(i, ii,us,ue,vs,ve, sur1, surInvert[i], k, n);// if(Mark==1) { normal2=Cal_normal(j, jj,us,ue,vs,ve, sur2, surInvert[j], k, n);// } else { normal2=Cal_normal2(j, jj,us,ue,vs,ve, sur2, surInvert[j], k, n);// } rModulus1 = sqrt(normal1.X()*normal1.X()+normal1.Y()*normal1.Y()+normal1.Z()*normal1.Z()); rModulus2 = sqrt(normal2.X()*normal2.X()+normal2.Y()*normal2.Y()+normal2.Z()*normal2.Z()); if(rModulus1>0&&rModulus2>0) { temp=normal1.X()*normal2.X()+normal1.Y()*normal2.Y()+normal1.Z()*normal2.Z(); Csita=temp/rModulus1/rModulus2; if(Csita>1.0) { Csita=1.0; } else if(Csita<-1.0) { Csita=-1.0; } sita[k]=acos(Csita)*180/PI_VALUE; //pj change /*cout<< "\t" << sita[i];*/ if(k>0&&k0) { temp=sqrt(normala[0]*normala[0]+normala[1]*normala[1]+normala[2]*normala[2]); normala[0]/=temp; normala[1]/=temp; normala[2]/=temp; average=sum/Con; } else { average=0.0; } return(average); } Standard_Real Cal_sita_Modify(int i, int ii, int j, int jj, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface sur1, Handle_Geom_BSplineSurface sur2, vector surInvert, int n, int Mark, Standard_Real* sita) { gp_Vec normal1; gp_Vec normal2; Standard_Real rModulus1; Standard_Real rModulus2; Standard_Real PI_VALUE=3.1415926535898; // pj change Standard_Real temp, Csita, sum, average, nx,ny,nz; int Con=0; sum=0.0; for(int k=0;k<=n;k++) { normal1=Cal_normal(i, ii,us,ue,vs,ve, sur1, surInvert[i], k, n);// if(Mark==1) { normal2=Cal_normal(j, jj,us,ue,vs,ve, sur2, surInvert[j], k, n);// } else { normal2=Cal_normal2(j, jj,us,ue,vs,ve, sur2, surInvert[j], k, n);// } rModulus1 = sqrt(normal1.X()*normal1.X()+normal1.Y()*normal1.Y()+normal1.Z()*normal1.Z()); rModulus2 = sqrt(normal2.X()*normal2.X()+normal2.Y()*normal2.Y()+normal2.Z()*normal2.Z()); if(rModulus1>0&&rModulus2>0) { temp=normal1.X()*normal2.X()+normal1.Y()*normal2.Y()+normal1.Z()*normal2.Z(); Csita=temp/rModulus1/rModulus2; if(Csita>1.0) { Csita=1.0; } else if(Csita<-1.0) { Csita=-1.0; } sita[k]=acos(Csita)*180/PI_VALUE; /*cout<< "\t" << sita[i];*/ if(k>0&&k0) { average=sum/Con; } else { average=0.0; } return(average); } Handle_Geom_BSplineSurface Modefy_sur(int i, int Mark, vector sur1, Standard_Real* temp, vector modefiedu, vector modefiedv) { int row,col; gp_Pnt aP;//, aQ /*Handle_Geom_BSplineSurface sur=sur1[i]->Copy();*/ Handle(Geom_BSplineSurface) sur=Handle(Geom_BSplineSurface)::DownCast(sur1[i]->Copy()); row=sur->NbUPoles(); col=sur->NbVPoles(); if(Mark==0)//00-10 vs[i] { for(int k=2;kPole(k,2); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur->SetPole(k,2, aP); //aQ=sur1[i]->Pole(k,2); } } else if(Mark==1)//10-11 ue[i] { for(int k=2;kPole(row-1,k); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur->SetPole(row-1,k, aP); //aQ=sur1[i]->Pole(row-1,k); } } else if(Mark==2)//11-01 ve[i] { for(int k=2;kPole(k,col-1); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur->SetPole(k,col-1, aP); //aQ=sur1[i]->Pole(k,col-1); } } else// if(Mark==3)//01-00 us[i] { for(int k=2;kPole(2,k); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur->SetPole(2,k, aP); //aQ=sur1[i]->Pole(2,k); } } return(sur); } void Modefy_sur2(int i, int Mark, vector sur1, Standard_Real* temp, vector modefiedu, vector modefiedv) { int row,col; gp_Pnt aP;//, aQ row=sur1[i]->NbUPoles(); col=sur1[i]->NbVPoles(); if(Mark==0)//00-10 vs[i] { if(col>3||modefiedu[i]==false) { for(int k=2;kPole(k,2); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur1[i]->SetPole(k,2, aP); //aQ=sur1[i]->Pole(k,2); } modefiedu[i]=true; } } else if(Mark==1)//10-11 ue[i] { if(row>3||modefiedv[i]==false) { for(int k=2;kPole(row-1,k); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur1[i]->SetPole(row-1,k, aP); //aQ=sur1[i]->Pole(row-1,k); } modefiedv[i]=true; } } else if(Mark==2)//11-01 ve[i] { if(col>3||modefiedu[i]==false) { for(int k=2;kPole(k,col-1); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur1[i]->SetPole(k,col-1, aP); //aQ=sur1[i]->Pole(k,col-1); } modefiedu[i]=true; } } else// if(Mark==3)//01-00 us[i] { if(row>3||modefiedv[i]==false) { for(int k=2;kPole(2,k); aP.SetCoord(aP.X()+temp[0],aP.Y()+temp[1],aP.Z()+temp[2]); sur1[i]->SetPole(2,k, aP); //aQ=sur1[i]->Pole(2,k); } modefiedv[i]=true; } } } gp_Vec Cal_normal(int i, int Mark, vector us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert, int k, int n)// { double uu, vv; gp_Pnt aP; gp_Vec aDu; gp_Vec aDv; gp_Vec normal; Standard_Real rModulus; if(Mark==0)//00-10 vs[i] { uu=us[i]+(double)k / n *(ue[i]-us[i]); vv=vs[i]; //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==1)//10-11 ue[i] { uu=ue[i]; vv=vs[i]+(double)k / n *(ve[i]-vs[i]); //cout<< "\t" << vs[i] << "\t" << ve[i]; } else if(Mark==2)//11-01 ve[i] { uu=ue[i]+(double)k / n *(us[i]-ue[i]); vv=ve[i]; //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==3)//01-00 us[i] { uu=us[i]; vv=ve[i]+(double)k / n *(vs[i]-ve[i]); //cout<< "\t" << vs[i] << "\t" << ve[i]; } myBSplineSurface->D1(uu, vv, aP, aDu, aDv); if(myInvert==false) { normal = aDu.Crossed(aDv); } else { normal = -aDu.Crossed(aDv); } rModulus = sqrt(normal.X()*normal.X()+normal.Y()*normal.Y()+normal.Z()*normal.Z()); if (rModulus > 1.0e-9) { normal.Normalize(); } else { normal.SetCoord(0., 0., 0.); } if (fabs(normal.X())<1.0e-6) { normal.SetCoord(0.0,normal.Y(),normal.Z()); } if (fabs(normal.Y())<1.0e-6) { normal.SetCoord(normal.X(),0.0,normal.Z()); } if (fabs(normal.Z())<1.0e-6) { normal.SetCoord(normal.X(),normal.Y(),0.0); } //cout< us, vector ue, vector vs, vector ve, Handle_Geom_BSplineSurface myBSplineSurface, bool myInvert, int k, int n)// { double uu, vv; gp_Pnt aP; gp_Vec aDu; gp_Vec aDv; gp_Vec normal; Standard_Real rModulus; if(Mark==0)//00-10 vs[i] { uu=us[i]+(double)k / n *(ue[i]-us[i]); vv=vs[i]; //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==1)//10-11 ue[i] { uu=ue[i]; vv=vs[i]+(double)k / n *(ve[i]-vs[i]); //cout<< "\t" << vs[i] << "\t" << ve[i]; } else if(Mark==2)//11-01 ve[i] { uu=ue[i]+(double)k / n *(us[i]-ue[i]); vv=ve[i]; //cout<< "\t" << us[i] << "\t" << ue[i]; } else if(Mark==3)//01-00 us[i] { uu=us[i]; vv=ve[i]+(double)k / n *(vs[i]-ve[i]); //cout<< "\t" << vs[i] << "\t" << ve[i]; } myBSplineSurface->D1(uu, vv, aP, aDu, aDv); if(myInvert==false) { normal = aDu.Crossed(aDv); } else { normal = -aDu.Crossed(aDv); } rModulus = sqrt(normal.X()*normal.X()+normal.Y()*normal.Y()+normal.Z()*normal.Z()); if (rModulus > 1.0e-9) { normal.Normalize(); } else { normal.SetCoord(0., 0., 0.); } if (fabs(normal.X())<1.0e-6) { normal.SetCoord(0.0,normal.Y(),normal.Z()); } if (fabs(normal.Y())<1.0e-6) { normal.SetCoord(normal.X(),0.0,normal.Z()); } if (fabs(normal.Z())<1.0e-6) { normal.SetCoord(normal.X(),normal.Y(),0.0); } //cout<