#!/usr/bin/env bash # Export every printable part to stl/, each turned to its print orientation and # placed on the bed (z = 0). Run from anywhere. set -euo pipefail DIR="$(cd "$(dirname "$0")" && pwd)" cd "$DIR" mkdir -p stl if ! command -v openscad &>/dev/null; then echo "Error: openscad not found in PATH" >&2 exit 1 fi # name | source file | print-orientation transform applied to the module call render() { local name="$1" src="$2" body="$3" wrap wrap="$(mktemp "${TMPDIR:-/tmp}/_bp_XXXX.scad")" { echo "parameters_only = false;" echo "include <$DIR/tapo_ceiling_mount_parameters.scad>;" echo "use <$DIR/$src>;" echo "$body" } > "$wrap" echo "Rendering stl/$name.stl" openscad --render -o "stl/$name.stl" "$wrap" rm -f "$wrap" } # A part flipped rim-down. OpenSCAD snaps vertices to a 2^-20 mm grid, so the # flipped rim can land a hair above or below z = 0. Sink the part by 0.01 um # and clip it at z = 0, so the rim sits exactly on the bed. flipped() { echo "intersection() { translate([0,0,-1e-5]) translate([0,0, $1]) mirror([0,0,1]) $2 translate([-500,-500,0]) cube(1000); }" } render inner_clamps tapo_ceiling_inner_clamp.scad \ "$(flipped clamp_boss_height "tapo_inner_clamp_pair();")" render inner_clamp tapo_ceiling_inner_clamp.scad \ "$(flipped clamp_boss_height "tapo_inner_clamp();")" render outer_plate tapo_ceiling_outer_plate.scad \ "translate([0,0, plate_thickness + max(centering_lip_height, screw_boss_h)]) mirror([0,0,1]) tapo_outer_plate();" render camera_connector tapo_ceiling_camera_connector.scad \ "$(flipped conn_top_z "camera_connector();")" render camera_adapter_blank tapo_ceiling_camera_adapter_blank.scad \ "$(flipped adapter_rim_z "tapo_camera_adapter_blank();")" render camera_adapter_tapo_original_base tapo_ceiling_camera_adapter_tapo_original_base.scad \ "$(flipped adapter_rim_z "tapo_camera_adapter_original_base();")" render camera_adapter_tapo tapo_ceiling_camera_adapter_tapo.scad \ "$(flipped adapter_rim_z "tapo_camera_adapter_tapo();")" render nut_fit_test tapo_ceiling_nut_fit_test.scad \ "tapo_nut_fit_test_print();" render tapo_base_test_set tapo_ceiling_tapo_base.scad \ "for (i = [0 : len(tapo_fit_gaps) - 1]) translate([i * 62, 0, 0]) tapo_base(tapo_fit_gaps[i], i + 1);" render tapo_base tapo_ceiling_tapo_base.scad \ "tapo_base(tapo_lug_gap);" echo "Done. Print 1 plate, 1 linked clamp pair, 1 connector, 1 adapter."