build123d/docs/topology_selection/examples/group_properties_with_keys.py

61 lines
No EOL
2 KiB
Python

import os
from copy import copy
from build123d import *
from ocp_vscode import *
working_path = os.path.dirname(os.path.abspath(__file__))
filedir = os.path.join(working_path, "..", "..", "assets", "topology_selection")
with BuildPart() as part:
with BuildSketch(Plane.XZ) as sketch:
with BuildLine():
CenterArc((-6, 12), 10, 0, 360)
Line((-16, 0), (16, 0))
make_hull()
Rectangle(50, 5, align=(Align.CENTER, Align.MAX))
extrude(amount=12)
Box(38, 6, 22, align=(Align.CENTER, Align.MAX, Align.MIN), mode=Mode.SUBTRACT)
circle = part.edges().filter_by(GeomType.CIRCLE).sort_by(Axis.Y)[0]
with Locations(Plane(circle.arc_center, z_dir=circle.normal())):
CounterBoreHole(13 / 2, 16 / 2, 4)
mirror(about=Plane.XZ)
before_fillet = copy(part)
length_groups = part.edges().group_by(Edge.length)
fillet(length_groups.group(6) + length_groups.group(5), 4)
after_fillet = copy(part)
with BuildSketch() as pins:
with Locations((-21, 0)):
Circle(3 / 2)
with Locations((21, 0)):
SlotCenterToCenter(1, 3)
extrude(amount=-12, mode=Mode.SUBTRACT)
with GridLocations(42, 16, 2, 2):
CounterBoreHole(3.5 / 2, 3.5, 0)
after_holes = copy(part)
radius_groups = part.edges().filter_by(GeomType.CIRCLE).group_by(Edge.radius)
bearing_edges = radius_groups.group(8).group_by(SortBy.DISTANCE)[-1]
pin_edges = radius_groups.group(1.5).filter_by_position(Axis.Z, -5, -5)
chamfer([pin_edges, bearing_edges], .5)
location = Location((-20, -20))
items = [before_fillet.part] + length_groups.group(6) + length_groups.group(5)
before = Compound(items).move(location)
show(before, after_fillet.part.move(Location((20, 20))))
save_screenshot(os.path.join(filedir, "group_length_key.png"))
location = Location((-20, -20), (180, 0, 0))
after = Compound([after_holes.part] + pin_edges + bearing_edges).move(location)
show(after, part.part.move(Location((20, 20), (180, 0, 0))))
save_screenshot(os.path.join(filedir, "group_radius_key.png"))