File size: 2,710 Bytes
41d6e2b 89f261c 41d6e2b dddf9a7 41d6e2b 89f261c dddf9a7 41d6e2b 89f261c dddf9a7 41d6e2b dddf9a7 41d6e2b 89f261c dddf9a7 41d6e2b dddf9a7 41d6e2b dddf9a7 41d6e2b 89f261c dddf9a7 41d6e2b 89f261c dddf9a7 41d6e2b dddf9a7 41d6e2b dddf9a7 41d6e2b 89f261c 41d6e2b dddf9a7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
import FreeCAD as App
import FreeCADGui as Gui
from FreeCAD import Vector
import math
def createFlangeAssembly():
doc = App.newDocument("Flange")
# === Parameters ===
FLANGE_OUTER_DIAMETER = 100.0
FLANGE_THICKNESS = 7.5
BORE_INNER_DIAMETER = 50.0
NECK_HEIGHT = 15.0
NECK_OUTER_DIAMETER = 60.0
NUM_BOLT_HOLES = 6
BOLT_HOLE_DIAMETER = 12.0
PCD = 75.0
total_height = FLANGE_THICKNESS + NECK_HEIGHT
# === 1. Create flange base ===
flange = doc.addObject("Part::Cylinder", "Flange")
flange.Radius = FLANGE_OUTER_DIAMETER / 2
flange.Height = FLANGE_THICKNESS
# === 2. Cut central bore from flange ===
bore = doc.addObject("Part::Cylinder", "CentralBore")
bore.Radius = BORE_INNER_DIAMETER / 2
bore.Height = FLANGE_THICKNESS
bore_cut = doc.addObject("Part::Cut", "FlangeWithBore")
bore_cut.Base = flange
bore_cut.Tool = bore
# === 3. Create neck ===
neck_outer = doc.addObject("Part::Cylinder", "NeckOuter")
neck_outer.Radius = NECK_OUTER_DIAMETER / 2
neck_outer.Height = NECK_HEIGHT
neck_outer.Placement.Base = Vector(0, 0, FLANGE_THICKNESS)
neck_inner = doc.addObject("Part::Cylinder", "NeckInner")
neck_inner.Radius = BORE_INNER_DIAMETER / 2
neck_inner.Height = NECK_HEIGHT
neck_inner.Placement.Base = Vector(0, 0, FLANGE_THICKNESS)
neck_hollow = doc.addObject("Part::Cut", "HollowNeck")
neck_hollow.Base = neck_outer
neck_hollow.Tool = neck_inner
# === 4. Fuse flange (with central hole) and neck ===
fused = doc.addObject("Part::Fuse", "FlangeAndNeck")
fused.Base = bore_cut
fused.Tool = neck_hollow
# === 5. Cut bolt holes sequentially ===
current_shape = fused
bolt_radius = BOLT_HOLE_DIAMETER / 2
bolt_circle_radius = PCD / 2
for i in range(NUM_BOLT_HOLES):
angle_deg = 360 * i / NUM_BOLT_HOLES
angle_rad = math.radians(angle_deg)
x = bolt_circle_radius * math.cos(angle_rad)
y = bolt_circle_radius * math.sin(angle_rad)
hole = doc.addObject("Part::Cylinder", f"BoltHole_{i+1:02d}")
hole.Radius = bolt_radius
hole.Height = total_height
hole.Placement.Base = Vector(x, y, 0)
cut = doc.addObject("Part::Cut", f"Cut_Bolt_{i+1:02d}")
cut.Base = current_shape
cut.Tool = hole
current_shape = cut
# === 6. Final result ===
doc.recompute()
Gui.activeDocument().activeView().viewAxometric()
Gui.SendMsgToActiveView("ViewFit")
return doc
if __name__ == "__main__":
createFlangeAssembly()
import FreeCADGui
FreeCADGui.activeDocument().activeView().viewAxometric()
FreeCADGui.SendMsgToActiveView("ViewFit")
|