build123d/examples/packed_boxes.py
Ami Fischman 80097a9227 Add a new TestCase that asserts that examples exit successfully.
Examples changes that were necessary:
- loft.py: failed on macos (only) because of (seemingly) over-precise
  floating-point accuracy assertion. Loosened the tolerance, and
  expressed it as a multiple of the expected value.
  > AssertionError: delta=0.002982314711971412 is greater than tolerance=0.001; got=1306.3375467197516, want=1306.3405290344635
- packed_boxes.py: only emit output files when GEN_DOCS is
  True (mimicking lego.py).
2025-02-22 10:11:06 -08:00

37 lines
1.2 KiB
Python

"""
name: packed_boxes.py
by: fischman
date: November 9th 2023
desc: Demo packing a bunch of boxes in 2D.
"""
import functools
import operator
import random
import build123d as bd
GEN_DOCS = False
random.seed(123456)
test_boxes = [bd.Box(random.randint(1, 20), random.randint(1, 20), random.randint(1, 5))
for _ in range(50)]
packed = bd.pack(test_boxes, 3)
# Lifted from https://build123d.readthedocs.io/en/latest/import_export.html#d-to-2d-projection
def export_svg(parts, name):
part = functools.reduce(operator.add, parts, bd.Part())
view_port_origin=(0, 0, 150)
visible, hidden = part.project_to_viewport(view_port_origin)
max_dimension = max(*bd.Compound(children=visible + hidden).bounding_box().size)
exporter = bd.ExportSVG(scale=100 / max_dimension)
exporter.add_layer("Visible")
exporter.add_layer("Hidden", line_color=(99, 99, 99), line_type=bd.LineType.ISO_DOT)
exporter.add_shape(visible, layer="Visible")
exporter.add_shape(hidden, layer="Hidden")
if GEN_DOCS:
exporter.write(f"../docs/assets/{name}.svg")
export_svg(test_boxes, "packed_boxes_input")
export_svg(packed, "packed_boxes_output")