Open desktop-applicatie voor constructieve berekeningen op basis van CalcPAD-syntax, met directe export naar IFC (4x3 STEP) en IFCX (JSON-LD). Werkt zowel als standalone Tauri-app als embedded library voor FEM-applicaties en normtoetsingen.
Voorheen bekend als Ifc-Calc — herbouwd onder de OpenAEC Foundation als opvolger van CalcPAD met open file-formats en moderne web-tech.
- Formules met eenheden —
mm,kN,N/mm²,mm⁴, … via mathjs unit-aware arithmetic - Automatische unit-simplificatie —
b*hgeeft directmm², geen handmatigeto-cast nodig - Wiskundige opmaak — KaTeX-rendering met echte breuken, superscripts, subscripts en Griekse letters
- Formule-keten — toont
naam = formule = ingevulde waarden = resultaatop één regel - Live preview — split-pane editor (CodeMirror 6) en debounced preview, syntax highlighting voor
.cpd - Project met meerdere rekenbladen — dezelfde module kan er meerdere keren in (drie balklagen, elk met eigen invoer); de projectgegevens gelden voor alle bladen
Compatibiliteit met voorbeeldbestanden voor de ondersteunde rekensyntax.
"Title,'prose,// comment#if … #else if … #else … #end if,#hide / #show / #pre / #post#repeat n … #end repeaten#for var = lo : hi … #loop(incl. nested)#def name(p1; p2; …) … #end defmacros,#def Name$ = literalconstants#include filename.cpd— externe macro-libraries en SVG drawings$Plot{ … @ x = lo : hi }— inline parametrische plots- Subscript-comma's (
V_b,0,n_Int,support,points),$-getypeerde refs, matrix[a;b|c;d] - Format-specs (
:F2), dotted/percent identifiers (Cs.Cd,F_0.9G50%TotalWeight) - mathjs Matrix-aware
take,hlookup,hlookup_ge,hlookup_le,vlookup,get
- Parametrische SVG-macros — prose-line value interpolation (
'<line x1="'a'" y1="'b'"/>) @svg … @endblocks voor handgeschreven SVG@img(file.svg)— externe SVG-tekeningen worden inline ge-embed (incl.<polygon fill="…">, hatch patterns, gradients) via dezelfde include-resolver als#include@img(file.png|jpg|…)— raster afbeeldingen via<img src>
Live IFCX (JSON-LD draft) en IFC4x3 STEP-SPF generatie. Opslaan schrijft het hele project weg: alle rekenbladen in één ruimtelijke boom, met een element per blad. Zie docs/ifc-export.md.
- Detecteert structurele elementen via conventionele variabelenamen (
b_fdn,l_fdn,D_paal,M_Ed,R_c_d, …) - Altijd geldig Project → Site → Building → Storey skelet
- IFC-tab met spatial tree, STEP viewer en IFCX JSON viewer (syntax highlighting + klikbare entity-types naar BuildingSMART docs)
- Eén klik export:
.ifc/.ifcxdownload
- Projectgegevens — gevolgklasse, ontwerplevensduur, windgebied en de projectkop staan op projectniveau en werken door in elk blad
- Afdrukken / PDF — het hele project als één document: voorblad uit de projectgegevens, inhoudsopgave, elk blad op een eigen pagina, met het parametrische beeld én de uitwerking. Met Voorbeeld zie je op het scherm precies wat er op papier komt
- GEF-upload (
@gef name) voor sonderingsdata - 5 themes (light, forge, openaec, blueprint, contrast) — OpenAEC design tokens
@select var "Label" … @enddropdown-blocks voor materiaalkeuzes etc.
Open-Calculations-Studio/
├── packages/
│ ├── core/ # @ifc-calc/core — rekenengine (TS library)
│ │ ├── src/
│ │ │ ├── parser.ts # Line-based parser, macro expansion, #include
│ │ │ ├── evaluator.ts # mathjs evaluator + CalcPAD helpers
│ │ │ ├── ifc-generator.ts # IFCX / IFC4x3 STEP generators
│ │ │ ├── latex.ts # Expr → LaTeX converter
│ │ │ ├── renderer.ts # HTML renderer (KaTeX, SVG coalescing)
│ │ │ ├── gef-parser.ts # Sondering (GEF) parser
│ │ │ ├── types.ts # Public types
│ │ │ └── index.ts # Public API
│ │ └── package.json
│ ├── desktop/ # @openaec/calculations-studio — Tauri app
│ │ ├── src/ # React UI (ribbon, panels, preview)
│ │ │ └── store/projectStore.ts # Project: exemplaren + projectgegevens
│ │ ├── src-tauri/ # Rust shell (Tauri 2)
│ │ └── src/templates/calcpad-samples/ # Vendored .cpd + .svg samples
│ └── web/ # @ifc-calc/web — browser-only build
├── docs/superpowers/ # Design docs + implementation plans
└── package.json # npm workspaces root
"Project — woning Laageind 57
#include svg_drawing.cpd
# 1. Invoer
b = 300 mm
h = 500 mm
N_Ed = ?*(kN)
fck = 30 N/mm^2
# 2. Geometrie
A = b*h // mm² — automatisch
W_y = b*h^2/6 // mm³
# 3. Toetsing
sigma = N_Ed/A to N/mm^2
#if sigma ≤ fck/1.5
'Voldoet ✓
#else
'Voldoet NIET ✗
#end if
# 4. Detail-tekening
@img(detail-D1.svg)
# 5. Belasting-diagram
$Plot{f(x) @ x = 0 : L}
npm install# Browser-preview starten (bouwt eerst de rekenkern)
npm run dev
# Rekenkern en frontend bouwen, inclusief TypeScript-controle
npm run build
# Native debugbuild zonder installatiepakket
npm run build:debug
# Desktop (Tauri) starten
npm run tauri:dev --workspace=@openaec/calculations-studio
# Rekenkern automatisch herbouwen tijdens wijzigingen
npm run dev --workspace=@ifc-calc/coreDe desktop-app vraagt een Rust-toolchain (rustup) plus, op Windows, de
Visual Studio Build Tools met de C++-werkbelasting en de Windows SDK:
winget install --id Rustlang.Rustup --exactwinget install --id Microsoft.VisualStudio.2022.BuildTools --exact --override "--quiet --wait --norestart --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"Die tweede vraagt beheerdersrechten; draai hem vanuit een PowerShell die als administrator is gestart, anders breekt hij af met code 1602. De browser-preview draait zonder Rust en is voor het rekenwerk zelf gelijkwaardig; alleen bestandsdialogen en de opslag van instellingen werken daar niet.
Afdrukken gaat standaard via de browser (voorblad, inhoudsopgave, elk blad op een pagina, mét tekeningen). De Rust-rapportengine van OpenAEC is optioneel en wordt níét meegebouwd, zodat dit project op zichzelf bouwt:
npm run tauri build --workspace=@openaec/calculations-studio -- --features rapportengineZonder die vlag bestaan de engine-commando's wel, maar geven ze een melding dat de build ze niet bevat. Zie docs/backlog.md voor waarom die weg nu niet de standaard is.
import {
parse,
evaluate,
render,
generateIfcx,
generateIfc4x3Step,
} from '@ifc-calc/core';
const source = `
b = 300 mm
h = 500 mm
A = b*h
N_Ed = 120 kN
sigma = N_Ed/A to N/mm^2
`;
// Render naar HTML (KaTeX formules + SVG)
const ast = parse(source);
const evaluated = evaluate(ast, {});
const html = render(evaluated);
// IFC export uit dezelfde calc
const ifcx = generateIfcx(evaluated, { projectName: 'Toetsing balk B1' });
const step = generateIfc4x3Step(evaluated, { projectName: 'Toetsing balk B1' });import detailSvg from './detail-D1.svg?raw';
import svgDrawing from './svg_drawing.cpd?raw';
const ast = parse(source, {
includes: new Map([
['detail-D1.svg', detailSvg], // wordt door @img(detail-D1.svg) inline ge-embed
['svg_drawing.cpd', svgDrawing], // wordt door #include svg_drawing.cpd geladen
]),
});- TypeScript — type-safe codebase
- mathjs — expressie-parsing, eenheden, matrices
- KaTeX — wiskundige opmaak
- CodeMirror 6 — editor met
.cpdsyntax highlighting + autocomplete - React 19 — desktop UI
- Tauri 2 — Rust shell met file-system + dialog plugins
- Vite — bundler met
?rawimports voor samples - npm workspaces — monorepo
Zie LICENSE.
In actieve ontwikkeling onder de OpenAEC Foundation. PRs en issues welkom.