#!/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('') # --- projector beam envelope, drawn first so everything overlays it A(f'') # --- catwalk cone to the acting area A(f'') # --- lip wash cone, stopped by the deck A(f'') # --- house floor and stage A(f'') A(f'') A(f'HOUSE FLOOR') A(f'STAGE DECK') # --- scenic verticals for z, h, col, lbl, dy in ((0.0, PORTAL_H, 'var(--ink)', 'PORTAL', -7), (LEGS[0], 25.0, 'var(--aurora)', 'LEG 1', -7), (LEGS[1], 25.0, 'var(--aurora)', 'LEG 2', 30), (CYC_Z, CYC_H, 'var(--accent)', 'CYC', -7)): A(f'') A(f'{lbl}') # --- electrics for n, z in ELEC.items(): A(f'') A(f'E{n}') # --- electric trim datum and the height the projector must reach A(f'') A(f'ELEC TRIM {TRIM:.0f}′') xd = sx(10.6) A(f'') A(f'') A(f'') A(f'{EPSON_TRIM-TRIM:.1f}′') # --- the two Epsons A(f'') A(f'EPSON ×2') A(f'trim {EPSON_TRIM:.2f}′') # --- FOH positions A(f'') A(f'CATWALK') A(f'40′ · 25′ up') A(f'') A(f'SPOT POSNS') A(f'89′ · 30′ up') # --- deck beam units A(f'') A(f'') A(f'deck beams ×4') # --- lip actors A(f'') A(f'lip actors') # --- dimension strip yb = DECK_Y + 52 A(f'') for z, lbl in ((SPOT_Z, '89′'), (CAT_Z, '40′'), (0.0, '0'), (CYC_Z, '30′')): A(f'') A(f'{lbl}') 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('') # the volume nothing may hang in -- the projector beam on its way to the cyc A(f'') A(f'KEEP CLEAR — projector beam') # acting areas, drawn under everything for i, x in enumerate((-20, -10, 0, 10, 20), start=1): A(f'') A(f'{i}') # cyc A(f'') A(f'CYC 50′ · line set 30') # electrics for n, z in ELEC.items(): A(f'') A(f'ELEC {n}') A(f'+{z:.0f}′') # epson A(f'') A(f'EPSON ×2 · set 14') # legs for z in LEGS: for x0, x1 in ((-26.0, -21.0), (21.0, 26.0)) if z == 6.0 else ((-20.39, -15.39), (15.39, 20.39)): A(f'') # portal A(f'') A(f'') A(f'') A(f'PLASTER 0') # apron edge A(f'') A(f'STAGE LIP −7′') # deck beam units for x in (-DECK_UNITS_X, DECK_UNITS_X): for dz in (-0.8, 1.8): A(f'') for xx, anc in ((-DECK_UNITS_X, 'end'), (DECK_UNITS_X, 'start')): A(f'2 beams') A(f'' 'five acting areas on 10′ centres at +8′, keyed from the catwalk at 19°') 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()))