curvedarch / code /export.py
jpata's picture
labeling
5a8852a
Raw
History Blame Contribute Delete
2.6 kB
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
import io
import numpy as np
def export_plywood_layout_pdf(sheets_data, title="Cut Patterns", color='black'):
"""
Exports the packed meshes from multiple sheets to a multi-page PDF.
'sheets_data' is a list of dicts: [{'meshes': [...], 'w': ..., 'h': ...}, ...]
"""
from matplotlib.backends.backend_pdf import PdfPages
from code.packing import get_mesh_2d_bbox
buf = io.BytesIO()
with PdfPages(buf) as pdf:
scale = 39.37 # Meters to Inches for 1:1 scale
for sheet in sheets_data:
meshes = sheet['meshes']
sheet_w = sheet['w']
sheet_h = sheet['h']
fig, ax = plt.subplots(figsize=(sheet_w * scale, sheet_h * scale))
# 1. Collect all edges
all_lines = []
# Add Sheet Boundary
sheet_boundary = [
(0, 0), (sheet_w, 0), (sheet_w, sheet_h), (0, sheet_h), (0, 0)
]
for i in range(len(sheet_boundary) - 1):
all_lines.append([sheet_boundary[i], sheet_boundary[i+1]])
# Add Mesh Edges and Labels
for mesh in meshes:
for edge in mesh.edges():
p1, p2 = mesh.edge_coordinates(edge)
all_lines.append([(p1[0], p1[1]), (p2[0], p2[1])])
# Add Label
name = mesh.attributes.get('name', '')
if name:
# Simple bbox center for label placement
min_x, min_y, max_x, max_y = get_mesh_2d_bbox(mesh)
ax.text((min_x + max_x)/2, (min_y + max_y)/2, name,
color=color, ha='center', va='center',
fontsize=8, fontweight='bold')
# 2. Draw lines
lc = LineCollection(all_lines, colors=color, linewidths=4.0)
ax.add_collection(lc)
# 3. Setup axes
ax.set_aspect('equal')
ax.set_xlim(0, sheet_w)
ax.set_ylim(0, sheet_h)
ax.axis('off')
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
plt.margins(0,0)
ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
pdf.savefig(fig, transparent=True, pad_inches=0)
plt.close(fig)
buf.seek(0)
return buf