DynaLab is a Python desktop app for building and analyzing block-diagram control systems with a graphical canvas, editable block parameters, and classical control analysis tools.
It is aimed at the workflow many engineers actually want:
- drop blocks onto a diagram
- wire up a feedback loop
- edit gains and transfer functions directly in the UI
- compute the closed-loop transfer function
- inspect Bode and step response plots without leaving the app
In spirit, it is a lightweight Simulink-style desktop workbench built with PySide6, NodeGraphQt, and python-control.
A lot of Python control tooling is powerful, but heavily script-driven. That is great for notebooks and batch workflows, but not always ideal when you want to:
- sketch a loop visually
- tune blocks interactively
- inspect responses immediately
- use a diagram-first workflow instead of a code-first workflow
DynaLab was built to close that gap with a Python-native desktop UI for classical control work.
The app provides a desktop graph editor where you can:
- drag and drop blocks from a block library
- connect blocks visually
- create standard feedback control diagrams
- delete blocks and reconnect the model quickly
Selecting a block opens its parameters in the inspector panel, where you can edit values directly.
Examples:
- Gain block: change
k - Transfer Function block: edit numerator and denominator coefficients
- Sum block: define sign pattern such as
[+1, -1] - Delay block: configure discrete-domain timing values
- Source blocks: set step magnitude, impulse parameters, or constant values
From the UI, the current app can compute and display:
- Closed-loop transfer function
- Bode plot
- Step response
- Poles and zeros
DynaLab supports project save/load using a .simproj file format so diagrams and analysis setups can be reopened later.
- Step
- Impulse
- Constant
- Transfer Function (TF)
- Gain
- Sum
- Delay (
z^-1)
- Scope
- Terminator
The current application layout centers around three main work areas:
- Canvas for block-diagram construction
- Library dock for block insertion
- Inspector dock for parameter editing
Analysis results are shown in a separate plot window.
DynaLab provides a desktop block-diagram canvas where users can place source blocks, transfer functions, gains, sums, delays, scopes, and terminators, then wire them into feedback-control diagrams.
Analysis results are displayed in plot windows, giving the project a lightweight Simulink-style workflow backed by Python control tools.
A typical workflow looks like this:
- Launch the app.
- Drag a Step source, Sum block, Transfer Function block, Gain block, and Scope onto the canvas.
- Connect the blocks into a standard negative-feedback loop.
- Click each block and set parameters in the inspector.
- Run:
- Closed-loop TF
- Bode
- Step
- Inspect the resulting plots and transfer function display.
That gives you a visual control-diagram workflow without having to assemble the entire model manually in Python code.
DynaLab is currently built around:
- Python
- PySide6 for the desktop shell
- NodeGraphQt for the node-based block-diagram canvas
- python-control for classical control analysis
- NumPy and Matplotlib for numeric work and plotting
Create and activate a virtual environment, then install the required packages.
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install PySide6 NodeGraphQt control numpy matplotlibDepending on your platform and environment, you may also want scipy installed because some control-related workflows commonly depend on it:
pip install scipyFrom the project root:
python -m simulatorTo clear saved UI settings and start fresh:
python -m simulator --reset-settingsA simplified view of the architecture:
simulator/
app.py
settings.py
log.py
core/
ir/
project/
signals/
blocks/
lti/
sources/
sinks/
compilers/
control_compiler.py
pathsim_compiler.py
bdsim_compiler.py
engines/
control_engine.py
sim_engine.py
ui/
main_window.py
graph/
inspector/
plots/
nodes/
The app is intentionally separated into layers:
- UI layer: canvas, inspector, menus, plots
- IR layer: semantic project representation for blocks, ports, and wires
- Compiler layer: turns the diagram into analysis-ready models
- Engine layer: runs control analysis and returns structured results
This architecture is meant to keep the graphical editor from becoming tightly coupled to any one solver backend.
DynaLab is being built with a few practical goals in mind:
- diagram-first workflow instead of script-first workflow
- Python-native control tooling rather than a black-box desktop stack
- editable semantic model underneath the UI
- extensible backend architecture so new analysis engines can be integrated later
- incremental evolution from classical control analysis toward broader simulation workflows
At this stage, the project already demonstrates a lot of real functionality:
- the UI launches cleanly
- blocks can be placed on the graph canvas
- feedback diagrams can be constructed visually
- the inspector can edit block parameters
- transfer function, Bode, step, and pole/zero analysis are working
- projects can be persisted and reopened
This is not just a mock UI. It is already a usable early desktop control-analysis tool.
This project is still in an early release stage, so some limitations remain.
Examples of current scope boundaries:
- the block library is intentionally small
- the current analysis focus is classical LTI/control workflows
- advanced simulation backends are still evolving
- diagram ergonomics and visual polish are still being improved
- some backend/library compatibility can depend on the local Python environment
Planned or natural next-step upgrades include:
- richer block library
- better visual routing and diagram polish
- stronger project/session behavior
- explicit input/output selection from the canvas
- improved simulation backend integration
- broader discrete-time and hybrid workflows
- more robust scope and signal-inspection tools
- packaging into a friendlier distributable desktop release
DynaLab sits at an interesting intersection:
- control engineering
- scientific Python
- desktop UI development
- diagram-driven modeling
It is useful both as:
- a practical control-systems desktop tool
- and an engineering software architecture project
The project has been iterated heavily around a few non-negotiable behaviors:
- blocks must be visually editable
- feedback loops must be supported
- graph connections must export correctly into the semantic IR
- the UI must remain responsive while analysis remains grounded in real control tooling
A lot of effort has gone into making the graph canvas, inspector, and control-analysis path work together cleanly.
DynaLab should be interesting to:
- control engineers
- students studying feedback systems
- Python developers building engineering tools
- anyone curious about a Python-native alternative to diagram-based control analysis workflows
Current release stage: early alpha / first usable desktop release.
The app is already capable of meaningful control-diagram construction and analysis, but it is still actively evolving.
See LICENSE.

