//-------------------------------------------------------------------------------------------------- bool _MakeBendSection(MakeContext context) { if (_Angle <= 0) { return(true); } // Make face for revolving var bendFace = _MakeBendSectionFace(context); if (bendFace == null) { return(false); } // Build bend section var makeRevol = new BRepPrimAPI_MakeRevol(bendFace, context.BendAxis, _Angle.Clamp(0.0, 180.0).ToRad()); if (!makeRevol.IsDone()) { Messages.Error("Failed building bending edge."); return(false); } context.BendSectionShape = makeRevol.Shape(); return(true); }
public override void Build() { double wallThick = wallThickness.Meters; double diam = diameter.Meters; double crownRad = crownRadius.Meters; double knucleRad = knucleRadius.Meters; double totalH = totalHeight.Meters; double use1 = useless1.Meters; double use2 = useless2.Bars; string use3 = useless3; // can't work if P == O if (crownRadius == knucleRadius) { return; } // _____________curved part_____________ // on va définir un certain nombre de points // certains avec des intersections de cercles, donc va y avoir un peu de calculs... gp_Pnt A = new gp_Pnt(wallThick, 0, 0); // point à droite de la base gp_Pnt B = new gp_Pnt(0, 0, 0); // point à gauche de la base gp_Pnt C = new gp_Pnt(0, totalH, 0); // debut de l'arc exterieur gp_Pnt H = new gp_Pnt(wallThick, totalH, 0); // debut de l'arc intérieur gp_Pnt P = new gp_Pnt(wallThick + crownRad, totalH, 0); // centre du petit cercle formant l'arc gp_Pnt O = new gp_Pnt(wallThick + knucleRad, totalH, 0); // centre du grand cercle formant le capot gp_Pnt a1 = new gp_Pnt(crownRad * Math.Cos(3 * Math.PI / 4) + P.X(), crownRad * Math.Sin(3 * Math.PI / 4) + P.Y(), 0); // point de l'arc de cercle intérieur gp_Pnt a2 = new gp_Pnt((crownRad + wallThick) * Math.Cos(3 * Math.PI / 4) + P.X(), (crownRad + wallThick) * Math.Sin(3 * Math.PI / 4) + P.Y(), 0); // point de l'arc de cercle extérieur // pour a3 et a4 c'est compliqué, je crois que je dois choisir un angle au hasard et que potentiellement ça peut tout niquer (si R2 trop petit comparé à R1) //gp_Pnt a3 = new gp_Pnt(-radius2 * Math.Cos(3 * Math.PI / 4) + thickness + radius2, radius2* Math.Sin(3 * Math.PI / 4)+ totalHeight - thickness - radius2, 0); // point de l'arc du capot intérieur //gp_Pnt a4 = new gp_Pnt(-(radius2 + thickness) * Math.Cos(3 * Math.PI / 4) + thickness + radius2, (radius2 + thickness) * Math.Sin(3 * Math.PI / 4) + totalHeight - thickness - radius2, 0); // point de l'arc du capot extérieur gp_Pnt E = new gp_Pnt(O.X(), O.Y() + knucleRad + wallThick, 0); // haut du capot gp_Pnt F = new gp_Pnt(O.X(), O.Y() + knucleRad, 0); // haut du capot mais côté intérieur // maintenant il faut définir les intersections des arcs de cercle et du capot // soit l'intersection du cercle de rayon myRadius1(R1) et de centre P (que l'on va abréger P(R1) ) avec O(R2) // et également (myThickness=T) P(R1+T) avec O(R2+T) gp_Pnt G = new gp_Pnt(P.X(), P.Y() + crownRad, 0); // point de l'arc de cercle intérieur gp_Pnt D = new gp_Pnt(P.X(), P.Y() + crownRad + wallThick, 0); // point de l'arc de cercle extérieur // maintenant qu'on a tous nos points faut les relier ;) TopoDS_Edge AB = new BRepBuilderAPI_MakeEdge(A, B).Edge(); TopoDS_Edge BC = new BRepBuilderAPI_MakeEdge(B, C).Edge(); GC_MakeArcOfCircle Ca2D = new GC_MakeArcOfCircle(C, a2, D); BRepBuilderAPI_MakeEdge meCa2D = new BRepBuilderAPI_MakeEdge(Ca2D.Value()); TopoDS_Edge CD = meCa2D.Edge(); TopoDS_Edge DE = new BRepBuilderAPI_MakeEdge(D, E).Edge(); TopoDS_Edge EF = new BRepBuilderAPI_MakeEdge(E, F).Edge(); TopoDS_Edge FG = new BRepBuilderAPI_MakeEdge(F, G).Edge(); GC_MakeArcOfCircle Ga1H = new GC_MakeArcOfCircle(G, a1, H); BRepBuilderAPI_MakeEdge meGa1H = new BRepBuilderAPI_MakeEdge(Ga1H.Value()); TopoDS_Edge GH = meGa1H.Edge(); TopoDS_Edge HA = new BRepBuilderAPI_MakeEdge(H, A).Edge(); // creating the wire BRepBuilderAPI_MakeWire aMakeWire = new BRepBuilderAPI_MakeWire(AB, BC, CD, DE); TopoDS_Wire aWire = aMakeWire.Wire(); aMakeWire = new BRepBuilderAPI_MakeWire(aWire, EF); aWire = aMakeWire.Wire(); aMakeWire = new BRepBuilderAPI_MakeWire(aWire, FG); aWire = aMakeWire.Wire(); aMakeWire = new BRepBuilderAPI_MakeWire(aWire, GH); aWire = aMakeWire.Wire(); aMakeWire = new BRepBuilderAPI_MakeWire(aWire, HA); aWire = aMakeWire.Wire();//*/ // rotation du wire gp_Ax1 Axis = new gp_Ax1(new gp_Pnt(wallThick + knucleRad, 0, 0), new gp_Dir(0, 1, 0)); // origine 0,0,0 avec dir 0,1,0 BRepBuilderAPI_MakeFace aMakeFace = new BRepBuilderAPI_MakeFace(aWire); TopoDS_Face face = aMakeFace.Face(); BRepPrimAPI_MakeRevol aMakeRevol = new BRepPrimAPI_MakeRevol(face, Axis, 2 * Math.PI); aMakeRevol.Build(); TopoDS_Shape aRotatedShape = aMakeRevol.Shape(); // _____________triangulation_____________ SetMyFaces(Triangulation(aRotatedShape, 0.007f)); //*/ }