Skip to content

Workflow

A BEMGen definition always follows the same chain:

  1. Program presets for every space type the plan needs, and optionally an envelope preset.
  2. A plan generator builds the detailed plan; Transform Plan optionally moves it.
  3. A plan simplifier turns the plan into a floor at the zoning level you want.
  4. A floor aggregator stacks the floors, with multipliers, into a building.
  5. Validation checks the floor or building.
  6. Convert2BEM and Convert2IDF turn the building into ClimateStudio inputs or an EnergyPlus file.

Each component does one step and passes one object to the next. Inputs, outputs, and defaults of every component are listed in the component reference; this page explains how to use them together. For a complete definition with numbers, see the end-to-end example.

Canvas of the linear-plan example definition

The example definition linear-plan.gh, left to right: presets, generator, simplifier, floor aggregator with its multipliers panel, Validate, and both converters.

1. Program presets

Every plan generator has one required preset input per space type it places, for example Dwelling Unit, Corridor, and Stair on the Linear Plan Generator. An unconnected preset input gives Grasshopper's usual warning (Input parameter DU failed to collect data) and no plan; there is no fallback preset.

Built-in presets

Panel 1 Program Presets has one component per space type: Dwelling Unit Preset, Corridor Preset, Stair Preset, Office Preset, Core Preset, Retail Preset, Mall Preset, Kitchen Preset, Dining Preset, Operating Theatre Preset, Clean Corridor Preset, Dirty Corridor Preset, Clinical Support Preset, Care Bedroom Preset, Care Communal Preset, Lobby Preset, Activity Hall Preset, and Service Preset. Each outputs a Preset of its space type, and every input defaults to the illustrative example values, so it works with nothing connected (each shows a remark saying the values are illustrative).

Inputs, in order:

Input Nickname Meaning
Name N Preset name; descriptive only (reports, provenance, messages), never used for matching.
WWR WWR Window-to-wall ratio in [0, 1) used by the plan generator for every outdoor wall of this space type.
Conditioned Cond Whether the space is heated and cooled; the setpoints are ignored when it is not.
Heating H Constant heating setpoint, °C.
Cooling C Constant cooling setpoint, °C.
one number per load e.g. Occ, Lt, Eq The design value of each load of the preset, in its unit (people/m², W/m², 1/h, …, stated in the input's description). Infiltration is not one of them: it is set on the envelope preset.
one schedule per load e.g. OccS, LtS Optional fraction schedule that replaces the load's built-in schedule when connected.
Heating On HOn Whether a conditioned space is heated (default true); when false, Heating is ignored.
Cooling On COn Whether a conditioned space is cooled (default true); when false, Cooling is ignored. A conditioned space needs one of the two.

The loads depend on the space type. For example Dwelling Unit Preset has Occupancy (0.03 people/m²), Lighting (5 W/m²), and Equipment (5 W/m²), WWR 0.3, conditioned at 21 °C / 24 °C; Corridor Preset has Lighting (5 W/m²), WWR 0.2, conditioned; Stair Preset has Lighting (3 W/m²), WWR 0.1, and is unconditioned. The values of all eighteen presets and their schedules are listed in program presets.

General presets

Panel 1 Program builds a preset for any space type from scratch, mixes presets, or reads one from program JSON:

  • Schedule (Sch): an 8760-hour schedule from a Name, a Kind (Fraction for loads, Temperature for setpoints and hot-water temperatures, Activity for the occupants' activity in W per person), 24 hourly Weekday values (Monday to Friday), 24 hourly Weekend values (Saturday and Sunday), and the First Day of the year (default Monday). Holidays are not modelled.
  • Load (Load): a load from its Type (Occupancy, Lighting, ElectricEquipment, GasEquipment, DomesticHotWater, Ventilation), Basis (PerFloorArea, PerPerson, Absolute, AirChangesPerHour, PerDwellingUnit), Value in the basis' unit, and a fraction Schedule. Optional: an End Use (unset, the type's snake-case name, such as lighting), the heat fractions Radiant, Latent, Lost, Visible, and Return Air of lighting and equipment, and the Target Temperature and Inlet Temperature schedules of hot water (unset, 60 °C and 10 °C). The type Infiltration and the basis PerExteriorWallArea are not accepted: the component shows 'Infiltration': infiltration is not a program load: set it on the Envelope Preset.
  • Program Preset (Preset): a preset from a Name, a Space Type (one of the space type names), a list of Loads (at most one per type, end use, and basis), Conditioned (default true), Heating and Cooling temperature schedules (a conditioned space needs at least one), a WWR, Heating On and Cooling On (default true), and the occupants' Activity schedule (unset, 120 W per person), People Radiant (unset, 0.3), and People Sensible (a number, or autocalculate, the default).
  • Mix Programs (Mix): one preset from several. Presets is the list of program presets (any-program presets too) and Weights one weight for each, in the same order, each greater than 0: the preset's share of the floor area, in any unit. The optional Name, Space Type, and WWR replace the defaults: a name built from the preset names and normalised weights, the space type of the preset with the largest weight, and the weighted mean WWR. Loads per floor area and air changes are weighted by share, per-person loads by occupants, and absolute loads are added unweighted; schedules and setpoints combine as in a zone merge, and the mix is conditioned when any preset is. Absolute occupancy in one preset beside a per-person load in another is an error. Per-dwelling loads, heat fractions, hot-water temperatures, and the people settings are mixed too (Mix Programs). What's new has an example. Its strip Get from Atlas… takes the members and their weights from a folder of the atlas site, and then Presets and Weights are optional (What's new).
  • Program JSON (PJson): a preset from the text of a program JSON 6.1.0 export of Energy Archetype Atlas release 2.4.0, filled or source version, with its schedules expanded on Year (default 2007) and Holidays. Climate Zone selects the values that differ by climate (Convert2IDF refuses a program that has such values and no zone, What's new), and Context selects the loads that apply only with a construction context. Its strips Get from Atlas… and Edit JSON… store the text from the atlas site or a window (What's new). WWR (unset: the JSON's window ratios, else 0.4), the per-orientation ratios, and the optional Name, Space Type, Loads, heating and cooling, and people inputs complete or override the JSON; Source, Assumptions, Overrides, and Left Out say where every value came from. See What's new and the example program-json-office.gh.
  • Schedule Draw (SDraw): drawn 8,760-hour schedules for a program JSON from the atlas's schedule generator, installed separately with Python and run as an external command while Run is true; its Drawn JSON goes into Program JSON; its strip Get from Atlas… stores the generation.json of the program's atlas folder. It runs generator 4.1.0 and can draw the DOE offices' programs and the IECC programs. See What's new and the example schedule-draw.gh.
  • Construction JSON (CJson): a construction set from the text of a unified construction JSON 4.0.0 export of atlas release 2.4.0 (or 2.3.0, the same contract), for Convert2IDF's Construction input (step 7); its strip Get from Atlas… takes a set and context from the atlas site (What's new).
  • Choosing a value. Kind and First Day of Schedule, Type and Basis of Load, and Space Type of Program Preset take the name of a value as text, typed in any case. You can type it or wire a panel. You can also right-click the input and pick the value from the menu, where the current one is ticked. Or choose Extract parameter on the input: this places a dropdown (a Value List) with every value, wired into the input and set to its current value.

Text inputs are matched case-insensitively; an unknown name gives an error that lists the valid names.

Any-program preset

A preset of one space type cannot be wired into an input of another: an Office Preset on the Linear Plan Generator's Corridor input is the error PresetSpaceTypeMismatch. To use a program on a different space type, wire the preset through the parameter Any Program Preset (AnyP) in panel 1 Program. It casts any preset, built-in or general, to a preset without a space type, with the same name, loads, schedules, conditioning, setpoints, and WWR. Every preset input of every generator accepts it: the zones keep the input's space type (the corridor stays a Corridor zone) and take the preset's program and WWR, and the plan's provenance records AnyProgramPreset.Corridor=Example Office, so the change of program is never silent.

Envelope preset

Envelope Preset (Env), in panel 1 Program Presets, gives the constructions and the infiltration to both converters. Its layered constructions are those of the illustrative Example Envelope; its inputs set the preset Name (default Example Envelope), the window's simple glazing: Glazing name (Example Double Glazing), U-Factor (1.8 W/(m²·K), at most 7), SHGC (0.4), and VT (0.7), and the infiltration of the whole building:

Input Nickname Default Meaning
Infiltration Rate Inf 0.3 Design rate of every zone, finite and not negative, in the unit of the basis.
Infiltration Basis InfB AirChangesPerHour What the rate is per: PerExteriorSurfaceArea (m³/h per m² of the zone's outdoor walls, roofs, and exposed floors, windows included), PerExteriorWallArea (m³/h per m² of its outdoor walls), or AirChangesPerHour (1/h of its volume). Right-click the input to choose one, or extract it as a dropdown.
Infiltration Schedule InfS always on Optional fraction schedule that multiplies the rate.

Every zone gets the same rate and schedule, applied to its own surfaces or volume, so a change of zoning does not change the infiltration the surfaces and volume imply. If a converter's Envelope input is left unconnected, the converter uses the Example Envelope; if it is connected but receives no envelope preset, the converter warns and uses the example too. The constructions are described in envelope presets.

2. Generate a plan

Panel 2 Generate holds the eighteen plan generators, one per typology family (Typologies). Each has number inputs with defaults, then its preset inputs, then Preview Location, and one Plan output.

  • Dimensions are in metres regardless of the model units. Every family has Floor Height (floor-to-floor height) and Orientation (clockwise rotation of plan north from true north, degrees; 0 means plan north is true north). Counts (Bay Count, Wing Count, …) are whole numbers with a family minimum.
  • Plan frame. Plans are laid out axis-aligned with the south-west corner of the bounding box at the origin and the long side along x. Orientation changes only which way is north, not the geometry; use Transform Plan to move or rotate the geometry itself.
  • Errors. A value that would break the family (a count below its minimum, a non-positive length, a core that leaves no room) is the error InvalidParameter, with a message naming the input. A wrong preset is PresetSpaceTypeMismatch.
  • Windows. One centred window per outdoor wall, sized from the zone preset's WWR. A wall shorter than 1 m, or a window that would be narrower or lower than 0.3 m, gets no window and a remark WindowOmitted; the plan is still produced.

Preview Location

Every component with a viewport preview (the generators, Transform Plan, the simplifiers, and the floor aggregators) has an optional last input Preview Location (PL), a vector in model units, default zero. It moves only that component's preview; the data and every output keep their true coordinates. Use it to lay several stages side by side in the viewport, for example the plan at the origin, the simplified floor 40 m to the east, and the building 80 m to the east.

Move and rotate a plan: Transform Plan

Transform Plan (TPlan), in 2 Generate, takes a Plan and a Grasshopper Transform and outputs the moved plan. It applies only the rotation about the world z axis and the translation in x and y (the transform is in model units; BEMGen converts it to metres). Any other part of the transform (a z translation, a rotation about another axis, scaling, shear, mirroring, projection) is not applied and gives a warning that states what was applied. Storey heights come from the floor aggregator, never from the transform. Combine a Rotate and a Move transform with Grasshopper's Compound component, or use Orient. Plans stay valid at any rotation: every simplifier and aggregator works on rotated and moved plans.

Storey plans

Stepped Band is the one generator whose plan differs by storey: each storey steps back from the one below, leaving a terrace. Its Plan output is a list of plans, bottom to top (three by default). Wire the list into a simplifier (Grasshopper then simplifies each storey) and the simplifier's Floor output into a floor aggregator's Floors, with Multipliers unconnected, so each floor stands for one storey. The viewport draws each storey at its height, also after Transform Plan and simplification; the plans themselves all lie at elevation 0 until the aggregator stacks them. The terraces become outdoor roof pieces of the storey below.

3. Simplify the plan

Panel 3 Simplify has five plan simplifiers. Each takes a Plan and outputs a Floor.

Component Level Result
No Simplification (Z0) Z0 The plan's own zones and surfaces, unchanged.
Semantic Merge (Z1) Z1 Connected zones of the same space type merged into one zone each (for example all dwelling units of a wing). With Join Pieces true, all zones of a space type on the floor become one zone, even where they do not touch.
Conditioned Merge (Z1c) Z1c Connected conditioned zones merged into one zone, and connected unconditioned zones (stairs) into another, named Conditioned-1, Unconditioned-1, and so on. With Join Pieces true, one conditioned and one unconditioned zone per floor.
Perimeter Core (Z2) Z2 One perimeter zone per orientation, Depth deep (default 4.57 m), plus a core; corners split on the bisectors. Courts get their own perimeter zones.
Single Zone per Floor (Z3) Z3 The whole floor as one zone.

Merged zones get the area-weighted programs of their sources: installed loads and the scheduled load at every hour are conserved, air changes are volume weighted, and the setpoints are floor-area weighted over the conditioned sources. A merged zone is conditioned if any source is, so Perimeter Core and Single Zone per Floor, which merge the unconditioned stair into conditioned zones, enlarge the conditioned floor area; validation reports this as a note. Conditioned Merge never merges the two kinds, so it keeps the conditioned floor area exactly. Every rebuilt outdoor wall gets one centred window with the glazed area of the windows it covers. Infiltration is not merged: it follows each zone's own surfaces or volume (envelope preset).

Semantic Merge and Conditioned Merge have the Boolean input Join Pieces (J, default false). False gives one zone per connected piece of a class; true gives one zone per class on the floor, made of all its pieces, which may be apart. A zone of several pieces is one zone with one program and one multiplier; the previews draw one solid per piece, Convert2BEM gives one Brep per piece, and Convert2IDF writes one Zone with the surfaces of every piece. What's new in 1.1.0 has an example.

Perimeter Core needs every wing of the footprint to be wider than twice the Depth; otherwise it fails with PlanTooNarrow. Reduce Depth or use another simplifier.

Map Source to Target (Map), in 6 Inspect, lists for a floor which source zone overlaps which target zone, the overlap area, and the fraction of each.

4. Stack the floors

Panel 4 Aggregate has four floor aggregators. Each takes Floors, a list ordered bottom to top, and optional Multipliers, and outputs a Building. They share the same first step: the full stack is assembled (each floor repeated by its multiplier, storey k at the sum of the floor heights below it, zone IDs prefixed L{k}/), and every floor and ceiling is split into ground, roof, exposed, and between-storey pieces.

Component Zones Multiplier N Floors and ceilings between storeys
Stack Floors (Stack) every storey explicit, zones L0/…, L1/…, … the floor is repeated N times between two zones
Stacked Floor Zone Multiplier (ZMult) one representative storey per group of N storeys, at its true elevation; storeys with ground, roof, or exposed surfaces are split off as single storeys zone multiplier N on the representative storey's zones adiabatic
Single Zone per Floor Type (1ZType) one zone E{i} per floor entry, spanning its N storeys the floor is repeated N times before merging between two entries: between zones; within an entry: internal mass
Single Zone Building (1ZBldg) one zone BUILDING the floor is repeated N times before merging internal mass

Multipliers

Multipliers takes one whole number from 1 per floor, in the same order as Floors, or nothing, which means 1 for every floor. A list of another length is the error Give one multiplier per floor (n), or none for all 1. To build a five-storey building from one floor with a distinct ground floor, middle, and top, give the same floor three times (Grasshopper's Merge component with the floor in three inputs) and the multipliers 1, 3, 1.

The floors of one building may come from different plans and simplifiers, but they must have the same Orientation (OrientationMismatch). A storey not fully supported by the storey below gets the warning UnsupportedStorey with the uncovered area; the building is still produced. Stacked Floor Zone Multiplier reports the storeys it split off with the remark FloorTypeSplit, and draws the represented but unmodelled storeys in transparent grey.

5. Validate

Validate (panel 6 Inspect) takes a floor or a building and outputs Passed (true when every enforced check passes) and a Report, one line per check: ok (passed), FAIL (an enforced check failed), or note (a reported-only check differs), with the reference and actual values.

  • A floor is compared with its source plan: floor area, volume, conditioned floor area (note only), exterior wall area, glazing in total and per orientation (North, East, South, West), installed and hourly scheduled magnitude of every load type, façade coverage, no overlapping zones, source coverage, and traceability.
  • A building is compared with each of its source floors' plans (lines prefixed Floor0., Floor1., …) and with the same floors stacked with every storey explicit (lines prefixed Building.), which adds ground, roof, and exposed floor area and the building height.

A failed validation adds a warning to Validate. You do not need Validate before converting: both converters validate the building themselves.

Inspect (panel 6 Inspect) gives a text Report (zones, loads, surfaces) and the Provenance of a plan, floor, or building.

6. Convert2BEM

Convert2BEM (2BEM), panel 5 Convert, turns a building into Grasshopper data trees for a ClimateStudio definition. Its output layout is provisional until a ClimateStudio reference definition exists.

Inputs:

Input Nickname Default Meaning
Building Bldg — The building from a floor aggregator.
Override Ovr false Convert even if validation fails; recorded in Provenance.
EnableInternalWallHeatTransfer IWHT false Write walls between two zones as Interzone:<zone ID>; when false a wall between two conditioned zones is written Adiabatic, and a wall of a zone without HVAC stays Interzone:<zone ID>.
EnableFloorHeatTransfer FHT false The same for floors and ceilings between two zones.
Envelope Env Example Envelope Envelope preset (optional).

The building is validated first. If it fails and Override is false, the component shows the error ValidationFailed and only Provenance is set, so you can read the failing checks. If Override is true it converts, warns ValidationOverridden, and ends Provenance with OVERRIDE: converted despite failed validation.

Outputs are trees with one branch {i} per zone, in building order, except Provenance, the three outputs of the envelope's infiltration (Infiltration Rate, Basis, and Schedule), and Calendar, which are the same for every zone:

Output Nickname Branch {i} holds
Zones Z closed Breps of the zone's parts (model units)
Names N the zone ID, e.g. L0/P-North
Space Types ST the space type
Multipliers M the zone multiplier
Conditioned Cd whether the zone is conditioned
Load Types, Load Bases, Load Values LT, LB, LV one item per load, aligned
Load Schedules LS branch {i;k}: 8760 fractions of load k
Heating Setpoints, Cooling Setpoints HS, CS 8760 values, °C; empty for an unconditioned zone, and the side a conditioned zone does not have
Surfaces S walls, floors, and ceilings, each facing out of the zone
Boundaries B per surface: Outdoors, Ground, Adiabatic, or Interzone:<zone ID>
Windows W the windows of the zone's walls
Internal Mass IM exposed internal-mass area, m²
Provenance P provenance, validation report, options, envelope, infiltration, override
Constructions Con per surface, the construction name from the envelope preset
Window Constructions WCon per window, the glazing name
Infiltration Rate IR the envelope preset's infiltration rate, one number for every zone, in the unit of the basis
Infiltration Basis IB the basis: PerExteriorSurfaceArea, PerExteriorWallArea, or AirChangesPerHour
Infiltration Schedule IS the 8760 fractions that multiply the infiltration of every zone
Infiltration Flows IF the design flow of one instance of the zone, m³/h: the rate times the zone's exterior surface area, outdoor wall area, or volume, by the basis
Load End Uses LE per load, its end use, aligned with Load Values
Heat Fractions HF branch {i;k}: radiant, latent, lost, visible, and return-air fraction of load k; empty for loads other than lighting and equipment
Dwelling Units DU the dwellings of one instance of the zone, which per-dwelling loads are multiplied by
Activity Act 8760 activity levels of the occupants, W per person
People Radiant, People Sensible PR, PS the occupants' radiant fraction, and their sensible fraction (a number or autocalculate)
Water Target, Water Inlet WT, WI branch {i;k}: 8760 target and inlet temperatures, °C, of hot-water load k; empty for other loads
Calendar Cal one item: the calendar the schedules were expanded on (year and holidays); none for the built-in presets
Shading Shd not per zone: one list of opaque shading surfaces, the outdoor walls of the storeys Stacked Floor Zone Multiplier represents but does not model, at their true heights; empty under the other aggregators

Infiltration Flows times Infiltration Schedule is the hourly flow of one instance of a zone, and times Multipliers the flow of every instance. The infiltration is also written in Provenance as INFILTRATION: <rate> <basis> (EnergyPlus <method>), schedule <name>.

A zone without windows (an interior core) or without loads has no branch in Windows or the load outputs: match branches by path, not by position. Every zone has a branch in Infiltration Flows.

Heat transfer between zones

The two heat-transfer options decide how surfaces between two zones are written; they change neither the building nor its validation. Off (the default), walls and slabs between two conditioned zones are adiabatic, so each zone exchanges heat only with the outdoors and the ground. A zone without HVAC, such as an unconditioned stair, keeps its links to its neighbours: its walls, floors, and ceilings stay paired interzone surfaces whatever the options say, so that such a zone is never left with only its exterior surfaces to lose heat through. On, every surface between two zones is written as a paired interzone surface. The same options exist on Convert2IDF. Stacked Floor Zone Multiplier buildings have no slab between storeys to pair: those pieces are adiabatic in the building itself.

7. Convert2IDF

Convert2IDF (2IDF), panel 5 Convert, writes an EnergyPlus 26.2 input file ready to simulate: the site from a weather file when one is given, ground temperatures from the indoor setpoints (the monthly mean minus 2 °C), hourly outputs, constructions from the envelope preset or a construction set, ideal-loads HVAC for every conditioned zone, exact hourly schedules, loads, one infiltration object per zone from the envelope preset, internal mass, zone multipliers, outdoor surfaces as convex pieces, and the shading of storeys a floor multiplier leaves out. A zone with heating and cooling gets a dual-setpoint thermostat, a zone with one side a single heating or cooling one; the people, lighting, equipment, and hot-water objects take the program's heat fractions, activity, and water temperatures; and the run period's year is that of the building's calendar, or 2007, which starts on a Monday, without one. It does not run EnergyPlus: run the file with the same weather file, for example with EP-Launch or energyplus -w <file.epw> <file.idf>. What the outputs are for: Experiment outputs.

Input Nickname Default Meaning
Building Bldg — The building.
Envelope Env Example Envelope Envelope preset (optional).
EnableInternalWallHeatTransfer IWHT false Pair walls between zones; otherwise adiabatic between two conditioned zones, while a wall of a zone without HVAC stays paired.
EnableFloorHeatTransfer FHT false Pair floors and ceilings between zones; otherwise adiabatic between two conditioned zones, while one of a zone without HVAC stays paired.
Override Ovr false Convert even if validation fails; recorded in Provenance and the IDF header.
Path P — Fully qualified path of the file to write (for example C:\models\linear.idf), in an existing folder; only used when Write is true.
Write W false Write the file to Path; when false nothing is written.
Overwrite O false Replace an existing file; when false an existing file is kept and the error FileExists is shown.
Weather Wthr — Fully qualified path of an .epw weather file (optional): the IDF gets Site:Location from it, and the header and Provenance name it with its SHA-256. Without it, EnergyPlus takes the location from the weather file it runs with. A .stat file of the same name next to it, when it states the ASHRAE climate zone, is read too.
Construction Cons — Construction set from Construction JSON (optional), used instead of Envelope; connect one, not both.
Fill From Example Fill false Let a role the construction set lacks take the Example envelope's construction, with a warning; when false such a role is an error.
Require Floor Research Eligibility FloorCheck false Require each distinct source floor to pass the floor research-eligibility checks (spatial conditioning, thermostat sides, full-year controls, spatial program gains, heat partitions, and geometric source mappings); a failed or missing floor blocks the conversion even with Override. When false, the legacy behaviour.
Daylighting Dayl false Write each zone's daylighting controls from its program, at the reference points the 90.1 code rule places on the zone's own windows and skylights; when false no daylighting object is written.

Daylighting and the climate zone have their own rules: with Daylighting true only zones whose program has controls and a code rule get them (What's new), and a program with values by climate zone but no Climate Zone is refused (What's new).

Outputs: IDF (the file text; empty when validation blocks the conversion), Provenance (provenance, validation report, options, envelope, infiltration, ENERGYPLUS: 26.2, SHADING:, WEATHER:, GROUND:, any override, and FILE: written <path> or FILE: not written (<reason>)), and Written (whether the file was written in this solution).

Keep Write off while editing

Every solution with Write and Overwrite both true rewrites the file. Keep Write false while you build the definition and read the IDF text or wire it into a panel; set Write true when you want the file, for example with a Button or a Boolean Toggle.

Surface types follow the building: ceilings facing outdoors are written as Roof, others as Ceiling; vertices are the building's own coordinates in metres, and the building's Orientation becomes the IDF North Axis. Interzone pairs between zones with different multipliers are written adiabatic with the warning InterzoneMultiplierMismatch.

Checking the file against the EnergyPlus IDD

BEMGen's repository, private for now, has a checker that compares IDF files with the EnergyPlus data dictionary (Energy+.idd, shipped with EnergyPlus). With Python 3, in a clone of that repository:

python scripts/idd-check/idd_check.py "C:\EnergyPlusV26-2-0\Energy+.idd" C:\models\linear.idf

It also takes a folder of IDF files. What it checks and its last run: IDD check.

Runtime messages

BEMGen reports through Grasshopper's runtime messages: errors (red, no output), warnings (orange, output produced), and remarks (grey, information). A message from BEMGen's services starts with its severity and code, and the subject in brackets when there is one, for example Warning UnsupportedStorey [L1]: … or Error ValidationFailed: …. The codes (InvalidParameter, PresetSpaceTypeMismatch, WindowOmitted, PlanTooNarrow, FileExists, …) are listed in the domain model.