No host required.
A Python desktop application — its own first-class node editor, not a plugin renting space inside Rhino, Blender or Revit.
An open-source node graph that builds parametric structural models and pushes them into Tekla, ETABS and SAP2000 as native elements, runs gravity analysis through bundled PyNite (or OpenSees), and exports IFC4 on every cycle.
Grasshopper–Tekla Live Link, CSiXRevit, Speckle — all assume you already own Rhino, Revit, or a Tekla maintenance contract. Engineering offices that don't have no good open-source alternative for visually authoring parametric structural models that round-trip to FEA and detailing software. Karakulak is that alternative.
A Python desktop application — its own first-class node editor, not a plugin renting space inside Rhino, Blender or Revit.
Beams, columns and slabs land in Tekla, ETABS and SAP2000 as their actual element types — through OAPI and the Tekla .NET API — not as reference geometry a detailer has to redraw.
Pure-Python linear-static analysis runs in-process — no external tool, no binary, no environment variable. Press Push, get displacement and reactions back on the canvas.
Beam flexure (§7.4), column axial (§7.3) and strong-column-weak-beam (§7.3.5) check nodes. ρ_min, confinement zones, cover, bar spacing inline; deep helpers via [tbdy_full].
Change a parameter and re-push. IFC GlobalId, ETABS label and Tekla GUID survive save / load / reopen — the same element is rewritten, not cloned next to itself.
Every model emits IFC4 alongside its native push — validated, opens in BIMVision. Even when the receiver isn't Tekla or CSI, the data still lands somewhere.
Four push backends drop native elements into Tekla, ETABS, SAP2000 or IFC4. Two analysis backends run linear-static, self-weight gravity analysis — PyNite is bundled and the default; OpenSees is an optional, more powerful alternative invoked through a Tcl subprocess.
| Backend | What it does | Tracked identity | Kind |
|---|---|---|---|
|
ETABSv23 +
|
Native frames, sections and materials via the CSI COM OAPI. | Frame label | push |
|
SAP2000v25 +
|
Same API as ETABS — 99 % shared code path. | Frame label | push |
|
Teklastructures 2023 +
|
Native beams and columns via the .NET OAPI; round-trips through GUID. | GUID | push |
|
IFC4ifcopenshell
|
Validated IFC4 export — opens cleanly in BIMVision and downstream BIM stacks. | GlobalId | push |
|
PyNitedefault
|
Gravity linear-static analysis, in-process. No install, no environment variable. CI-tested every push. | — analysis only | bundled analyse |
|
OpenSeesoptional
|
Same scope and result format as PyNite, via Tcl-script subprocess. The generated .tcl is reproducible standalone. | — analysis only | analyse |
Drag-and-drop parametric canvas with topological evaluation, dirty propagation and per-node error display. Nodes turn red on failure; the rest of the graph keeps running.
Beam flexure check (§ 7.4), column axial check (§ 7.3), strong-column-weak-beam check (§ 7.3.5). Five core formulas inline; shear capacity, anchorage and Pn–Mn surface via the optional turkrebar extra.
Parameter changes update existing backend elements instead of creating duplicates. IFC GlobalId, ETABS label and Tekla GUID are preserved across save / load / reopen. Bake All freezes state; per-backend Reset Live Link clears it.
Three.js r168 viewer embedded in the application window via QWebEngineView. Updates after every evaluation cycle — no Alt-Tab to a BIM viewer to confirm geometry.
IPE and HEA series (EN 10365) with searchable picker dialogs. Pushed via PropFrame.SetISection rather than ETABS catalog-file import — cross-version and cross-machine reproducible.
FIXED, PINNED, PINNED_RX, ROLLER_Z, ROLLER_YZ. PINNED_RX + ROLLER_YZ is the stable pair for 3D simply-supported beams; FIXED for cantilevers and column bases — selectable on the canvas Support node.
python -m karakulak — opens the node editor.
File → Open examples/03_tbdy_3story_frame.karakulak.
Press Ctrl+E — the DAG runs; the 3D preview updates.
Switch the Push node backend to PYNITE and press Push. Analysis runs
in-process; results appear on the canvas node.
With ETABS running, switch to ETABS and push again to create native frame elements.
Change a column from 400×400 to 500×500. Press Ctrl+E, push — the same ETABS frames update in place.
Each layer is independently testable. The engine doesn't know what a beam is. The UI doesn't know what TBDY is. The domain doesn't know whether it's being rendered or pushed to a CAD process — or solved by PyNite.
The dependency arrow never bends back. A backend writer can't reach up into the graph; the graph can't reach down into a writer's COM apartment — which is what keeps apartment-conflict-prone bridges (Tekla's MTA vs CSI's STA) from poisoning the rest of the codebase. 17 ADRs cover every non-obvious choice we've made, from NodeGraphQt selection to analysis-backend licensing.
pytest
— 747 green.Core install includes the UI, engine, domain primitives, all four push backends, PyNite analysis, and IFC export. Web preview, the full turkrebar TBDY helpers, and dev tooling are opt-in extras.
# clone & enter $ git clone https://github.com/ogunc/karakulak.git $ cd karakulak # virtualenv $ python -m venv .venv $ .venv\Scripts\activate # windows $ source .venv/bin/activate # linux / macOS # dev install — pytest, ruff, mypy $ pip install -e ".[dev]" # run the 747-test suite $ pytest ======== 747 passed in 38.4s ======== # launch the node editor $ python -m karakulak
Karakulak is alpha. Core works end-to-end, but the API, file format and feature set are still moving. Pin to a specific commit for anything production-shaped — and read the limits below before pinning expectations to them.
API, file format and behaviour may change between commits before v0.1.0 is tagged final.
PyNite and OpenSees apply self-weight distributed loads and run a single linear static analysis. Non-linear, dynamic, modal and imposed-load cases are not implemented.
CSI and Tekla can't coexist in the same Python process — pythonnet's MTA and comtypes' STA collide with WinError −2147417850. Restart Karakulak to switch families. PyNite, OpenSees and IFC are exempt.
"Bake All (IFC)" bakes every tracked element at once. Per-node bake controls and per-node live-link status indicators on element bodies are v0.2.0 scope.
No Windows + Tekla CI runner yet. test_regenerate_preserves_tekla_guid stays xfail(strict=True) pending one.
No documented OAPI call repaints the Model Explorer tree independently of the 3D viewport. If the tree shows stale state, use View → Refresh Displays in ETABS.
Karakulak is free software: use, study, modify and distribute under the GNU Affero General Public License v3 or later. If you run a modified version as a networked service, you must publish the modified source.
Karakulak links dynamically to LGPL-3.0 libraries (PySide6, IfcOpenShell). Dynamic linking under LGPL is permitted; users retain the right to swap LGPL libraries independently.
A karakulak is the Anatolian caracal — a stealthy, precise, agile predator. The name follows the AEC parametric-tool tradition of small-animal nicknames.