//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOMImpl_PlaneDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOMImpl_IPlane aPI (aFunction); Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; double aSize = aPI.GetSize() / 2.0; if (aType == PLANE_PNT_VEC) { Handle(GEOM_Function) aRefPnt = aPI.GetPoint(); Handle(GEOM_Function) aRefVec = aPI.GetVector(); TopoDS_Shape aShape1 = aRefPnt->GetValue(); TopoDS_Shape aShape2 = aRefVec->GetValue(); if (aShape1.ShapeType() != TopAbs_VERTEX || aShape2.ShapeType() != TopAbs_EDGE) return 0; gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShape1)); TopoDS_Edge anE = TopoDS::Edge(aShape2); TopoDS_Vertex V1, V2; TopExp::Vertices(anE, V1, V2, Standard_True); if (!V1.IsNull() && !V2.IsNull()) { gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); gp_Pln aPln (aP, aV); aShape = BRepBuilderAPI_MakeFace(aPln, -aSize, +aSize, -aSize, +aSize).Shape(); } } else if (aType == PLANE_THREE_PNT) { Handle(GEOM_Function) aRefPnt1 = aPI.GetPoint1(); Handle(GEOM_Function) aRefPnt2 = aPI.GetPoint2(); Handle(GEOM_Function) aRefPnt3 = aPI.GetPoint3(); TopoDS_Shape aShape1 = aRefPnt1->GetValue(); TopoDS_Shape aShape2 = aRefPnt2->GetValue(); TopoDS_Shape aShape3 = aRefPnt3->GetValue(); if (aShape1.ShapeType() != TopAbs_VERTEX || aShape2.ShapeType() != TopAbs_VERTEX || aShape3.ShapeType() != TopAbs_VERTEX) return 0; gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape1)); gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape2)); gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShape3)); if (aP1.Distance(aP2) < gp::Resolution() || aP1.Distance(aP3) < gp::Resolution() || aP2.Distance(aP3) < gp::Resolution()) Standard_ConstructionError::Raise("Plane creation aborted: coincident points given"); if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular())) Standard_ConstructionError::Raise("Plane creation aborted: points lay on one line"); GC_MakePlane aMakePlane (aP1, aP2, aP3); aShape = BRepBuilderAPI_MakeFace(aMakePlane, -aSize, +aSize, -aSize, +aSize).Shape(); } else if (aType == PLANE_FACE) { Handle(GEOM_Function) aRef = aPI.GetFace(); TopoDS_Shape aRefShape = aRef->GetValue(); //if (aRefShape.ShapeType() != TopAbs_FACE) return 0; //Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aRefShape)); //if (!aGS->IsKind(STANDARD_TYPE(Geom_Plane))) { // Standard_TypeMismatch::Raise("Plane creation aborted: non-planar face given as argument"); //} //aShape = BRepBuilderAPI_MakeFace(aGS, -aSize, +aSize, -aSize, +aSize).Shape(); gp_Ax3 anAx3 = GEOMImpl_IMeasureOperations::GetPosition(aRefShape); gp_Pln aPln (anAx3); aShape = BRepBuilderAPI_MakeFace(aPln, -aSize, +aSize, -aSize, +aSize).Shape(); } else if (aType == PLANE_TANGENT_FACE) { Handle(GEOM_Function) aRefFace = aPI.GetFace(); TopoDS_Shape aShape1 = aRefFace->GetValue(); if(aShape1.IsNull()) Standard_TypeMismatch::Raise("Plane was not created.Basis face was not specified"); TopoDS_Face aFace = TopoDS::Face(aShape1); Standard_Real aKoefU = aPI.GetParameterU(); Standard_Real aKoefV = aPI.GetParameterV(); Standard_Real aUmin,aUmax,aVmin,aVmax; ShapeAnalysis::GetFaceUVBounds(aFace,aUmin,aUmax,aVmin,aVmax); Standard_Real aDeltaU = aUmax - aUmin; Standard_Real aDeltaV = aVmax - aVmin; Standard_Real aParamU = aUmin + aDeltaU*aKoefU; Standard_Real aParamV = aVmin + aDeltaV*aKoefV; Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace); if(aSurf.IsNull()) Standard_TypeMismatch::Raise("Plane was not created.Base surface is absent"); gp_Vec aVecU,aVecV; gp_Pnt aPLoc; aSurf->D1(aParamU,aParamV,aPLoc,aVecU,aVecV); BRepTopAdaptor_FClass2d clas(aFace,Precision::PConfusion()); TopAbs_State stOut= clas.PerformInfinitePoint(); gp_Pnt2d aP2d(aParamU,aParamV); TopAbs_State st= clas.Perform(aP2d); if(st == stOut) Standard_TypeMismatch::Raise("Plane was not created.Point lies outside the face"); gp_Vec aNorm = aVecU^aVecV; gp_Ax3 anAxis(aPLoc,gp_Dir(aNorm),gp_Dir(aVecU)); gp_Pln aPlane(anAxis); BRepBuilderAPI_MakeFace aTool(aPlane, -aSize, +aSize, -aSize, +aSize); if(aTool.IsDone()) aShape = aTool.Shape(); } else if (aType == PLANE_2_VEC) { Handle(GEOM_Function) aRefVec1 = aPI.GetVector1(); Handle(GEOM_Function) aRefVec2 = aPI.GetVector2(); TopoDS_Shape aShape1 = aRefVec1->GetValue(); TopoDS_Shape aShape2 = aRefVec2->GetValue(); if (aShape1.ShapeType() != TopAbs_EDGE || aShape2.ShapeType() != TopAbs_EDGE) return 0; TopoDS_Edge aVectX = TopoDS::Edge(aShape1); TopoDS_Edge aVectZ = TopoDS::Edge(aShape2); TopoDS_Vertex VX1, VX2, VZ1, VZ2; TopExp::Vertices( aVectX, VX1, VX2, Standard_True ); TopExp::Vertices( aVectZ, VZ1, VZ2, Standard_True ); gp_Vec aVX = gp_Vec( BRep_Tool::Pnt( VX1 ), BRep_Tool::Pnt( VX2 ) ); gp_Vec aVZ = gp_Vec( BRep_Tool::Pnt( VZ1 ), BRep_Tool::Pnt( VZ2 ) ); if ( aVX.Magnitude() < Precision::Confusion() || aVZ.Magnitude() < Precision::Confusion()) Standard_TypeMismatch::Raise("Invalid vector selected"); gp_Dir aDirX = gp_Dir( aVX.X(), aVX.Y(), aVX.Z() ); gp_Dir aDirZ = gp_Dir( aVZ.X(), aVZ.Y(), aVZ.Z() ); if ( aDirX.IsParallel( aDirZ, Precision::Angular() ) ) Standard_TypeMismatch::Raise("Parallel vectors selected"); gp_Ax3 aPlane = gp_Ax3( BRep_Tool::Pnt( VX1 ), aDirZ, aDirX ); BRepBuilderAPI_MakeFace aTool(aPlane, -aSize, +aSize, -aSize, +aSize); if(aTool.IsDone()) aShape = aTool.Shape(); } else if (aType == PLANE_LCS) { Handle(GEOM_Function) aRef = aPI.GetLCS(); double anOrientation = aPI.GetOrientation(); gp_Ax3 anAx3; if (aRef.IsNull()) { gp_Ax2 anAx2 = gp::XOY(); anAx3 = gp_Ax3( anAx2 ); } else { TopoDS_Shape aRefShape = aRef->GetValue(); if (aRefShape.ShapeType() != TopAbs_FACE) return 0; anAx3 = GEOMImpl_IMeasureOperations::GetPosition(aRefShape); } if ( anOrientation == 2) anAx3 = gp_Ax3(anAx3.Location(), anAx3.XDirection(), anAx3.YDirection() ); else if ( anOrientation == 3 ) anAx3 = gp_Ax3(anAx3.Location(), anAx3.YDirection(), anAx3.XDirection() ); gp_Pln aPln(anAx3); aShape = BRepBuilderAPI_MakeFace(aPln, -aSize, +aSize, -aSize, +aSize).Shape(); } else { } if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }
TopoDS_Shape MakeBottle(const Standard_Real myWidth, const Standard_Real myHeight, const Standard_Real myThickness) { // Profile : Define Support Points gp_Pnt aPnt1(-myWidth / 2., 0, 0); gp_Pnt aPnt2(-myWidth / 2., -myThickness / 4., 0); gp_Pnt aPnt3(0, -myThickness / 2., 0); gp_Pnt aPnt4(myWidth / 2., -myThickness / 4., 0); gp_Pnt aPnt5(myWidth / 2., 0, 0); // Profile : Define the Geometry Handle(Geom_TrimmedCurve) anArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3,aPnt4); Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1, aPnt2); Handle(Geom_TrimmedCurve) aSegment2 = GC_MakeSegment(aPnt4, aPnt5); // Profile : Define the Topology TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(anArcOfCircle); TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(aSegment2); TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(anEdge1, anEdge2, anEdge3); // Complete Profile gp_Ax1 xAxis = gp::OX(); gp_Trsf aTrsf; aTrsf.SetMirror(xAxis); BRepBuilderAPI_Transform aBRepTrsf(aWire, aTrsf); TopoDS_Shape aMirroredShape = aBRepTrsf.Shape(); TopoDS_Wire aMirroredWire = TopoDS::Wire(aMirroredShape); BRepBuilderAPI_MakeWire mkWire; mkWire.Add(aWire); mkWire.Add(aMirroredWire); TopoDS_Wire myWireProfile = mkWire.Wire(); // Body : Prism the Profile TopoDS_Face myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile); gp_Vec aPrismVec(0, 0, myHeight); TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile, aPrismVec); // Body : Apply Fillets BRepFilletAPI_MakeFillet mkFillet(myBody); TopExp_Explorer anEdgeExplorer(myBody, TopAbs_EDGE); while(anEdgeExplorer.More()) { TopoDS_Edge anEdge = TopoDS::Edge(anEdgeExplorer.Current()); //Add edge to fillet algorithm mkFillet.Add(myThickness / 12., anEdge); anEdgeExplorer.Next(); } myBody = mkFillet.Shape(); // Body : Add the Neck gp_Pnt neckLocation(0, 0, myHeight); gp_Dir neckAxis = gp::DZ(); gp_Ax2 neckAx2(neckLocation, neckAxis); Standard_Real myNeckRadius = myThickness / 4.; Standard_Real myNeckHeight = myHeight / 10.; BRepPrimAPI_MakeCylinder MKCylinder(neckAx2, myNeckRadius, myNeckHeight); TopoDS_Shape myNeck = MKCylinder.Shape(); myBody = BRepAlgoAPI_Fuse(myBody, myNeck); // Body : Create a Hollowed Solid TopoDS_Face faceToRemove; Standard_Real zMax = -1; for(TopExp_Explorer aFaceExplorer(myBody, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()) { TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current()); // Check if <aFace> is the top face of the bottle�s neck Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace); if(aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane)) { Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface); gp_Pnt aPnt = aPlane->Location(); Standard_Real aZ = aPnt.Z(); if(aZ > zMax) { zMax = aZ; faceToRemove = aFace; } } } TopTools_ListOfShape facesToRemove; facesToRemove.Append(faceToRemove); myBody = BRepOffsetAPI_MakeThickSolid(myBody, facesToRemove, -myThickness / 50, 1.e-3); // Threading : Create Surfaces Handle(Geom_CylindricalSurface) aCyl1 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 0.99); Handle(Geom_CylindricalSurface) aCyl2 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 1.05); // Threading : Define 2D Curves gp_Pnt2d aPnt(2. * M_PI, myNeckHeight / 2.); gp_Dir2d aDir(2. * M_PI, myNeckHeight / 4.); gp_Ax2d anAx2d(aPnt, aDir); Standard_Real aMajor = 2. * M_PI; Standard_Real aMinor = myNeckHeight / 10; Handle(Geom2d_Ellipse) anEllipse1 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor); Handle(Geom2d_Ellipse) anEllipse2 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor / 4); Handle(Geom2d_TrimmedCurve) anArc1 = new Geom2d_TrimmedCurve(anEllipse1, 0, M_PI); Handle(Geom2d_TrimmedCurve) anArc2 = new Geom2d_TrimmedCurve(anEllipse2, 0, M_PI); gp_Pnt2d anEllipsePnt1 = anEllipse1->Value(0); gp_Pnt2d anEllipsePnt2 = anEllipse1->Value(M_PI); Handle(Geom2d_TrimmedCurve) aSegment = GCE2d_MakeSegment(anEllipsePnt1, anEllipsePnt2); // Threading : Build Edges and Wires TopoDS_Edge anEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(anArc1, aCyl1); TopoDS_Edge anEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment, aCyl1); TopoDS_Edge anEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(anArc2, aCyl2); TopoDS_Edge anEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment, aCyl2); TopoDS_Wire threadingWire1 = BRepBuilderAPI_MakeWire(anEdge1OnSurf1, anEdge2OnSurf1); TopoDS_Wire threadingWire2 = BRepBuilderAPI_MakeWire(anEdge1OnSurf2, anEdge2OnSurf2); BRepLib::BuildCurves3d(threadingWire1); BRepLib::BuildCurves3d(threadingWire2); // Create Threading BRepOffsetAPI_ThruSections aTool(Standard_True); aTool.AddWire(threadingWire1); aTool.AddWire(threadingWire2); aTool.CheckCompatibility(Standard_False); TopoDS_Shape myThreading = aTool.Shape(); // Building the Resulting Compound TopoDS_Compound aRes; BRep_Builder aBuilder; aBuilder.MakeCompound (aRes); aBuilder.Add (aRes, myBody); aBuilder.Add (aRes, myThreading); return aRes; }