Calculate Coverage
Work out which products a project needs from a type, per bouwnummer, and export it to Excel or JSON
Calculate Coverage
Calculate Coverage answers one question: which products does this project need from this type? It reports the answer per bouwnummer and writes it to an Excel workbook or a JSON file.
Unlike Missing Coverage, which inspects the open Revit document against live Alpha data, Calculate Coverage needs no open document and, when you use the JSON sources, no Alpha account and no API key at all.
Opening it
Click Calculate Coverage in the Tools panel of the Alpha ribbon.
Choosing the inputs
The project and the type are picked independently. Each can come from three places:
| Source | What it reads | Needs an Alpha account? |
|---|---|---|
| Live (Alpha API) | The project/type straight from the configured environment | Yes: an API key for that environment |
| Alpha JSON file | An Alpha-native export (GET /projects/{id}/export, or a type export) | No |
| Heijmans JSON file | A Heijmans configurator export: a project export, or a WOCO type export | No |
So a fully offline run is "Heijmans JSON" (or "Alpha JSON") for both sides. This is the intended way to check a project handed over as two files before anything is imported into Alpha.
The add-in checks the file you pick against the source you selected. If you point at a WOCO type export while "Heijmans project JSON" is selected, it says so instead of failing somewhere inside a parser.
Press Load. The add-in resolves which houses use the chosen type and lists their bouwnummers.
Heijmans projects reference types by name, and a house type may extend the type name; a house of type
B01DGW resolves onto type B01 with variant DGW. The variant is reported in its own column. This
mirrors how the Alpha project importer resolves Heijmans types.
Choosing bouwnummers
Every matching bouwnummer is listed with its house type and block, ticked by default. Untick the ones you do not want, or use All / None. Verifying one bouwnummer is the quickest way to sanity-check a new project file.
Scope: which choices count as fixed
This setting changes the answer substantially, so it is worth understanding.
| Scope | Meaning |
|---|---|
| House choices fixed (default) | Every option the bouwnummer pins is treated as settled, whatever its phase. Answers "what does this bouwnummer need as specified". |
| Buyer choices open | Options the type marks CONSUMER expand to every code, even when the house already has one, because the buyer can still change them. Answers "what must exist so this bouwnummer can be configured and rendered". |
The default matters for Heijmans data in particular: Heijmans marks its VAR - … options (beukbreedte,
entree, kapvorm, …) as CONSUMER but pins them per bouwnummer. With buyer choices open, a single
bouwnummer therefore expands into every beukbreedte × entree combination the type allows; for a real
B01, that is the difference between roughly 700 and roughly 12,000 products for one bnr.
Use buyer choices open when you are deciding what to export so the configurator and viewer are complete. Use house choices fixed when you want a specific bouwnummer's bill of models.
Filling the RVT / GLB columns
Coverage means "required and available", but a pair of JSON files says nothing about which files have been produced. There are two ways to fill that in:
- A live type. When the type comes from the Alpha API, the RVT/GLB status is read from Alpha's own coverage records.
- An export folder. Tick Also check an export folder and pick a folder. Any product with a
matching
<product>.rvtor<product>.glbunder that folder (searched recursively, case-insensitively) is marked present. This is what makes a fully offline run report real coverage.
With neither, the RVT/GLB columns are left blank rather than claiming everything is missing.
Filtering on the element name
Name filter narrows the export to the products whose name matches a search term: "only the DAK
models", "everything starting with B01_", a regex for a code pattern. It takes two choices: which
name to test, and how to compare it.
| Name | What it tests |
|---|---|
| Product name (default) | The final name: what the RVT/GLB file and the Revit group are called |
| Generated name | The pre-override name, built from the bouwnummer's own codes |
| Either name | A row is kept when either name matches |
The two differ exactly where a name override applies: a bouwnummer with Entree = ZGE can require a
product named …_VGEL_…. Filter on the product name to ask "which models must exist"; on the
generated name to ask "what did this bouwnummer itself ask for".
| Mode | Matches |
|---|---|
| contains (default) | The term appears anywhere in the name |
| starts with / ends with | The name begins/ends with the term |
| is exactly | The whole name equals the term |
| matches regex | .NET regular expression, e.g. DAK_BB5[0-9] |
Matching is case-insensitive, like the export-folder scan; a filter that misses on casing alone would read as "nothing required".
Combining terms
Terms combine with AND, OR and NOT, grouped with brackets:
| Search | Keeps |
|---|---|
DAK AND BB57 | names holding both |
DAK OR GEVEL | names holding either |
B01 AND NOT DAK | names holding B01 but not DAK |
GEVEL AND (BB57 OR BB60) | brackets override the default order |
NOT binds tightest, then AND, then OR, the usual order, so A OR B AND C reads as A OR (B AND C).
&&, || and ! work as aliases. Each operand is compared with the mode you picked, so under matches
regex every term is its own pattern.
Two things worth knowing:
- Without any operator the whole box is a single term.
VK eerste verdiepingsearches for that phrase, not for three words; multi-word names keep working exactly as before. - Quote a term to search for the keywords themselves:
"and"looks for the lettersand.
The condition is applied to each name whole. With either name selected, VGEL AND ZGE needs one
name to hold both terms; it will not take VGEL from the product name and ZGE from the generated one.
A malformed search (DAK AND, an unclosed bracket or quote) is reported in words and nothing is written.
The filter runs after the RVT/GLB check, so the rvt/glb columns are unaffected by it. Bouwnummers left with no matching product drop out of the export, and the Run info sheet records the filter and how much it kept. If nothing matches, no file is written and the window says so rather than leaving you an empty workbook.
Output
Pick Excel (.xlsx) or JSON (.json) and a file path. Leave the path empty to write to your Desktop
with a generated name like coverage_DeGroteWielen_Veld1A_B01_20260803-1530.xlsx.
The workbook has three sheets:
| Sheet | Contents |
|---|---|
| Per BNR | One row per (bouwnummer, tree, required product), with the choices that selected it |
| Products | Each distinct product once, with how many bouwnummers need it and which |
| Run info | Sources, scope, filter, timestamp, counts, and any warnings from the run |
The JSON output carries the same data plus the full choice list per row.
The grid in the window is a preview capped at 2000 products; the exported file always holds every row.
Splitting the output per bouwnummer
Split decides how the bouwnummers are spread over sheets and files:
| Split | Result |
|---|---|
| One file, all bouwnummers together (default) | The three-sheet workbook described above |
| One worksheet per bouwnummer | The Per BNR sheet is replaced by one tab per bouwnummer (BNR 002, BNR 003, …), followed by Products and Run info for the whole run |
| One file per bouwnummer | One complete file per bouwnummer, written into a folder named after the output file |
With one file per bouwnummer, choosing …\coverage_run.xlsx produces
…\coverage_run\coverage_run_bnr002.xlsx, …_bnr003.xlsx, and so on, a folder rather than 200 loose
files on your Desktop. Open folder goes to that folder. Each file is a full report for its own
bouwnummer: its Products sheet is re-rolled for that bnr only, and its Run info sheet notes which
larger run it came from. This split works for JSON too.
A run of a single bouwnummer stays one file, since a folder holding one workbook helps nobody.
Excel has no fixed sheet ceiling, but a workbook of thousands of tabs is unusable, so one worksheet
per bouwnummer writes at most 400 tabs and puts the rest on a shared Other BNRs sheet, with a
warning naming them. For more bouwnummers than that, use one file per bouwnummer. JSON has no
worksheets, so picking the sheet split with JSON writes a single file and says so; every row carries
its bnr.
Product names and name overrides
The exported product name is the final name: the one the RVT/GLB file and the Revit group are called. Where a name override applies, the pre-override name is kept in the generated name column.
This matters when reading the output: Heijmans types deliberately map some variants onto a shared model,
so a bouwnummer with Entree = ZGE can legitimately require a product named …_VGEL_…. That is an
override, not a mistake. The generated-name column always shows the bouwnummer's own codes.
Warnings
Anything the run could not do cleanly is listed in the window and on the Run info sheet: a name override that still contained an unresolved placeholder, an exhaustive option missing from the type, a bouwnummer in the filter that does not exist, or a branch skipped for exceeding the combination cap. Coverage is never silently truncated.