mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 02:30:55 -08:00
- Unbreak the three broken tutorials (fixes #848) - This involved a rewrite of PPP-01-10 because I already had my own solution to that one and I couldn't easily tell what was going wrong with the previous solution. - Add assertions to all the tutorials so that non-raising means success - Add the TTT examples to `test_examples.py` added recently for #909 - Also added sympy to development dependencies since one of the TTT examples uses it.
104 lines
3.6 KiB
Python
104 lines
3.6 KiB
Python
"""
|
|
Creation of a complex sheet metal part
|
|
|
|
name: ttt_sm_hanger.py
|
|
by: Gumyr
|
|
date: July 17, 2023
|
|
|
|
desc:
|
|
This example implements the sheet metal part described in Too Tall Toby's
|
|
sm_hanger CAD challenge.
|
|
|
|
Notably, a BuildLine/Curve object is filleted by providing all the vertices
|
|
and allowing the fillet operation filter out the end vertices. The
|
|
make_brake_formed operation is used both in Algebra and Builder mode to
|
|
create a sheet metal part from just an outline and some dimensions.
|
|
license:
|
|
|
|
Copyright 2023 Gumyr
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
"""
|
|
|
|
from build123d import *
|
|
from ocp_vscode import *
|
|
|
|
sheet_thickness = 4 * MM
|
|
|
|
# Create the main body from a side profile
|
|
with BuildPart() as side:
|
|
d = Vector(1, 0, 0).rotate(Axis.Y, 60)
|
|
with BuildLine(Plane.XZ) as side_line:
|
|
l1 = Line((0, 65), (170 / 2, 65))
|
|
l2 = PolarLine(l1 @ 1, length=65, direction=d, length_mode=LengthMode.VERTICAL)
|
|
l3 = Line(l2 @ 1, (170 / 2, 0))
|
|
fillet(side_line.vertices(), 7)
|
|
make_brake_formed(
|
|
thickness=sheet_thickness,
|
|
station_widths=[40, 40, 40, 112.52 / 2, 112.52 / 2, 112.52 / 2],
|
|
side=Side.RIGHT,
|
|
)
|
|
fe = side.edges().filter_by(Axis.Z).group_by(Axis.Z)[0].sort_by(Axis.Y)[-1]
|
|
fillet(fe, radius=7)
|
|
|
|
# Create the "wings" at the top
|
|
with BuildPart() as wing:
|
|
with BuildLine(Plane.YZ) as wing_line:
|
|
l1 = Line((0, 65), (80 / 2 + 1.526 * sheet_thickness, 65))
|
|
PolarLine(l1 @ 1, 20.371288916, direction=Vector(0, 1, 0).rotate(Axis.X, -75))
|
|
fillet(wing_line.vertices(), 7)
|
|
make_brake_formed(
|
|
thickness=sheet_thickness,
|
|
station_widths=110 / 2,
|
|
side=Side.RIGHT,
|
|
)
|
|
bottom_edge = wing.edges().group_by(Axis.X)[-1].sort_by(Axis.Z)[0]
|
|
fillet(bottom_edge, radius=7)
|
|
|
|
# Create the tab at the top in Algebra mode
|
|
tab_line = Plane.XZ * Polyline(
|
|
(20, 65 - sheet_thickness), (56 / 2, 65 - sheet_thickness), (56 / 2, 88)
|
|
)
|
|
tab_line = fillet(tab_line.vertices(), 7)
|
|
tab = make_brake_formed(sheet_thickness, 8, tab_line, Side.RIGHT)
|
|
tab = fillet(tab.edges().filter_by(Axis.X).group_by(Axis.Z)[-1].sort_by(Axis.Y)[-1], 5)
|
|
tab -= Pos((0, 0, 80)) * Rot(0, 90, 0) * Hole(5, 100)
|
|
|
|
# Combine the parts together
|
|
with BuildPart() as sm_hanger:
|
|
add([side.part, wing.part])
|
|
mirror(about=Plane.XZ)
|
|
with BuildSketch(Plane.XY.offset(65)) as h1:
|
|
with Locations((20, 0)):
|
|
Rectangle(30, 30, align=(Align.MIN, Align.CENTER))
|
|
fillet(h1.vertices().group_by(Axis.X)[-1], 7)
|
|
SlotCenterPoint((154, 0), (154 / 2, 0), 20)
|
|
extrude(amount=-40, mode=Mode.SUBTRACT)
|
|
with BuildSketch() as h2:
|
|
SlotCenterPoint((206, 0), (206 / 2, 0), 20)
|
|
extrude(amount=40, mode=Mode.SUBTRACT)
|
|
add(tab)
|
|
mirror(about=Plane.YZ)
|
|
mirror(about=Plane.XZ)
|
|
|
|
got_mass = sm_hanger.part.volume*7800*1e-6
|
|
want_mass = 1028
|
|
tolerance = 10
|
|
delta = abs(got_mass - want_mass)
|
|
print(f"Mass: {got_mass:0.1f} g")
|
|
assert delta < tolerance, f'{got_mass=}, {want_mass=}, {delta=}, {tolerance=}'
|
|
|
|
assert abs(got_mass - 1028) < 10, f'{got_mass=}, want=1028, tolerance=10'
|
|
|
|
show(sm_hanger)
|