#include "Stdafx.h" #include "OCCMakeSolid.h" //#include "BOPTools_Tools2D.hxx" // XUEFENG DELETE 202009 #include "BRepPrimAPI_MakeHalfSpace.hxx" #include "SplitAllInsectionCurves.h" OCCMakeSolid::OCCMakeSolid(void) { } OCCMakeSolid::OCCMakeSolid( vector shapeSet ) { this->shapeSet = shapeSet; } OCCMakeSolid::~OCCMakeSolid(void) { } TopoDS_Shape OCCMakeSolid::GetResult() { return this->result; } void OCCMakeSolid::Perform() { TopoDS_Compound comp; BRep_Builder builder; builder.MakeCompound(comp); TopoDS_Shape ss,s; if(shapeSet.size() == 1) { vector faceSet; for(TopExp_Explorer ex(shapeSet[0], TopAbs_FACE); ex.More(); ex.Next()) { faceSet.push_back(TopoDS::Face(ex.Current())); } TopoDS_Shell shell = SewShell(faceSet); BRepBuilderAPI_MakeSolid newsolid = BRepBuilderAPI_MakeSolid(shell); newsolid.Build(); result = newsolid.Solid(); return; } vector pSet; gp_Pnt center = ComputeSolidCenter(); for(int i = 0; i < shapeSet.size(); i++) { TopoDS_Shape bShape = shapeSet[i]; TopoDS_Compound c; BRep_Builder b; b.MakeCompound(c); for(int j = 0; j < shapeSet.size(); j++) { if(i == j) { continue; } b.Add(c,shapeSet[j]); } TopoDS_Solid solid; if(bShape.ShapeType() ==TopAbs_FACE) { BRepPrimAPI_MakeHalfSpace MHS(TopoDS::Face(bShape), center); solid=MHS.Solid(); } else if(bShape.ShapeType() ==TopAbs_SHELL) { BRepPrimAPI_MakeHalfSpace MHS(TopoDS::Shell(bShape), center); solid=MHS.Solid(); } if(solid.IsNull()) { continue; } if(!IsReversed(solid, center)) { solid.Reverse(); } if(i == 0) { ss = solid; continue; } BRepAlgoAPI_Common newcut(solid ,ss); if(newcut.IsDone()) { //builder.Add(comp, newcut.Shape()); ss = newcut.Shape(); } //throw comp; } throw ss; TopoDS_Compound compAll; builder.MakeCompound(compAll); for(int i = 0; i < shapeSet.size(); i++) { builder.Add(compAll, shapeSet[i]); } //throw compAll; TopoDS_Compound comp1; builder.MakeCompound(comp1); for(TopExp_Explorer ex(comp, TopAbs_FACE);ex.More(); ex.Next()) { builder.Add(comp1, TopoDS::Face(ex.Current())); } comp = comp1; BRepAlgoAPI_Cut newcut(compAll ,comp); if(!newcut.IsDone()) { return; } s = newcut.Shape(); throw s; vector faceSet; for(TopExp_Explorer ex(s, TopAbs_FACE); ex.More(); ex.Next()) { faceSet.push_back(TopoDS::Face(ex.Current())); } TopoDS_Shell shell = SewShell(faceSet); BRepBuilderAPI_MakeSolid newsolid = BRepBuilderAPI_MakeSolid(shell); newsolid.Build(); result = newsolid.Solid(); } gp_Pnt OCCMakeSolid::ComputeSolidCenter() { vector pSet; for(int i = 0; i < shapeSet.size(); i++) { TopoDS_Shape bShape = shapeSet[i]; TopoDS_Compound c; BRep_Builder b; b.MakeCompound(c); for(int j = 0; j < shapeSet.size(); j++) { if(i == j) { continue; } b.Add(c,shapeSet[j]); } BRepAlgoAPI_Section asect(bShape,c,Standard_False); asect.ComputePCurveOn1(Standard_True); asect.Approximation(Standard_True); asect.Build(); TopoDS_Shape splitResult = asect.Shape(); map mapEdge; for (TopExp_Explorer Ex(splitResult,TopAbs_EDGE); Ex.More(); Ex.Next()) { mapEdge.insert(make_pair(mapEdge.size(), TopoDS::Edge(Ex.Current()))); } std::vector allWires; std::vector allWiresName; for(map::iterator iter = mapEdge.begin(); iter != mapEdge.end(); iter++) { allWires.push_back(iter->second); std::string linename; linename = std::to_string(i); allWiresName.push_back(linename); //builder.Add(compLine,faceBorder[i]); } // 将原面拆分 成网格面 CSplitAllInsectionCurves m_tool; m_tool.Init(allWires,allWiresName); if(m_tool.GetAllWires(false)) { map mapEdge; std::map> closedatas= m_tool.GetClosedResultDatas(); for(std::map>::iterator iter= closedatas.begin(); iter != closedatas.end(); iter++) { vector wireDate = iter->second; for(vector::iterator it = wireDate.begin(); it != wireDate.end(); it++) { CResultData data = *it; double df,dl; Handle(Geom_Curve) cv = BRep_Tool::Curve(m_tool.GetIWireByID(data.m_iWireID),df,dl); Handle(Geom_TrimmedCurve) myTrimmed = new Geom_TrimmedCurve(cv, data.m_dStartRatio,data.m_dEndRatio); TopoDS_Edge newEdge = BRepBuilderAPI_MakeEdge(myTrimmed); gp_Pnt p1,p2; GetEdgeStartEndPoint(newEdge, p1,p2); pSet.push_back(p1); pSet.push_back(p2); } } } } gp_Pnt center(0,0,0); for(int i = 0; i < pSet.size(); i++) { center = gp_Pnt(center.X() + pSet[i].X(), center.Y() + pSet[i].Y(), center.Z() + pSet[i].Z()); } center = gp_Pnt(center.X() / pSet.size(), center.Y() / pSet.size(), center.Z() / pSet.size()); return center; }