# Grouper Tender: the user's blueprint measured. Plain Python (no bpy): import it or exec it. # # Source: reference/user_blueprint.jpg (1408 x 768 px), an AI-drawn sheet "DEEP SEA EXPLORER - SUBTUB CLASS, ORTHOGRAPHIC # BLUEPRINT DS-ST-001" (TOP, SIDE, BOTTOM, FRONT ELEVATION, BACK ELEVATION, two SECTION A-A: COCKPIT INTERIOR), sent with # "create me 3d model of this tender from this blueprint exactly". Every number below is a pixel of the ORIGINAL picture, # read on 4-10x zooms with rulers (reference/z4_*.png, build/gr_zoom.py), white-line runs per column and row (red channel # > 105: the lines are 1.5-2 px wide, the grid R 15-60, the blue ground R 0-25), circle fits (build/gr_circles.py), closed # regions (build/gr_regions.py) and the flood-filled silhouettes (build/gr_trace.py, gr_views.py -> # reference/mask_*.png, lines_*.png, build/outline_tables.json). "line" = the centre of a drawn line; "edge" = the outer edge # of the silhouette (0.75 px outside the outline's centre). # # VIEWS AND AXES # SIDE (sheet x 430-1010, y 255-520): the STARBOARD side, nose to the RIGHT (+x), up = -y. SIDE RULES (the user's rule). # TOP (x 440-1000, y 20-250): nose to the right; the upper half of the image is PORT. Centre line y 149.0. Same x as SIDE at # the stern (drum 516-543 in both) and at the nose face (912-916); its ring is drawn 6.8 px forward of SIDE's # (760.2 vs 753.4): plan positions are taken from SIDE where SIDE shows the part, widths from TOP. # BOTTOM(x 440-1000, y 520-745): a near copy of TOP (an AI sheet); used only for what neither SIDE nor TOP show # (the ventral port, the skeg's root, the transducer). # FRONT (x 95-385, y 215-550): looking aft at the nose; viewer's right = PORT. Same vertical scale and datum as SIDE (drum # centre 426.2 vs 425.3, pods 455.4, bottom 476.5 vs 476); horizontally 1/0.941 of TOP's (max hull width 153 px vs # 144): lateral = (x - 231.85) * 0.941 TOP px. # BACK (x 1075-1345, y 235-550): looking forward at the stern; viewer's right = STARBOARD. Vertical = SIDE's (duct centre # 377.9 vs drum 379.1); horizontally 1/0.935 of TOP's: lateral = (1205.9 - x) * 0.935 TOP px. # SECTION A-A (top right, x 1040-1360, y 20-240): the full hull section at the ring, looking forward, drawn 1/1.346 of SIDE # vertically and 1/1.31 of TOP laterally (its ring top y 70 = SIDE 294, its circle r 55.7 = the hull's 73 px half # width, its bottom skids y 200 = SIDE 469 = the pods). The bottom-left SECTION A-A (x 150-315, y 565-710) is # another AI take of the same cabin: used only for the curved overhead console panels. # # SCALE: S = 0.0171 m per px (TOP, SIDE, BOTTOM). The sheet's dimension labels contradict each other and the drawing: # label view drawn between (px) span px mm/px # 15500 TOP x 516-941 425 36.5 # 15500 (x2) SIDE x 515-950 435 35.6 # 2800 TOP y 77-221 144 19.4 # 2100 TOP y 97.5-200 102.5 20.5 # 1850 TOP y 119.5-179 59.5 31.1 # 1990 TOP y 113-186 73 27.3 # 1880 SIDE y 296-476 180 10.4 # 1950 SIDE y 319.5-436 116.5 16.7 # 1890 SIDE y 340-420 80 23.6 # 2030 / 1600 BOTTOM y 549-689 / 573-664 140 / 91 14.5 / 17.6 # 2100 / 1950 FRONT x 156-307 / 175.5-288.5 151 / 113 13.9 / 17.3 # 2000 / 1950 FRONT x 171-293 / 151-313 122 / 162 16.4 / 12.0 # 2100 / 1950 FRONT y 296-475 / 320-458 179 / 138 11.7 / 14.1 # 2000 / 1950 BACK x 1141-1272 / 1121-1291 131 / 170 15.3 / 11.5 # "1:100 (at A1 size)" is not a usable scale. 10.4 to 36.5 mm/px: no label set can be trusted; the two pairs that agree # (TOP 2800/2100: 19.4/20.5; the stern drum's 1850/1890: 23.1/23.6) disagree with each other. # The one hard size is the docking interface: the arm's claws close round a collar of the Kazah's profile (wall r 0.506- # 0.535, hook lip r 0.552, lip top z 1.375; claws shut at r 0.558-0.693, never below z 1.213; landing feet z 1.405 over # r 0.41-0.53). The sheet's top ring, read in TOP as three circles round (760.2, 149.0): r 38.89 (its footprint on the # hull), r 32.19 and r 29.63 (the thick double line of its top face). At 0.0171 m/px: 0.665, 0.5505, 0.5067 m: the drawn # ring IS the Kazah collar (inner wall 0.506, lip 0.552) within 1.5 mm. At 20 mm/px the claws would land on the ring's top # face (r 0.59-0.64) and the clips would need their own hardware inside a smaller hatch than drawn. # Result: 7.42 m from the stern duct to the sensor drum's face, 2.46 m hull width, 2.71 m over the thruster pods, # 2.95 m hull height (3.11 m to the collar's lip, 3.55 m to the antenna tip). Moon pool (estimated from the Mako's and # Spearfish's results: about 1.1 m left at 4.64 m aft of the origin): the stern face is 3.97 m aft -> about 1.7 m left; # the Coder's sweep_check gives the real number. # Checked independently on the user's concept render (reference/user_concept.jpg, 2026-10-22, "Check this picture as a # referance": the same sub with two pilots): the side window is about 3.2 head heights tall (0.74 m for a 0.23 m head) # -> 0.74 / 44 px = 16.8 mm/px; the hull height against the heads -> about 17.5 mm/px. Both agree with 17.1. # (A first reading at 14 mm/px from the section's seat heights was dropped: the section is the least careful drawing # and its seats come out tall at any scale that fits the docking collar and the concept's pilots.) # History: this file was written by two copies of the Designer on 2026-10-22 (02:43-03:01, the Administrator's # mistake); reconciled at 03:05 by the remaining one: one set of scripts (gr_trace.py -> gr_views.py -> gr_sil_tables.py, # gr_tracecheck.py), S = 0.0171 kept, sections 4, 5, 6, 7, 10 and 12 revised for the concept render. # # ORIGIN AND AXES (the Kazah's): 1 unit = 1 m, nose to -Y, port +X, Z up; origin on the centre line 9 cm behind the clamp # axis. Clamp axis = the ring's centre: SIDE x 753.40 (the collar's side walls 721/786 at y 297, 716/790.5 at its foot), # TOP lateral 0. Origin at SIDE x 753.40 - 0.09 / S = 748.14. # z: the collar's lip top must be z 1.375 (the Kazah's). Drawn, the top face's edge is SIDE y 296 and the hull under the # collar y 303.6: with y 296 = 1.375 the hull's top at the clamp axis would be z 1.245 and under the claws' inner tips # (r 0.558 on the diagonals) z 1.19, only 2.3 cm below the claws' lowest point (1.213). The collar is therefore built # 1.75 px (0.03 m) taller than drawn: its lip top is image y 294.25 -> Z0 = 294.25 + 1.375 / S = 374.66. Hull top at the # axis z 1.215, under the claws' inner tips z 1.16 (5.3 cm clear). The SIDE outline moves 1.75 px at the collar only. S = 0.0171 X0 = 748.14 # SIDE/TOP image x of the origin CL_IMG = 753.40 # SIDE image x of the clamp axis (Y = -0.09) Z0 = 374.66 # SIDE/FRONT/BACK image y of z = 0 (the collar 1.75 px taller than drawn, see above) YC_TOP = 149.0 # TOP image y of the centre line (ring 148.9-149.0, stern drum 108/190, mid hull 77/221) YC_BOTTOM = 628.8 # BOTTOM image y of the centre line (its ring's centre) XC_FRONT, KF = 231.85, 0.941 # FRONT centre x (pods 171.3/292.7 -> 232.0, emitters 195.7/267.6 -> 231.65, drum 231.7) XC_BACK, KB = 1205.9, 0.935 # BACK centre x (duct 1205.9, pods 1141.4/1270.4 -> 1205.9) SEC_C = (1206.67, 134.5) # SECTION A-A (top right): centre of its hull circle (r 55.7) SEC_KY, SEC_KX = 1.346, 1.31 # section px -> SIDE px (vertical), -> TOP px (lateral) SEC_Y_SIDE = 380.8 # SIDE image y of the section circle's centre (294 + (134.5 - 70) * 1.346) Y_CL = -0.09 def Yi(x): """SIDE/TOP image x -> Blender Y (nose -Y)""" return (X0 - x) * S def Zi(y): """SIDE/FRONT/BACK image y -> Blender Z""" return (Z0 - y) * S def Xt(y): """TOP image y -> Blender X (port +X is the upper half)""" return (YC_TOP - y) * S def Xbot(y): """BOTTOM image y -> |X| from the centre line (the BOTTOM is used only for centre-line parts)""" return abs(y - YC_BOTTOM) * S def Xf(x): """FRONT image x -> Blender X (viewer's right = port)""" return (x - XC_FRONT) * KF * S def Xb(x): """BACK image x -> Blender X (viewer's left = port)""" return (XC_BACK - x) * KB * S def Xs(x): """SECTION A-A image x -> Blender X (looking forward: viewer's left = port)""" return (SEC_C[0] - x) * SEC_KX * S def Zs(y): """SECTION A-A image y -> Blender Z""" return Zi(SEC_Y_SIDE + (y - SEC_C[1]) * SEC_KY) def Lp(px): """a TOP/SIDE pixel length -> metres""" return px * S # ===================================================================================================================== # 1. THE HULL (one quad grid, lofted from stations; the parts below are separate meshes or trims) # ===================================================================================================================== # Stations run from the stern duct's front face (x 543) to the nose's front frame (x 913). Each station's section: # top z = HULL_TOP (SIDE line, parts removed), bottom z = HULL_BOT (SIDE line), half width = HULL_HALF (TOP line), # the height of the widest line = HULL_YW, the section = two superellipse quadrants joined at the widest line: # upper (|X| / W) ** NU + ((yw - y) / (yw - ytop)) ** NU = 1, lower the same with NL and (y - yw) / (ybot - yw). # Exponents read off BACK and FRONT (mid body, top 305, widest 378, bottom 477): BACK half widths 38.5/48/56/62/66.5/ # 72/75/77 at y 312/320/328/336/344/352/360/368 -> NU 1.95-2.3, take 2.1; below: 75/73/71/69/68.5 at 396/404/412/420/424 # and the hull bottom arc 470 at |x| 42, 477 at 0 (FRONT, between the pods) -> NL 1.8 near the widest line, 2.8 at the # bottom: take 2.3. Check: the upper rim (SIDE y 340) lands at |X| 62.6 px, where TOP draws its line (lateral 62-64). NU_MID, NL_MID = 2.1, 2.3 # stern end (x 543-560) eases to a circle (2.0/2.0) to meet the duct (r 41, centre y 379.1); the nose (x 867-913) has a # flat underside (the nose body's underside at y 398): NL 3.2 there; the upper nose keeps 2.1. SECTION_EXPONENTS = [(543, 2.0, 2.0), (562, 2.1, 2.3), (840, 2.1, 2.3), (867, 2.1, 3.2), (913, 2.1, 3.2)] # hull top, SIDE line centre (x, y). Removed: the antenna foot (x 701-711), the collar (716-791: the hull runs under it # from 304.5 to 303.0, the collar's footprint lens dips to y 317 at its lateral sides), the emitter housings (843-863: # the hull line under them read on the 10x zoom). The stern shoulder rises from the duct's top corner (543, 339) in 7 px. HULL_TOP = [(543, 339.0), (544, 335.5), (545, 331.5), (546, 327.5), (548, 323.0), (550, 320.5), (555, 319.0), (560, 320.5), (565, 320.5), (570, 319.5), (575, 318.5), (580, 318.0), (585, 317.0), (590, 316.5), (595, 316.0), (600, 315.5), (605, 315.5), (610, 314.5), (615, 314.5), (620, 314.5), (625, 314.5), (630, 314.5), (635, 313.5), (640, 312.5), (645, 312.0), (650, 311.0), (655, 310.5), (660, 309.5), (665, 309.5), (670, 308.5), (675, 307.5), (680, 307.5), (685, 306.5), (690, 306.5), (695, 305.5), (700, 305.5), (705, 305.0), (710, 304.5), (716, 304.5), (735, 304.0), (753.4, 303.6), (770, 303.3), (791, 303.0), (795, 302.5), (800, 303.0), (805, 303.5), (810, 303.5), (815, 304.5), (820, 305.5), (825, 305.5), (830, 306.5), (835, 307.5), (840, 309.0), (845, 310.5), (850, 311.5), (855, 313.5), (860, 315.0), (865, 317.5), (870, 320.5), (875, 323.5), (880, 326.5), (885, 330.0), (889.5, 336.0), (892.5, 342.0), (897.5, 348.0), (901.0, 354.0), (903.5, 360.0), (906.0, 366.0), (908.0, 372.0), (909.0, 378.0), (911.0, 384.0), (913.0, 390.0)] # the nose's front profile below x 889 is a near-vertical face: as (x, y) the same points continue to the chin step NOSE_FRONT = [(889.5, 336.0), (890.0, 339.0), (892.5, 342.0), (894.5, 345.0), (897.5, 348.0), (899.0, 351.0), (901.0, 354.0), (902.5, 357.0), (903.5, 360.0), (905.0, 363.0), (906.0, 366.0), (907.0, 369.0), (908.0, 372.0), (908.5, 375.0), (909.0, 378.0), (910.0, 381.0), (911.0, 384.0), (913.5, 387.0), (913.0, 390.0), (913.0, 393.0), (913.0, 396.0), (912.5, 399.0)] # hull bottom, SIDE line centre (x, y). Aft: the keel line, straight from the duct's bottom corner to x 733 (the ventral # skeg hangs under 547-614). Mid: the belly, the same line as the pods' bottom where they are full (800-838). Fore: the # cheek's lower branch up to its tip (867, 420), then the nose body's flat underside at y 398 to the frame (913, 396). HULL_BOT = [(543, 421.0), (545, 422.0), (550, 423.5), (555, 425.0), (560, 426.5), (565, 427.5), (570, 429.0), (575, 430.0), (580, 431.5), (585, 432.5), (590, 433.5), (595, 434.5), (600, 435.5), (605, 436.5), (610, 437.5), (615, 438.5), (620, 440.0), (625, 440.5), (630, 441.5), (635, 442.5), (640, 443.5), (645, 444.5), (650, 445.5), (655, 446.5), (660, 447.5), (665, 448.5), (670, 449.0), (680, 450.5), (690, 452.5), (700, 454.0), (710, 455.5), (720, 456.5), (730, 457.5), (735, 461.0), (740, 463.5), (745, 465.5), (750, 467.5), (755, 468.5), (760, 469.5), (765, 470.5), (770, 471.5), (775, 472.0), (780, 473.0), (785, 473.5), (790, 474.0), (795, 474.5), (800, 475.5), (810, 475.5), (820, 476.0), (830, 475.5), (836, 475.5), (838, 474.0), (841, 468.0), (842, 465.0), (843, 462.0), (845, 459.0), (845.5, 456.0), (846.5, 453.0), (848.5, 450.0), (849, 447.0), (850.5, 444.0), (852.5, 441.0), (854.5, 438.0), (856.5, 435.0), (858.5, 432.0), (860.5, 429.0), (863, 426.0), (866, 423.0), (867, 420.0), (868, 405.0), (870, 399.0), (880, 398.0), (890, 398.0), (900, 398.0), (905, 397.0), (910, 397.0), (913, 396.0)] # the cheek's upper branch (a crease on the lower nose's flank, from the waist's lower rim end to the cheek's tip) CHEEK_CREASE = [(830, 400.0), (836, 400.0), (842.5, 402.0), (849.5, 405.0), (858, 408.0), (866, 417.0), (867, 420.0)] # hull half width, TOP line centre, px from the centre line (x, half). Removed: the stern fins (565-601: the hull edge # under them interpolated from 42.5 at 560 to 56.75 at 600), the thruster pods (755-842: the hull's own edge line runs on # at y 77.75/220.25 under the capsules), the dimension line at y 77 (655-670 eased). HULL_HALF = [(543, 41.0), (545, 41.25), (550, 41.25), (555, 41.25), (560, 42.5), (565, 44.5), (570, 46.5), (575, 48.5), (580, 50.5), (585, 52.5), (590, 54.5), (595, 56.0), (600, 56.75), (605, 57.25), (610, 58.25), (615, 60.25), (620, 61.25), (625, 62.25), (630, 63.25), (635, 64.25), (640, 65.25), (645, 66.25), (650, 67.25), (655, 68.5), (660, 69.6), (665, 70.4), (670, 71.0), (680, 71.25), (835, 71.25), (840, 70.5), (845, 67.5), (850, 65.25), (855, 63.25), (860, 61.75), (865, 59.25), (870, 57.25), (875, 54.25), (880, 52.25), (885, 49.25), (890, 45.25), (895, 41.25), (900, 37.25), (905, 33.75), (910, 31.25), (913, 30.5)] # the height (SIDE y) of the widest line: the waist band's middle (rims 344/412 at x 570, 359/398 at 680, 343/447 at 800) # at 378 from the stern to x 840 (BACK and FRONT: widest at 368-388 / 372-380), the side windows' middle at the nose HULL_YW = [(543, 379.1), (560, 378.0), (840, 378.0), (870, 372.0), (913, 368.0)] # --- the waist band: an hourglass band along each flank, recessed 0.03 m between two rims (each rim a rounded lip 0.04 m # wide: the sheet's double lines are its two edges). It runs from the stern duct to the side window's frame (upper rim) # and down to the bottom just aft of the pod's face (lower rim). Everything on the flank between the rims sits in it: # the stern fin's mount, the vents, the side door, the grab rail and pipe. # (x, y_upper_edge, y_lower_edge) of each rim, SIDE line centres (column scan, build notes) WAIST_UPPER_RIM = [(545, 340.5, 342.5), (550, 342.0, 344.5), (560, 343.0, 347.0), (570, 340.0, 343.0), (580, 338.0, 341.0), (590, 337.0, 340.0), (600, 337.0, 340.0), (610, 338.0, 341.5), (620, 341.0, 344.5), (630, 345.0, 348.5), (640, 350.0, 354.0), (650, 355.5, 360.0), (660, 359.0, 364.0), (670, 359.0, 365.0), (680, 359.0, 364.5), (690, 359.0, 364.0), (700, 359.0, 364.0), (705, 357.0, 362.0), (710, 354.5, 359.0), (715, 351.5, 356.0), (720, 348.0, 353.0), (725, 345.0, 349.5), (730, 343.0, 346.5), (735, 340.0, 344.0), (740, 340.0, 346.0), (800, 340.0, 346.5), (835, 340.0, 347.0), (840, 340.5, 345.0)] WAIST_LOWER_RIM = [(545, 418.0, 420.0), (555, 409.0, 412.0), (560, 410.0, 413.0), (570, 412.5, 415.0), (580, 414.0, 417.0), (590, 413.5, 417.0), (600, 412.0, 415.0), (610, 410.0, 413.0), (620, 407.0, 410.0), (630, 403.5, 407.0), (640, 400.0, 403.0), (650, 396.0, 399.0), (660, 394.0, 398.0), (705, 394.0, 398.0), (710, 395.0, 399.0), (715, 398.5, 402.0), (720, 402.0, 406.0), (725, 406.0, 410.0), (730, 410.0, 414.0), (735, 414.0, 418.0), (740, 418.0, 422.0), (745, 421.5, 425.5), (750, 425.5, 429.5), (755, 429.5, 433.0), (760, 433.5, 437.0), (765, 437.0, 440.0), (770, 440.5, 444.0), (775, 443.0, 446.5), (780, 445.0, 448.0), (790, 446.0, 449.0), (800, 447.0, 450.0), (810, 449.0, 452.0), (815, 450.5, 455.0), (820, 454.0, 461.5), (825, 461.0, 466.0), (828, 468.0, 471.0), (830, 474.0, 476.0)] WAIST_RECESS_M = 0.03 # The concept render: the rims are grooves with cyan light strips laid in them. Each rim = a channel between its two # drawn lines, 0.02 m deep, rounded edges r 4 mm; its floor carries the strip (section 12). The band between the upper and # the lower rim is the recessed face (WAIST_RECESS_M). WAIST_RIM_GROOVE_DEPTH_M = 0.02 # the chine on the upper aft body: a crease (5 mm step down to the flank) from the duct's top corner to where it meets # the top line. SIDE (x, y); TOP draws it as the three parallel lines from (557, 117) to (650, 85) (and mirrored). CHINE_SIDE = [(545, 338.5), (550, 336.0), (560, 334.0), (570, 332.0), (580, 329.0), (590, 327.0), (600, 325.0), (610, 323.0), (620, 320.0), (625, 318.0), (632, 315.0)] CHINE_TOP = [(557, 117.0), (575, 111.0), (600, 103.0), (625, 94.0), (650, 85.5)] # transverse belly seam (BOTTOM: the line across the belly at x 657, y 556-690) BELLY_SEAM_X = 657.0 # ===================================================================================================================== # 2. STERN: the ducted thruster (SIDE "the big stepped drum", BACK "large duct, inner ring, spokes, hub") # ===================================================================================================================== # The shroud: a short cylinder on the hull's aft face. SIDE: x 516-543, y 339-421 (line centres 338.75 / 419.25 at the # silhouette), its aft corners rounded r 5 px; TOP: y 108-190 -> r 41 about the centre line; centre SIDE y 379.1. DUCT = {"x_aft": 516.5, "x_fore": 543.0, "r_out": 40.75, "y_c": 379.1, "aft_corner_r": 5.0, # BACK (scaled to TOP px by KB 0.935): rings round (1205.9, 377.9) at r 44.6 (the lip), 37.8/35.2/33.2 (the duct's # inner wall, its rounded throat), 17.8/14.2 (the hub) "r_lip_back": 44.6 * KB, "r_inner": 35.2 * KB, "r_throat": 33.2 * KB, "r_hub": 17.8 * KB, "r_hub_cap": 14.2 * KB, "stator_x": 520.0, # the six stator spokes sit 3.5 px inside the aft lip "stator_deg": (30, 90, 150, 210, 270, 330), # BACK: top and bottom vertical, four at 30 deg off horizontal "stator_width": 6.0 * KB, # BACK: each spoke 5-7 px wide (double line) "rotor_x": 532.0, "rotor_blades": 5, "rotor_r": 31.5 * KB, # my addition: the rotor behind the stator (not drawn) "flank_slot": (530.0, 368.0, 388.0), # SIDE: a 1 px slot on each flank of the shroud, x 530, y 368-388 } # BACK: the duct's lip is drawn 3.9 px (scaled) larger than SIDE/TOP's r 41: SIDE rules -> r 40.75 outer, the inner # rings scaled by the same 40.75 / 41.7. # ventral skeg (SIDE "Stabilizer Fin", lower aft): hangs under the keel line from x 547 to 614. SIDE region (x, y_keel, # y_bottom): its aft edge slants from (545, 423) to (551, 437); bottom edge (551, 437) -> (607, 444); front end rounded up # into the keel at (612-614, 438-440). BACK: a blade 4-6 px thick on the centre line (x 1203-1207), its rounded foot at # y 443-445. BOTTOM: its root fairs into a teardrop 34 px wide (y 611-645 round the centre 628.8? read 598-632 at x 548-645): # the skeg grows out of a low ridge 0.29 m wide at the root that thins to the blade (0.09 m) at its bottom edge. SKEG = {"profile": [(545, 423.0), (548, 430.0), (551, 437.0), (560, 439.5), (570, 441.5), (580, 443.0), (590, 444.0), (600, 444.5), (607, 444.0), (611, 441.5), (614, 438.5)], "blade_thick_px": 5.0, "root_ridge_half_px": 17.0, "root_ridge_x": (548, 645)} # stern fins (SIDE: the "T" in the waist band; TOP: the swept fins at the aft flanks; BACK: inside the ears) # a vertical mount plate across the waist band, SIDE x 571-574, from the upper rim (y 348) to the lower rim (412) STERN_FIN_MOUNT = {"x": (571.0, 574.5), "y": (348.0, 412.0), "proud_px": 2.0} # the fin: a stubby wing, SIDE box x 579-606 (region 581-603 inside the lines) y 370-386 (centre 378, 16 px thick), # its forward end rounded (r 8, x 598-606); fillet steps at its root (573-580, 365-370 and 390-395). # Planform (TOP, port side; starboard mirrored about y 149): root along the hull from (562, 110) to (601, 94); outline # (x, y_top): the long outer edge runs aft-root -> forward tip; the short front edge back to the hull. Lateral px = 149 - y. STERN_FIN = {"side_box": (579.0, 370.0, 606.0, 386.0), "nose_r": 8.0, "y_c": 378.0, "planform_top": [(562, 110.0), (568, 103.0), (577, 94.0), (585, 88.0), (592, 85.0), (597, 86.0), (600, 90.0), (601, 94.0)], "tip_lateral_px": 64.0, "root_lateral_px": (39.0, 55.0)} # Note: SIDE's box is x 579-606, TOP's fin x 562-601: SIDE rules for x (579-606); TOP gives the planform's shape and span. # dorsal ridge on the upper aft body (TOP: the teardrop x 551-630, open aft, rounded forward end at 630, widest 23 px at # x ~600; BACK: its aft face is the "tombstone" 34 px wide (scaled 31.8), top y 313, base y 335, with a rounded slot # 1196-1216 x 320-328). SIDE: its top IS the hull's top line from 548 to 630 (the hull under it is lower). DORSAL_RIDGE = {"top_planform": [(551, 11.5), (575, 12.0), (600, 11.5), (615, 9.5), (625, 6.5), (630, 0.0)], "height_px_at": [(551, 9.0), (580, 7.0), (610, 4.0), (630, 0.0)], "aft_slot_back": (1196.0, 320.0, 1216.0, 328.0)} # BACK "Insignia (Flag)" points at the upper stern to starboard of the ridge (leader end 1225, 325): a small insignia decal STERN_INSIGNIA = {"lateral_px": -20.0, "y": (320.0, 328.0), "x": (548.0, 562.0)} # bilge strakes under the aft lower body (BACK: two slanted plates at x 1172-1195 / 1218-1240, y 444-455, angled about 30 deg # outboard-down; SIDE "Stabilizer Fin" leader ends on the keel at x 668, a tick at x 705 marks their forward end) BILGE_STRAKE = {"x": (640.0, 705.0), "lateral_px": 21.0, "span_px": 21.6, "angle_deg": 30.0, "thick_px": 2.0} # ===================================================================================================================== # 3. TOP: collar (= the docking collar), hatch, antenna, emitters, battery hatch # ===================================================================================================================== # Collar round the clamp axis (SIDE x 753.40, lateral 0). TOP circles r 38.89 / 32.19 / 29.63 (gr_circles.py). SIDE profile # (line centres, half width about 753.4): top face y 293.5 at the centre (domed) to 296 at its edge r 32; the outer wall # r 32 at y 296-299, r 33.5 at y 300 (a rim), r 37 at y 302-305 (the foot); the footprint on the hull r 38.9, whose curve # dips to y 317 at the lateral sides (the lens SIDE draws under the hull line). COLLAR = {"x_c": CL_IMG, "r_foot": 38.89, "r_top_out": 32.19, "r_top_in": 29.63, "side_profile": [(32.0, 296.0), (32.0, 299.0), (33.5, 300.0), (36.0, 302.0), (37.0, 304.5), (38.89, 305.5)], "lens_bottom_y": 317.0} # The docking interface (Kazah, mk_clamp.py), metres about (0, -0.09): KAZAH = {"wall_r": (0.506, 0.535), "lip_r": 0.552, "wall_z": (1.19, 1.335), "lip_top_z": 1.375, "claw_az_deg": (45.0, 135.0, 225.0, 315.0), "claw_half_deg": 11.0, "claw_r_shut": (0.558, 0.693), "claw_r_open": (0.61, 0.79), "claw_min_z": 1.213, "feet_z": 1.405, "feet_r": (0.41, 0.53)} # The drawn collar's top face: r 0.5067-0.5505, z 1.375 (y 296). Between the claws it keeps the drawn outer wall and rim # (COLLAR_PROFILE_M) down to the hull. In four claw pockets (45/135/225/315 deg +- 16 deg) the outer # wall is cut back to the Kazah profile: wall r 0.535 from z 1.335 down to z 1.19 under the lip (r 0.552, z 1.335-1.375), # then a fillet r 0.535 -> 0.58 down to the hull (z 1.16 at r 0.558, lower outward); the pocket's ends are radial faces. CLAW_POCKET_HALF_DEG = 16.0 # The collar's profile in metres (r about the clamp axis, z), the drawn SIDE profile stretched from its 9.5 px (y 296 .. # 305.5) to the 0.195 m between the hull (z 1.180 at the footprint) and the lip top 1.375: COLLAR_PROFILE_M = [(0.5067, 1.375), (0.5472, 1.375), (0.5472, 1.313), (0.5729, 1.293), (0.6156, 1.252), (0.6327, 1.200), (0.6650, 1.180)] # top face r 0.5067-0.5472 (the drawn double line's outer edge 32.19 px = 0.5505: the face's rounded outer corner, r 8 mm) # Hatch lid inside the collar: r 0.500 (6 mm gap to the inner wall 0.5067), domed as SIDE draws (y 293.5 at the centre = # z 1.418, y 296 = z 1.375 at the edge) but kept under the landing feet (z 1.405 over r 0.41-0.53): # z(r) = 1.375 + 0.043 * (1 - (r / 0.42) ** 2) for r < 0.42, 1.375 beyond (2.8 cm under the feet at r 0.41). HATCH = {"r": 0.500, "gap": 0.0067, "thick": 0.06, "dome_h": 0.043, "dome_r": 0.42, "hinge": "forward edge (Y = -0.09 - 0.50), axis along X at z 1.39", "open_deg": (0.0, 100.0)} # Ventral port (BOTTOM: the same ring drawn under the keel, centre 761.8 -> at the clamp axis like the collar, r 39.08): # a flush service plate, groove ring r 29.6 / 32.2 px, plate 1 cm recessed; it sits on the belly between the pods. VENTRAL_PORT = {"x_c": CL_IMG, "r_groove": (29.63, 32.19), "r_out": 39.08} # Ventral transducer (BOTTOM "pin": x 715-735 at y 625-632, a small capsule with a stem to x 710): a low capsule 20 x 7 px VENTRAL_TRANSDUCER = {"x": (715.0, 735.0), "half_px": 3.5, "proud_px": 3.0} # Antenna (SIDE: a tube 3 px across from its foot to its tip, raked aft; TOP: a circle r 4 at (708, 150) and a line aft to # x 692; FRONT/BACK: one vertical mast on the centre line). Foot bracket SIDE x 702-711, y 299-305. ANTENNA = {"foot": (706.5, 301.0), "tip": (692.5, 268.5), "dia_px": 3.0, "foot_bracket": (701.5, 299.0, 711.5, 305.0), "foot_r_top_px": 4.0} # -> foot (Y 0.712, z 1.260), tip (Y 0.951, z 1.815), length 0.605 m, raked 23.3 deg aft of vertical. # Moving: a fold hinge at the foot (axis along X), 0 = as drawn, folds aft to 70 deg; folded only if the carousel or # the arm's head needs it (checks decide). # Emitter housings (SIDE "Battery Access Hatch" hump; TOP the two teardrops; FRONT the two round emitters "Emitter Array") # TOP: x 841-862, y 115-130 and 167-182 (centres 122.5 / 174.5 -> lateral +26.5 / -25.5: take +-26.0), 15 px wide, rounded # aft end, flat front with a lens band at 857-861. SIDE (10x zoom): back at x 843 (y 306-314), top arc to y 300 at x 858, # front face vertical x 858-862 from y 301 down to 322 (its foot is on the shoulder, below the centre-line top). # FRONT: lens circles r 7.3 at y 308.0 (both). FRONT draws them at lateral +-34 (TOP px): TOP rules for plan positions. # Lateral: TOP +-26, FRONT +-34 (TOP px): SIDE decides indirectly: the housing's front face reaches down to y 320-322 at # x 860, 6-7 px under the centre-line top (315); on the section there (top 315, widest 372, half width 61.75, NU 2.1) that # drop is at |X| 30-31 px. Take 30 (0.513 m). The concept render shows them as round lamp heads on short pylons at the # deck's shoulders, lenses facing forward, bright white. EMITTER = {"x": (841.0, 862.0), "lateral_px": 30.0, "half_width_px": 7.5, "top_y": 300.0, "side_profile": [(843, 314.0), (843, 306.0), (846, 303.5), (850, 301.5), (855, 300.3), (858, 300.0), (861, 301.0), (862, 312.0), (860, 320.0)], "lens_r_px": 7.0, "lens_y": 309.0, "lens_x": 861.5} # Battery access hatch (TOP: a 10 x 10 px square on the centre line, x 849-859, y 145-155; FRONT: the box 226-238 x 296-312 # the mast seems to rise from): a raised square hatch plate 0.17 m, 0.05 m proud, on the nose deck. SIDE cannot show it # (it is behind the emitter housings' outline). # The concept render shows a small boxy sensor on a short stalk on the centre line between the lamps (a dark lens face # forward), not a flat hatch: FRONT's box x 226-238, y 296-312 is it. SIDE does not show it above the emitters' outline # (y 300), so SIDE caps its top at y 301 (z 1.258); TOP: 10 x 10 px. A box 0.17 x 0.17 x 0.10 m on a stalk 0.05 m across. SENSOR_BOX = {"x": (849.0, 859.0), "half_px": 5.0, "top_y": 301.0, "box_h_m": 0.10, "stalk_dia_m": 0.05, "lens": "dark glass face on its forward side, 0.12 x 0.06 m"} # (the sheet's label "Battery Access Hatch" points at the emitter housing's hump in SIDE; no separate hatch is built) # nose deck seams (TOP): the curved panel line round each emitter, port side (x, y_top); mirrored about 149 NOSE_DECK_SEAM = [(852, 100.0), (862, 103.0), (872, 109.0), (879, 117.0), (880, 124.0), (878, 131.0), (866, 133.5), (855, 133.5), (845, 131.0), (840, 127.0)] # ===================================================================================================================== # 4. NOSE: windows, frame, sensor drum on its cradle # ===================================================================================================================== # Side window (one each flank; FRONT's two side windows are these, seen at the nose's corners): SIDE glass edge (the inner # of the two lines): top y 344-346, bottom 384-386, aft x 846-848, forward 893 (top) -> 902 (bottom), corner r about 10. SIDE_WINDOW_GLASS = [(862, 345.0), (875, 344.5), (885, 345.5), (890, 347.5), (893, 350.0), (896, 357.0), (899, 366.0), (901, 374.0), (902, 379.0), (899, 384.0), (890, 385.5), (875, 385.5), (862, 384.0), (855, 381.0), (850, 375.0), (847.5, 366.0), (847.5, 357.0), (850, 350.0), (855, 346.5)] # its frame band (dark titanium, raised 0.025 m): outer edge top y 339-340, aft x 839.5, bottom 389-391, the lower aft corner # a large arc (839, 366) -> (848, 384) -> (860, 396); forward it merges into the nose front frame (x 903-913) SIDE_WINDOW_FRAME_OUT = [(845, 340.0), (870, 339.0), (887, 339.0), (893, 341.0), (903, 352.0), (909, 372.0), (912, 388.0), (905, 391.5), (880, 391.0), (860, 396.0), (848, 386.0), (841, 375.0), (839.5, 366.0), (839.5, 352.0), (841, 344.0)] # the chin step under the frame: lines at y 391, 395 and 398 for x 866-913 (the frame's foot, a step, the nose underside) CHIN_STEP_Y = (391.0, 395.0, 398.0) # Front window (FRONT only: the nose face): FRONT glass x 199-266 at the bottom (y 386), 205-260 at the top (y 342), top # edge arched (342 at the centre, 348 at the corners) -> lateral +-31.5 / +-25.9 TOP px (0.539 / 0.443 m). # Height: FRONT draws its top 10 px above the side windows' top and its bottom 5 px above theirs: on SIDE's nose front # profile (NOSE_FRONT) the glass runs from y 336.5 (x 890) to y 379 (x 909.5). The glass follows the nose face. FRONT_WINDOW = {"y_top": 336.5, "y_bot": 379.0, "half_top_px": 25.9, "half_bot_px": 31.5, "arch_px": 6.0 * KF} # mullion between the front and side windows: FRONT x 193-199 (left), 266-271 (right) -> lateral 31.5 .. 36.6 TOP px # (0.539 .. 0.625 m): dark titanium. Outer frame round all three (FRONT 161-305 x 338-395): the "mask" band. MULLION_LATERAL_PX = (31.5, 36.6) # FRONT's side windows: x 163-193 (bottom) / 172-190 (top), y 352-391 -> lateral 36.6 .. 64.8 TOP px (0.625 .. 1.108 m) FRONT_SIDE_WINDOW_LATERAL_PX = (36.6, 64.8) # upper nose panel lines (FRONT): (170, 330) -> (197, 330) -> (206, 320) -> (206, 305) and mirrored: seams on the cowl FRONT_COWL_SEAM = [(170, 330.0), (197, 330.0), (206, 320.0), (206, 305.0)] # Sensor drum (SIDE "Sensor Mast", FRONT "Main Thruster": a round face with six perforated sectors and a hexagonal hub). # SIDE: body x 928-950, y 393.5-457 (r 31.75 about y 425.25), front face at x 950 (its rim 946-950, the grille recessed 2 # px, ribs drawn as dashes at x 943-948); rear flange x 916-928 r 25 (y 400-451) with ribs at x 917, 920, 923, 926. # FRONT: r 34.8 about (231.7, 426.2) -> 32.7 TOP px; SIDE rules: r 31.75. Its axis is the centre line at z(425.25). SENSOR_DRUM = {"x_face": 950.0, "x_body": (928.0, 950.0), "r": 31.75, "y_c": 425.25, "edge_r": 4.0, "face_recess": 2.0, "flange_x": (916.0, 928.0), "flange_r": 25.0, "flange_ribs_x": (917.0, 920.0, 923.0, 926.0), # FRONT face pattern (radii in FRONT px, scale x KF): six sectors between dividers at 30/90/150/210/270/330 # deg, dividers 3 px wide; perforated plate (hex dots, about 2 px pitch) from r 13 to 30; rim r 30-34.8; # a hexagonal hub r 13 (flat top and bottom) with a round hole r 5.5 "face_r": {"rim": (30.0, 34.8), "grille": (13.5, 30.0), "hub_hex": 13.0, "hub_hole": 5.5}, "divider_deg": (30, 90, 150, 210, 270, 330), "divider_w": 3.0} # The cradle (SIDE: bent tubes and an arm on each side of the drum; FRONT: a frame round the drum: side rails x 192-200 / # 263-272 from y 402 to 470, a top bar y 402-406, a bottom bar y 462-470, clamps at y 404-410 and 440-450). # Each side frame stands in a vertical plane at lateral +-(35.85 * KF) = +-33.7 TOP px (0.577 m), just outside the drum's # rim (0.543 m). Tubes 6 px across (0.10 m) unless noted. SIDE coordinates (x, y): CRADLE = {"lateral_px": 33.7, "upper_arm": [(891.0, 399.5), (918.0, 401.5)], # box beam 4 px, from the nose's underside to the flange top "u_tube": [(896.0, 407.0), (886.0, 431.0), (877.0, 455.0), (879.0, 461.0), (884.0, 463.5), (889.0, 461.5), (900.0, 447.0), (916.0, 427.0)], # down from the nose underside, round the bend, up to the flange "lower_rail": [(850.0, 447.0), (920.0, 447.0)], # tube 5 px, from the cheek to the flange's lower rear "clevis": (905.0, 440.0, 920.0, 452.0), # where the rail meets the flange "base_bracket": (848.0, 446.0, 866.0, 470.0), # the plate on the cheek ("Stabilizer Fin" lower right) "cross_tube_y": 464.0, "cross_tube_x": 884.0, # joins the two U bends under the drum (FRONT y 462-470) "top_bar": (905.0, 402.0), # joins the two upper arms behind the drum (FRONT y 402-406) "flange_clamps_y": (407.0, 445.0)} # FRONT clamps between the rails and the flange # lower nose fins: FRONT's two small slanted fins on the cheeks (x 178-186 / 278-286, y 420-440) at lateral +-49 TOP px, # SIDE's plate at x 848-866 under them: small fins 0.31 m long, 0.25 m deep, angled 20 deg outboard CHEEK_FIN = {"x": (848.0, 866.0), "y": (446.0, 470.0), "lateral_px": 49.0, "angle_deg": 20.0, "thick_px": 2.0} # ===================================================================================================================== # 5. FLANKS: thruster pods, door, vents, equipment # ===================================================================================================================== # Thruster pods (FRONT "Side Thruster Pod": round faces r 19.3/19.6 at (171.3, 455.8) and (292.7, 455.0); BACK: r 19.9/19.8 # at (1141.4, 455.5) and (1270.4, 454.9) with rings r 15, 11, 8, 5; TOP: the bulge beyond the hull x 755-842, outer edge # at lateral 76 (760-785) rising to 80 (805-815); SIDE: their bottom = the belly line, tapering aft to x 733). # A teardrop nacelle on each lower corner: axis at lateral +-59.5 TOP px (FRONT 60.7*KF = 57.1, BACK 64.5*KB = 60.3, TOP # max 80.5 - r), SIDE y 455.5 (z -1.353); radius along x (SIDE's bottom line minus the axis height): POD = {"lateral_px": 59.5, "y_c": 455.5, "radius": [(733.0, 3.5), (740.0, 8.0), (750.0, 12.0), (760.0, 14.0), (770.0, 16.0), (780.0, 17.5), (790.0, 18.5), (800.0, 19.5), (836.0, 19.5), (839.0, 18.5), (841.0, 17.0)], # front face (FRONT): a nozzle, outer ring r 19.3, inner duct r 13, hub r 5 with a ring r 9 (FRONT px x KF) "face": {"r_duct": 13.0, "r_hub": 5.0, "r_ring": 9.0}, # tail cone (BACK): panel rings at r 15, 11, 8, 5 where the cone narrows "tail_rings_r": (15.0, 11.0, 8.0, 5.0), # TOP: capsules on each pod's upper outer side (x0, x1, lateral_in, lateral_out): two inset vents and a raised one "vents": [(737.0, 797.0, 65.0, 72.0), (807.0, 840.0, 67.0, 71.0)], "raised_capsule": (757.0, 782.0, 69.0, 75.0), # SIDE: a slot on the pod's flank x 790-808, y 439-443 (also on the BOTTOM at 790-810) "slot": (790.0, 439.0, 808.0, 443.0)} # The pod sinks into the hull's lower corner (its inner side at lateral 40 is inside the hull there); a fillet trim (a swept # quad strip 0.04 m) along the junction. # Side door (SIDE: a rounded rectangle in the waist band, below the collar): outline (line centre) x 738.5-796.5, # y 348.5-418.5, corner r 9 px; porthole (circle fit) centre (767.86, 371.80), glass r 12.2, frame ring r 12.2-15.4; # two small ovals on its forward side: latches at (788, 367) and (788, 397), 6 x 4 px. Mirrored on the port flank. DOOR = {"x": (738.5, 796.5), "y": (348.5, 418.5), "corner_r": 9.0, "porthole_c": (767.86, 371.80), "porthole_r": (12.2, 15.4), "latches": [(788.0, 367.0), (788.0, 397.0)], "latch_size": (6.0, 4.0), "hinge": "aft edge (x 738.5), vertical axis just outside the skin", "open_deg": (0.0, 95.0)} # -> Y +0.165 .. -0.827, z 0.447 .. -0.750; 0.99 m wide, 1.20 m tall. # Vents and panels on the flank (SIDE, in the waist band; mirrored on the port flank): FLANK_DETAILS = { "fill_port": (662.0, 368.0, 676.0, 379.0), # rounded square with a C-shaped mark (a fill port) "slot_1": (676.0, 370.0, 705.0, 378.0), # long rounded slot (vent) "slot_2": (680.0, 380.0, 700.0, 384.0), "slot_3": (680.0, 388.0, 702.0, 392.0), "dots": [(668.0, 389.0), (673.0, 389.0), (678.0, 389.0)], # three small bolts/lamps "panel_right": (715.0, 368.0, 725.0, 378.0), # small rounded panel aft of the door "rim_light": (790.0, 437.0, 808.0, 441.0), # see POD slot # in front of the door (SIDE 8x zoom) the sheet draws right-angled lines with small end blobs; the concept render shows # exactly there cyan circuit traces on a flat panel (no rail, no pipe): they are emissive inlays, flush (see section 12, # CIRCUIT_ZONES). Only the panel they sit on is geometry: a flat plate 2 mm proud, SIDE x 803-838, y 350-408. "trace_panel": (803.0, 350.0, 838.0, 408.0), } # ===================================================================================================================== # 6. MARKINGS (kept where and as large as drawn; both flanks, as the BOTTOM view shows them on both sides; TOP shows only # the starboard ones: the port flank's are the mirror, the text reading correctly from outside) # ===================================================================================================================== # SIDE (starboard): the flag x 684-716, y 316-334 (canton 684-697 x 316-325); "SUBTUB 1" x 725-790, y 318-336 (letter height # 18 px = 0.31 m); the seal: a circle about (697, 347), r 10. TOP draws the same at x 685-716 / 722-805 / 683-705. MARKINGS = {"insignia_box": (684.0, 316.0, 716.0, 334.0), "insignia_canton": (684.0, 316.0, 697.0, 325.0), "text": "Subtub 1", "text_style": "the concept render's: title case, italic sans, light grey paint", "text_box": (725.0, 318.0, 790.0, 336.0), "seal_c": (697.0, 347.0), "seal_r": 10.0} # The user, 2026-10-22, on the flank's and the stern's striped insignia: "remove those flags". No flag markings anywhere: the # drawing skips the insignia tiles (left transparent, so the sheet's layout stays) and the surfaces pass builds no patch for # them; their places stay in surfaces_report.json for the concept camera's landmark. The seal and the lettering stay. FLAGS = False # The drawn flag is a real national flag and the seal an official-looking seal: they become a generic striped insignia # (two-tone stripes, a plain canton with a white chevron, no stars) and a generic seal (a ring with a gear-and-compass mark, # no text) whose emblem is cyan circuit lines (the concept's seal). No brand names anywhere. The lettering keeps the sheet's # place and size (x 725-790, 0.31 m tall box) in the concept's style "Subtub 1" (the user's own word for the Tenders). # ===================================================================================================================== # 7. CABIN (SECTION A-A, top right; the bottom-left section for the overhead panels) # ===================================================================================================================== # The pressure hull is the hull itself here: the section's hatched wall is 5 px (x 1.31 -> 6.6 TOP px = 0.113 m): the # cabin's lining stands 0.11 m inside the skin. Deck: the section's floor slab y 182-190. CABIN = { "wall_m": 0.113, "deck_top_z": Zs(182.0), # -1.198 "deck_bottom_z": Zs(190.0), # -1.382 "ceiling_z": Zs(83.8), # 1.062 (inner circle top); the hatch opening r 0.506 goes through it # seats (section): left x 1168-1195, right 1222-1250 (27-28 px -> 0.61-0.63 m wide); back top y 118, cushion y 160-170, # pedestal 170-182. Centres +0.564 (port) and -0.657 (stbd): drawn 3 px off centre -> symmetric +-0.61 m. # moved inboard to +-0.45 (from the section's +-0.61) so each eye's straight-ahead ray passes through the front window # (its half width at eye height is 0.516 m), the user's requirement on the Spearfish; the console narrows to 0.34 m "seat_lateral_drawn": 0.61, "seat_lateral": 0.45, "seat_width": 0.56, "seat_back_top_z": Zs(118.0), "cushion_top_z": Zs(160.0), "cushion_front_z": Zs(170.0), # console column between the seats: x 1195-1215 (0.45 m wide, centred), from the deck up to y 105 (z 0.60), its control # box x 1192-1220, y 138-155 (z -0.16 .. -0.55) "console_half_drawn": 0.21, "console_half": 0.17, "console_top_z": Zs(105.0), "console_box_z": (Zs(155.0), Zs(138.0)), # overhead screens: left 1160-1190 / right 1222-1252, y 98-110; centre 1197-1215, y 103-112 (hang from the ceiling; # the bottom-left section draws them as three curved panels following the ceiling arc) "overhead_z": (Zs(110.0), Zs(98.0)), "overhead_side_lateral": (Xs(1190.0), Xs(1160.0)), "overhead_centre_half": 0.20, # wall control panels: x 1153-1163 / 1250-1260, y 140-165 (z -0.16 .. -0.69) "wall_panel_z": (Zs(165.0), Zs(140.0)), # seated eye: 0.78 m over the cushion top "eye_z": Zs(160.0) + 0.78, } # Where along Y: SECTION A-A is cut at the ring looking forward, so what it shows stands forward of the cut. The seats # are placed forward of the collar and the side doors (which open into the entry space under the hatch): seat backs at # SIDE x 800 (Y -0.887), seat 0.60 m deep, eyes at SIDE x 815 (Y -1.14); the console runs forward to the nose's frame. CABIN_Y = {"entry": (Yi(791.0), Yi(716.0)), "seat_back_x": 800.0, "eye_x": 815.0} # view: from each eye (+-0.45, Y -1.14, z 0.09) the straight-ahead ray passes through the front window 6.6 cm inside its # edge (half width 0.516 m at z 0.09), the side window lies 30-40 deg outboard. Check (gr_view_check, after the Spearfish's # view_check.py): rays yaw -40..+40, pitch -25..+15, 5 deg; required: straight ahead = glass for both seats, and at least # half the rays through glass. # ===================================================================================================================== # 8. SECTION SHAPES for reference (BACK and FRONT rows: half width in TOP px after KB / KF, hull only) # ===================================================================================================================== BACK_HALF = [(y, round(h * KB, 2)) for y, h in [(305, 30.0), (312, 38.5), (320, 48.0), (328, 56.0), (336, 62.0), (344, 66.5), (352, 72.0), (360, 75.0), (368, 77.0), (376, 77.0), (388, 76.5), (396, 75.0), (404, 73.0), (412, 71.0), (420, 69.0), (424, 68.5)]] FRONT_HALF = [(y, round(h * KF, 2)) for y, h in [(332, 59.5), (340, 64.5), (348, 69.0), (356, 74.0), (364, 75.5), (372, 76.5), (380, 76.5), (392, 73.5), (400, 73.0), (408, 70.5), (416, 68.5), (424, 67.0)]] HULL_BOTTOM_ARC_FRONT = [(0.0, 477.0), (20.0 * KF, 476.0), (42.0 * KF, 470.0)] # (|x| TOP px, y) between the pods # ===================================================================================================================== # 9. MOVING PARTS (own objects, origin on the axis, rotation 0, scale 1; drivers are simple expressions on Grouper_Root) # ===================================================================================================================== MOVING = { "SM_Grouper_Hatch": "lid, hinge at its forward edge, axis X at z 1.39, 0..100 deg (hatch_open_deg)", "SM_Grouper_Door_R / _L": "side doors, vertical hinge at the aft edge just outside the skin, 0..95 deg (door_r_deg, door_l_deg)", "SM_Grouper_Rotor": "stern rotor, 5 blades, spins about Y (rotor_turns)", "SM_Grouper_Antenna": "folds aft about X at its foot, 0..70 deg (antenna_fold_deg); 0 = as drawn", } # ===================================================================================================================== # 10. MATERIALS: the user's concept render rules the look (the sheet's block says "TITANIUM-CERAMIC ALLOY HULL, ACRYLIC # VIEWPORT"; the concept shows the titanium as a dark gunmetal satin metal, not a light ceramic) # ===================================================================================================================== # Texture sets: the pack's, as the Mako's surfaces pass (models/vessel-interior/textures/ModSci_Engineer/Textures/Base: # ScratchedMetal under the gunmetal, StainedSteel for the dark frames, BrushedMetal on the waist band, Glass for the # acrylic's dirt and scratches; FloorPanel_A on the deck), source_textures/leather_white (tinted) on the seats. Nothing # downloaded. Emission strengths all scale with Grouper_Root["lights"] (0 off .. 1 on; simple-expression drivers). MATERIALS = { "M_Grouper_Gunmetal": "hull shells, collar, pods, stern fins, skeg, emitter and sensor housings' bodies: dark gunmetal " "satin metal (0.10, 0.11, 0.12), metallic 0.9, roughness 0.32-0.42 from ScratchedMetal_Rough, clear " "coat 0.2, lighter worn edges and dark crevices from the baked masks", "M_Grouper_Band": "the waist band's recessed face: a shade darker and rougher (0.07, 0.075, 0.08), metallic 0.85, rough " "0.45, BrushedMetal normal at low strength: it must read as a recess beside the shells", "M_Grouper_FrameDark": "window frames and mullions, the door's frame, duct lip and stator, cradle, antenna, the trace panel, " "pod face rings: near-black titanium (0.035, 0.04, 0.045), metallic 1, rough 0.3-0.4 (StainedSteel)", "M_Grouper_Acrylic": "viewports and porthole: clear thick acrylic (0.08 m edges), IOR 1.49, faint blue-green tint, the Glass " "set's dirt and scratch maps at low strength", "M_Grouper_Strip": "light strips in the rim grooves, the duct ring and the collar ring: cyan emission (0.0, 0.85, 1.0), " "strength 4 x lights, a dark glossy base when off", "M_Grouper_Trace": "circuit traces (the emissive mask from lines_side.png in CIRCUIT_ZONES) and the seal's emblem: cyan " "(0.0, 0.85, 1.0), strength 2.5 x lights, on the gunmetal", "M_Grouper_LampWhite": "emitter lenses and the pods' front lamps: frosted lens, emission warm white (1.0, 0.95, 0.85), " "strength 8 x lights", "M_Grouper_ScannerLens": "the sensor drum's face: faceted crystal cells under a clear cover, emission (0.25, 0.65, 1.0) " "strength 5 x lights, the cells' borders dark titanium", "M_Grouper_DuctGlow": "the duct's inner wall from the lip to the stator: dark metal with cyan emission 1.5 x lights, fading " "toward the lip", "M_Grouper_Recess": "vent slots, gaps, the hub hole: near black (0.02), rough 0.6", "M_Grouper_Marking": "lettering 'Subtub 1': light grey paint (0.75, 0.77, 0.78); insignia: stripes light grey and muted " "red (0.45, 0.08, 0.06), canton dark navy (0.04, 0.06, 0.14) with a white chevron", "M_Grouper_Cabin": "the concept's interior: lining dark grey (0.12), deck FloorPanel_A, seats dark leather (leather_white " "tinted 0.08) on dark titanium frames, screens cyan emissive with UI drawn as a texture", } # ===================================================================================================================== # 12. THE USER'S CONCEPT RENDER (reference/user_concept.jpg; 2x crop concept_sub_2x.png; zooms z_concept_c_*.png) # Placed before section 11 because section 11 is generated (gr_sil_tables.py rewrites from its marker to the end). # ===================================================================================================================== # The Administrator's division: the BLUEPRINT rules shape, proportions and outline (SIDE first); the CONCEPT rules the look # (materials, colours, lights, strips, the markings' style) and settles how parts look and attach where the sheet is unclear. # The concept is a perspective view from forward-starboard-above (nose to the right, as SIDE): it shows the starboard flank, # the nose's starboard side window and the big front window (two pilots side by side behind them), the deck with the two # lamps and the sensor box, the collar, the stern duct, the drum on its cradle, the starboard pod's lamp (and the port # pod's lamp beside the drum). # Light strips: laid in the sheet's own grooves, so their paths are SIDE lines (x, y) projected onto each flank (port = # mirror). Strip width = the groove's floor (the groove between the rim's two drawn lines, less 1 cm a side), 0.02-0.04 m. def _mid(rim): return [(x, round(0.5 * (a + b), 2)) for x, a, b in rim] LIGHT_STRIPS = { # upper strip: the upper waist rim from the stern to the side window's frame, then up and over the frame's outer edge # ("round the windows' tops"), then across the nose top along the front window frame's top edge (0.04 m aft of the # glass's top, at SIDE x 889, lateral -0.60..+0.60 m on the surface) to the other flank: one closed run over the nose "upper": _mid(WAIST_UPPER_RIM)[1:] + [(843.0, 338.5), (870.0, 337.0), (887.0, 337.0), (893.0, 339.0)], "upper_nose_crossing": {"side_x": 889.0, "half_m": 0.60, "aft_of_glass_m": 0.04}, # lower strip: the lower waist rim from the stern, down under the door and along the pod's flank, curving down to the # belly in front of the pods ("another curving down from amidships to the belly") "lower": _mid(WAIST_LOWER_RIM)[1:], # a ring round the hull's aft face where it meets the duct (SIDE x 543.5, r 41 px about y 379.1): the concept's cyan line # hugging the duct's front rim "duct_ring": {"x": 543.5, "r_px": 41.5, "y_c": 379.1, "width_m": 0.03}, # the collar's light ring: the rim band of COLLAR_PROFILE_M (r 0.5729 .. 0.5472, z 1.293 .. 1.313), broken at the four # claw pockets (+-16 deg round 45/135/225/315): the concept's two cyan bars on the disc's flank "collar_ring": {"r": (0.5472, 0.5729), "z": (1.293, 1.313), "gap_half_deg": 16.0}, } # Circuit traces: the concept's thin cyan traces sit where the sheet draws small right-angled lines. The emissive mask is # the sheet's own drawn lines (reference/lines_side.png) inside these SIDE boxes, projected onto each flank, 1.5 px wide # (0.026 m). The waist rims that cross a box are excluded (they carry the strips). CIRCUIT_ZONES = { "fore_of_door": (800.0, 348.0, 840.0, 410.0), # between the door and the side window (the concept's densest traces) "aft_panels": (660.0, 365.0, 727.0, 394.0), # the vent slots and small panels aft of the door: glowing outlines "cheek": (838.0, 396.0, 868.0, 446.0), # under the side window's aft corner, down the lower nose "seal": (686.0, 336.0, 708.0, 358.0), # the seal's emblem (made generic: ring + circuit lines) } # Lamps (emission; lens faces and directions in the model's axes: forward = -Y) LAMPS = { "emitter_L/R": {"x_lens": 861.5, "y": 309.0, "lateral_px": 30.0, "r_px": 7.0, "faces": "-Y (forward)", "colour": "warm white", "note": "round heads on short pylons at the deck's shoulders"}, "pod_L/R": {"x_face": 841.0, "y": 455.5, "lateral_px": 59.5, "r_lens_m": 9.0 * KF * S, "r_bezel_m": 13.0 * KF * S, "faces": "-Y", "colour": "warm white", "note": "the concept's bright round lamps at the pods' front ends"}, "scanner": {"x_face": 950.0, "y": 425.25, "r_px": 30.0, "faces": "-Y", "colour": "cyan-blue", "note": "the drum's face: a big central hexagon and faceted cells round it, glowing"}, "duct_glow": {"note": "the duct's inner wall, cyan, low"}, } # Concept readings that change or settle the sheet (see design/DESIGN.md, the disagreements table): CONCEPT_NOTES = [ "hull colour: dark gunmetal satin metal with deep panel grooves (replaces the first reading's light ceramic)", "the waist rims are grooves with cyan strips, not raised lips", "the lines in front of the door are circuit traces (emissive), not a grab rail and pipe", "the 'Battery Access Hatch' hump is a lamp head on a pylon; the small square on the deck is a boxy sensor on a stalk", "the pods' front faces carry bright lamps (FRONT draws rings there)", "the drum's face is a glowing faceted lens (FRONT draws perforated sectors round a hexagon)", "the lettering is 'Subtub 1' in italic title case (the sheet: SUBTUB 1)", "the seal carries a cyan circuit emblem; the flag stays a generic striped insignia (no national flag)", "the cabin is dark with cyan screens; two pilots side by side (no figures in the model)", "the blue jet behind the duct and the scanner's rings are effects, not geometry", ] # ===================================================================================================================== # 11. RAW SILHOUETTES (build/gr_views.py -> outline_tables.json -> build/gr_sil_tables.py; every 3 px, FRONT/BACK every 2 rows) # ===================================================================================================================== # SIDE_SIL, TOP_SIL, BOTTOM_SIL: (x, y_top_line, y_bottom_line); FRONT_SIL, BACK_SIL: (y, x_left_line, x_right_line). # The outline line's centre (the silhouette's outer edge moved 0.75 px in), every part included (SIDE: the antenna, the # collar, the emitters, the drum and its cradle; TOP: the stern fins, the pods). FRONT and BACK: the right halves carry # label leaders (FRONT x 283-310, BACK x 1225-1290 at y 300-330): use the left halves. For overlays and checks only: # the hull is built from section 1's tables. SIDE_SIL = [(515, 347.75, 412.25), (518, 341.75, 416.25), (521, 340.75, 417.25), (524, 339.75, 418.25), (527, 339.75, 418.25), (530, 338.75, 419.25), (533, 338.75, 419.25), (536, 338.75, 419.25), (539, 338.75, 419.25), (542, 338.75, 419.25), (545, 329.75, 424.25), (548, 324.75, 435.25), (551, 323.75, 437.25), (554, 321.75, 438.25), (557, 320.75, 439.25), (560, 321.75, 439.25), (563, 320.75, 440.25), (566, 320.75, 440.25), (569, 319.75, 441.25), (572, 319.75, 441.25), (575, 318.75, 441.25), (578, 318.75, 442.25), (581, 317.75, 442.25), (584, 317.75, 443.25), (587, 317.75, 443.25), (590, 316.75, 443.25), (593, 316.75, 444.25), (596, 316.75, 444.25), (599, 315.75, 444.25), (602, 315.75, 444.25), (605, 315.75, 444.25), (608, 315.75, 443.25), (611, 314.75, 441.25), (614, 314.75, 439.25), (617, 314.75, 439.25), (620, 314.75, 439.25), (623, 314.75, 440.25), (626, 314.75, 440.25), (629, 314.75, 441.25), (632, 314.75, 441.25), (635, 313.75, 442.25), (638, 313.75, 443.25), (641, 312.75, 443.25), (644, 312.75, 444.25), (647, 311.75, 444.25), (650, 311.75, 445.25), (653, 310.75, 445.25), (656, 310.75, 446.25), (659, 309.75, 446.25), (662, 309.75, 447.25), (665, 309.75, 448.25), (668, 308.75, 448.25), (671, 307.75, 448.25), (674, 307.75, 449.25), (677, 307.75, 449.25), (680, 307.75, 450.25), (683, 306.75, 450.25), (686, 306.75, 451.25), (689, 306.75, 451.25), (692, 269.75, 452.25), (695, 270.75, 453.25), (698, 277.75, 453.25), (701, 283.75, 454.25), (704, 290.75, 455.25), (707, 297.75, 455.25), (710, 299.75, 455.25), (713, 304.75, 455.25), (716, 304.75, 456.25), (719, 300.75, 456.25), (722, 296.75, 456.25), (725, 296.75, 457.25), (728, 295.75, 457.25), (731, 295.75, 457.25), (734, 294.75, 460.25), (737, 294.75, 462.25), (740, 294.75, 463.25), (743, 294.75, 464.25), (746, 294.75, 465.25), (749, 293.75, 466.25), (752, 293.75, 467.25), (755, 293.75, 468.25), (758, 293.75, 469.25), (761, 293.75, 469.25), (764, 294.75, 470.25), (767, 294.75, 470.25), (770, 294.75, 471.25), (773, 294.75, 471.25), (776, 295.75, 472.25), (779, 295.75, 472.25), (782, 296.75, 473.25), (785, 297.75, 473.25), (788, 301.75, 473.25), (791, 302.75, 474.25), (794, 302.75, 474.25), (797, 302.75, 474.25), (800, 303.75, 475.25), (803, 303.75, 475.25), (806, 303.75, 475.25), (809, 303.75, 475.25), (812, 304.75, 475.25), (815, 304.75, 475.25), (818, 304.75, 475.25), (821, 305.75, 475.25), (824, 305.75, 475.25), (827, 306.75, 475.25), (830, 306.75, 475.25), (833, 307.75, 475.25), (836, 307.75, 475.25), (839, 308.75, 472.25), (842, 305.75, 470.25), (845, 303.75, 470.25), (848, 302.75, 470.25), (851, 301.75, 469.25), (854, 300.75, 468.25), (857, 300.75, 466.25), (860, 300.75, 466.25), (863, 316.75, 466.25), (866, 317.75, 466.25), (869, 320.75, 466.25), (872, 321.75, 466.25), (875, 323.75, 466.25), (878, 325.75, 466.25), (881, 327.75, 466.25), (884, 329.75, 467.25), (887, 331.75, 467.25), (890, 336.75, 467.25), (893, 342.75, 465.25), (896, 346.75, 463.25), (899, 350.75, 459.25), (902, 354.75, 454.25), (905, 362.75, 449.25), (908, 370.75, 449.25), (911, 382.75, 450.25), (914, 386.75, 450.25), (917, 398.75, 450.25), (920, 400.75, 449.25), (923, 402.75, 448.25), (926, 401.75, 449.25), (929, 397.75, 451.25), (932, 395.75, 453.25), (935, 394.75, 455.25), (938, 393.75, 455.25), (941, 393.75, 455.25), (944, 394.75, 455.25), (947, 397.75, 451.25), (950, 401.75, 450.25)] TOP_SIL = [(515, 128.75, 149.25), (518, 111.75, 186.25), (521, 109.75, 188.25), (524, 109.75, 189.25), (527, 108.75, 189.25), (530, 108.75, 189.25), (533, 107.75, 190.25), (536, 107.75, 190.25), (539, 107.75, 190.25), (542, 107.75, 190.25), (545, 107.75, 190.25), (548, 107.75, 190.25), (551, 107.75, 190.25), (554, 107.75, 190.25), (557, 107.75, 190.25), (560, 106.75, 192.25), (563, 103.75, 194.25), (566, 100.75, 197.25), (569, 97.75, 200.25), (572, 95.75, 203.25), (575, 92.75, 205.25), (578, 90.75, 206.25), (581, 89.75, 208.25), (584, 87.75, 210.25), (587, 86.75, 211.25), (590, 85.75, 212.25), (593, 84.75, 212.25), (596, 85.75, 211.25), (599, 90.75, 207.25), (602, 92.75, 205.25), (605, 91.75, 206.25), (608, 90.75, 207.25), (611, 90.75, 208.25), (614, 89.75, 209.25), (617, 88.75, 209.25), (620, 87.75, 210.25), (623, 86.75, 211.25), (626, 86.75, 212.25), (629, 85.75, 212.25), (632, 84.75, 213.25), (635, 84.75, 213.25), (638, 83.75, 214.25), (641, 83.75, 214.25), (644, 82.75, 215.25), (647, 82.75, 216.25), (650, 81.75, 216.25), (653, 81.75, 217.25), (656, 80.75, 217.25), (659, 80.75, 217.25), (662, 80.75, 218.25), (665, 79.75, 218.25), (668, 79.75, 218.25), (671, 79.75, 218.25), (674, 78.75, 218.25), (677, 78.75, 219.25), (680, 78.75, 219.25), (683, 78.75, 219.25), (686, 78.75, 219.25), (689, 78.75, 219.25), (692, 78.75, 220.25), (695, 78.75, 219.25), (698, 78.75, 219.25), (701, 78.75, 219.25), (704, 78.75, 220.25), (707, 78.75, 220.25), (710, 78.75, 220.25), (713, 78.75, 220.25), (716, 77.75, 220.25), (719, 77.75, 220.25), (722, 77.75, 220.25), (725, 77.75, 220.25), (728, 77.75, 221.25), (731, 76.75, 221.25), (734, 76.75, 221.25), (737, 76.75, 221.25), (740, 76.75, 221.25), (743, 76.75, 221.25), (746, 76.75, 221.25), (749, 76.75, 222.25), (752, 76.75, 222.25), (755, 75.75, 223.25), (758, 74.75, 223.25), (761, 73.75, 224.25), (764, 73.75, 224.25), (767, 73.75, 224.25), (770, 73.75, 224.25), (773, 73.75, 224.25), (776, 73.75, 224.25), (779, 74.75, 224.25), (782, 73.75, 224.25), (785, 73.75, 225.25), (788, 72.75, 225.25), (791, 72.75, 226.25), (794, 71.75, 226.25), (797, 71.75, 226.25), (800, 70.75, 227.25), (803, 70.75, 227.25), (806, 70.75, 227.25), (809, 69.75, 227.25), (812, 69.75, 227.25), (815, 69.75, 227.25), (818, 69.75, 227.25), (821, 70.75, 228.25), (824, 70.75, 227.25), (827, 70.75, 226.25), (830, 70.75, 225.25), (833, 73.75, 224.25), (836, 74.75, 223.25), (839, 76.75, 221.25), (842, 79.75, 218.25), (845, 81.75, 216.25), (848, 82.75, 215.25), (851, 83.75, 214.25), (854, 84.75, 213.25), (857, 85.75, 212.25), (860, 87.75, 211.25), (863, 88.75, 209.25), (866, 89.75, 208.25), (869, 91.75, 206.25), (872, 92.75, 205.25), (875, 94.75, 203.25), (878, 95.75, 202.25), (881, 97.75, 200.25), (884, 99.75, 198.25), (887, 101.75, 196.25), (890, 103.75, 194.25), (893, 105.75, 192.25), (896, 107.75, 189.25), (899, 110.75, 187.25), (902, 113.75, 184.25), (905, 115.75, 183.25), (908, 116.75, 180.25), (911, 117.75, 180.25), (914, 117.75, 180.25), (917, 123.75, 174.25), (920, 121.75, 175.25), (923, 118.75, 179.25), (926, 115.75, 182.25), (929, 115.75, 182.25), (932, 115.75, 182.25), (935, 115.75, 182.25), (938, 119.75, 177.25), (941, 124.75, 172.25)] BOTTOM_SIL = [(515, 583.75, 651.25), (518, 579.75, 658.25), (521, 577.75, 662.25), (524, 573.75, 663.25), (527, 573.75, 663.25), (530, 573.75, 662.25), (533, 573.75, 662.25), (536, 575.75, 662.25), (539, 574.75, 662.25), (542, 573.75, 666.25), (545, 570.75, 670.25), (548, 571.75, 671.25), (551, 571.75, 673.25), (554, 571.75, 674.25), (557, 571.75, 675.25), (560, 571.75, 675.25), (563, 571.75, 677.25), (566, 572.75, 678.25), (569, 570.75, 679.25), (572, 568.75, 681.25), (575, 567.75, 682.25), (578, 566.75, 683.25), (581, 565.75, 684.25), (584, 564.75, 684.25), (587, 564.75, 683.25), (590, 563.75, 681.25), (593, 562.75, 680.25), (596, 560.75, 677.25), (599, 560.75, 674.25), (602, 560.75, 674.25), (605, 559.75, 675.25), (608, 558.75, 677.25), (611, 558.75, 677.25), (614, 557.75, 678.25), (617, 557.75, 679.25), (620, 556.75, 680.25), (623, 556.75, 680.25), (626, 555.75, 681.25), (629, 555.75, 681.25), (632, 554.75, 682.25), (635, 554.75, 682.25), (638, 554.75, 682.25), (641, 554.75, 683.25), (644, 554.75, 683.25), (647, 553.75, 683.25), (650, 553.75, 684.25), (653, 553.75, 684.25), (656, 553.75, 684.25), (659, 553.75, 684.25), (662, 553.75, 684.25), (665, 553.75, 684.25), (668, 552.75, 684.25), (671, 552.75, 684.25), (674, 552.75, 684.25), (677, 552.75, 685.25), (680, 552.75, 685.25), (683, 552.75, 685.25), (686, 552.75, 685.25), (689, 552.75, 685.25), (692, 551.75, 686.25), (695, 551.75, 686.25), (698, 551.75, 686.25), (701, 551.75, 686.25), (704, 551.75, 686.25), (707, 551.75, 686.25), (710, 551.75, 686.25), (713, 551.75, 690.25), (716, 550.75, 687.25), (719, 550.75, 687.25), (722, 549.75, 688.25), (725, 547.75, 689.25), (728, 547.75, 691.25), (731, 549.75, 693.25), (734, 549.75, 696.25), (737, 548.75, 698.25), (740, 548.75, 700.25), (743, 548.75, 702.25), (746, 548.75, 703.25), (749, 548.75, 705.25), (752, 547.75, 706.25), (755, 546.75, 707.25), (758, 544.75, 708.25), (761, 543.75, 708.25), (764, 547.75, 709.25), (767, 547.75, 709.25), (770, 547.75, 709.25), (773, 547.75, 709.25), (776, 547.75, 710.25), (779, 549.75, 710.25), (782, 548.75, 710.25), (785, 547.75, 710.25), (788, 546.75, 710.25), (791, 546.75, 710.25), (794, 548.75, 710.25), (797, 548.75, 711.25), (800, 548.75, 711.25), (803, 548.75, 711.25), (806, 548.75, 711.25), (809, 548.75, 711.25), (812, 549.75, 711.25), (815, 549.75, 711.25), (818, 549.75, 711.25), (821, 549.75, 711.25), (824, 549.75, 710.25), (827, 549.75, 710.25), (830, 547.75, 710.25), (833, 548.75, 710.25), (836, 550.75, 710.25), (839, 550.75, 709.25), (842, 550.75, 709.25), (845, 551.75, 708.25), (848, 551.75, 706.25), (851, 552.75, 705.25), (854, 552.75, 701.25), (857, 553.75, 697.25), (860, 554.75, 690.25), (863, 554.75, 684.25), (866, 555.75, 681.25), (869, 557.75, 679.25), (872, 558.75, 678.25), (875, 559.75, 677.25), (878, 560.75, 676.25), (881, 562.75, 674.25), (884, 563.75, 673.25), (887, 565.75, 671.25), (890, 566.75, 669.25), (893, 569.75, 667.25), (896, 571.75, 665.25), (899, 573.75, 663.25), (902, 576.75, 660.25), (905, 577.75, 659.25), (908, 578.75, 659.25), (911, 578.75, 658.25), (914, 579.75, 657.25), (917, 581.75, 654.25), (920, 584.75, 653.25), (923, 589.75, 647.25), (926, 591.75, 645.25), (929, 589.75, 646.25), (932, 587.75, 649.25), (935, 586.75, 650.25), (938, 585.75, 650.25), (941, 585.75, 650.25), (944, 586.75, 649.25), (947, 588.75, 647.25), (950, 595.75, 640.25)] FRONT_SIL = [(266, 230.75, 232.25), (268, 230.75, 232.25), (270, 230.75, 232.25), (272, 230.75, 232.25), (274, 230.75, 232.25), (276, 230.75, 232.25), (278, 230.75, 232.25), (280, 230.75, 232.25), (282, 230.75, 232.25), (284, 230.75, 232.25), (286, 230.75, 232.25), (288, 230.75, 232.25), (290, 230.75, 232.25), (292, 230.75, 232.25), (294, 221.75, 242.25), (296, 205.75, 257.25), (298, 202.75, 260.25), (300, 194.75, 268.25), (302, 190.75, 272.25), (304, 189.75, 273.25), (306, 188.75, 274.25), (308, 189.75, 274.25), (310, 189.75, 273.25), (312, 189.75, 273.25), (314, 189.75, 273.25), (316, 186.75, 276.25), (318, 184.75, 278.25), (320, 182.75, 280.25), (322, 180.75, 287.25), (324, 178.75, 287.25), (326, 176.75, 287.25), (328, 175.75, 288.25), (330, 173.75, 289.25), (332, 172.75, 290.25), (334, 171.75, 292.25), (336, 169.75, 293.25), (338, 168.75, 294.25), (340, 167.75, 295.25), (342, 166.75, 296.25), (344, 165.75, 297.25), (346, 164.75, 299.25), (348, 163.75, 300.25), (350, 162.75, 300.25), (352, 161.75, 304.25), (354, 160.75, 305.25), (356, 157.75, 304.25), (358, 156.75, 304.25), (360, 156.75, 305.25), (362, 156.75, 305.25), (364, 156.75, 306.25), (366, 156.75, 306.25), (368, 156.75, 306.25), (370, 155.75, 307.25), (372, 155.75, 307.25), (374, 155.75, 307.25), (376, 155.75, 307.25), (378, 155.75, 307.25), (380, 155.75, 307.25), (382, 156.75, 306.25), (384, 156.75, 306.25), (386, 157.75, 305.25), (388, 157.75, 305.25), (390, 157.75, 305.25), (392, 158.75, 304.25), (394, 158.75, 304.25), (396, 158.75, 304.25), (398, 159.75, 304.25), (400, 159.75, 304.25), (402, 159.75, 303.25), (404, 160.75, 302.25), (406, 160.75, 302.25), (408, 161.75, 301.25), (410, 161.75, 301.25), (412, 162.75, 300.25), (414, 162.75, 300.25), (416, 163.75, 299.25), (418, 163.75, 299.25), (420, 164.75, 298.25), (422, 164.75, 298.25), (424, 164.75, 297.25), (426, 164.75, 297.25), (428, 164.75, 298.25), (430, 164.75, 298.25), (432, 163.75, 299.25), (434, 162.75, 301.25), (436, 160.75, 303.25), (438, 158.75, 304.25), (440, 156.75, 306.25), (442, 155.75, 307.25), (444, 154.75, 308.25), (446, 153.75, 309.25), (448, 152.75, 311.25), (450, 152.75, 311.25), (452, 151.75, 311.25), (454, 151.75, 311.25), (456, 151.75, 311.25), (458, 151.75, 311.25), (460, 151.75, 311.25), (462, 150.75, 311.25), (464, 150.75, 311.25), (466, 154.75, 310.25), (468, 155.75, 306.25), (470, 157.75, 305.25), (472, 159.75, 303.25), (474, 163.75, 299.25), (476, 175.75, 236.25)] BACK_SIL = [(263, 1204.75, 1206.25), (265, 1204.75, 1206.25), (267, 1204.75, 1206.25), (269, 1204.75, 1206.25), (271, 1204.75, 1206.25), (273, 1204.75, 1206.25), (275, 1204.75, 1206.25), (277, 1204.75, 1206.25), (279, 1204.75, 1206.25), (281, 1204.75, 1206.25), (283, 1204.75, 1206.25), (285, 1204.75, 1206.25), (287, 1204.75, 1206.25), (289, 1204.75, 1206.25), (291, 1204.75, 1206.25), (293, 1204.75, 1207.25), (295, 1185.75, 1225.25), (297, 1177.75, 1233.25), (299, 1176.75, 1234.25), (301, 1175.75, 1236.25), (303, 1173.75, 1238.25), (305, 1172.75, 1239.25), (307, 1170.75, 1241.25), (309, 1169.75, 1242.25), (311, 1168.75, 1243.25), (313, 1166.75, 1244.25), (315, 1164.75, 1248.25), (317, 1161.75, 1249.25), (319, 1159.75, 1252.25), (321, 1157.75, 1254.25), (323, 1154.75, 1256.25), (325, 1152.75, 1258.25), (327, 1150.75, 1260.25), (329, 1149.75, 1262.25), (331, 1147.75, 1263.25), (333, 1146.75, 1265.25), (335, 1144.75, 1266.25), (337, 1143.75, 1268.25), (339, 1142.75, 1269.25), (341, 1141.75, 1270.25), (343, 1140.75, 1271.25), (345, 1139.75, 1272.25), (347, 1136.75, 1274.25), (349, 1135.75, 1275.25), (351, 1134.75, 1276.25), (353, 1133.75, 1278.25), (355, 1132.75, 1278.25), (357, 1132.75, 1279.25), (359, 1131.75, 1279.25), (361, 1131.75, 1280.25), (363, 1130.75, 1280.25), (365, 1130.75, 1281.25), (367, 1129.75, 1281.25), (369, 1129.75, 1282.25), (371, 1129.75, 1282.25), (373, 1129.75, 1282.25), (375, 1129.75, 1282.25), (377, 1129.75, 1282.25), (379, 1129.75, 1282.25), (381, 1129.75, 1282.25), (383, 1129.75, 1282.25), (385, 1129.75, 1282.25), (387, 1129.75, 1281.25), (389, 1130.75, 1281.25), (391, 1130.75, 1281.25), (393, 1130.75, 1280.25), (395, 1131.75, 1280.25), (397, 1131.75, 1280.25), (399, 1131.75, 1279.25), (401, 1132.75, 1279.25), (403, 1132.75, 1278.25), (405, 1133.75, 1278.25), (407, 1134.75, 1277.25), (409, 1134.75, 1277.25), (411, 1135.75, 1276.25), (413, 1135.75, 1275.25), (415, 1136.75, 1275.25), (417, 1136.75, 1274.25), (419, 1137.75, 1274.25), (421, 1137.75, 1274.25), (423, 1137.75, 1273.25), (425, 1137.75, 1273.25), (427, 1137.75, 1274.25), (429, 1136.75, 1274.25), (431, 1135.75, 1276.25), (433, 1134.75, 1277.25), (435, 1132.75, 1279.25), (437, 1130.75, 1281.25), (439, 1128.75, 1283.25), (441, 1127.75, 1284.25), (443, 1125.75, 1285.25), (445, 1124.75, 1287.25), (447, 1123.75, 1287.25), (449, 1122.75, 1288.25), (451, 1122.75, 1289.25), (453, 1122.75, 1289.25), (455, 1121.75, 1289.25), (457, 1121.75, 1289.25), (459, 1121.75, 1289.25), (461, 1121.75, 1289.25), (463, 1121.75, 1289.25), (465, 1121.75, 1289.25), (467, 1125.75, 1285.25), (469, 1126.75, 1284.25), (471, 1128.75, 1282.25), (473, 1131.75, 1279.25), (475, 1135.75, 1275.25), (476, 1203.75, 1209.25)]