# [Setup]
from build123d import *

# [Setup]


def write_svg(filename: str, view_port_origin=(-100, -50, 30)):
    """Save an image of the BuildPart object as SVG"""
    builder: BuildPart = BuildPart._get_context()

    visible, hidden = builder.part.project_to_viewport(view_port_origin)
    max_dimension = max(*Compound(children=visible + hidden).bounding_box().size)
    exporter = ExportSVG(scale=100 / max_dimension)
    exporter.add_layer("Visible")
    exporter.add_layer("Hidden", line_color=(99, 99, 99), line_type=LineType.ISO_DOT)
    exporter.add_shape(visible, layer="Visible")
    exporter.add_shape(hidden, layer="Hidden")
    exporter.write(f"assets/{filename}.svg")


# [Ex. 1]
with BuildPart() as example_1:
    Box(3, 2, 1)
    # [Ex. 1]
    write_svg("box_example")

# [Ex. 2]
with BuildPart() as example_2:
    Cone(2, 1, 2)
    # [Ex. 2]
    write_svg("cone_example")

# [Ex. 3]
with BuildPart() as example_3:
    Box(3, 2, 1)
    with Locations(example_3.faces().sort_by(Axis.Z)[-1]):
        CounterBoreHole(0.2, 0.4, 0.5, 0.9)
    # [Ex. 3]
    write_svg("counter_bore_hole_example")


# [Ex. 4]
with BuildPart() as example_4:
    Box(3, 2, 1)
    with Locations(example_3.faces().sort_by(Axis.Z)[-1]):
        CounterSinkHole(0.2, 0.4, 0.9)
    # [Ex. 4]
    write_svg("counter_sink_hole_example")

# [Ex. 5]
with BuildPart() as example_5:
    Cylinder(1, 2)
    # [Ex. 5]
    write_svg("cylinder_example")

# [Ex. 6]
with BuildPart() as example_6:
    Box(3, 2, 1)
    Hole(0.4)
    # [Ex. 6]
    write_svg("hole_example")

# [Ex. 7]
with BuildPart() as example_7:
    Sphere(1, 0)
    # [Ex. 7]
    write_svg("sphere_example")

# [Ex. 8]
with BuildPart() as example_8:
    Torus(1, 0.2)
    # [Ex. 8]
    write_svg("torus_example")

# [Ex. 9]
with BuildPart() as example_9:
    Wedge(1, 1, 1, 0, 0, 0.5, 0.5)
    # [Ex. 9]
    write_svg("wedge_example")

# [Ex. 10]
with BuildPart() as example_10:
    Box(30, 20, 20)
    Box(20, 30, 20)
    Box(20, 20, 30)
    with Locations((-10, 0, 0)):
        Box(40, 23, 23)
    ConvexPolyhedron(example_10.vertices())
    # [Ex. 10]
    write_svg("convex_polyhedron_example")
