55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
|
from dataclasses import dataclass
|
||
|
import cadquery as Cq
|
||
|
from nhf import Material, Role
|
||
|
from nhf.build import Model, target, assembly, TargetKind
|
||
|
import nhf.utils
|
||
|
|
||
|
@dataclass
|
||
|
class LightPanel(Model):
|
||
|
|
||
|
# Dimensions of the base panel
|
||
|
length: float = 300.0
|
||
|
width: float = 200.0
|
||
|
|
||
|
grid_height: float = 30.0
|
||
|
grid_top_height: float = 10.0
|
||
|
# Distance from grid to edge
|
||
|
grid_margin: float = 20.0
|
||
|
# Number of holes in each row of the grid
|
||
|
grid_holes: int = 5
|
||
|
grid_layers: int = 10
|
||
|
grid_hole_width: float = 10.0
|
||
|
|
||
|
base_thickness: float = 25.4/16
|
||
|
grid_thickness: float = 25.4/8
|
||
|
|
||
|
def __post_init__(self):
|
||
|
assert self.grid_holes >= 2
|
||
|
super().__init__(name="crown")
|
||
|
|
||
|
@target(name="grid", kind=TargetKind.DXF)
|
||
|
def grid_profile(self):
|
||
|
w = self.length - self.grid_margin * 2
|
||
|
h = self.grid_height + self.grid_top_height
|
||
|
|
||
|
# The width of one hole (w0) satisfies
|
||
|
# n * w0 + (n+1) t = w
|
||
|
# where t is the thickness of the edge
|
||
|
n = self.grid_holes
|
||
|
w0 = self.grid_hole_width
|
||
|
t = (w - n * w0) / (n + 1)
|
||
|
# The spacing is such that the first and last holes are a distance `t`
|
||
|
# away from the edges, so it satisfies
|
||
|
# t + w0/2 + (n-1) * s + w0/2 + t = w
|
||
|
step = (w - t*2 - w0) / (n - 1)
|
||
|
return (
|
||
|
Cq.Sketch()
|
||
|
.push([(0, h/2)])
|
||
|
.rect(w, h)
|
||
|
.push([
|
||
|
(i * step + t + w0/2 - w/2, self.grid_height/2)
|
||
|
for i in range(0, n)
|
||
|
])
|
||
|
.rect(w0, self.grid_height, mode='s')
|
||
|
)
|