"""Colour rebar pipe solids by nominal diameter (run inside Rhino 8 via runner after the rebar stages). Globals: PARAMS_PATH. Ported from Code/교각모델링/apply_rebar_colors.py (Ungok P1, model v0.1.09). Rule (context-migration/디자인지침_경로.md, R8 criteria 2026-10-07): same diameter -> same colour regardless of steel grade (S = SD500, H = SD400). Centrelines keep their layer colour. Prints a check: per-diameter object count and colour, and any pipe whose colour does not match. """ import json from collections import Counter from Rhino.DocObjects import ObjectColorSource from System.Drawing import Color doc = __rhino_doc__ P = json.load(open(PARAMS_PATH, encoding="utf-8")) PID = P["pier_id"] PALETTE = {int(k): tuple(v) for k, v in P["display"]["rebar_palette"].items()} def main(): done, bad = Counter(), [] for o in list(doc.Objects): oid = o.Attributes.GetUserString("id") or "" if not oid.startswith(f"{PID}-R-"): continue dia = int(o.Attributes.GetUserString("dia")[1:]) # 'S32' / 'H19' -> 32 / 19 if dia not in PALETTE: bad.append((oid, "no palette entry")) continue attr = o.Attributes.Duplicate() attr.ObjectColor = Color.FromArgb(*PALETTE[dia]) attr.ColorSource = ObjectColorSource.ColorFromObject doc.Objects.ModifyAttributes(o, attr, True) done[dia] += 1 # check (re-read objects) seen = {} for o in doc.Objects: oid = o.Attributes.GetUserString("id") or "" if oid.startswith(f"{PID}-R-"): dia = int(o.Attributes.GetUserString("dia")[1:]) c = o.Attributes.ObjectColor ok = o.Attributes.ColorSource == ObjectColorSource.ColorFromObject and (c.R, c.G, c.B) == PALETTE[dia] if not ok: bad.append((oid, "colour mismatch")) seen.setdefault(dia, set()).add((c.R, c.G, c.B)) doc.Views.Redraw() print(json.dumps(dict(coloured=dict(done), colours_per_dia={k: list(v) for k, v in seen.items()}, distinct_colours=len({tuple(PALETTE[k]) for k in seen}), mismatches=bad[:10], mismatch_count=len(bad)))) main()