Add front stabilization bracket
This commit is contained in:
parent
d6ccc3496b
commit
0a4ca64dad
|
@ -236,6 +236,10 @@ class Onbashira(Model):
|
||||||
|
|
||||||
section1_gohei_loc: float = 30.0
|
section1_gohei_loc: float = 30.0
|
||||||
gohei_bolt_diam: float = 6.0
|
gohei_bolt_diam: float = 6.0
|
||||||
|
# Extension from each gohei bolt's centre
|
||||||
|
front_bracket_ext: float = 6.0
|
||||||
|
front_bracket_depth: float = 15.0
|
||||||
|
front_bracket_thickness: float = 6.0
|
||||||
|
|
||||||
magnet_size: float = 6.0
|
magnet_size: float = 6.0
|
||||||
|
|
||||||
|
@ -275,7 +279,7 @@ class Onbashira(Model):
|
||||||
barrel_wall_thickness: float = 25.4 / 8
|
barrel_wall_thickness: float = 25.4 / 8
|
||||||
barrel_length: float = 25.4 * 12
|
barrel_length: float = 25.4 * 12
|
||||||
# Longitudinal shift
|
# Longitudinal shift
|
||||||
barrel_shift: float = -20.0
|
barrel_shift: float = 30.0
|
||||||
|
|
||||||
# Gap between the stator edge and the inner face of the barrel
|
# Gap between the stator edge and the inner face of the barrel
|
||||||
stator_gap: float = 3.0
|
stator_gap: float = 3.0
|
||||||
|
@ -291,6 +295,8 @@ class Onbashira(Model):
|
||||||
bearing_spindle_max_diam: float = 16.0
|
bearing_spindle_max_diam: float = 16.0
|
||||||
bearing_spindle_ext: float = 5.0
|
bearing_spindle_ext: float = 5.0
|
||||||
bearing_spindle_gap: float = 0.2
|
bearing_spindle_gap: float = 0.2
|
||||||
|
bearing_spindle_tail: float = 4.0
|
||||||
|
bearing_spindle_tail_diam: float = 6.0
|
||||||
bearing_gasket_extend: float = 12.0
|
bearing_gasket_extend: float = 12.0
|
||||||
bearing_disk_thickness: float = 25.4 / 16
|
bearing_disk_thickness: float = 25.4 / 16
|
||||||
|
|
||||||
|
@ -373,12 +379,18 @@ class Onbashira(Model):
|
||||||
def angle_side(self) -> float:
|
def angle_side(self) -> float:
|
||||||
return 360 / self.n_side
|
return 360 / self.n_side
|
||||||
@property
|
@property
|
||||||
def delta_side_width(self) -> float:
|
def ratio_side_width(self) -> float:
|
||||||
"""
|
"""
|
||||||
Difference between interior and exterior side width due to side thickness
|
Difference between interior and exterior side width due to side thickness
|
||||||
"""
|
"""
|
||||||
theta = math.pi / self.n_side
|
theta = math.pi / self.n_side
|
||||||
dt = self.side_thickness * math.tan(theta)
|
return math.tan(theta)
|
||||||
|
@property
|
||||||
|
def delta_side_width(self) -> float:
|
||||||
|
"""
|
||||||
|
Difference between interior and exterior side width due to side thickness
|
||||||
|
"""
|
||||||
|
dt = self.side_thickness * self.ratio_side_width
|
||||||
return dt * 2
|
return dt * 2
|
||||||
@property
|
@property
|
||||||
def side_width_inner(self) -> float:
|
def side_width_inner(self) -> float:
|
||||||
|
@ -701,8 +713,8 @@ class Onbashira(Model):
|
||||||
for i in range(self.n_side):
|
for i in range(self.n_side):
|
||||||
angle = (i+0.5) * th1
|
angle = (i+0.5) * th1
|
||||||
result.faces(">Z").moveTo(
|
result.faces(">Z").moveTo(
|
||||||
br * math.cos(angle),
|
br * math.cos(-angle),
|
||||||
br * math.sin(angle),
|
br * math.sin(-angle),
|
||||||
).tagPlane(f"holeF{i}")
|
).tagPlane(f"holeF{i}")
|
||||||
result.faces("<Z").moveTo(
|
result.faces("<Z").moveTo(
|
||||||
br * math.cos(-angle),
|
br * math.cos(-angle),
|
||||||
|
@ -803,6 +815,7 @@ class Onbashira(Model):
|
||||||
r1 = self.bearing_gap / 2
|
r1 = self.bearing_gap / 2
|
||||||
r2 = self.bearing_spindle_max_diam / 2
|
r2 = self.bearing_spindle_max_diam / 2
|
||||||
h = self.bearing_disk_gap
|
h = self.bearing_disk_gap
|
||||||
|
h2 = self.bearing_spindle_ext + self.bearing_disk_thickness - self.bearing_spindle_tail
|
||||||
cone = Cq.Solid.makeCone(
|
cone = Cq.Solid.makeCone(
|
||||||
radius1=r2,
|
radius1=r2,
|
||||||
radius2=r1,
|
radius2=r1,
|
||||||
|
@ -810,14 +823,22 @@ class Onbashira(Model):
|
||||||
)
|
)
|
||||||
cyl = Cq.Solid.makeCylinder(
|
cyl = Cq.Solid.makeCylinder(
|
||||||
radius=r1,
|
radius=r1,
|
||||||
height=self.bearing_spindle_ext + self.bearing_disk_thickness,
|
height=h2,
|
||||||
pnt=(0, 0, h/2)
|
pnt=(0, 0, h/2)
|
||||||
)
|
)
|
||||||
|
tail = Cq.Solid.makeCone(
|
||||||
|
radius1=r1,
|
||||||
|
radius2=self.bearing_spindle_tail_diam/2,
|
||||||
|
height=self.bearing_spindle_tail,
|
||||||
|
pnt=(0, 0, h/2 + h2),
|
||||||
|
)
|
||||||
|
assert self.bearing_spindle_tail < self.bearing_spindle_ext
|
||||||
|
assert self.bearing_spindle_tail_diam > BOLT_BEARING.diam_thread
|
||||||
hole = Cq.Solid.makeCylinder(
|
hole = Cq.Solid.makeCylinder(
|
||||||
radius=(BOLT_BEARING.diam_thread + self.bearing_spindle_gap)/2,
|
radius=(BOLT_BEARING.diam_thread + self.bearing_spindle_gap)/2,
|
||||||
height=h*4
|
height=self.bearing_spindle_height
|
||||||
).moved(0, 0, -h*2)
|
).moved(0, 0, -self.bearing_spindle_height/2)
|
||||||
top = cone + cyl - hole
|
top = cone + cyl + tail - hole
|
||||||
return top + top.mirror("XY")
|
return top + top.mirror("XY")
|
||||||
|
|
||||||
def barrel(self) -> Cq.Compound:
|
def barrel(self) -> Cq.Compound:
|
||||||
|
@ -1429,6 +1450,51 @@ class Onbashira(Model):
|
||||||
|
|
||||||
### Side Panels
|
### Side Panels
|
||||||
|
|
||||||
|
@target(name="front-bracket")
|
||||||
|
def front_bracket(self) -> Cq.Workplane:
|
||||||
|
assert self.front_bracket_ext > self.gohei_bolt_diam / 2
|
||||||
|
assert self.front_bracket_depth > self.gohei_bolt_diam
|
||||||
|
x0 = self.bulk_radius
|
||||||
|
y0 = x0 * math.tan(2 * math.pi / self.n_side)
|
||||||
|
s1 = self.side_width_inner
|
||||||
|
s2 = s1 - self.front_bracket_thickness * self.ratio_side_width
|
||||||
|
result = (
|
||||||
|
Cq.Workplane()
|
||||||
|
.sketch()
|
||||||
|
.regularPolygon(s1, self.n_side)
|
||||||
|
.regularPolygon(s2, self.n_side, mode="s")
|
||||||
|
.polygon([
|
||||||
|
(0, 0),
|
||||||
|
(x0, 0),
|
||||||
|
(x0, y0),
|
||||||
|
], mode="i")
|
||||||
|
.finalize()
|
||||||
|
.extrude(self.front_bracket_depth)
|
||||||
|
.translate((0, 0, -self.front_bracket_depth/2))
|
||||||
|
)
|
||||||
|
hole_subtractor = Cq.Solid.makeCylinder(
|
||||||
|
radius=BOLT_COMMON.diam_thread/2,
|
||||||
|
height=self.bulk_radius,
|
||||||
|
dir=(1, 0, 0)
|
||||||
|
)
|
||||||
|
result -= hole_subtractor
|
||||||
|
angle = 360 / self.n_side
|
||||||
|
result -= hole_subtractor.rotate((0,0,0), (0, 0, 1), angle)
|
||||||
|
loc_rot = Cq.Location.rot2d(angle)
|
||||||
|
r1 = self.bulk_radius - self.side_thickness
|
||||||
|
result.tagAbsolute("holeT1", (r1, 0, 0), direction="+X")
|
||||||
|
loc_ht1 = (loc_rot * Cq.Location(r1, 0, 0)).toTuple()[0]
|
||||||
|
result.tagAbsolute("holeT2", loc_ht1, direction=loc_ht1)
|
||||||
|
return result
|
||||||
|
|
||||||
|
@target(name="front-bracket-large")
|
||||||
|
def front_bracket_large(self) -> Cq.Workplane:
|
||||||
|
"""
|
||||||
|
Optional alternative that is a bit bigger
|
||||||
|
"""
|
||||||
|
result = self.front_bracket()
|
||||||
|
return result + result.mirror("XZ")
|
||||||
|
|
||||||
def profile_side_panel(
|
def profile_side_panel(
|
||||||
self,
|
self,
|
||||||
length: float,
|
length: float,
|
||||||
|
@ -1546,8 +1612,12 @@ class Onbashira(Model):
|
||||||
result.tagAbsolute(f"holeBSI{i}", (-px, -py, t), direction="+Z")
|
result.tagAbsolute(f"holeBSI{i}", (-px, -py, t), direction="+Z")
|
||||||
result.tagAbsolute(f"holeBPO{i}", (+px, -py, 0), direction="-Z")
|
result.tagAbsolute(f"holeBPO{i}", (+px, -py, 0), direction="-Z")
|
||||||
result.tagAbsolute(f"holeBSO{i}", (-px, -py, 0), direction="-Z")
|
result.tagAbsolute(f"holeBSO{i}", (-px, -py, 0), direction="-Z")
|
||||||
|
# Mark the gohei attachment points
|
||||||
|
y_gohei = self.side_length1/2 - self.section1_gohei_loc
|
||||||
|
result.tagAbsolute(f"holeGoheiB", (0, y_gohei, t), direction="+Z")
|
||||||
|
result.tagAbsolute(f"holeGoheiF", (0, y_gohei, 0), direction="-Z")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@target(name="side-panel2", kind=TargetKind.DXF)
|
@target(name="side-panel2", kind=TargetKind.DXF)
|
||||||
def profile_side_panel2(self) -> Cq.Sketch:
|
def profile_side_panel2(self) -> Cq.Sketch:
|
||||||
return (
|
return (
|
||||||
|
@ -1579,7 +1649,26 @@ class Onbashira(Model):
|
||||||
role=Role.STRUCTURE | Role.DECORATION,
|
role=Role.STRUCTURE | Role.DECORATION,
|
||||||
loc=Cq.Location.rot2d(i*360/self.n_side) * Cq.Location(-r,0,0,90,0,90),
|
loc=Cq.Location.rot2d(i*360/self.n_side) * Cq.Location(-r,0,0,90,0,90),
|
||||||
)
|
)
|
||||||
return a
|
a = a.constrain(f"side{i}", "Fixed")
|
||||||
|
for i in range(self.n_side):
|
||||||
|
i1 = (i + 1) % self.n_side
|
||||||
|
name_bracket = f"front_bracket{i}"
|
||||||
|
a = a.addS(
|
||||||
|
self.front_bracket(),
|
||||||
|
name=name_bracket,
|
||||||
|
role=Role.STRUCTURE,
|
||||||
|
)
|
||||||
|
a = a.constrain(
|
||||||
|
f"side{i1}?holeGoheiB",
|
||||||
|
f"{name_bracket}?holeT1",
|
||||||
|
"Plane",
|
||||||
|
)
|
||||||
|
a = a.constrain(
|
||||||
|
f"side{i}?holeGoheiB",
|
||||||
|
f"{name_bracket}?holeT2",
|
||||||
|
"Plane",
|
||||||
|
)
|
||||||
|
return a.solve()
|
||||||
def assembly_section(self, **kwargs) -> Cq.Assembly:
|
def assembly_section(self, **kwargs) -> Cq.Assembly:
|
||||||
a = Cq.Assembly()
|
a = Cq.Assembly()
|
||||||
side = self.side_panel(**kwargs)
|
side = self.side_panel(**kwargs)
|
||||||
|
@ -2335,6 +2424,7 @@ class Onbashira(Model):
|
||||||
a = a.add(self.assembly_machine(), name="machine")
|
a = a.add(self.assembly_machine(), name="machine")
|
||||||
if has_part(parts, "electronics1"):
|
if has_part(parts, "electronics1"):
|
||||||
a = a.add(self.assembly_electronics1(), name="electronics1")
|
a = a.add(self.assembly_electronics1(), name="electronics1")
|
||||||
|
a = a.constrain("electronics1/controller", "Fixed")
|
||||||
if has_part(parts, ["electronics1", "ring3"]):
|
if has_part(parts, ["electronics1", "ring3"]):
|
||||||
a = a.constrain(
|
a = a.constrain(
|
||||||
f"electronics1/barL?holeBO2",
|
f"electronics1/barL?holeBO2",
|
||||||
|
@ -2374,27 +2464,27 @@ class Onbashira(Model):
|
||||||
)
|
)
|
||||||
a = a.constrain(
|
a = a.constrain(
|
||||||
f"{coupler_name}?holeOB",
|
f"{coupler_name}?holeOB",
|
||||||
f"ring1/side{i}?holeStatorL",
|
f"ring1/side{i}?holeStatorR",
|
||||||
"Plane",
|
"Plane",
|
||||||
)
|
)
|
||||||
a = a.constrain(
|
a = a.constrain(
|
||||||
f"{coupler_name}?holeIF",
|
f"{coupler_name}?holeIF",
|
||||||
f"machine/stator2?holeB{ir}",
|
f"machine/stator1?holeF{ir}",
|
||||||
"Plane",
|
"Plane",
|
||||||
)
|
)
|
||||||
|
|
||||||
name_bolt =f"stator_outer_bolt{i}"
|
#name_bolt =f"stator_outer_bolt{i}"
|
||||||
a = a.addS(
|
#a = a.addS(
|
||||||
BOLT_LONG.generate(),
|
# BOLT_LONG.generate(),
|
||||||
name=name_bolt,
|
# name=name_bolt,
|
||||||
material=self.material_fastener,
|
# material=self.material_fastener,
|
||||||
role=Role.CONNECTION,
|
# role=Role.CONNECTION,
|
||||||
)
|
#)
|
||||||
a = a.constrain(
|
#a = a.constrain(
|
||||||
f"{coupler_name}?holeOF",
|
# f"{coupler_name}?holeOF",
|
||||||
f"{name_bolt}?root",
|
# f"{name_bolt}?root",
|
||||||
"Plane",
|
# "Plane",
|
||||||
)
|
#)
|
||||||
|
|
||||||
name_bolt =f"chamber_back{i}boltFPI{i}"
|
name_bolt =f"chamber_back{i}boltFPI{i}"
|
||||||
a = a.addS(
|
a = a.addS(
|
||||||
|
|
Loading…
Reference in New Issue