Add planned vs actual turnover dashboards, monthly actual costs, editable retention forecasts and actuals, starting retention, payouts and running balances. Preserve manual values across workbook imports and include retention backfill tooling. Add Cedar Gate model extraction and reports, measured service routes and ground surfaces, plus site-map section totals and quantity refinements.
2.9 KiB
Site model pipeline (Phase 1, run by hand)
Turns a consultant's drawings into the five JSON files the Site map page loads
(bushveld.json, services.json, earthworks.json, schedules.json, surface.json).
Specific to Civil Concepts' layer names on Bushveld Joy Road (C3092); other drawing sets
need the layer maps at the top of each script adjusted.
Tools
- LibreDWG (
brew install libredwg) →dwg2dxf - poppler (
brew install poppler) →pdftotext,pdftocairo - Python 3 with numpy
Build (Bushveld Joy example)
- Convert DWGs:
dwg2dxf -y -o out.dxf in.dwg(road layout M910-001, signs & markings M910-002, studs M910-005, stormwater LS M921-001). - Run in this order, all writing into one output folder
OUT:
(python3 -I extract_bushveld.py <road-layout.dxf> "<SO DATA folder>" OUT/bushveld.json python3 -I extract_extras.py <drawings folder> <converted DXF folder> OUT python3 -I extract_surface.py <road-layout.dxf> OUT python3 -I extract_xs.py <cross-section.pdf> <road-layout.dxf> OUTextract_xs.pyvalidates againstsurface.json, so run it last.) - Upload:
python3 upload.py --site <site id> --label "<text>" [--dry-run] OUT.
Checks printed by the scripts
- extract_bushveld: areas per work type and the 20 m chainage sections.
- extract_surface: contour-only surface vs peg levels (median / 90th percentile).
- extract_xs: rebuilt alignment length vs the drawing (674.412 m for Bushveld Joy) and cross-section vs design-surface agreement.
- upload: progress keys recorded on the site that the new model no longer has.
Tests
python3 -m unittest discover -s scripts/site-model -p "test_*.py"
Cedar Gate (C3277 / Equestria Ext. 289)
The 2026-10-20 delivery contains two projects. Use the C3277 archive and
Cedar Gate Contours Chris.dwg; exclude the Nellmapius drawings.
- Convert the bound C3277-910-001 Rev A road layout, C3277-920to940 Rev B
services layout, and Chris ground-contour DWG to DXF with
dwg2dxf. - With Python packages
numpy scipy shapely>=2.1 ezdxfavailable, run:python3 scripts/site-model/extract_cedar_gate.py DXF_FOLDER OUTPUT_FOLDER - Check
validation.json, the source hashes insources.json, surface coverage, and the rendered model. The initial reviewed output is inreports/site-models/cedar-gate/2026-10-20. - Upload with the normal uploader using Cedar Gate site ID
u6n5fye4czinw6o.
The extractor checks all four alignment lengths against drawing labels, conserves hatch areas in disjoint 20 m planning sections, measures single kerb lines once, and keeps surveyed ground separate from the finished-level surface. Service routes are plan overlays without inferred inverts, pipe sizes or trench volumes. External lower pavement layers, earthwork volumes and setting-out pegs are deliberately unquantified pending reconciliation with the relevant source data.