Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Requires **Blender 5.2 LTS** or newer (files were written with 5.2.3).

| Folder | What is in it |
|---|---|
| [`instruments/`](instruments/) | One `.blend` per ARM instrument (AERI, KAZR, DL, MPL, MWR3C, MET tower, ECOR, SEBS, SIRS, RWP, …) plus the C-SAPR2 radar, the KAWG AWOS and the radiosonde balloon launch (balloon, sonde, line and launch crew, animated) |
| [`instruments/`](instruments/) | One `.blend` per ARM instrument (AERI, KAZR, DL, MPL, MWR3C, MET tower, ECOR, SEBS, SIRS, RWP, …) plus the C-SAPR2 radar, the KAWG AWOS, the radiosonde balloon launch (balloon, sonde, line and launch crew, animated), and the DERECHOS additions: MRR micro rain radar, stand-alone METWXT, GNDRAD upwelling radiometers with ground-viewing IRT, STAMP and SoilVUE10 soil profiles, and a PhenoCam mast |
| [`containers/`](containers/) | AMF2 instrument containers, AOS platform, office shelter, and the SACR container (M1 and S2 versions) |
| [`buildings/`](buildings/) | Farmstead (M1), MIRF buildings and center pivots (S1), KAWG hangars and terminal (S2), Louisa power station, flagpole, site signs |
| [`vehicles/`](vehicles/) | Farm vehicles and implements, and the ARM Challenger 850 research aircraft |
Expand Down
Binary file added instruments/GNDRAD/GNDRAD.blend
Binary file not shown.
Binary file added instruments/METWXT/METWXT.blend
Binary file not shown.
Binary file added instruments/MRR/MRR.blend
Binary file not shown.
Binary file added instruments/PHENOCAM/PHENOCAM.blend
Binary file not shown.
8 changes: 8 additions & 0 deletions instruments/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ One file per instrument; link the `INST_*` (or `CSAPR2`) collection. Root at the

`INST_BALLOON` is the radiosonde launch at M1: balloon, sonde, the line (a stretch-to constraint from sonde to balloon) and the two-person launch crew (`BALLOON_Crew`). It carries the release animation over frames 1–480; the *_Hold/*_Release crew poses swap visibility at release.

`INST_GNDRAD`, `INST_METWXT`, `INST_MRR`, `INST_PHENOCAM`, `INST_SOILVUE10` and `INST_STAMP` are procedural (rebuild with `blender -b --factory-startup --python tools/build_inst_<name>.py`; helpers in `tools/instlib.py`). Each root carries `full_name`, `sites`, `sources` and `notes` custom properties. Parts below grade (probes, footings, driven stakes, ground rods) sit in a `<NAME>_BelowGrade` child collection that is hidden in viewport and render; un-hide it for cut-away views. Their `bbox_*` describe what stands above ground and `below_grade_m` gives the depth.

| Preview | Collection | File |
|---|---|---|
| <img src="preview/AERI.jpg" width="260"> | `INST_AERI` | [`AERI/AERI.blend`](AERI/AERI.blend) (0.2 MB) |
Expand All @@ -17,18 +19,24 @@ One file per instrument; link the `INST_*` (or `CSAPR2`) collection. Root at the
| <img src="preview/DL.jpg" width="260"> | `INST_DL` | [`DL/DL.blend`](DL/DL.blend) (0.2 MB) |
| <img src="preview/ECOR.jpg" width="260"> | `INST_ECOR` | [`ECOR/ECOR.blend`](ECOR/ECOR.blend) (0.3 MB) |
| <img src="preview/ECOR_4m.jpg" width="260"> | `INST_ECOR_4m` | [`ECOR/ECOR.blend`](ECOR/ECOR.blend) (0.3 MB) |
| <img src="preview/GNDRAD.jpg" width="260"> | `INST_GNDRAD` | [`GNDRAD/GNDRAD.blend`](GNDRAD/GNDRAD.blend) (0.2 MB) |
| <img src="preview/IRT.jpg" width="260"> | `INST_IRT` | [`IRT/IRT.blend`](IRT/IRT.blend) (0.1 MB) |
| <img src="preview/KAZR.jpg" width="260"> | `INST_KAZR` | [`KAZR/KAZR.blend`](KAZR/KAZR.blend) (0.2 MB) |
| <img src="preview/LDIS.jpg" width="260"> | `INST_LDIS` | [`LDIS/LDIS.blend`](LDIS/LDIS.blend) (0.1 MB) |
| <img src="preview/MAWS.jpg" width="260"> | `INST_MAWS` | [`MAWS/MAWS.blend`](MAWS/MAWS.blend) (0.2 MB) |
| <img src="preview/MET.jpg" width="260"> | `INST_MET` | [`MET/MET.blend`](MET/MET.blend) (0.3 MB) |
| <img src="preview/METWXT.jpg" width="260"> | `INST_METWXT` | [`METWXT/METWXT.blend`](METWXT/METWXT.blend) (0.2 MB) |
| <img src="preview/MFR.jpg" width="260"> | `INST_MFR` | [`MFR/MFR.blend`](MFR/MFR.blend) (0.1 MB) |
| <img src="preview/MFRSR.jpg" width="260"> | `INST_MFRSR` | [`MFRSR/MFRSR.blend`](MFRSR/MFRSR.blend) (0.1 MB) |
| <img src="preview/MPL.jpg" width="260"> | `INST_MPL` | [`MPL/MPL.blend`](MPL/MPL.blend) (0.1 MB) |
| <img src="preview/MRR.jpg" width="260"> | `INST_MRR` | [`MRR/MRR.blend`](MRR/MRR.blend) (0.2 MB) |
| <img src="preview/MWR3C.jpg" width="260"> | `INST_MWR3C` | [`MWR3C/MWR3C.blend`](MWR3C/MWR3C.blend) (0.2 MB) |
| <img src="preview/PHENOCAM.jpg" width="260"> | `INST_PHENOCAM` | [`PHENOCAM/PHENOCAM.blend`](PHENOCAM/PHENOCAM.blend) (0.1 MB) |
| <img src="preview/RWP.jpg" width="260"> | `INST_RWP` | [`RWP/RWP.blend`](RWP/RWP.blend) (0.3 MB) |
| <img src="preview/SEBS.jpg" width="260"> | `INST_SEBS` | [`SEBS/SEBS.blend`](SEBS/SEBS.blend) (0.2 MB) |
| <img src="preview/SIRS.jpg" width="260"> | `INST_SIRS` | [`SIRS/SIRS.blend`](SIRS/SIRS.blend) (0.3 MB) |
| <img src="preview/SOILVUE10.jpg" width="260"> | `INST_SOILVUE10` | [`SOILVUE10/SOILVUE10.blend`](SOILVUE10/SOILVUE10.blend) (0.2 MB) |
| <img src="preview/SONDE.jpg" width="260"> | `INST_SONDE` | [`SONDE/SONDE.blend`](SONDE/SONDE.blend) (0.2 MB) |
| <img src="preview/STAMP.jpg" width="260"> | `INST_STAMP` | [`STAMP/STAMP.blend`](STAMP/STAMP.blend) (0.2 MB) |
| <img src="preview/VDIS.jpg" width="260"> | `INST_VDIS` | [`VDIS/VDIS.blend`](VDIS/VDIS.blend) (0.1 MB) |
| <img src="preview/WB.jpg" width="260"> | `INST_WB` | [`WB/WB.blend`](WB/WB.blend) (0.2 MB) |
Binary file added instruments/SOILVUE10/SOILVUE10.blend
Binary file not shown.
Binary file added instruments/STAMP/STAMP.blend
Binary file not shown.
Binary file added instruments/preview/GNDRAD.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added instruments/preview/METWXT.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added instruments/preview/MRR.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added instruments/preview/PHENOCAM.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added instruments/preview/SOILVUE10.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added instruments/preview/STAMP.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
134 changes: 134 additions & 0 deletions tools/build_inst_gndrad.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
"""GNDRAD upwelling radiometer stand (+ downward IRT, the GNDIRT) -> instruments/GNDRAD/GNDRAD.blend
(collection INST_GNDRAD). blender -b --factory-startup --python tools/build_inst_gndrad.py

Per the GNDRAD handbook (ARM TR-027, T. Stoffel): upwelling shortwave by an inverted
pyranometer (Eppley PSP, 2pi sr, 0.3-3 um) and upwelling longwave by an inverted
pyrgeometer (Eppley PIR, 4-50 um), both mounted inverted WITHOUT ventilation 10 m above
ground looking at the surface. DERECHOS Table 1 also requests a ground-viewing IRT
(GNDIRT), which ARM mounts on the same boom.

Model: guyed 10 m tilt-down aluminium mast on a concrete pad, 2 m boom to the south (-Y)
so the sensors view undisturbed ground away from the mast, crossarm at the boom tip with
PSP (west), IRT (centre, nadir) and PIR (east). Radiometer bodies are generic PSP/PIR-sized
(the field units may be Kipp & Zonen CMP22/CGR4); boom length and guy layout are generic.
"""
import bpy, math, os, sys
from mathutils import Vector, Matrix
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import instlib as L

NAME = 'GNDRAD'
coll, root = L.start(NAME)
HB = 10.0 # boom height (handbook: 10 m AGL)
BOOM = 2.0 # boom length towards -Y
TIP = Vector((0, -BOOM, HB))
PLATE_C = -0.030 - 0.051 # radiometer case centre: shield top meets the plate underside


def build_mast(mb):
mb.box((0, 0, 0.025), (0.9, 0.9, 0.05), 'concrete')
mb.box((0, 0, 0.06), (0.36, 0.36, 0.02), 'galvanized')
for sx in (-1, 1): # tilt-down hinge cheeks
mb.box((sx * 0.07, 0, 0.17), (0.012, 0.16, 0.20), 'galvanized')
mb.cyl((-0.09, 0, 0.22), (0.09, 0, 0.22), 0.015, 'stainless', seg=12)
for x in (-0.13, 0.13):
for y in (-0.13, 0.13):
mb.cyl((x, y, 0.07), (x, y, 0.11), 0.012, 'stainless', seg=8)
secs = [(0.07, 4.0, 0.060), (4.0, 7.5, 0.048), (7.5, HB + 0.35, 0.038)]
for z0, z1, r in secs:
mb.cyl((0, 0, z0), (0, 0, z1), r, 'aluminum', seg=24)
mb.cyl((0, 0, z1 - 0.05), (0, 0, z1 + 0.02), r + 0.008, 'aluminum', seg=24) # splice collar
for zg in (4.5, 9.0): # guy rings
mb.cyl((0, 0, zg - 0.03), (0, 0, zg + 0.03), 0.065, 'galvanized', seg=20)
# air terminal
mb.cyl((0, 0, HB + 0.35), (0, 0, HB + 0.95), 0.008, 'copper', r1=0.003, seg=8)
# boom, brace and crossarm
mb.beam((0, -0.05, HB), TIP, 0.05, 0.05, 'aluminum')
mb.box((0, -0.06, HB), (0.14, 0.04, 0.16), 'galvanized') # boom clamp
mb.cyl((0, -0.04, HB - 0.75), (0, -1.2, HB - 0.03), 0.014, 'aluminum', seg=10)
mb.box((0, -0.05, HB - 0.75), (0.12, 0.04, 0.08), 'galvanized')
mb.beam(TIP + Vector((-0.40, 0, 0)), TIP + Vector((0.40, 0, 0)), 0.04, 0.04, 'aluminum')
mb.box(TIP, (0.10, 0.10, 0.07), 'galvanized') # crossarm clamp
for x in (-0.28, 0.28): # inverted mounting plates
mb.box(TIP + Vector((x, 0, -0.025)), (0.15, 0.15, 0.010), 'aluminum') # top touches the arm
# junction box at the boom root, logger enclosure at the base (door -Y)
mb.box((0.10, -0.10, HB - 0.35), (0.16, 0.10, 0.20), 'grey_plastic')
mb.box((0, -0.17, 1.45), (0.40, 0.20, 0.50), 'fiberglass_white')
mb.box((0, -0.273, 1.45), (0.38, 0.008, 0.48), 'fiberglass_white')
mb.box((0, -0.278, 1.6), (0.12, 0.002, 0.05), 'label')
for z in (1.25, 1.65):
mb.box((0, -0.06, z), (0.36, 0.04, 0.04), 'galvanized')


def radiometer(mb, c, kind):
"""Inverted PSP ('sw') or PIR ('lw') body centred at c, domes pointing down (-Z)."""
c = Vector(c)
body_top = c + Vector((0, 0, 0.045))
mb.cyl(body_top, body_top + Vector((0, 0, 0.006)), 0.085, 'kipp_white', seg=40) # sun/guard shield
mb.cyl(c, body_top, 0.064, 'kipp_white', seg=40) # case
mb.cyl(c - Vector((0, 0, 0.012)), c, 0.058, 'black_anod', seg=40) # base ring
for k in range(3): # levelling screws
a = math.radians(90 + 120 * k)
p = c + Vector((0.075 * math.cos(a), 0.075 * math.sin(a), 0.045))
mb.cyl(p, p + Vector((0, 0, 0.02)), 0.006, 'stainless', seg=8)
mb.cyl(c + Vector((0.06, 0, 0.02)), c + Vector((0.10, 0, 0.02)), 0.010, 'black_plastic', seg=10) # connector
d0 = c - Vector((0, 0, 0.012))
if kind == 'sw': # double glass domes over a black detector
mb.cyl(d0, d0 - Vector((0, 0, 0.002)), 0.022, 'black_body', seg=24)
mb.lathe([(0.032 * math.cos(t), -0.032 * math.sin(t)) for t in [i * math.pi / 2 / 10 for i in range(11)]],
'dome', M=Matrix.Translation(d0), seg=40)
mb.lathe([(0.020 * math.cos(t), -0.020 * math.sin(t)) for t in [i * math.pi / 2 / 8 for i in range(9)]],
'dome', M=Matrix.Translation(d0), seg=32)
else: # flat-ish silicon window (pyrgeometer)
mb.cyl(d0, d0 - Vector((0, 0, 0.010)), 0.030, 'black_anod', r1=0.026, seg=32)
mb.lathe([(0.026, 0.0), (0.024, -0.004), (0.016, -0.008), (0.0, -0.009)], 'lens_dark',
M=Matrix.Translation(d0 - Vector((0, 0, 0.010))), seg=32)


def build_sensors(mb):
radiometer(mb, TIP + Vector((-0.28, 0, PLATE_C)), 'sw')
radiometer(mb, TIP + Vector((0.28, 0, PLATE_C)), 'lw')
# nadir IRT (Heitronics KT15-class head) hanging from the crossarm clamp
mb.box(TIP + Vector((0, 0, -0.0525)), (0.06, 0.06, 0.065), 'aluminum')
mb.cyl(TIP + Vector((0, 0, -0.08)), TIP + Vector((0, 0, -0.28)), 0.033, 'stainless', seg=28)
mb.cyl(TIP + Vector((0, 0, -0.28)), TIP + Vector((0, 0, -0.34)), 0.036, 'black_anod', seg=28)
mb.cyl(TIP + Vector((0, 0, -0.340)), TIP + Vector((0, 0, -0.343)), 0.018, 'lens_dark', seg=24)


L.part('gndrad_mast', coll, root, build_mast)
L.part('gndrad_sensors', coll, root, build_sensors)
L.empty('gndrad_psp', coll, root, tuple(TIP + Vector((-0.28, 0, PLATE_C))), 0.1)
L.empty('gndrad_pir', coll, root, tuple(TIP + Vector((0.28, 0, PLATE_C))), 0.1)
L.empty('gndirt', coll, root, tuple(TIP + Vector((0, 0, -0.34))), 0.1)

# guys: three directions avoiding the boom (boom -Y = 270 deg)
for k, az in enumerate((90, 210, 330)):
a = math.radians(az)
anchor = Vector((5.0 * math.cos(a), 5.0 * math.sin(a), 0.0))
L.part(f'gndrad_anchor_{k}', coll, root, lambda mb, p=anchor: (
mb.cyl(p + Vector((0, 0, 0.0)), p + Vector((0, 0, 0.12)), 0.02, 'galvanized', seg=10),
mb.box(p + Vector((0, 0, 0.0)), (0.2, 0.2, 0.02), 'concrete')))
for zg in (4.5, 9.0):
top = Vector((0.065 * math.cos(a), 0.065 * math.sin(a), zg))
L.wire(f'gndrad_guy_{k}_{int(zg)}', top, anchor + Vector((0, 0, 0.12)), 0.003, coll, root)

L.cable('gndrad_cable_up', [(0.04, -0.17, 1.70), (0.045, -0.05, 1.9), (0.045, -0.045, 5.0),
(0.045, -0.045, HB - 0.5), (0.10, -0.10, HB - 0.45)], 0.008, coll, root)
for x, nm in ((-0.28, 'psp'), (0.0, 'irt'), (0.28, 'pir')):
L.cable(f'gndrad_cable_{nm}', [(0.10, -0.10, HB - 0.25), (0.06, -0.4, HB - 0.06), (x * 0.5, -1.4, HB - 0.03),
(x, -BOOM + 0.12, HB - 0.04), (x + (0.1 if x >= 0 else 0.1), -BOOM, HB - 0.08)],
0.004, coll, root)
L.cable('gndrad_cable_power', [(-0.08, -0.17, 1.20), (-0.08, -0.22, 0.6), (-0.10, -0.30, 0.06),
(-0.4, -0.7, 0.0), (-0.8, -1.1, 0.0)], 0.009, coll, root)

L.finish(NAME, coll, root,
'Ground Radiometers on Stand for Upwelling Radiation (GNDRAD) with ground-viewing IRT',
['M1', 'S1'],
['ARM GNDRAD handbook ARM TR-027 (T. Stoffel, 2004): inverted unventilated PSP and PIR at 10 m AGL',
'DERECHOS white paper Table 1 (SIRS upwelling components; GNDIRT / IRT row)'],
f'Guyed 10 m tilt-down aluminium mast on a concrete pad; {BOOM:.0f} m boom to -Y at {HB:.0f} m; '
'crossarm at the tip with inverted PSP-type pyranometer (empty gndrad_psp, -X), nadir IRT '
'(gndirt, centre) and inverted PIR-type pyrgeometer (gndrad_pir, +X). Guys at 4.5 and 9 m '
'to anchors 5 m out at az 90/210/330 deg (clear of the boom). Logger enclosure at 1.2-1.7 m. '
'Sensor bodies and stand layout are generic.')
print('ALL DONE')
106 changes: 106 additions & 0 deletions tools/build_inst_metwxt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
"""Stand-alone Vaisala WXT530-series weather transmitter -> instruments/METWXT/METWXT.blend
(collection INST_METWXT). blender -b --factory-startup --python tools/build_inst_metwxt.py

The configuration used on ARM redeployable profiling modules (R1) and the ANL guest kit
at NIU (DERECHOS Tables 1 and 3): a WXT530-series head on a ~2 m, 60 mm galvanised pole
with a folding tripod base, a fibreglass logger/comms enclosure and a ground rod.
The WXT head itself is a copy of the wxt530 sub-assembly of instruments/MET/MET.blend
(read only), so both assets show the same sensor.
"""
import bpy, math, os, sys
from mathutils import Vector, Matrix
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import instlib as L

NAME = 'METWXT'
coll, root = L.start(NAME)
H = 2.00 # top of the pole; WXT mount sits on it

# ---- WXT head copied from the MET tower asset
src = os.path.join(L.REPO, 'instruments/MET/MET.blend')
with bpy.data.libraries.load(src, link=False) as (s, d):
d.objects = [n for n in s.objects if n.startswith('wxt530')]
objs = {o.name: o for o in d.objects}
old = objs.pop('wxt530')
head = L.empty('wxt', coll, root, (0, 0, 0), 0.15)
for o in objs.values():
coll.objects.link(o)
o.parent = head # keeps local transform relative to the head
bpy.data.objects.remove(old)
# find the bottom of the head in its own frame and sit it on the pole top
zmin = min((o.matrix_parent_inverse @ o.matrix_basis @ Vector(c)).z for o in objs.values() for c in o.bound_box)
head.location = (0, 0, H - zmin)
for o in objs.values():
o.name = o.name.replace('wxt530', 'wxt')


def build_mast(mb):
mb.cyl((0, 0, 0.0), (0, 0, H), 0.0302, 'galvanized', seg=24)
mb.cyl((0, 0, H - 0.004), (0, 0, H), 0.031, 'black_plastic', seg=24)
mb.cyl((0, 0, 0.0), (0, 0, 0.012), 0.08, 'galvanized', seg=24)
# folding tripod: collar at 0.9 m, three legs to foot plates, ground stakes
mb.cyl((0, 0, 0.86), (0, 0, 0.94), 0.042, 'galvanized', seg=20)
for k in range(3):
a = math.radians(90 + 120 * k)
foot = Vector((0.78 * math.cos(a), 0.78 * math.sin(a), 0.02))
top = Vector((0.045 * math.cos(a), 0.045 * math.sin(a), 0.90))
mb.cyl(top, foot, 0.016, 'galvanized', seg=10)
mb.box(foot + Vector((0, 0, -0.012)), (0.12, 0.12, 0.008), 'galvanized')
mb.cyl(foot + Vector((0.04 * math.cos(a), 0.04 * math.sin(a), 0.03)),
foot + Vector((0.04 * math.cos(a), 0.04 * math.sin(a), -0.012)), 0.008, 'galvanized', seg=8)
mid = top.lerp(foot, 0.55)
mb.cyl(mid, Vector((0, 0, 0.35)), 0.009, 'galvanized', seg=8) # leg brace to the pole
mb.cyl((0, 0, 0.33), (0, 0, 0.37), 0.04, 'galvanized', seg=20)


def build_enclosure(mb):
# 14x12x6-inch fibreglass enclosure on unistrut, door facing south (-Y)
for z in (0.95, 1.40):
mb.box((0, -0.045, z), (0.30, 0.04, 0.04), 'galvanized')
mb.box((0, -0.03, z), (0.08, 0.03, 0.07), 'stainless')
mb.box((0, -0.16, 1.175), (0.31, 0.16, 0.36), 'fiberglass_white')
mb.box((0, -0.243, 1.175), (0.29, 0.008, 0.34), 'fiberglass_white')
for x in (-0.14, 0.14):
for z in (1.03, 1.32):
mb.cyl((x, -0.247, z), (x, -0.257, z), 0.012, 'stainless', seg=10)
mb.box((0, -0.248, 1.29), (0.10, 0.002, 0.04), 'label')
for x in (-0.08, 0.0, 0.08):
mb.cyl((x, -0.16, 0.995), (x, -0.16, 0.97), 0.011, 'grey_plastic', seg=10)


def build_ground(mb):
mb.cyl((0.35, -0.25, 0.0), (0.35, -0.25, 0.10), 0.008, 'copper', seg=10)
mb.box((0.35, -0.25, 0.08), (0.03, 0.03, 0.03), 'brass')


def build_buried(mb):
mb.cyl((0.35, -0.25, -0.40), (0.35, -0.25, 0.0), 0.008, 'copper', seg=10) # ground rod
for k in range(3): # tripod stakes
a = math.radians(90 + 120 * k)
f = Vector((0.82 * math.cos(a), 0.82 * math.sin(a), 0.0))
mb.cyl(f, f + Vector((0, 0, -0.30)), 0.008, 'galvanized', seg=8)


L.part('metwxt_mast', coll, root, build_mast)
L.part('metwxt_enclosure', coll, root, build_enclosure)
L.part('metwxt_ground_rod', coll, root, build_ground)
L.part('metwxt_buried', L.below(coll), root, build_buried)
L.cable('metwxt_cable_wxt', [(0.0, -0.040, H - 0.05), (0.0, -0.040, 1.7), (0.0, -0.040, 1.45),
(0.08, -0.10, 1.0), (0.08, -0.16, 0.97)], 0.004, coll, root)
L.cable('metwxt_cable_power', [(-0.08, -0.16, 0.97), (-0.08, -0.20, 0.6), (-0.06, -0.12, 0.2),
(-0.10, -0.15, 0.01), (-0.45, -0.55, 0.0), (-0.7, -0.85, 0.0)], 0.007, coll, root)
L.cable('metwxt_ground_strap', [(0.0, -0.16, 0.97), (0.05, -0.28, 0.55), (0.25, -0.30, 0.15), (0.35, -0.25, 0.09)],
0.003, coll, root, m='copper')

L.finish(NAME, coll, root,
'Vaisala WXT530-series weather transmitter on stand-alone pole (METWXT)',
['R1', 'NIU'],
['ARM MET handbook DOE/SC-ARM-TR-086 (metwxt class)',
'Vaisala WXT530 series user guide M211840EN (WXT536 0.7 kg, polycarbonate shield, AISI 316 rain plate)',
'DERECHOS white paper Table 1 (MET / METWXT at M1, S1, R1) and Table 3 (Vaisala WXT530 at NIU)',
'WXT head geometry copied from instruments/MET/MET.blend (wxt530 sub-assembly)'],
f'WXT head (empty "wxt") on a 60 mm galvanised pole, sensor base at {H:.2f} m (head top ~{H + 0.24:.2f} m); '
'folding tripod with stakes, fibreglass logger/comms enclosure at 1.0-1.35 m facing -Y, '
'ground rod (stakes and rod below grade in METWXT_BelowGrade). North mark of the WXT is +Y. Generic stand - match to the R1 module '
'or ADM installation when its layout is fixed.')
print('ALL DONE')
Loading
Loading