{"ok":true,"spec":"hus-spec","version":1,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://draw.dibrix.com/spec/schema","title":"hus-spec v1","description":"Kompakt parametrisk hus (meter, z opp). Bygges med build_from_spec / POST /sessions/{sid}/spec.","type":"object","required":["spec","version"],"properties":{"spec":{"const":"hus-spec"},"version":{"const":1},"units":{"const":"m"},"opening_std":{"type":"integer","description":"Åpningsstandard: 2 = gerikt/belistning AV med mindre style.trim_out er satt (kilde-merk med style.casing_source/frame_source lest|antatt|ukjent). Utelatt = 2. Sett 1 for å bygge en eldre spec med gammel standard (gerikt på ute og inne)."},"wall_std":{"type":"integer","description":"Veggstandard (ytre mål, NS 3940): 2 = ringen til yttervegger (alignment left/right) er UTSIDEN AV FERDIG VEGG inkludert kledning, og thickness_m er hele veggen; Dibrix legger kledningen innenfor ringen (kjernen = thickness_m minus utlekting + bord), så ytre mål er det samme med kledning på eller av. Utelatt/1 = eldre spec: ringen er kjernens ytterflate og kledningen legges utenpå (+0,042 m). Tegningsimporten setter 2."},"name":{"type":"string"},"site":{"type":"object","description":"Tomta i verden. `georef` = prosjektets georeferanse (bim/georeference.py, docs/georeferanse.md): {crs 25832|25833|25835|annen EPSG, origin {n, e, h?} (verdenskoordinatene til modellens 0,0; h = NN2000 for z 0), rotation_deg (fra modellens +y til nord, med klokka), limits {ridge_max_m, gesims_max_m, min_distance_m, avg_terrain_h}, constraints [{id, kind plangrense|byggegrense|nabogrense|bygg, points [[N, E], …], keep ost|vest|nord|sor|venstre|hoyre (plan-/byggegrense), closed, ref fasadeliv|yttervegg|takutstikk, min_m}]}. Utelatt = georeferansen i økta røres ikke; null = fjern den."},"meta":{"type":"object","description":"Fritt: kilde, tolker-versjon, timing {lese_s}, not_carried {kind: antall}. `ankere` = måle-ankere fra stedet [{id, kind, value_m, precision_mm, source, ref}] (bim/anchors.py, docs/maal-ankere.md): bygges inn i økta og kontrollerer modellen."},"levels":{"type":"array","description":"Etasjer. Elementene får etasje av z. Utelatt = modellen får ingen etasjer.","items":{"type":"object","required":["n","z"],"properties":{"n":{"type":"string"},"z":{"type":"number"},"h":{"type":"number"}}}},"cladding":{"type":"object","description":"Standardkledning for vegger med cladding: true (on, type 'liggende'|'stående', cover, utlekting, t, fuge, material; se bim.cladding.DEFAULT_CLADDING)."},"corner_boards":{"type":"object","description":"Hjørnekasser for hele modellen: {on, w, t, inner, material}."},"phases":{"type":"array","description":"Faser (docs/rehab-faser.md): [{id, name, order, kind existing|demolition|new|modified|custom, status planlagt|pågår|ferdig, start, end, deps, color}]. Hvert element kan ha «phase»: fase-id; tomt = standardfasen."},"phase_view":{"type":"object","description":"Visning per fase: {default, hidden: [fase-id], mode phase|material, existing_grey}."},"plan":{"type":"object","description":"4D/5D-plan: {start, calendar work5|all, tasks[{id,name,phase,duration_d,deps,kinds,elements,resource}], unit_prices{nøkkel:{unit,nok}}, overrides{element:kr}, budget{total,phases}}."},"style":{"type":"string","description":"Modellstil ved navn (valgfri): «Arkitekt svart/hvit», «Presentasjon farge», «Søknad», «Skisse» eller en stil i dokumentet. Utelatt = stilen modellen har fra før (utseendet endres ikke)."},"style_objects":{"type":"object","description":"Valgfri farge/linje/skravur per objekttype oppå stilen, {type: {face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch, text_color, visible}}; typer og verdier: GET /sessions/{sid}/style/catalog."},"walls":{"type":"array","items":{"type":"object","required":["a","b"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"a":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"b":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"height_m":{"type":"number"},"thickness_m":{"type":"number"},"wall_type":{"type":"string","description":"Veggtype fra biblioteket (ytter_250 …); tykkelsen følger typen når den matcher."},"z0":{"type":"number"},"alignment":{"enum":["left","center","right"]},"join_mode":{"enum":["miter","butt"],"description":"Skjøtmodus (miter = gjæring i lukket ring/L)."},"to_roof":{"type":"boolean"},"to_slab":{"type":"boolean"},"cladding":{"description":"true = spec.cladding, false = ingen, objekt = egen kledning.","oneOf":[{"type":"boolean"},{"type":"object"}]},"materials":{"type":"object","additionalProperties":{"type":["string","array"]},"description":"Delflate → fargenavn (bim.materials.PALETTE)."},"name":{"type":"string"},"peak":{"type":"array"},"phase":{"type":"string","description":"Fase-id (bim/phases.py, docs/rehab-faser.md): eksisterende | rivning | ny | endres | egne fase-id-er. «nytt» = «ny». Tomt = standardfasen. Påvirker ikke geometrien; styrer farge, filter, mengder og kost."},"bearing":{"enum":["bearing","non_bearing","unknown"],"description":"Bærende: bearing | non_bearing | unknown (utelatt = ukjent)."},"fire_class":{"enum":["none","EI30","EI60","EI90"],"description":"Brannklasse."},"fire_wall":{"type":"boolean","description":"Brannvegg (bare vegg)."},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"openings":{"type":"array","items":{"type":"object","required":["host","kind"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"host":{"type":"string","description":"id til veggen"},"name":{"type":"string","description":"visningsnavn på åpningen (bevares; uten navn lages «Window 1.2x1.2» o.l.)"},"kind":{"enum":["door","window","opening"]},"offset_m":{"type":"number","description":"fra veggens a-ende til åpningens venstre kant"},"width_m":{"type":"number"},"height_m":{"type":"number"},"sill_m":{"type":"number","description":"sålehøyde over veggfot"},"hinge":{"enum":["left","right"]},"style":{"type":"object","description":"dør: type slett|speil|glass|helglass|garage|dobbel|skyve|skyve_vegg|lomme (+ fyllinger, glass_cols/glass_rows 1-4 + glass_h + glass_bar_w (sprosset glass), leaf_type, sidefelt_w, overlys_h, ventil, klasse, port); vindu: type fast|1-floy|2-floy; form: shape rect|circle (rundt vindu, width_m = diameter)|arch (rundbue, arch_rise_m = stikk); karm: karm_w (bredde, m; standard frame_width_m 0,05) + karm_d (dybde, standard 0,115); gerikt: trim_out true|false (AV som standard) + trim_out_w (bredde) + trim_out_t (tykkelse) + trim_out_over/utforing; kilde: frame_source / casing_source = lest|antatt|ukjent"},"outer_loop_uv":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"description":"[[u, z], …] (z absolutt) for vinklet åpning"},"frame_width_m":{"type":"number"},"materials":{"type":"object","additionalProperties":{"type":["string","array"]},"description":"Delflate → fargenavn (bim.materials.PALETTE)."},"phase":{"type":"string","description":"Fase-id (bim/phases.py, docs/rehab-faser.md): eksisterende | rivning | ny | endres | egne fase-id-er. «nytt» = «ny». Tomt = standardfasen. Påvirker ikke geometrien; styrer farge, filter, mengder og kost."},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"slabs":{"type":"array","items":{"type":"object","required":["boundary"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"boundary":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"minItems":3,"description":"Plan-ring [[x, y], …] i meter, ikke lukket med gjentatt første punkt."},"z_top":{"type":"number"},"thickness_m":{"type":"number"},"slab_type":{"enum":["standard","betong_sale","tre_etasjeskille","terrasse"]},"holes":{"type":"array","items":{"type":"object","properties":{"boundary":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"minItems":3,"description":"Plan-ring [[x, y], …] i meter, ikke lukket med gjentatt første punkt."},"kind":{"type":"string"}}},"description":"Hull (sjakt …). Trappehull lages av trappen selv."},"fall":{"type":["object","null"]},"materials":{"type":"object","additionalProperties":{"type":["string","array"]},"description":"Delflate → fargenavn (bim.materials.PALETTE)."},"name":{"type":"string"},"phase":{"type":"string","description":"Fase-id (bim/phases.py, docs/rehab-faser.md): eksisterende | rivning | ny | endres | egne fase-id-er. «nytt» = «ny». Tomt = standardfasen. Påvirker ikke geometrien; styrer farge, filter, mengder og kost."},"bearing":{"enum":["bearing","non_bearing","unknown"],"description":"Bærende: bearing | non_bearing | unknown (utelatt = ukjent)."},"fire_class":{"enum":["none","EI30","EI60","EI90"],"description":"Brannklasse."},"fire_wall":{"type":"boolean","description":"Brannvegg (bare vegg)."},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"roofs":{"type":"array","items":{"type":"object","required":["boundary"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"boundary":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"minItems":3,"description":"Plan-ring [[x, y], …] i meter, ikke lukket med gjentatt første punkt."},"form":{"enum":["gable","hip","shed","flat","custom"],"description":"custom = taket er top_faces; uten dem bygges nærmeste form med en advarsel"},"top_faces":{"type":"array","description":"takets oversideflater [[[x, y, z], …], …] (form custom: SKP-fasit, T-tak)"},"slope_deg":{"type":"number","description":"takvinkel i GRADER (anbefalt); vinner over slope_pct"},"slope_pct":{"type":"number","description":"takvinkel i % stigning (eldre, virker som før)"},"overhang_m":{"type":"number"},"thickness_m":{"type":"number"},"z_eave":{"type":"number"},"ridge_height_m":{"type":["number","null"]},"edge_roles":{"type":"array","items":{"enum":["slope","gable","flat"]},"description":"per kant: slope (raft) | gable (gavl)"},"edge_slopes":{"type":"array"},"edge_rises":{"type":"array","description":"m over z_eave per kant (ulik takfot)"},"edge_overhangs":{"type":"array"},"edge_abut":{"type":"array"},"ridge_offset_m":{"type":"number"},"covering":{"type":"object","description":"{type: shingel_rett|shingel_skra|shingel_drape|shingel_kuttet|shingel_swing|stein_dobbelkrum|stein_flat|stein_tegl|falset_stal|stal_trapes|papp|skifer|torv_sedum, color}. Frie ord (betongstein/tegl/bølgeblikk/takpapp/stål/gress/sedum) normaliseres; ukjent type → warning."},"openings":{"type":"array","description":"Takhull i plan: [{kind, boundary, cut?}]. kind: takopplett (innskåret tverrgavl gjennom hele taket; cut=perpendicular|plumb), ark (kvist-fot, standard når kind mangler), takvindu (hull for takvindu; glass/karm via POST /roof_window / takvindu()), pipe (skorsteinshull). Se docs/spec.md § roofs[].openings."},"trim":{"type":"object"},"trim_materials":{"type":"object"},"vindski_boards":{"type":"array"},"trim_dims":{"type":"object"},"face_materials":{"type":"array"},"materials":{"type":"object","additionalProperties":{"type":["string","array"]},"description":"Delflate → fargenavn (bim.materials.PALETTE)."},"downpipes":{"type":["string","object"],"description":"nedløpets ende per takfot: samme|syd|nord|ost|vest|start|slutt|begge|ingen|auto, eller per langside {\"vest\": \"syd\", \"ost\": \"syd\", \"*\": regel}"},"from_walls":{"type":"boolean"},"name":{"type":"string"},"framing":{"type":"object","description":"takets egne sperrer (vinner over prosjektets): {rafter_b, rafter_h, rafter_cc, ridge_b, ridge_h} i meter, eller {\"rafter\": \"48x198\", \"cc\": 600}"},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"stairs":{"type":"array","items":{"type":"object","required":["start","direction"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"start":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"direction":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"z0":{"type":"number"},"z1":{"type":"number"},"settings":{"type":"object","description":"type rett|L|U, width, risers, railing … (bim.stairs.DEFAULT_STAIR)"},"shape":{"type":"object","description":"«Trapp i form»: {boundary [[x,y]…], start (kantindeks/punkt), direction, locks {riser_count, flight_tread_counts, winder_count}, profile (SlimBim-id), settings}; vinner over start/direction/settings"},"name":{"type":"string"},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"columns":{"type":"array","items":{"type":"object","required":["origin"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"origin":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"size_m":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"height_m":{"type":"number"},"z0":{"type":"number"},"shape":{"enum":["rect","round"]},"materials":{"type":"object","additionalProperties":{"type":["string","array"]},"description":"Delflate → fargenavn (bim.materials.PALETTE)."},"name":{"type":"string"},"bearing":{"enum":["bearing","non_bearing","unknown"],"description":"Bærende: bearing | non_bearing | unknown (utelatt = ukjent)."},"fire_class":{"enum":["none","EI30","EI60","EI90"],"description":"Brannklasse."},"fire_wall":{"type":"boolean","description":"Brannvegg (bare vegg)."},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"beams":{"type":"array","items":{"type":"object","required":["a","b"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"a":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"b":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"width_m":{"type":"number"},"depth_m":{"type":"number"},"z0":{"type":"number","description":"underside"},"materials":{"type":"object","additionalProperties":{"type":["string","array"]},"description":"Delflate → fargenavn (bim.materials.PALETTE)."},"name":{"type":"string"},"to_roof":{"type":"boolean","description":"bærer taket: toppen på takundersiden (sperrene), følger taket; utelatt = automatisk når toppen er under et tak"},"bearing":{"enum":["bearing","non_bearing","unknown"],"description":"Bærende: bearing | non_bearing | unknown (utelatt = ukjent)."},"fire_class":{"enum":["none","EI30","EI60","EI90"],"description":"Brannklasse."},"fire_wall":{"type":"boolean","description":"Brannvegg (bare vegg)."},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"t_roofs":{"type":"array","description":"T-tak: to tak i ``roofs`` (hovedtak + tverrfløy) klippet mot hverandre langs kehlen og erstattet av ETT takelement.","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"main":{"type":"string","description":"tak-id (hovedtak)"},"wing":{"type":"string","description":"tak-id (tverrfløy)"}},"required":["main","wing"]}},"railings":{"type":"array","items":{"type":"object","required":["path"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"path":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"minItems":2},"closed":{"type":"boolean"},"z0":{"type":"number"},"settings":{"type":"object","description":"style liggende|spiler|glass|massiv, height …"},"clip_roofs":{"type":["array","null"],"description":"tak-id-er som klipper bordene; [] = alle tak; utelatt = ingen"},"name":{"type":"string"},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"chimneys":{"type":"array","items":{"type":"object","required":["origin"],"properties":{"id":{"type":"string","description":"Spec-lokal id; andre elementer refererer til den."},"origin":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"settings":{"type":"object","description":"shape rect|round, size, z0, z1, sections, cap …"},"above_ridge_m":{"type":"number","description":"topp = høyeste møne + dette"},"name":{"type":"string"},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"terrain":{"type":"object","description":"Tomteterreng (bim.terrain): origin, size_m, z, slope_x_pct, slope_y_pct, points [[x,y,z]] (merk en nedkjøring med [x,y,z,\"rampe\"]), holes, ramps (plan-ringer for nedkjøring/kjellernedgang, regnes ikke med i gj.sn. terreng), thickness_m."},"rooms":{"type":"array","description":"Navngitte rom (IfcSpace) utledet av veggene rundt et punkt: {name, at [x, y], level (etasjenavn) | z}. Bygges til slutt, etter at veggene står; et punkt som ikke ligger i et lukket rom gir en advarsel, ikke feil.","items":{"type":"object","required":["name","at"],"properties":{"name":{"type":"string"},"at":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"level":{"type":"string"},"z":{"type":"number"},"number":{"type":"string"},"building":{"type":"string","description":"id i buildings (utelatt = hovedhuset)"}}}},"buildings":{"type":"array","description":"Flere bygg på tomta (valgfri): [{id, name, kind hus|garasje|annet bygg}]. Elementer med «building»: id hører til det bygget (IfcBuilding under tomta, Entity Info viser det); uten «building» hører de til hovedhuset. Alle bygg står i SAMME koordinatsystem (situasjonsplanen gir plasseringen); etasje settes fortsatt av høyden.","items":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"enum":["hus","garasje","annet bygg"]}}}},"furniture":{"type":"array","description":"Parametriske møbler, kjøkken, hvitevarer og sanitær fra biblioteket (T46): ref = katalog-id (dibrix-furn-seng, -sofa, -spisebord, -kjokken-underskap, -kjoleskap, -badekar, -toalett …; finn dem med GET /library?q=…, eller bar typenøkkel som 'seng'), at = [x, y, z] (midten av bunnen på gulvet, m; front mot -y, rygg/vegg mot +y før rot_deg), rot_deg om Z, params = typens mål og valg {width_m, depth_m, height_m, sink, drawers, …} (innenfor typens område), scale (jevn, 1 = målene). Bygges som instanser av en DELT prototype. matrix (16 tall, kolonnevis) står bare for tippede/speilede forekomster og overstyrer at/rot_deg/scale. En id fra det gamle mesh-biblioteket gir en advarsel: byttes mot en parametrisk type når den åpenbart passer, ellers hoppes den over.","items":{"type":"object","required":["ref"],"properties":{"ref":{"type":"string"},"at":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":3},"rot_deg":{"type":"number"},"scale":{"type":"number"},"params":{"type":"object","additionalProperties":{"type":"number"}},"matrix":{"type":"array","items":{"type":"number"},"minItems":16,"maxItems":16}}}}}},"example":{"spec":"hus-spec","version":1,"units":"m","opening_std":2,"name":"Eksempel anneks 6 x 4","cladding":{"on":true,"type":"stående","material":"White"},"corner_boards":{"on":true},"slabs":[{"id":"s1","boundary":[[0,0],[6,0],[6,4],[0,4]],"z_top":0.0,"thickness_m":0.2}],"walls":[{"id":"w1","a":[0,0],"b":[6,0],"height_m":2.5,"wall_type":"ytter_250","alignment":"left","to_roof":true,"cladding":true},{"id":"w2","a":[6,0],"b":[6,4],"height_m":2.5,"wall_type":"ytter_250","alignment":"left","to_roof":true,"cladding":true},{"id":"w3","a":[6,4],"b":[0,4],"height_m":2.5,"wall_type":"ytter_250","alignment":"left","to_roof":true,"cladding":true},{"id":"w4","a":[0,4],"b":[0,0],"height_m":2.5,"wall_type":"ytter_250","alignment":"left","to_roof":true,"cladding":true}],"openings":[{"host":"w1","kind":"door","offset_m":0.6,"width_m":0.9,"height_m":2.1,"hinge":"left","style":{"type":"glass"}},{"host":"w1","kind":"window","offset_m":2.4,"width_m":1.2,"height_m":1.2,"sill_m":0.9,"style":{"type":"1-floy"}},{"host":"w3","kind":"window","offset_m":2.4,"width_m":1.2,"height_m":1.2,"sill_m":0.9,"style":{"type":"fast"}}],"roofs":[{"id":"r1","boundary":[[0,0],[6,0],[6,4],[0,4]],"form":"gable","slope_pct":40,"overhang_m":0.4,"z_eave":2.5,"edge_roles":["slope","gable","slope","gable"],"covering":{"type":"falset_stal","color":"Sort"}}]},"usage":["POST /sessions/{sid}/spec {spec, replace?} bygger spec i økta (ett angresteg); GET /sessions/{sid}/spec leser ut.","Rekkefølge i byggingen: etasjer, hjørnekasser, terreng, dekker, vegger (+åpninger), tak, søyler, bjelker, trapper, rekkverk, skorsteiner; kledning, hjørnekasser og rom bygges én gang på slutten.","Navn = bim.agent_ops/nyttelast (height_m, thickness_m, offset_m, slope_pct …); utelatte felt får standardverdier.","Vegger i en lukket ring: alignment='left' når ringen går mot klokka (CCW), 'right' med klokka, så ligger veggkroppen innover og ringen er ytterflaten; join_mode 'miter' er standard. Med wall_std 2 er ringen utsiden av kledningen (utvendig mål på tegningen) og thickness_m hele veggen inkl. kledning.","tak.boundary er ytre veggflate-ringen; tak.edge_roles per kant ('slope' raft / 'gable' gavl).","Svaret har timing {valider_s, bygge_s, totalt_s} og counts per element; warnings forteller hva som ble hoppet over."],"units":"m"}