#!/usr/bin/env python3
"""Lighting-plan diagrams, generated from the surveyed venue numbers."""
import math
# ---- venue, all depths in feet upstage of the plaster line, y=0 at stage deck
CYC_Z, CYC_W, CYC_H = 30.0, 50.0, 30.0
OPEN_W, OPEN_H = 50.0, 21.5
PORTAL_W, PORTAL_H = 62.0, 29.5
HOUSE_Y = -3.5 # house floor relative to deck
APRON, PIT = 7.0, 16.0
EPSON_Z, EPSON_TRIM = 14.0, 27.84
EPSON_LO, EPSON_HI, EPSON_HALF = 0.70, 29.27, 22.86
CAT_Z, CAT_Y = -40.0, 25.0 # FOH catwalk
SPOT_Z, SPOT_Y = -89.0, 30.0 # followspot positions
ELEC = {1: 3.0, 2: 8.0, 3: 17.0}
TRIM = 18.0
LEGS = (6.0, 12.0)
DECK_UNITS_Z, DECK_UNITS_X = 3.0, 23.0
def beam_env(z):
"""Epson cyc-beam envelope at depth z: (bottom, top, half-width)."""
f = (z - EPSON_Z) / (CYC_Z - EPSON_Z)
if f < 0:
return None
return (EPSON_TRIM + (EPSON_LO - EPSON_TRIM) * f,
EPSON_TRIM + (EPSON_HI - EPSON_TRIM) * f,
EPSON_HALF * f)
# ---------------------------------------------------------------- SECTION
def section_svg():
"""Side section: every position, its angle, and the projector beam."""
X0, X1 = -95.0, 34.0 # feet, downstage negative
PX = 5.6 # px per foot horizontally
PY = 5.6 # px per foot vertically
DECK_Y = 300.0
ox = 40.0
sx = lambda z: ox + (z - X0) * PX
sy = lambda y: DECK_Y - y * PY
p = []
A = p.append
A('')
cap = ('Side section, to scale. Note the vertical relationship: the Epsons hang at 27.84′, '
'9.8′ above the 18′ electric trim. An ultra-short lens sits near the '
'top of its own picture, so it has to be above everything it clears — the beam then falls '
'away downstage-to-upstage and passes over Electric 3 with 4.75′ to spare. '
'The violet wedge is that beam — '
'nothing may hang inside it, which is why Electric 4 flies out. The blue wedge is the catwalk '
'front wash, top-cut so it dies on the deck at +22′ rather than climbing the cyc. The green '
'wedge is the lip wash from the followspot positions: cut at 7′ above the house floor it is '
'stopped by the apron at +2.7′, downstage of the first legs, so it can never reach a screen.')
return ('\n \n
\n ' + ''.join(p) +
f'\n
\n {cap}\n ')
# ---------------------------------------------------------------- PLAN
def plan_svg():
"""Plan view: positions across the width, and what each system covers."""
PX = 8.4
cx = 350.0
top = 46.0 # y px for the cyc (z = 30)
PZ = 6.4 # px per foot of depth
sx = lambda x: cx + x * PX
sz = lambda z: top + (CYC_Z - z) * PZ
p = []
A = p.append
A('')
cap = ('Plan. Five acting areas on 10′ centres at +8′, each keyed from the catwalk at 19°. '
'The four deck beam units sit at ±23′, three feet upstage of plaster — downstage of '
'the first legs so nothing blocks them, and behind the 6′ portal side bands so the bodies are '
'masked from most of the house.')
return ('\n \n
\n ' + ''.join(p) +
f'\n
\n {cap}\n ')
if __name__ == "__main__":
print(len(section_svg()), len(plan_svg()))