mirror of
https://github.com/gumyr/build123d.git
synced 2026-01-23 04:52:27 -08:00
95 lines
No EOL
3 KiB
Python
95 lines
No EOL
3 KiB
Python
import os
|
|
from copy import copy
|
|
|
|
from build123d import *
|
|
from ocp_vscode import *
|
|
|
|
working_path = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
with BuildPart() as part_context:
|
|
with BuildSketch() as sketch:
|
|
with BuildLine() as line:
|
|
l1 = Line((0, -3), (6, -3))
|
|
l2 = JernArc(l1 @ 1, l1 % 1, radius=3, arc_size=180)
|
|
l3 = PolarLine(l2 @ 1, 6, direction=l2 % 1)
|
|
l4 = Line(l1 @ 0, l3 @ 1)
|
|
make_face()
|
|
|
|
with Locations((6, 0, 0)):
|
|
Circle(2, mode=Mode.SUBTRACT)
|
|
|
|
extrude(amount=2)
|
|
|
|
with BuildSketch(Plane.YZ) as plate_sketch:
|
|
RectangleRounded(16, 6, 1.5, align=(Align.CENTER, Align.MIN))
|
|
|
|
plate = extrude(amount=-2)
|
|
|
|
with Locations(plate.faces().group_by(Face.area)[-1].sort_by(Axis.X)[-1]):
|
|
with GridLocations(13, 3, 2, 2):
|
|
CounterSinkHole(.5, 1)
|
|
|
|
fillet(edges().filter_by(lambda e: e.length == 2).filter_by(Axis.Z), 1)
|
|
bore = faces().filter_by(GeomType.CYLINDER).filter_by(lambda f: f.radius == 2)
|
|
chamfer(bore.edges(), .2)
|
|
|
|
line = Line((0, -3), (6, -3))
|
|
line += JernArc(line @ 1, line % 1, radius=3, arc_size=180)
|
|
line += PolarLine(line @ 1, 6, direction=line % 1)
|
|
|
|
sketch = make_hull(line.edges())
|
|
sketch -= Pos(6, 0, 0) * Circle(2)
|
|
part = extrude(sketch, amount= 2)
|
|
part_before = copy(part)
|
|
|
|
plate_sketch = Plane.YZ * RectangleRounded(16, 6, 1.5, align=(Align.CENTER, Align.MIN))
|
|
plate = extrude(plate_sketch, amount=-2)
|
|
plate_face = plate.faces().group_by(Face.area)[-1].sort_by(Axis.X)[-1]
|
|
plate -= Plane(plate_face) * GridLocations(13, 3, 2, 2) * CounterSinkHole(.5, 1, 2)
|
|
|
|
part += plate
|
|
part_before2 = copy(part)
|
|
|
|
part = fillet(part.edges().filter_by(lambda e: e.length == 2).filter_by(Axis.Z), 1)
|
|
bore = part.faces().filter_by(GeomType.CYLINDER).filter_by(lambda f: f.radius == 2)
|
|
part = chamfer(bore.edges(), .2)
|
|
|
|
class Punch(BaseSketchObject):
|
|
def __init__(
|
|
self,
|
|
radius: float,
|
|
size: float,
|
|
blobs: float,
|
|
rotation: float = 0,
|
|
mode: Mode = Mode.ADD,
|
|
):
|
|
with BuildSketch() as punch:
|
|
if blobs == 1:
|
|
Circle(size)
|
|
else:
|
|
with PolarLocations(radius, blobs):
|
|
Circle(size)
|
|
|
|
if len(faces()) > 1:
|
|
raise RuntimeError("radius is too large for number and size of blobs")
|
|
|
|
add(Face(faces()[0].outer_wire()), mode=Mode.REPLACE)
|
|
|
|
super().__init__(obj=punch.sketch, rotation=rotation, mode=mode)
|
|
|
|
tape = Rectangle(20, 5)
|
|
for i, location in enumerate(GridLocations(5, 0, 4, 1)):
|
|
tape -= location * Punch(.8, 1, i + 1)
|
|
|
|
set_defaults(reset_camera=Camera.RESET)
|
|
show(line)
|
|
save_screenshot(os.path.join(working_path, "create_1d.png"))
|
|
|
|
show(sketch, Pos(10, 10) * part_before)
|
|
save_screenshot(os.path.join(working_path, "upgrade_2d.png"))
|
|
|
|
show(plate, Pos(12, 12) * part_before2, Pos(24, 24) * part)
|
|
save_screenshot(os.path.join(working_path, "add_part.png"))
|
|
|
|
show(tape)
|
|
save_screenshot(os.path.join(working_path, "extend.png")) |