Walls reach up to a roof, as Revit's walls attached at the top: gable walls fill the gable's triangle, walls under a slope end at its underside, wherever that is above or below their own height. Give the walls and the roof, or select both. When the roof changes its measures, its walls follow; "detach" gives them back their own height. roof "on" a wall attaches that wall at once.
JSON form: attachwalls {"ids": [walls], "roof": id} (their tops follow the roof's underside) | {"ids": [walls and one roof]} | {"ids": [walls], "detach": true}
A beam, as Revit's structural framing and Archicad's beam tool: a section hanging below the line from start to end (its top's middle on it, as a beam under a floor is placed), level or sloping, of a "material", named after its section (24/40, or "name" such as IPE 300: width 0.15, depth 0.3, web 0.0071, flange 0.0107). Schedules list beams with their lengths, IFC files carry them as IfcBeam. First 24/40 cm.
JSON form: beam {"start": [x, y, z], "end": [x, y, z] (its top's middle at both ends), "size": [0.24, 0.4] | "diameter": d | "profile": {"shape": "rectangle"|"round"|"I", "width", "depth", "diameter", "web", "flange"}, "name": "IPE 300", "material": "Stahl S235"}
Columns, as Revit's structural columns and Archicad's column tool: a section (a rectangle, round, or an I section given by its measures: a steel HEB 200 is width 0.2, depth 0.2, web 0.009, flange 0.015) standing on its foot up to the next storey's floor (or "height"), turned by "rotation", of a "material", named after its section (30/30, Ø30, or "name"). Floor plans cut them filled, schedules list them, IFC files carry them as IfcColumn. First 30/30 cm, then the last size used.
JSON form: column {"at": [x, y, z] or "points": [[x, y, z], ...] (each foot's middle), "size": [0.3, 0.3] | "diameter": 0.3 | "profile": {"shape": "rectangle"|"round"|"I", "width", "depth", "diameter", "web", "flange"}, "name": "HEB 200", "height": h (default up to the next storey), "base": z, "rotation": degrees, "material": "Stahlbeton C25/30"}
Quantities by DIN 276 cost group, as a cost estimate (Kostenschätzung) and the tender after it start: outside walls (331 load-bearing, 335 and 336 their claddings outside and inside, 334 their windows and doors, 337 curtain walls), inner walls (341 load-bearing - masonry or concrete 17.5 cm and more -, 342 the others, 345 their claddings, 344 their doors), floors (351 the structure and stairs and beams, 353 finishes above, 354 claddings below; the lowest is the ground slab: 322, 324, 325), roofs (361, 363 coverings above the rafters, 364 claddings below, 362 roof windows), columns (333 outside, 343 inside). Layers of types count by their material, in m² of the part's face; walls are outside walls where a side of them lies beyond their storey's floor slabs. With "rates" (the office's own prices per unit, by group or by group and part) each row is priced and the groups and the building totalled. "place" draws the estimate as a table, "path" writes it as a spreadsheet. The IFC export carries the same groups as a DIN 276 classification of each part.
JSON form: costs {"rates": {"331": 180, "335 Kalkzementputz": 28} (per unit, by group or group and part), "ids": [...] (default all), "place": [x, y, z] (draw the table there), "path": "costs.csv", "separator": ";"|","|"\t", "language": "en"|"de"}
Aliases: rastergrid
Curtain grid
AI toolInteractive
Gives walls a curtain wall's grid (Pfosten-Riegel-Fassade), or changes it: mullions at most "spacing" apart, evenly on each straight piece, transoms at the "transoms" heights above the foot, "mullion" wide, glass "glass" thick in the middle, rows listed in "panels" (1 the lowest) closed by opaque panels "panel" thick (spandrels, Brüstungsfelder); what isn't given stays (or is the last grid used). The wall keeps its path, height and joins; its type and layers go, it has no windows. "remove": true makes them plain walls again.
JSON form: curtain {"ids": [walls] (default: the selection), "spacing": 1.5, "transoms": [0.9, 2.1], "mullion": 0.06, "glass": 0.03, "panels": [1] (rows closed by panels, 1 the lowest), "panel": 0.06, "thickness": 0.15 (the mullions' depth) | "remove": true}
A curtain wall (Pfosten-Riegel-Fassade), as Revit's: a wall along clicked corners whose frame is mullions standing evenly at most "spacing" apart on each straight piece (a post at each corner, as wide as the mitre), transoms across at the "transoms" heights and along its foot and top, and a pane of glass in each field. It is a wall: it joins, is dimensioned and stands on its level like one; floor plans cut its mullions and draw its glass, elevations show the grid, IFC carries it as IfcCurtainWall. curtain changes the grid or turns walls into curtain walls.
JSON form: curtainwall as wall, with "curtain": {"spacing": 1.5, "transoms": [h, ...], "mullion": 0.06, "glass": 0.03} (default the last grid used); "thickness" is the mullions' depth (15 cm first)
What a demolition takes away (Abbruchmassen), for the offer and the containers: by material, the walls, floors, roofs and stairs of a type layer by layer (cut by their windows), other solids by their material or else their layer's name, in m³ as they stand and in tonnes where the material has a density (material {"density"}: the tip charges by weight). "swell" is the factor rubble grows by broken (Auflockerungsfaktor, about 1.5 for masonry and concrete), "load" what a container or truck takes, giving the loads. By default everything marked to demolish (renovation {"status": "demolish"}) and what new windows and doors take out of walls that stay (Durchbrüche: their face times the wall, layer by layer) and new openings out of floors that stay (a stair hole: its area times the floor, layer by layer; "breaches": false leaves them out); "place" draws the list as a table, "path" writes it as a spreadsheet.
JSON form: demolition {"ids": [...] (default: everything marked demolish), "swell": 1.5 (rubble's loosening), "load": 10 (m³ a container takes), "breaches": true (new openings in walls and floors that stay), "place": [x, y, z] (as a table there), "path": "abbruch.csv", "separator": ";"|","|"\t", "language": "en"|"de"}
A dimension chain through the rooms along a line, as plans for building have them and Archicad's interior dimensioning makes them: a stop at every wall face the line crosses, so the chain gives the rooms' clear widths and the walls' thicknesses in turn. Only the walls standing at the line's height count (one storey). A chain level or upright in plan holds on to the walls' own corners and jambs, so it follows when the walls move; the dimension line runs through the walls, without extension lines. The values are 2.5 mm high on every sheet, each at its own scale (paperHeight; a textHeight fixes them in the model instead).
JSON form: dimthrough {"from": [x, y, z], "to": [x, y, z] (the line the chain lies on, at the storey's height), "ids": [walls] (default all walls shown standing at that height), paperHeight (default 2.5) or textHeight, decimals, separator, dimstyle as for dimlinear}
Dimension chains round the outside of the walls, as plans for building have them and Archicad's automatic exterior dimensioning makes them: on each side, nearest the walls the openings (piers and shell openings of the windows and doors), then the walls (corners, recesses and projections), outermost the whole length; a chain that would tell no more than the next is left out; what lies behind a part further out (the inside of a U) isn't on that side's chains. Each storey and each building of it gets its own chains, at its walls' foot. Each chain is a row of linear dimensions holding on to the walls' corners, so they follow when the walls move. The building's own directions count: one turned on the site gets its chains along its sides. Distances follow the drawing's scale (10 and 7 mm on paper); the values are 2.5 mm high on every sheet, each at its own scale (paperHeight; a textHeight fixes them in the model instead). "to": "core" measures the walls' structure instead of their finished faces (Rohbaumaße, as working drawings give them; Revit's dimensions to the core): the masonry, concrete, timber or steel layers of each wall's type, plaster and insulation left out, the openings' shell sizes as they are.
JSON form: dimwalls {"ids": [walls] (default: the selection, else all walls shown; each storey on its own), "chains": ["openings", "walls", "overall"], "sides": ["south", "east", "north", "west"], "distance": 1.0 (first chain from the outside; default 10 mm on paper), "spacing": 0.7 (between chains; default 7 mm on paper), "to": "finish"|"core" (the walls' faces, or their structure: Rohbaumaße), paperHeight (default 2.5) or textHeight, decimals, separator, dimstyle as for dimlinear}
Aliases: türtuerdooradd
Door
AI toolInteractive
Puts a door opening into a wall, like window but standing on the wall's foot: first 0.885 by 2.01 m (German shell size), then the last measures used. Floor plans cut through it draw the leaf standing open and its swing: "hinge" says at which end of the opening it hangs, "swing" to which side of the wall's path it opens (by default the side of the point given). A door "type" (openingtype) gives its size, its leaves (one or two) and how open views show it.
JSON form: door {"wall": id, "at": [x, y, z] (at the wall: its middle) or "distance": d (along the path), "width": 0.885, "height": 2.01, "sill": 0, "hinge": "start"|"end", "swing": "left"|"right", "type": "Tür 2-flg" | "component": "...", "componentType": "...", "values": {...}}
Aliases: gaubedachgaube
Dormer
AI toolInteractive
Builds a dormer on a roof's face: a front wall standing on the roof "height" high up to its own roof, cheeks at its sides down to the roof, and its roof sloping at "slope" up from its front until it meets the roof ("shed", a Schleppgaube) or from both sides to a ridge ("gable", a Satteldachgaube), "wall" thick; the roof is opened under it, the window in its front is "window" [width, height] (else four fifths of the front). "at" a point on the roof puts its front's middle there; or "side", "along" and "up" (its front in from the eave line, in plan). It stays on its face, apart from other dormers and windows; its roof must be flatter than the roof's. Framing trims the rafters round its opening; the dormer's own timbers aren't framed.
JSON form: dormer {"roof": id, "at": [x, y, z] (on the roof: its front's middle) or "side": n, "along": a, "up": d (its front in from the eave line, in plan), "width": 2.0, "height": 1.2 (its front, above the roof), "shape": "shed"|"gable", "slope": 15, "wall": 0.15, "window": [w, h]} | {"roof": id} (lists) | {"roof": id, "remove": n}
Checks the outer components a conversion renews against the highest U-values the GModG (formerly the GEG) allows when an existing building is changed (§ 36, Anlage 7): outer walls 0.24, windows 1.3, roof windows 1.4, outer doors 1.8, roofs and ceilings under an unheated attic 0.24, walls and floors to the ground or an unheated room 0.30, floors over the outside air 0.24 W/(m²K) ("zone": "cool" for zones of 12 to 19 °C). Where each lies comes from the model as the heat load sees it: the walls along each heated room's outline and what lies behind them, their windows and doors, the floor and what is below, the ceiling or roof over it. Renewed is what is marked new (renovation; "all" checks every outer component). Changes to no more than 10 % of a component group's area (Anlage 7's four: outer walls; windows, roof windows and outer doors; roofs and what borders an attic; to the ground, unheated rooms and below) are exempt. U-values from the types' layers (EN ISO 6946) or as given. Selects what exceeds or has no U-value; a table with "place". A first check for the energy consultant: measures that renew only a layer (rendering, floor build-up, waterproofing) and special glazing are not told apart; French doors count as windows when drawn as windows, as doors (1.8) when drawn as doors; roof windows follow their roof's stage, a dormer's window with the windows (2a) and its front, cheeks and roof with the roof (5a; "u": {"dormer": U}, else the roof's); walls of heated basements count as outer walls; a roof's and a floor's area is the room's below it.
JSON form: envelopecheck {"unheated": ["0.01", "Keller"] (rooms by number or name), "u": {"AW neu": 0.22, "window": 0.95, "door": 1.3, "roofwindow": 1.1, "dormer": 0.2, "floor": 0.28} (W/(m²K) by type name or kind), "overOutside": ["slab type"] (floors over the outside air), "zone": "warm"|"cool", "all": false, "select": true, "place": [x, y, z], "language": "en"|"de"}
Writes the drawing's wall, floor and roof types as a table of build-ups for Excel, a layer a row: component (Wand, Decke, Dach), type, layer and thickness in the drawing's unit. importtypes reads such a table back, also one an office keeps itself.
JSON form: exporttypes {"file": "Aufbauten.csv", "separator": ";" | "," | "\t" (default: as Excel in the language of the interface)}
The timber members of a roof, wall or floor of a type as solids of their own: a roof's rafters up each sloping face from its eave, cut at the ridge, with hip and valley rafters, and if asked collar ties between opposite rafters ("collar": the height of their tops above the eaves), a ridge purlin and middle purlins ("purlins": heights of their flat tops) under them, the rafters notched on them (Kerve, "notch" deep square to the rafter, at most a quarter of its depth); a wall's studs along its path (at its ends and corners, two beside each window and door, either side of where another wall butts against it) between a bottom and a top plate, nailed or with "tenons" (Zapfen) in mortises, which follow its foot and top (under a roof too) and run as sill and header round its windows; a floor's joists across its shorter span (or "direction") with rim joists at their ends, trimmers beside each opening and headers at its ends. They stand in the type's layer of timber ("layer" names another; a type without timber is refused), as deep as it, "width" wide (default 8 cm rafters, 6 cm studs, 10 cm joists) and at most "spacing" apart (80 cm rafters, else 62.5 cm), evenly; grouped, in the component's layer and color. The layer stays (rafters and insulation); IFC files take them as IfcMember and IfcBeam. Each member knows its section, length and "material" (schedule of timber lists them). The component keeps these settings: changed (moved, stretched, a window added, its type changed), it is framed again in the same step, and erased, its members go too. Framing it again replaces its members and changes only the settings given; "remove": true takes them away.
JSON form: framing {"id": roof or wall of a type, "layer": "Sparren und Dämmung" (the type's layer they stand in; default: its timber one), "width": 0.08, "spacing": 0.8 (center to center, at most), "plates": true (walls: bottom and top plates, sills and headers), "doubled": true (walls: two studs beside each window and door), "tenons": false (walls: studs tenoned into the plates), "rim": true (floors: rim joists), "collar": 2.2 (roofs: collar ties, their tops so high above the eaves), "collarSize": [0.06, 0.16], "ridgePurlin": true, "purlins": [1.4] (roofs: middle purlins, their tops so high above the eaves), "purlinSize": [0.12, 0.2], "notch": 0.03 (roofs: rafters notched so deep on the purlins), "direction": [x, y] (floors: the way the joists run; default across the shorter span), "material": "KVH C24" (what the members are made of; default the layer's material if it is timber), "remove": true (takes the members away)}
Takes wall, floor, roof and stair types from a file into the drawing, as Revit's Transfer Project Standards: from an IFC file (IFC2X3, IFC4) the material layer sets of walls, slabs and roofs (or their IFC types) become types with their layers, named after the IFC type or the layer set, and stairs bring their material; from another drawing (.frame, an office's standard build-ups) its types; from a table of build-ups (CSV from Excel, a layer a row: Bauteil (wall, slab or roof; with one of kinds it may be left out), Typ, Schicht, Dicke with its unit in the header, as exporttypes writes it). All in the drawing's units. A type the drawing has under that name stays its own unless "replace" is true; then its walls, floors, roofs or stairs follow. One step to undo.
JSON form: importtypes {"file": "Hersteller.ifc", "Bauweisen.frame" or "Aufbauten.csv", "kinds": ["wall", "slab", "roof", "stair", "opening"] (default all; window and door types from drawings), "replace": false (default: the drawing's own types of a name stay)}
The storeys' levels, as Revit's: a name and the height of the floor. What stands on a level belongs to it up to the next one (a wall by its foot, a slab by its top, other objects by their bottom), so moving a level up or down takes its walls, slabs, stairs and furniture along; "above": true moves the levels above with it, as when a storey gets higher. "current" puts the work plane on the level's floor, so clicks land there. "alone" shows only what stands on the level, in 3D and in plan, until {"alone": false}: a way of looking, as isolateobjects, that leaves the layers alone and follows what is drawn or moved meanwhile. "storeys" makes several at once (EG, 1. OG, 2. OG, ... unless named). levelplans makes a floor plan sheet for each.
JSON form: level {} (lists them) | {"name": "OG", "elevation": 2.95} (makes one, or moves it with what stands on it; "above": true moves the levels above too) | {"name": "OG", "rename": "1. OG"} | {"name": "OG", "current": true} (draw on it) | {"name": "OG", "alone": true} (only this storey shown; {"alone": false} all) | {"name": "OG", "delete": true} | {"storeys": 3, "height": 2.95, "from": 0, "names": ["EG", "OG", "DG"]}
A floor plan sheet for each level, named after it: the plan cuts "cut" above the level's floor (1 m unless given) and shows down to the floor. Sheets made before are kept and only follow the levels' heights, so run it again after moving a level.
JSON form: levelplans {"cut": 1.0 (above each floor), "scale": 100, "paper": "A3", "levels": ["EG", "OG"] (default: all), "labels": true (windows and doors with their sizes)}
A building of an early design as one block (a mass, Baukörper): its outline standing so many storeys of a height (the lowest ones perhaps higher: "heights"), drawn with its storeys' floors round it. A roof on top ("roof": gable, hip or shed, "slope" in degrees, "gables" the sides standing upright, "kneeWall" how high its eaves stand above the top storey) holds an attic. "on" stands a mass on another's top, its outline "inset" from all or each side (a storey set back, Staffelgeschoss). massing works out the key figures a zoning plan asks for from the masses (GRZ, GFZ with the full storeys, BMZ, gross floor area and volume). Try variants by moving, copying and changing masses; with "id" its storeys, heights or roof change.
JSON form: mass {"points": [[x, y, z], ...] (its outline, at its foot) | "ids": [closed polylines or circles] | "on": mass (on its top, its outline), "inset": 1.5 or [per side] (set back), "bulges": [...], "storeys": 4, "height": 3.0 (a storey's), "heights": [4.5] (the lowest storeys' own), "roof": "flat"|"gable"|"hip"|"shed", "slope": 35, "gables": [sides], "kneeWall": 1.0} | {"id": mass, ...} (changes one)
Turns masses into a building to go on with, as early design ends: a level at each storey's floor (KG, EG, 1. OG …, DG, or those there are at that height), a floor slab on each and one on top, outside walls round the outline inside it, from each floor to the next one's underside. Under a mass's roof the attic's walls reach up to the roof (the gables into the gable), and the roof rests on them where the mass's was, reaching "overhang" beyond. Then levelplans makes the plans, and walls, openings and rooms are drawn in as usual. One step; the mass goes unless "keep".
JSON form: massbuild {"ids": [masses] (default: the selection), "thickness": 0.3 or "wallType": "AW 36,5", "slab": 0.2 or "slabType": "Geschossdecke", "roofThickness": 0.3 or "roofType": "Sparrendach", "overhang": 0.5, "keep": false (the mass stays)
The key figures of the masses (mass) against the plot, as a zoning plan (Bebauungsplan, BauNVO) asks for them: the area built over (the masses' outlines together) and GRZ, the floor area of all storeys (BGF) and of the full ones (GF) and GFZ, the gross volume (BRI) and BMZ, the storeys and the tallest building's height, each storey with its area and whether it is a full storey; an estimate of the living area (a share of the floor area) and of the costs (per m² of floor area, from a rate the user gives, as from BKI's figures). The plot, the plan's limits and the assumptions are kept in the drawing, so the app shows the figures as the masses change; figures above a limit are named. GFZ counts the full storeys (Vollgeschosse, BauNVO §20) as most Länder define them: more than 1,40 m out of the ground, 2,30 m high over two thirds of the floor; an attic under a roof or a storey set back over two thirds of the storey below. BMZ counts the full storeys' volume (Baumasse, BauNVO §21). Attics count where one can stand in them, their living area by WoFlV. Areas in m², whatever the drawing's unit.
JSON form: massing {} (the figures) | {"plot": id (a closed polyline round the plot), "grz": 0.4, "gfz": 1.2, "bmz": 0 (the zoning plan's limits; 0: none), "rate": 2900 (cost per m² gross floor area), "livingShare": 0.75} (kept in the drawing)
What layers of wall, floor and roof types and stairs are made of, as Revit's materials. A layer is of the material of its name, a stair type of its "material". "kind" (guessed from the name when not given) says how sections hatch it: concrete crossed, masonry diagonal, timber along the layer, insulation zigzag, plaster and screed dotted, steel solid; "hatch" sets another pattern. The values are what engineers work with: "density" kg/m³, thermal "conductivity" λ W/(m·K), "heatCapacity" J/(kg·K), modulus of "elasticity" and characteristic "strength" N/mm². With densities and λ for all its layers a type tells what a square meter weighs and its U-value (walltype, slabtype, rooftype, get_drawing). "description" says how it looks ("Kalkzementputz, weiß", "Tondachziegel, rotbraun"), as Revit's material description: elevations name the materials of the faces they show with it, as building applications ask. Materials go into IFC files with their values.
JSON form: material {} (lists them) | {"name": "Kalksandstein", "kind": "masonry", "density": 1800, "conductivity": 0.99, "heatCapacity": 1000, "elasticity": 5000, "strength": 12, "description": "Kalksandstein, weiß geschlämmt"} (makes or changes one; values in SI units, 0 for not known) | {"name": "..."} (shows it) | {"name": "...", "delete": true}
Aliases: öffnungoeffnung
Openings in a wall
AI toolInteractive
Lists the windows and doors of a wall with their numbers, changes one (measures or place along the wall), or closes it up again. Grips drag them along the wall too. In a conversion (see renovation) an opening may be at another stage than its wall: "renovation": "new" is a door broken through a wall that stays (yellow where the wall comes out, the door red), "demolish" a window bricked up (red infill, the old window yellow); deleting it would forget it was ever there.
JSON form: opening {"wall": id} (lists its windows and doors) | {"wall": id, "index": n, "width": w, "height": h, "sill": s, "distance": d or "at": [x, y, z], "hinge": "start"|"end", "swing": "left"|"right", "type": "..." or "", "component": "..." or "", "componentType": "...", "values": {...}, "inside": "left"|"right", "renovation": "new"|"demolish"|"existing"|"", "mark": "F 0.01"} (changes one) | {"wall": id, "index": n, "delete": true} (closes it up)
Kinds of window and door under a name, as Revit's window and door types. A type gives new windows and doors their size (window and door with "type"); its frame is "frame" wide in view and "depth" deep through the wall; "sashes" side by side (a door's leaves: 1 or 2) with mullions between them, each opening as "opening" says (fixed, turn, tilt or tiltturn; one for all or one each; a sash that opens has a frame of its own); "bars" [across, up] glazing bars in each pane; "transom": a top light that high above a transom bar; "sillInside" and "sillOutside": sills reaching so far beyond the wall's faces (which side is inside: opening with "inside"); a door's "swing" shows its leaves open by that many degrees in views (plans draw them open as always). Views and plans draw them as the type says, schedules count them by type. Changing a type's width or height changes its windows and doors (their sills stay); deleting it leaves them with a plain frame.
JSON form: openingtype {} (lists them) | {"name": "Fenster 2-flg", "kind": "window", "width": 1.51, "height": 1.385, "sill": 0.9, "frame": 0.07, "depth": 0.08, "sashes": 2, "opening": ["turn", "tiltturn"], "bars": [0, 1], "transom": 0.3, "sillInside": 0.03, "sillOutside": 0.04} | {"name": "Tür 2-flg", "kind": "door", "width": 1.51, "height": 2.135, "sashes": 2, "swing": 90} (makes or changes one) | {"name": "..."} (shows it) | {"name": "...", "delete": true}
Marks where a photo was taken and which way it looks, as surveys of an existing building and damage reports do: a circle with the photo's number and a cone toward what it shows. The mark is a block whose fields carry the photo's file, a note ("crack over the window") and the date; numbers count on (F1, F2 ...) unless given. "list": true lists the photo points of the plan with their view (N, NE ...), file, note and date; with "place" it draws them as a table, the photo log. 2.5 mm letters on paper: in the model at the drawing's scale (annoscale).
JSON form: photopoint {"at": [x, y, z], "toward": [x, y, z] | "direction": degrees (0 along +x, counter-clockwise), "number": text (default the next free, F1, F2 ...), "file": the photo's path, "note": what it shows, "date": text} | {"list": true, "place": [x, y, z] (draws the table; without it only lists)}
Puts the doors and windows a drawn floor plan shows into the walls standing on it (made with planwalls or by hand): each gap in a wall's lines with a door's swing or symbol, or a label as high as a door, is a door, hinged and opening as its swing shows; one with lines in it (frame and glass) or a window symbol is a window. As wide as the gap; as high as its label says ("0.90/2.10", or the height written under the width), else the last ones used (first 2.01 m for doors, 1.26 m on a 0.9 m sill for windows). Openings already there stay. "missed" lists those that found no wall.
JSON form: planopenings {"ids" | "within" | "layers" | "gapsAsDoors" (the plan, as for planwalls), "level": "OG" | "base": z (its storey, as for planwalls), "walls": [ids] (default all), "preview": true}
Aliases: roomsfromplan
Rooms from plan
AI toolInteractive
Makes the rooms a drawn floor plan's stamps name, between the walls standing on it (made with planwalls): each name inside walls becomes a room of that name, with the number written beside it (else the next one) and checked against the area the stamp states ("12,34 m²"): rooms whose area differs are counted, each with its "difference" in the list. Several names in one room: the biggest is its name; a stamp with only an area makes a room named Raum; heights and window ratios ("R.A. 1/8") are no names. Rooms there already keep theirs.
JSON form: planrooms {"ids" | "within" (the plan, as for planwalls), "level": "EG" | "base": z, "fill": false, "preview": true}
Aliases: stackplan
Stack plan
AI toolInteractive
Puts one storey's plan onto the others: moved (and with two points turned) so that its points "from" (a corner of the stair, an axis crossing, an outer corner) lie on "to", the same points in the plan it goes over, and lifted to its level's height (made at "elevation" when new). Plans of several storeys drawn side by side on one sheet become a stack, ready for planwalls on each level.
JSON form: planstack {"ids" | "within" (the storey's plan; default the selection), "from": [x, y] or [[x, y], [x, y]] (points of it), "to": the same (where they go: the same points in the plan below), "level": "OG", "elevation": z (makes the level if new)}
Builds the walls a drawn floor plan shows (lines from a DWG, a DXF or a PDF), as someone tracing it would: two or more parallel lines a wall's thickness apart are a wall, its axis in their middle, as thick as they are apart (lines between them, insulation or plaster, belong to it); evenly spaced lines (stair treads, patterns) are none. Pieces of one wall in line are one wall across a wall running into the gap, a door (its swing, a door symbol, a label as high as a door) or a window (lines in the gap, a window symbol, a label); corners meet and T's butt. Walls of a wall type's thickness become that type. Gaps nothing explains are listed in "unclear": ask about them. Gaps the user says are doors: "gapsAsDoors" with their points (or true), then the walls run on through them. "layers" lists the layers the walls were found on: when furniture or railings show as walls, give the layers of the cut walls (doors, windows and labels are still read from all); "lineweights" likewise how heavy their lines were: a PDF's cut walls are told apart by "lineweight". Several plans on one sheet: one at a time with "within", each on its storey's "level". Walls stand on the level (or "base") up to the next level (or "height"). Run it with "preview" first, look at what it found (thicknesses, counts), then without; planopenings then puts the doors and windows in, planrooms makes the rooms.
JSON form: planwalls {"ids": [...] | "within": {"min": [x, y], "max": [x, y]} (the plan; default the selection, else all), "layers": ["Walls"] (the layers its walls' lines are on; default all), "thickness": [min, max] (drawing units; default 5 to 80 cm), "lineweight": 0.35 (mm, walls' lines at least), "gapsAsDoors": [[x, y], ...] or true (unclear gaps that are doors), "maxOpening": w, "level": "EG" | "base": z, "height": h, "types": true (wall types of the same thickness), "renovation": "existing" (a plan of what stands, for a conversion), "preview": true}
Numbers the windows and doors as working drawings and their schedules call them (Revit's Mark): storey by storey, round the storey's middle clockwise from the north-west (the north side from west to east first; the drawing's true north where it lies on the earth), windows and doors each on their own: "F 0.01" the first window of the ground floor, "T 1.03" the third door of the floor above, "F -1.02" in the basement (storeys as room numbers count them; without levels "F 01"). Those with a position keep it and new ones go on from the highest, unless "renumber": true. Floor plans with labels show them over the shell sizes; schedule {"of": "openings", "per": "piece"} lists them one by one. opening sets one by hand ("mark").
JSON form: positions {"ids": [walls] (default all shown), "renumber": false (true numbers all anew), "windows": "F", "doors": "T"}
Aliases: umbauphase
Renovation
AI toolInteractive
Conversions, as Revit's phases and Archicad's renovation status: marks objects as existing, to be demolished or new ("status"; "none": no stage, as notes and dimensions have), and sets what the model shows ("show"): "existing" the building as it stands (new work hidden), "demolition" what comes down in yellow, "changes" what stands as drawn with demolition yellow and new work red (DIN 1356-1, as permits want it; Italy's tavola comparativa), "final" the building when done, "all" everything as drawn. Sheets and viewports show a stage of their own (layout and viewport with "renovation"), so one drawing gives the existing, demolition and new plans. Windows and doors may differ from their wall: a door broken through a wall that stays, a window bricked up (opening with "renovation"). Once a stage is given, new objects are new work ("draw" says otherwise; notes, dimensions, tables and rooms get none). Schedules count each stage apart, IFC files carry it (Pset …Common Status). Without parameters: how many objects are at each stage.
JSON form: renovation {"ids": [id, ...] (default: the selection), "status": "existing"|"demolish"|"new"|"none"} (marks objects) | {"show": "all"|"existing"|"demolition"|"changes"|"final"} | {"draw": "new"|"existing"|"demolish"|"none"} | {"colors": {"demolished": "#F7B500", "new": "#E2001A", "existing": "#808080" or ""}} | {} (counts)
Aliases: dachroofadd
Roof
AI toolInteractive
Builds a roof over an outline: every side slopes up inwards at "slope" degrees from its eave (a hip roof), except the gables, which stand upright ("shape": "gable" makes the two short ends of a four-cornered outline gables, "gables" names edges by number, edge 1 running from the first corner to the second). It is "thickness" thick square to its faces, its underside meeting the outline at the eaves' height (on walls it rests on their outer top edges), reaching "overhang" beyond the outline all round. "on" a closed wall takes its outer face as the outline and its top as the eaves; otherwise the eaves lie at the outline's height or "base". The roof keeps its measures: primitive changes slope, overhang and thickness, grips drag its corners. Over L-, T- and U-shaped houses the wings' roofs meet in valleys and hips; over outlines with corners aslant, and where sides have slopes of their own ("slopes", one per side or by side number), the faces are those of the outline's straight skeleton, as Revit and ArchiCAD build them. Without measures, the last ones used, first 35°, 0.5 m overhang, 0.3 m thick.
JSON form: roof {"points": [[x, y, z], ...] (the eaves' outline) | "ids": [a closed polyline] | "on": wall (a closed wall round a house), "slope": 35 (degrees), "overhang": 0.5, "thickness": 0.3 or "type": "Sparrendach" (a roof type), "shape": "hip"|"gable", "gables": [2, 4] (edge numbers from 1), "slopes": [35, 45, 35, 45] (each side's) or {"2": 45}, "base": z (eave height)}
Kinds of roof under a name, as Revit's roof types: their layers from the outside in (tiles, battens, rafters with insulation, or a concrete slab, lining); a roof of the type (roof with "type", or primitive with "type") is as thick as its layers together, square to its faces. Changing a type changes all its roofs at once, and the walls attached to them follow; IFC exports the layers as materials. Deleting a type leaves its roofs as they are.
JSON form: rooftype {} (lists them) | {"name": "Sparrendach", "layers": [{"name": "Tiles and battens", "thickness": 0.06}, {"name": "Rafters and insulation", "thickness": 0.2}, {"name": "Plasterboard", "thickness": 0.0125}]} (makes or changes one) | {"name": "..."} (shows it) | {"name": "...", "delete": true}
Sets a window into a roof's face, as Velux and Roto windows sit: a hole square to the face, frame and glass in it; "at" a point on the roof puts its middle there, or "side" (the eave it rises from, from 1), "along" that eave from the side's first corner and "up" the face from the eave to its lower edge. It stays on its face (not over a hip, valley, ridge or the eaves) apart from other windows and dormers. Framing trims the rafters round it with headers. Without measures, the last ones used, first 78 by 140 cm.
JSON form: roofwindow {"roof": id, "at": [x, y, z] (on the roof: the window's middle) or "side": n, "along": a, "up": u (its lower edge up the face from the eave), "width": 0.78, "height": 1.4 (up the slope)} | {"roof": id} (lists its windows and dormers) | {"roof": id, "remove": n}
Aliases: raumrooms
Room
AI toolInteractive
Rooms, as Revit's: the floor inside the walls round a point (doors and windows don't break it), named and numbered ("0.01" for the first on the storey at height 0, "1.01" one storey up), its stamp on the plan: number, name and area in m², in the drawing's text style, 2.5 mm high on paper, with the dimension style's decimal separator. Not filled unless "fill" (then in its layer's color). A room found between walls follows them when they move. Its "use" after DIN 277 (NUF 1 living, 2 office, 3 production and kitchens, 4 storing, 5 teaching, 6 care, 7 other: baths, store rooms, garages; TF technical, VF circulation), "outdoor" for a balcony, loggia or terrace, and "share" the share of its floor counted as living area: unless given, as its name tells (Flur VF, Heizung TF, Bad NUF 7, Balkon outdoor with a quarter, Keller and Garage none). schedule {"of": "rooms"} lists them with their living area after the German WoFlV: in full where the room is 2 m high or more, in half from 1 to 2 m (under a sloping roof), not below; a balcony or terrace a quarter (half at most); and the areas of each storey after DIN 277: NUF, TF, VF, NRF, BGF and KGF. Its "finishes" (floor, walls, ceiling, skirting, as written) make the room book: schedule {"of": "finishes"} lists each room's floor, wall and ceiling areas and skirting length, totalled by finish for the tender. In a conversion its "renovation" stage: a new room (the building when done) is found between the walls that stay and the new ones, an existing room (or one going) between the walls that stand now, and each follows those walls; schedule {"of": "rooms", "renovation": "before"|"after"} gives the areas before and after the conversion. {"update": true} fits all rooms to their walls again.
JSON form: room {"inside": [x, y, z] (a point between walls), "name": "Wohnen", "number": "0.01" (default: the next on its storey), "fill": false, "label": [x, y] (where its stamp goes), "use": "NUF 1"|...|"NUF 7"|"TF"|"VF", "outdoor": true, "share": 0.25, "finishes": {"floor": "Parkett Eiche", "walls": "Putz, Anstrich weiß", "ceiling": "Gipskarton", "skirting": "Holz"} | "points": [[x, y, z], ...] (its outline) | {"id": room or "ids": [...], "name", "number", "label", "fill", "use", "outdoor", "share"} (changes them; null: by the name again), "renovation": "existing"|"demolish"|"new" | {"update": true} (all rooms follow their walls)
Aliases: raumbuch
Room book
AI toolInteractive
The room book: each room's floor area, walls (all round up to the slab or roof over it, less its windows and doors), ceiling and skirting (less doors), clear height, and the finishes given by room {"finishes": {"floor", "walls", "ceiling", "skirting"}}, with what each finish comes to for the tender. "deductAbove": 2.5 measures openings up to 2.5 m² over, as VOB's plaster and paint rules do. The same as schedule {"of": "finishes"}.
JSON form: roombook {"ids": [...] (rooms; default all), "deductAbove": 2.5 (windows and doors up to this many m² measured over), "place": [x, y, z] (write tables there), "path": "raumbuch.csv", "separator": ";"|","|"\t", "language": "en"|"de"}
A room from a hand survey (Handaufmaß): its sides measured round it and diagonals between corners (counted from 1), for rooms that are nowhere square. Corner 1 lies at "at", the first side runs along "direction", the room to its left; each further corner where its two measures from known corners meet. It needs at least n − 3 diagonals that split the room into triangles (from one corner to all others will do); further measures check it, and the largest misfit is reported. Draws the outline as a closed polyline: walls follow with wall {"ids": [...]}, the room with room.
JSON form: roomsurvey {"sides": [4.02, 3.51, 4.05, 3.48] (m, round the room from corner 1), "diagonals": [[1, 3, 5.33], [2, 4, 5.30]] (corner, corner, m; at least n − 3 that split it into triangles, more check it), "at": [x, y, z] (corner 1), "direction": 0 (the first side's, degrees)}
Lists building parts, as Revit's schedules: the walls with their length (along the path), height, thickness, face area along the path without their windows and doors, and volume, summed by thickness; the windows and doors by kind and size, counted ("per": "piece" one row each as a working drawing's window and door schedule has them: position, storey, room, the way it faces outside, type, measures); the slabs with area and volume; the roofs with the area of their faces; the stairs with their shape, risers, going and width; the columns and beams by section, material and length, counted; the placements of parametric components by component, type and values, counted; the rooms with their floor and living area (WoFlV); "finishes" (only when asked) the room book: each room's floor, walls (up to the slab or roof over it, less windows and doors, those up to "deductAbove" m² measured over), ceiling and skirting (less doors) with the finishes given by room {"finishes"}, and what each finish comes to for the tender; "materials" (only when asked) a material takeoff: the volume of each material in the walls, floors, roofs and stairs of a type, layer by layer, and its weight where the material has a density; "timber" a timber list of the framing members (rafters, studs, plates) alike in section and length, counted; "connections" the joints where framing members meet (rafters on purlins, studs on plates, collar ties on rafters, jack rafters on hips, joists on rims and headers), counted, each with what usually joins it (an anchor, nails, a bolt, a joist hanger; a tenon where the studs are tenoned): a list to order by and to hand the structural engineer, not a design. Walls and slabs in blocks count at the size the block places them. "place" writes the lists as tables into the drawing (totals by thickness, openings by size), "path" a spreadsheet with one row per wall or per window and door (German Excel takes ';' and decimal commas, the default when the interface is German).
JSON form: schedule {"of": "walls"|"openings"|"slabs"|"roofs"|"stairs"|"rooms"|"finishes"|"columns"|"beams"|"components"|"materials"|"timber"|"connections"|"all" (default all; finishes, materials, timber and connections only when asked), "per": "size"|"piece" (windows and doors counted by size, or one row each by position), "deductAbove": 2.5 (room book: windows and doors up to this many m² measured over), "ids": [...] (default: everything in the model, also when the tables go on a sheet), "renovation": "existing"|"demolish"|"new" (one stage of a conversion; for rooms also "before"|"after"), "place": [x, y, z] (write tables there), "path": "walls.csv" (write a spreadsheet of one list, "of" not all), "separator": ";"|","|"\t", "language": "en"|"de"}
Draws the setback areas (Abstandsflächen) before the outside walls of the building as it will be (what a conversion demolishes left out) as the Musterbauordnung §6 measures them: each wall's height H from the ground before it (the terrain shown, the planned one first; without one ±0, or "ground") to where it meets the roof's skin or to its top, a gable rising with its wall, a parapet or a wall above standing within half a meter behind the face counting; a roof steeper than "third" degrees (45) adds a third of its height, one steeper than "full" (70) all of it; the area square to the wall, "factor" × H deep (0.4), at least "minimum" meters (3). The states differ: 0.2 H in commercial areas; "factor": 0 with "minimum": 3 where a state allows 3 m for small houses; "gables": "third" where gables count a third; "third": 0 where any roof under 70° adds a third. Walls built up to a boundary (row and semi-detached houses) go in "exclude". Each storey's walls count (a storey set back gets its own areas), a curved wall's chords one area, a courtyard (no floor or roof over it) as outside, a partition standing free in a room not. Hatched on a layer of their own with H and T written in, replacing those drawn before; checked against the plot ("plot") and walls facing each other (enclosing no more than 75°), whose areas must not overlap. Areas may reach onto "streets" (public traffic, green or water areas beside the plot) up to their middle. Projections, bays and balconies standing out of a straight wall, are left out as §6 (6) says when they stand out no more than 1.5 m, take no more than a third of their wall together and stay 2 m from the boundary before them ("projections": {"share", "depth", "boundary"} as the state's code says; false counts them): the wall's area runs on across them. To be checked against the state's code; dormers standing back from the face get areas of their own.
JSON form: setbacks {"factor": 0.4, "minimum": 3 (meters), "third": 45, "full": 70 (roof slopes adding a third or all of a roof's height), "gables": "full"|"third", "plot": id (a closed polyline round the plot), "streets": [ids] (closed polylines round streets, public green or water beside the plot: the areas may reach onto them up to their middle), "projections": false | {"share": 0.33, "depth": 1.5, "boundary": 2} (bays and balconies left out), "exclude": [walls built up to a boundary], "terrain": id | "ground": z (default the terrain shown, else ±0 or the walls' foot)}
A shading study (Verschattung): where the buildings' shadows fall on the level ground at times of a day, from the sun's position at the drawing's place (from its georeference, or latitude and longitude given), as hatches on a layer of their own with the time at each shadow's tip. For a building permit the spring equinox (21 March) and 17 January are usual days. Masses, walls, roofs and other solids cast shadows as far as they stand above the ground (the terrain's height under them, else ±0 where they reach below it, else their foot), taken level; finely meshed things (trees) cast their outline's hull. Times when the sun stands lower than 2° are reported without a shadow.
JSON form: shadows {"date": "2026-03-21" (default the spring equinox), "times": ["09:00", "12:00", "15:00"] or "time": "15:00" (clock time; CET/CEST unless "utcOffset"), "latitude": 48.14, "longitude": 11.58 (default from the georeference), "north": 0 (where north lies in the drawing, degrees counter-clockwise from up; default from the georeference), "ids": [solids] (default all shown), "ground": z (default the lowest solid's foot)
Builds floors and ceilings: a slab under an outline, its top at the outline's height (or "top"), "thickness" down from there, as Revit places floors at a level. The outline comes from corners given, from closed polylines ("ids"), or from the walls round a room ("inside": a point in it; the slab then fills the room up to the inner faces of the walls standing on that floor, leaving out what stands in it apart, such as a shaft). It keeps its outline and thickness: grips drag its corners, primitive changes its thickness, schedule counts its area and volume. Outlines may have arcs (a round balcony). Laid to falls ("fall" in percent, "direction" the way down), its top rises uphill from its lowest edge while its bottom stays level; of a type, its top layer takes the fall, as a screed laid to falls. slabopening cuts openings into it. Without a thickness, the last one used, first 20 cm.
JSON form: slab {"points": [[x, y, z], ...] (its outline), "bulges": [b, ...] (arcs, as a polyline's) | "ids": [closed polylines or circles] | "inside": [x, y, z] (a point in a room of walls), "thickness": 0.2 or "type": "Geschossdecke 22" (a floor type), "top": z (its top face; default the points' height), "fall": 2 (percent), "direction": [x, y] (the way down)}
Cuts openings into a floor (slab) by hand, as Revit's shaft or floor openings: from corners, from closed polylines (arcs too) or circles drawn on it ("ids"; they stay). An opening must lie inside the floor, apart from its other openings. "remove" closes opening n again; with the floor alone it lists them with their corners and areas. The floor's area, volume, layers and framing (trimmers and headers round it) follow. Stairs cut their own opening into the floor they reach. In a conversion an opening has a stage as a wall's openings do: cut into a standing floor it is broken through (new), its piece in the demolition; "demolish" closes an opening up ("hole": n sets the stage of opening n).
JSON form: slabopening {"slab": id, "points": [[x, y], ...] (the opening's corners), "bulges": [b, ...] (arcs, as a polyline's), "renovation": "new" (broken through)|"demolish" (closed up)|"existing"|"" (default: as new work drawn into another stage is, like a wall's openings)} | {"slab": id, "ids": [closed polylines or circles], "renovation"} | {"slab": id, "hole": n, "renovation": "demolish"} (its stage) | {"slab": id, "remove": n} | {"slab": id} (lists them)
Kinds of floor and ceiling under a name, as Revit's floor types: their layers from the top down (screed, impact sound insulation, concrete or timber, plaster); a floor of the type (slab with "type", or primitive with "type") is as thick as its layers together, its top staying where it is. Changing a type changes all its floors at once; IFC exports the layers as materials. Deleting a type leaves its floors as they are.
JSON form: slabtype {} (lists them) | {"name": "Geschossdecke 22", "layers": [{"name": "Screed", "thickness": 0.05}, {"name": "Insulation", "thickness": 0.03}, {"name": "Concrete", "thickness": 0.18}]} (makes or changes one) | {"name": "..."} (shows it) | {"name": "...", "delete": true}
Aliases: treppestairs
Stair
AI toolInteractive
Builds a stair from its bottom step up to the floor above. Without "risers" and "going" its steps follow DIN 18065: risers of about 17.5 cm and treads making a stride of 63 cm (two risers and a tread), the message saying when the rule is not kept. "shape" "quarter" turns it at a landing by a quarter (an L), "half" back beside itself (a U), to the "turn" side; "winding": "winders" turns those corners with winders instead of landings, the treads balanced along the inner side (Verziehen) over the steps before and after the corner so the narrow ends keep the 10 cm DIN 18065 asks for; "spiral" winds it round a "spindle" (diameter, first 20 cm), its treads "width" long out from it (first 80 cm), their "going" measured on the walking line in their middle; "railing" puts railings along its sides (left and right going up): a handrail "railingHeight" above the nosings, posts at most 1.2 m and balusters at most 12 cm apart; "flights" with "turns" give flights one by one (degrees, positive to the left). It is a concrete stair with a waist "thickness" under the flights. A slab whose top it reaches gets a hole for it, leaving 2 m headroom over its treads ("hole": false not). Plans draw its walking line with a circle at the bottom, an arrow at the top and the cut line.
JSON form: stair {"start": [x, y, z] (the middle of the bottom step), "toward": [x, y] or "angle": degrees (which way it runs up), "rise": 2.75 or "top": z (the floor it climbs to), "width": 1, "risers": n, "going": a, "thickness": 0.16 or "type": "Holztreppe Eiche" (a stair type), "shape": "straight"|"quarter"|"half"|"spiral", "turn": "left"|"right", "winding": "landings"|"winders", "spindle": 0.2 (a spiral's), "railing": "left"|"right"|"both"|"none", "railingHeight": 0.9, "landing": risers below the landing, "gap": between the flights of a half turn, "flights": [8, 8], "turns": [90] (instead of shape), "hole": true}
Kinds of stair under a name, as Revit's stair types: "solid" ones in one piece with a "waist" under their steps (concrete), or "stringers" ones of two stringers along their sides with treads between them, the risers open (timber, steel): "tread" thick treads, "stringer" thick stringers "stringerDepth" deep, inside the stair's width. "waist" is also the landings' depth; "material" names what it is made of (IFC takes it along). A stair of the type (stair with "type", or primitive with "type") is built so; changing a type changes its stairs, deleting it leaves them as they are.
JSON form: stairtype {} (lists them) | {"name": "Betontreppe", "build": "solid", "material": "Stahlbeton", "waist": 0.18} | {"name": "Holztreppe Eiche", "build": "stringers", "material": "Eiche", "tread": 0.04, "stringer": 0.06, "stringerDepth": 0.28, "waist": 0.2} (makes or changes one) | {"name": "..."} (shows it) | {"name": "...", "delete": true}
The sun a presentation shows the model in, kept with the drawing (as SketchUp's shadow settings): with "shown" the 3D view lights the model from where the sun stands at the drawing's place (its georeference) on the day and at the time of day, casting shadows, under the sky; the published view in the browser starts there. The time is the place's clock (Central European time with summer time in Europe's middle, else by the longitude) unless "utcOffset" gives the hours ahead of UTC. A drawing without a place on the earth is lit from the south-west of the drawing. Without parameters: the settings and where the sun stands (azimuth from north, elevation). For shadows drawn into the plan at several times, see shadows.
JSON form: sun {"shown"?: true, "date"?: "2026-06-21"|"today", "time"?: "15:00", "utcOffset"?: 2|null} | {} (where it stands)
Aliases: umgebungosm
Surroundings
AI toolInteractive
The buildings around the drawing's place from OpenStreetMap, as bodies of their height on a layer of their own ("Umgebung (OpenStreetMap)"; those of unknown height, guessed from storeys, on another), and the trees mapped there (trunk and crown, conifers as cones, 10 m high unless known) on a third, parks, lawns, woods and water as flat areas (within the radius, the plot left out) on a fourth, and streets and paths as bands of their width (from "width", their lanes or their kind) on a fifth, for the site plan, shadows and the presentation. Needs a georeference in a UTM system (georef). Fetched from the Overpass API (the drawing's place goes there); run again, it replaces what it brought. Buildings standing on the plot (massing "plot") stay out: they are the user's to draw. The data is © OpenStreetMap contributors (ODbL): name it wherever it shows.
JSON form: surroundings {"radius": 150 (meters around), "center": [x, y] (default the plot's middle, else the model's), "levels": 2, "levelHeight": 3 (for buildings of unknown height), "trees": true, "areas": true, "streets": true, "file": "answer.json" (an Overpass API answer instead of fetching)
Builds walls: a solid along a path of straight pieces and arcs ("bulges", as a polyline's) with mitred corners, a thickness and a height, standing on the height of its points (or "base"). "align" says where the path lies: in the wall's middle, or on its left or right face looking along the path (draw along the outside of a house with the right setting). "close" goes round a room. With "ids" it builds a wall along each line, polyline, arc or circle already drawn, which stay. Walls keep their measures: change thickness, height and align with primitive, drag corners and the height with grips. Floor plans show them cut (layout with "cut"). An end that lies in a wall already there (an inner wall drawn to the outer wall's middle) stops at its face, so walls butt ("join": false keeps it). This replaces AutoCAD's multiline: the double line is the wall seen from above. Without measures, the last ones used, first 24 cm by 2.5 m.
JSON form: wall {"points": [[x, y] or [x, y, z], ...] (corners, at least 2), "bulges": [b, ...] (one per point: the piece after it bent into an arc, as a polyline's), "close": bool (round a room), "thickness": 0.24, "height": 2.5, "align": "center"|"left"|"right", "base": z, "join": bool (default true), "type": "AW 36,5" (instead of thickness), "flip": bool, "curtain": true | {"spacing", "transoms", "mullion", "glass"} (a curtain wall)} | {"ids": [lines, polylines, arcs and circles], ...the same measures} (walls along them)
Kinds of wall under a name, as Revit's wall types: their layers (plaster, masonry, insulation, ...) from the wall's left face to its right one, looking along the wall's path; a wall of the type is as thick as its layers together (wall with "type", or primitive with "type" for one that stands). Changing a type changes all its walls at once; floor plans draw the lines between the layers, and schedule sums the areas per layer. Deleting a type leaves its walls as they are.
JSON form: walltype {} (lists them) | {"name": "AW 36,5", "layers": [{"name": "Plaster", "thickness": 0.015}, {"name": "Masonry", "thickness": 0.24}, ...]} (makes or changes one) | {"name": "AW 36,5"} (shows it) | {"name": "AW 36,5", "delete": true}
Puts a window into a wall: a hole through it, its middle at the point given (moved onto the wall's path) or so far along the path, so wide and high, starting "sill" above the wall's foot. It belongs to the wall: moves with it, shows as a gap in floor plans cut through it, and is listed, changed and closed up with opening. It must lie within one straight piece of the wall. Without measures, the last ones used, first 1.01 by 1.26 m with a 0.9 m sill. A window "type" (openingtype) gives its size and how it is built (frame, sashes, glazing bars, sills; "inside" says which side the inner sill goes).
JSON form: window {"wall": id, "at": [x, y, z] (at the wall: its middle) or "distance": d (along the path), "width": 1.01, "height": 1.26, "sill": 0.9, "type": "Fenster 2-flg" (its size and build) | "component": "Rundfenster", "componentType": "...", "values": {...} (a window component fills it), "inside": "left"|"right"}