OpenSees Studio is built in eight phases. Phases 0–7 ship the core GUI plus all the post-processing tooling we need for verification work. Phase 8 layers in the earthquake-engineering primitives that turn the GUI from "OpenSees frontend" into a usable research tool.
Status legend: ✅ done · 🟡 partial · ⬜ planned · ✂️ deferred / out-of-scope.
- ✅ Repo, license,
.gitignore,pyproject.toml - ✅ Pre-commit + ruff + mypy
- ✅ GitHub Actions CI (Linux/Mac/Win × Py 3.10–3.12)
- ✅
python -m opensees_studioopens aMainWindowwith PyVista 3D viewport, model-tree dock, property dock, console dock, working-plane toolbar, and a full menu bar (File / Edit / Define / Assign / Analyze / Display / View / Options / Help) - 🟡 Application icon and About dialog — wordmark logo done; native
OS icon (
.ico/.icns) still pending
- ✅
core.geometry:Node,Element,TrussElement,CorotTrussElement,ElasticBeamColumn,ForceBeamColumn,DispBeamColumn,ZeroLengthElement,ZeroLengthSectionElement,BeamWithHingesElement,QuadElement, plusGridSystem/CoordinateSystem - ✅
core.materials:ElasticIsotropic,ElasticUniaxial,ElasticPP,Steel01,Steel02,Concrete01,Concrete02,HystereticMaterial - ✅
core.sections:ElasticSection,FiberSectionwith rectangular / circular patches and straight rebar layers,SectionAggregator - ✅
core.loads:NodalLoad,UniformElementLoad,LinearTimeSeries,ConstantTimeSeries,PathTimeSeries,PlainLoadPattern,UniformExcitationPattern,ResponseSpectrum - ✅
core.analysis:StaticCase,ModalCase,TransientCase,PushoverCase,ResponseSpectrumCase— including chained preload viapreload_case_idsand pattern removal for free-vibration runs - ✅
core.constraints:EqualDOFConstraint(multi-point constraints) - ✅
core.project.Projectaggregator with id allocation, validation,validate_references() - ✅
services.persistence:.osmodel(Pydantic JSON) load/save with round-trip-clean assertion in every example script
- ✅
services.opensees_runner.OpenSeesRunneremits commands in the canonical order documented inarchitecture.md - ✅ Verified examples (matched analytically or against the OpenSees Wiki Tcl reference): cantilever (point + UDL), portal frame, basic truss, SDOF pushover, RC frame gravity / pushover / earthquake, Examples 1–4 family, two-storey shear / one-bay frames, simply supported beam with quad elements
- ✅
AnalysisWorker(QObject)runnable inside aQThreadwithprogress(int)/log(str)/finished(ResultsHandle)signals
- ✅
views.canvas3d.ModelCanvas(subclass ofQtInteractorfrom pyvistaqt) - ✅ Grid plane, world axes triad, view-cube-style preset buttons (Isometric / Top XY / Front XZ / Right YZ), parallel projection toggle
- ✅ Node rendering as glyphs; element rendering as tubes (frames / trusses) and shells (quads); supports rendered as gizmos
- ✅ Mouse picking →
nodePicked/elementPickedsignals; pixel-space grid snap (rejects clicks more than 15 px from an intersection) - ✅ Selection highlighting with in-place colour updates
- ✅ Grid system dialog (X / Y / Z spacing, generates nodes); SAP2000-style table editor; off-grid clicks rejected
- ✅ Working-plane filter — grid + snap restricted to the active level
- ✅ Draw Node / Draw Frame / Draw Truss tools with hover snap highlight
- ✅ Inline element editing from the Properties dock (truss area, any scalar field)
- ✅ Assign Support tool (Free / Pin / Roller / Fix + custom 6-DOF dialog)
- ✅ Assign Load: nodal loads, distributed beam loads, ground motions
- ✅ Assign EqualDOF (multi-point constraints) from the UI
- ✅ Show Extruded Sections toolbar shortcut
- ✅ Undo / Redo via
QUndoStackfor every model mutation - 🟡 Replicate / Mirror / Move / Extrude — basic copy works; story-extrude and mirror still pending
- ✅ Material library dialog (CRUD)
- ✅ Section library dialog (incl.
FiberSectionrows that previously crashed are now handled) - ✅ Property editor dock — context-aware, multi-selection assignment, inline mass editor
- 🟡 Fiber-section visual editor — exists; some UI polish still needed
- ✅ Analysis case manager dialog with case-type factories
- ✅ Run dialog with progress + log + cancel
- ✅ Per-run Rayleigh damping override (no project mutation)
- ✅ Results stored to
<project>.osresults.h5 - 🟡 Convergence diagnostics view (residuals per step) — partial info in run log; dedicated diagnostics dock pending
- ✅ Deformed shape with scale-factor slider
- ✅ Mode-shape animator (1-indexed; play / scrub / scale)
- ✅ Element force diagrams (axial, shear, moment) with auto-pick of the largest-magnitude component on dock open, numerical labels at global min/max ends
- ✅ Time-history plotter (pyqtgraph) with displacement / velocity / acceleration switching
- ✅ Hysteresis plotter — node DOF orbits and element local-force loops
- ✅ Pushover curve view in display units
- ✅ Response-spectrum view (Sa-T curve with modal-period markers and a mass-participation table)
- ✅ Snapshot / video export (mode shapes + time histories) via
imageio[ffmpeg] - ⬜ Render performance pass — collapse per-entity actors into glyphed PolyData (single draw call), in-place colour updates for selection, AA, lower-tessellation spheres. Target: 10k nodes / 20k frames @ 30 fps
- ✅
HystereticMaterial,BeamWithHinges,FiberSection→ all flowing into the runner, end-to-end pushover example - ✅ Response spectrum generator + SRSS / CQC modal combination
- ✅ Ground-motion import via
PathTimeSeries+UniformExcitationPattern, with an example wired up against the OpenSees A10000 record - ✅
ZeroLengthSectionElementfor moment-curvature workflows; closed-form verification example shipped - ⬜ Seismic isolators:
elastomericBearing*,frictionPendulumBearing,singleFPBearing,TripleFrictionPendulum - ⬜ Ground-motion library (PEER-style record set + scaling tools)
- ⬜ IDA (Incremental Dynamic Analysis) batch runner
- 🟡 Fiber-section editor — exists for rectangular / circular sections; confined / unconfined visual presets pending
- ✂️ Code-checking (TBDY-2018, ASCE 41, Eurocode 8)
- ✂️ Soil-structure interaction GUI
- ✂️ Cloud / collaborative editing
- ✂️ Native shell-element rendering / pre-processing (quads exist as a primitive, but a proper shell workflow is its own phase)