![]() |
SWMMVis
6.0.0-alpha.4
Qt6/C++ GIS-based graphical user interface for the SWMMVis engine (6.0.0-alpha.4)
|
MDI sub-window owning a MapCanvas, SWMMModelLayer, and map tools. More...
#include <swmmvisprojectwindow.h>
Signals | |
| void | modelLoaded () |
| void | modelLoadError (const QString &msg) |
| void | modelLoadFinished (bool ok, const QList< QString > &warnings, const QList< QString > &errors) |
| void | saveCompletedWithEngineWarnings (const QStringList &warnings) |
| void | meshImportFinished (bool ok, const QString &message, const QString &meshPath) |
| void | hasChangesChanged (bool dirty) |
| void | editSessionChanged (bool active) |
| void | offsetModeChanged (bool elevation) |
| void | autoLengthChanged (bool enabled) |
| void | activeResultsLayerChanged (SWMMResultsLayer *layer) |
| void | active2DResultsLayerChanged (SWMM2DResultsLayer *layer) |
| void | pick2DCellsPicked (class SWMM2DResultsLayer *layer, const QVector< int > &triIdxList, const QVector< openswmmvis::plot::PlotAttribute > &attrs) |
| void | meshProfileTraced (const QVector< QPointF > &scenePolyline) |
| void | analysisMeshProfileTraced (const QVector< QPointF > &scenePolyline) |
| void | terrainProfileTraced (const QVector< QPointF > &scenePolyline) |
| void | meshEdgeFluxRequested (class SWMM2DMeshLayer *mesh, int triIdx, int edgeLocal, openswmmvis::plot::PlotAttribute attr) |
| void | meshEdgeStatusMessage (const QString &message) |
| void | meshVertexSeriesRequested (class SWMM2DMeshLayer *mesh, const QVector< int > &vertexIdxList, const QVector< openswmmvis::plot::PlotAttribute > &attrs) |
| void | activeTerrainChanged (GISRasterLayer *newTerrain) |
| void | aboutToClose () |
Public Member Functions | |
| SWMMVisProjectWindow (OpenSWMMVisWorkspace *workspace, const QString &filePath=QString(), QWidget *parent=nullptr) | |
| ~SWMMVisProjectWindow () override | |
| MapCanvas * | canvas () const |
| SWMMModelLayer * | modelLayer () const |
| UnitSystem * | unitSystem () const |
| SelectionManager * | selectionManager () const |
| bool | isElevationOffsetMode () const |
| void | setElevationOffsetMode (bool elevation) |
| void | convertLinkOffsets (bool toElevation, bool convertValues) |
| void | reloadElevationOffsetModeFromEngine () |
| bool | loadModel (QList< QString > &warnings, QList< QString > &errors) |
| void | attachMeshLayer (class SWMM2DMeshLayer *meshLayer, bool pristine=false) |
| Subscribe a 2D mesh layer's edit signals to the project's dirty flag. | |
| void | importMeshFileAsync (const QString &srcPath) |
| Browse-and-load an existing SWMMVis 2D mesh (.2dm) into this project. | |
| void | loadModelAsync (class OpenProgressModel *progress=nullptr) |
| Non-blocking variant of loadModel(). | |
| bool | initializeBlankModel (const SWMMModelLayer::NewProjectSpec &spec, QList< QString > &warnings, QList< QString > &errors) |
In-memory File → New: build a blank BUILDING-state engine from spec (SWMMModelLayer::adoptNewEngine) and finish the load synchronously. The window keeps its empty model path until the first Save As. | |
| bool | save (QString *errorOut=nullptr) |
| Save the model to its current path or to a new path. | |
| bool | saveAs (const QString &newPath, QString *errorOut=nullptr) |
| QStringList | lastSaveWarnings () const |
| bool | hasChanges () const |
| void | setHasChanges (bool dirty) |
| bool | isEditSessionActive () const |
| void | setEditSessionActive (bool active) |
| bool | isUntitled () const |
| bool | isClosing () const |
| void | markUntitled () |
| void | activatePanTool () |
| void | activateZoomInTool () |
| void | activateZoomOutTool () |
| void | activateSelectTool () |
| void | activateSelectByPolygonTool () |
| void | activateMeasureTool () |
| void | activateSelectProfileTool () |
| void | activatePick2DCellsTool () |
| void | activateMeshProfileTool () |
| void | activateAnalysisMeshProfileTool () |
| void | activateTerrainProfileTool () |
| bool | hasModelLayer () const |
| bool | hasMeshLayer () const |
| void | activateMeshSelectVertexTool () |
| void | activateMeshSelectEdgeTool () |
| class OpenSWMMVisMapToolSelect * | selectTool () const |
| class OpenSWMMVisMapToolSelectProfile * | selectProfileTool () const |
| class OpenSWMMVisMapToolAddVirtualNode * | addVirtualJunctionTool () const |
| QList< OpenSWMMVisMapToolAddNode * > | addNodeTools () const |
| class OpenSWMMVisMapToolAddInletNode * | addInletJunctionTool () const |
| class MapToolPick2DCells * | pick2DCellsTool () const |
| class MapToolMeshProfile * | meshProfileTool () const |
| class openswmmvis::OutputStatsRegistry * | statsRegistry () const |
| SWMMResultsLayer * | activeResultsLayer () const |
| SWMM2DResultsLayer * | active2DResultsLayer () const |
| void | setActiveResultsLayer (SWMMResultsLayer *layer) |
| void | setActive2DResultsLayer (SWMM2DResultsLayer *layer) |
| void | setPending2DResultsRestore (const QJsonArray &entries) |
| QJsonArray | pending2DResultsRestore () const |
| void | clearPending2DResultsRestore () |
| QHash< class OpenSWMMVisMapTool *, QString > | toolActionKeys () const |
| void | activateAddJunctionTool () |
| void | activateAddVirtualJunctionTool () |
| void | activateAddInletJunctionTool () |
| void | activateAddOutfallTool () |
| void | activateAddStorageTool () |
| void | activateAddDividerTool () |
| void | activateAddConduitTool () |
| void | activateAddPumpTool () |
| void | activateAddOrificeTool () |
| void | activateAddWeirTool () |
| void | activateAddOutletTool () |
| void | activateAddGageTool () |
| void | activateAddSubcatchmentTool () |
| void | activateAddTextTool () |
| void | zoomToFullExtent () |
| OpenSWMMVisAnnotationLayer * | annotationLayer () const |
| OpenSWMMVisAnnotationLayer * | ensureAnnotationLayer () |
| bool | isAutoLengthEnabled () const |
| void | setAutoLengthEnabled (bool enabled) |
| QString | engineVersion () const |
| void | setEngineVersion (const QString &version) |
| QString | notesHtml () const |
| void | setNotesHtml (const QString &html) |
| QString | activeTerrainLayerPath () const |
| GISRasterLayer * | activeTerrain () const |
| double | terrainVertFactor () const |
| double | terrainNodeOffset () const |
| double | terrainLinkOffset () const |
| void | setActiveTerrain (GISRasterLayer *layer) |
| Sets the active terrain raster and propagates it to all add-node and add-link tools owned by this window. | |
| void | setTerrainNodeOffset (double offset) |
| void | setTerrainLinkOffset (double offset) |
| QString | terrainVerticalUnit () const |
| void | setTerrainVerticalUnit (const QString &unit) |
| Sets the terrain raster's vertical unit and updates the conversion factor applied when computing node/link invert elevations. | |
| void | restoreTerrainState (const QString &absoluteLayerPath, double nodeOffset, double linkOffset, const QString &vertUnit=QString()) |
| Restores terrain state from a persisted .oswp session. Called by ProjectSerializer::applySession after all layers are loaded. | |
Protected Member Functions | |
| void | closeEvent (QCloseEvent *event) override |
| void | changeEvent (QEvent *event) override |
| bool | eventFilter (QObject *watched, QEvent *event) override |
MDI sub-window owning a MapCanvas, SWMMModelLayer, and map tools.
One instance is created per opened .inp file.
|
explicit |
|
overridedefault |
|
signal |
Fires once during closeEvent, AFTER the user-prompt save / cancel decision is committed but BEFORE the QMdiSubWindow teardown has begun. All owned QObjects (model layer, results layers, canvas, etc.) are still alive and safe to dereference. External windows that hold raw back-pointers to this project (e.g. ProfilePlotDialog) connect here so they can drop their references gracefully — using QObject::destroyed instead is unsafe because by the time it fires the children are already gone.
| void SWMMVisProjectWindow::activateAddConduitTool | ( | ) |
| void SWMMVisProjectWindow::activateAddDividerTool | ( | ) |
| void SWMMVisProjectWindow::activateAddGageTool | ( | ) |
| void SWMMVisProjectWindow::activateAddInletJunctionTool | ( | ) |
| void SWMMVisProjectWindow::activateAddJunctionTool | ( | ) |
| void SWMMVisProjectWindow::activateAddOrificeTool | ( | ) |
| void SWMMVisProjectWindow::activateAddOutfallTool | ( | ) |
| void SWMMVisProjectWindow::activateAddOutletTool | ( | ) |
| void SWMMVisProjectWindow::activateAddPumpTool | ( | ) |
| void SWMMVisProjectWindow::activateAddStorageTool | ( | ) |
| void SWMMVisProjectWindow::activateAddSubcatchmentTool | ( | ) |
| void SWMMVisProjectWindow::activateAddTextTool | ( | ) |
| void SWMMVisProjectWindow::activateAddVirtualJunctionTool | ( | ) |
| void SWMMVisProjectWindow::activateAddWeirTool | ( | ) |
| void SWMMVisProjectWindow::activateAnalysisMeshProfileTool | ( | ) |
Slice US.A1 — the ANALYSIS-toolbar 2D-surface profile tool: traces the same polyline but plots ground + animated depth + envelope against the active 2D results layer (emits analysisMeshProfileTraced). A second MapToolMeshProfile instance so its checked state tracks actionPlotProfile while the mesh-toolbar tool tracks actionMeshProfile independently.
| void SWMMVisProjectWindow::activateMeasureTool | ( | ) |
| void SWMMVisProjectWindow::activateMeshProfileTool | ( | ) |
Trace a free-form polyline across the 2D mesh to plot a longitudinal profile. Lazy-creates the tool; toggles back to Select when already active (mirrors activateSelectProfileTool).
Slice US.A1 — this is the MESH-TOOLBAR profile tool: bed/terrain only (emits meshProfileTraced, routed to a results=nullptr dialog). The Analysis-toolbar water-depth variant is activateAnalysisMeshProfileTool.
| void SWMMVisProjectWindow::activateMeshSelectEdgeTool | ( | ) |
Slice §V.VB — activate the Mesh Edge Select tool. Lazy-creates on first call.
| void SWMMVisProjectWindow::activateMeshSelectVertexTool | ( | ) |
Slice §V.VB — activate the Mesh Vertex Select tool. Lazy-creates on first call.
| void SWMMVisProjectWindow::activatePanTool | ( | ) |
| void SWMMVisProjectWindow::activatePick2DCellsTool | ( | ) |
Slice CF.3 — activate the Pick 2D Cells tool on this canvas. Lazy-creates the tool on first call. No-op when no 2D results layer is loaded.
| void SWMMVisProjectWindow::activateSelectByPolygonTool | ( | ) |
| void SWMMVisProjectWindow::activateSelectProfileTool | ( | ) |
| void SWMMVisProjectWindow::activateSelectTool | ( | ) |
| void SWMMVisProjectWindow::activateTerrainProfileTool | ( | ) |
The TERRAIN-TOOLBAR profile tool: traces the same polyline but plots a ground profile sampled from the active DEM raster rather than the 2D mesh (emits terrainProfileTraced). A third MapToolMeshProfile instance — the tool is purely geometric — so its checked state tracks actionTerrainProfile independently of the two mesh profile actions.
| void SWMMVisProjectWindow::activateZoomInTool | ( | ) |
| void SWMMVisProjectWindow::activateZoomOutTool | ( | ) |
| SWMM2DResultsLayer * SWMMVisProjectWindow::active2DResultsLayer | ( | ) | const |
Active 2D results layer for analysis tools (may be null).
|
signal |
| SWMMResultsLayer * SWMMVisProjectWindow::activeResultsLayer | ( | ) | const |
Active 1D results layer for analysis tools (may be null). Defined out-of-line so the QPointer→T* conversion is only instantiated in the .cpp (which includes the full layer headers); a forward declaration is insufficient for QPointer's internal static_cast.
|
signal |
Fires when the active 1D / 2D results layer changes (including to null). The main window re-points the shared AnimationController, the analysis-toolbar combos, and the layer-tree check-state at these.
|
inline |
Direct (non-owning) accessor to the active terrain raster. Used by Slice BC's profile plot when the user wants the ground line to follow a DEM rather than the rim formula (invert + maxDepth).
|
signal |
Slice BC — fires whenever the active terrain raster changes (set / cleared / swapped) or its vertical-unit conversion factor is updated. The profile-plot dialog listens so the ground line stays in sync with the toolbar's terrain selection.
| QString SWMMVisProjectWindow::activeTerrainLayerPath | ( | ) | const |
Returns the file path of the active terrain raster (empty if none).
|
inline |
Inlet-junction insertion tool (click-a-street-conduit split). Exposed for the same reason as the virtual-junction tool above.
|
inline |
The generic add-node tools (junction / outfall / storage / divider), which also split a conduit when the click lands on one. Exposed so SWMMVis can route their statusMessageChanged to the status bar.
|
inline |
Virtual-junction insertion tool (click-a-conduit split). Exposed so SWMMVis can route its statusMessageChanged to the status bar.
|
signal |
|
inline |
Annotation layer for user-placed text labels. Lazily added to the canvas on first text placement; non-null after that point.
| void SWMMVisProjectWindow::attachMeshLayer | ( | class SWMM2DMeshLayer * | meshLayer, |
| bool | pristine = false |
||
| ) |
Subscribe a 2D mesh layer's edit signals to the project's dirty flag.
Every mesh mutation funnels through SWMM2DMeshLayer::apply* and reports via attributeChanged / meshEditsChanged. Without this the project stays "clean" after a cell edit, so Run skips its auto-save and the engine re-reads the stale .inp — the edit silently never reaches the solver. Call once per mesh layer, right after it joins the canvas.
| pristine | Pass true only when the layer was built from the very file the engine parsed, so the two meshes are known to agree and the save path may skip re-pushing this layer until something edits it. The default (false) is the safe one: a mesh generated or imported in-session leaves the engine holding the old mesh. |
|
signal |
| MapCanvas * SWMMVisProjectWindow::canvas | ( | ) | const |
|
overrideprotected |
|
inline |
|
overrideprotected |
| void SWMMVisProjectWindow::convertLinkOffsets | ( | bool | toElevation, |
| bool | convertValues | ||
| ) |
Apply the answer to the legacy UpdateOffsets convert prompt after the mode flip (see SWMMModelLayer::convertLinkOffsets) and mark the project dirty.
| toElevation | the mode switched TO; |
| convertValues | the prompt answer (true = Yes). |
|
signal |
|
inline |
Engine version selector (e.g., "5.3.0", "6.0.0", "6.0.0-alpha.1"). Per-project, persisted to project file.
| OpenSWMMVisAnnotationLayer * SWMMVisProjectWindow::ensureAnnotationLayer | ( | ) |
Get-or-create accessor used by ProjectSerializer to restore annotations before any tool has been activated.
|
overrideprotected |
|
inline |
Whether the project has unsaved changes.
|
signal |
| bool SWMMVisProjectWindow::hasMeshLayer | ( | ) | const |
| bool SWMMVisProjectWindow::hasModelLayer | ( | ) | const |
Slice US.A2 — availability probes for the context-sensitive Plot Profile dispatcher: is there a 1D SWMM model / a 2D mesh on the canvas?
| void SWMMVisProjectWindow::importMeshFileAsync | ( | const QString & | srcPath | ) |
Browse-and-load an existing SWMMVis 2D mesh (.2dm) into this project.
Until now a .2dm could only reach a model by already sitting next to its .inp (Simulation Options → Mesh only lists siblings of the model file). This stages a mesh from anywhere on disk: the file is copied next to the .inp when it lives elsewhere — so the saved [2D_MESH_FILE] reference stays relative and the project remains portable — then parsed and built on a worker thread and added to the canvas as the ACTIVE external mesh. That is the layer the save path retargets [2D_MESH_FILE] at, so the import survives save → reopen.
Existing mesh layers are kept (merely deactivated); a layer already reading the destination file is replaced rather than stacked, matching the mesh-generation path.
Asynchronous — the outcome arrives via meshImportFinished().
| bool SWMMVisProjectWindow::initializeBlankModel | ( | const SWMMModelLayer::NewProjectSpec & | spec, |
| QList< QString > & | warnings, | ||
| QList< QString > & | errors | ||
| ) |
In-memory File → New: build a blank BUILDING-state engine from spec (SWMMModelLayer::adoptNewEngine) and finish the load synchronously. The window keeps its empty model path until the first Save As.
|
inline |
Auto-length recalculates conduit length from polyline on every endpoint / vertex edit. Per-project, persisted to QSettings.
|
inline |
True from the moment closeEvent() commits to closing (just before aboutToClose() fires) — the window is still in the MDI area's subWindowList() then, so callers that scan it for "live" project windows must skip a closing one or they rebind to a dying canvas.
|
inline |
Whether an editing session is active (gate for all geometry mutations).
|
inline |
Offset mode (LINK_OFFSETS option). True = ELEVATION, false = DEPTH.
|
inline |
Slice Y — flag a window as a fresh, never-saved project. Untitled windows skip recent-files registration, force the title to "Untitled[*]", route Save through Save As, and always prompt on close (Save As… / Discard / Cancel) — the model lives only in memory until the first successful Save As clears the flag.
|
inline |
Engine warnings the LAST successful saveAs() produced (empty when the save was clean, or none has run). The writer reports through the engine's warning list — notably "embedded [REACTION_*] sections are lost from this save" (engine 7d43a1ff) — and saveAs() captures the delta across the write so callers and tests can see exactly what THIS save said, not the whole accumulated history.
| bool SWMMVisProjectWindow::loadModel | ( | QList< QString > & | warnings, |
| QList< QString > & | errors | ||
| ) |
| void SWMMVisProjectWindow::loadModelAsync | ( | class OpenProgressModel * | progress = nullptr | ) |
Non-blocking variant of loadModel().
Runs the engine create+open (the dominant cost — full .inp parse) in a QtConcurrent worker so the GUI event loop stays responsive; completes the load (SoA adoption, CRS resolution, canvas zoom) on the GUI thread and then emits modelLoadFinished(). Safe against the window being closed mid-load.
| progress | Optional determinate-progress sink. The worker reports into the EngineParse / SoaCopy / GeomCache stages; null is the "nobody is watching" case used by tests and the sync path. |
| void SWMMVisProjectWindow::markUntitled | ( | ) |
|
signal |
Forwards MapToolMeshSelectEdge::plotEdgeFluxRequested up to the main window so it can open the comparison plot with the edge's flow OR flux series (carried by attr).
|
signal |
Forwards MapToolMeshSelectEdge::statusMessageChanged (Ctrl-click boundary path picking hints) up to the main window's status bar.
|
signal |
Completion signal for importMeshFileAsync(): fired exactly once per call, on the GUI thread. meshPath is the file the new layer reads (the copy inside the project folder, when one was made) and is empty on failure. message is user-facing (an error, or a summary plus any reader warning).
|
inline |
Free-form 2D-mesh profile-trace tool. Null until first activation.
|
signal |
Forwards MapToolMeshProfile::profilePathTraced up to the main window so it can open the MeshProfilePlotDialog. The polyline is in scene coords (sx = mapX, sy = -mapY).
Slice US.A1 — meshProfileTraced is the MESH-TOOLBAR (bed-only) channel; analysisMeshProfileTraced is the ANALYSIS (ground+depth+envelope) channel. Same polyline payload; different dialog target.
|
signal |
Forwards MapToolMeshSelectVertex::plotVertexSeriesRequested up to the main window so it can plot the chosen interpolated attributes (depth / HGL) for the vertices.
| SWMMModelLayer * SWMMVisProjectWindow::modelLayer | ( | ) | const |
|
signal |
|
signal |
|
signal |
Completion signal for loadModelAsync(): fired exactly once per call, on the GUI thread, after the model is fully adopted (success) or the open failed. Warnings/errors carry the same diagnostics the sync loadModel() returns via out-params.
|
inline |
Rich-text notes mirrored to the engine's [TITLE] section as plain text. HTML form is preserved in the .oswp sidecar; the engine only ever sees the flattened plain text.
|
signal |
|
inline |
|
signal |
Slice CF.3 — forwards MapToolPick2DCells::cellsPicked up to the main window so it can open the Comparison Plot Dialog.
|
inline |
Slice CF.3 — Pick 2D mesh cells tool (box + lasso). Returns null until a SWMM2DResultsLayer exists on the canvas (created lazily on first access via activatePick2DCellsTool).
| void SWMMVisProjectWindow::reloadElevationOffsetModeFromEngine | ( | ) |
Re-read LINK_OFFSETS from the engine into the cached mElevationOffsetMode flag. Used by the main-window listener for SWMMModelLayer::optionsChanged so the status-bar checkbox refreshes after a Simulation Options Apply.
| void SWMMVisProjectWindow::restoreTerrainState | ( | const QString & | absoluteLayerPath, |
| double | nodeOffset, | ||
| double | linkOffset, | ||
| const QString & | vertUnit = QString() |
||
| ) |
Restores terrain state from a persisted .oswp session. Called by ProjectSerializer::applySession after all layers are loaded.
| absoluteLayerPath | Absolute path of the saved raster (may be empty). |
| nodeOffset | Saved node invert offset. |
| linkOffset | Saved link invert offset. |
| vertUnit | Saved vertical unit ("m" or "ft"). |
| bool SWMMVisProjectWindow::save | ( | QString * | errorOut = nullptr | ) |
Save the model to its current path or to a new path.
| bool SWMMVisProjectWindow::saveAs | ( | const QString & | newPath, |
| QString * | errorOut = nullptr |
||
| ) |
|
signal |
Fired after a SUCCESSFUL save whose engine write emitted warnings — the save-time analogue of the open path's warning routing. The list is the delta across this write only. Data-loss notices (embedded [REACTION_*] dropped) arrive here; SWMMVis routes every entry to the log panel and escalates the data-loss family to a modal.
| SelectionManager * SWMMVisProjectWindow::selectionManager | ( | ) | const |
|
inline |
Same direct-access pattern for Slice BC's profile tool — lets SWMMVis connect profilePathSelected to the ProfilePlotDialog spawner.
|
inline |
Direct access to the Select tool so the main window can wire its context-menu plotTimeSeriesRequested into the same chart dialog that Object Browser right-clicks use.
| void SWMMVisProjectWindow::setActive2DResultsLayer | ( | SWMM2DResultsLayer * | layer | ) |
Set the active 2D results layer. Same contract as the 1D setter.
| void SWMMVisProjectWindow::setActiveResultsLayer | ( | SWMMResultsLayer * | layer | ) |
Set the active 1D results layer. No-op if unchanged. Rejects a layer not currently on this window's canvas. Passing nullptr clears the selection (analysis tools then report "no results"). Emits activeResultsLayerChanged on a real change.
| void SWMMVisProjectWindow::setActiveTerrain | ( | GISRasterLayer * | layer | ) |
Sets the active terrain raster and propagates it to all add-node and add-link tools owned by this window.
| layer | Raster layer to sample; nullptr = no terrain assistance. |
| void SWMMVisProjectWindow::setAutoLengthEnabled | ( | bool | enabled | ) |
| void SWMMVisProjectWindow::setEditSessionActive | ( | bool | active | ) |
| void SWMMVisProjectWindow::setElevationOffsetMode | ( | bool | elevation | ) |
| void SWMMVisProjectWindow::setEngineVersion | ( | const QString & | version | ) |
| void SWMMVisProjectWindow::setHasChanges | ( | bool | dirty | ) |
Mark the project dirty/clean (also updates the title).
|
inline |
|
inline |
2D results restore entries stashed by ProjectSerializer::applySession (the .h5 open is asynchronous and runs after the sidecar applies). Consumed once by the 2D auto-load; entries carry absolute .h5 paths plus the persisted layer settings and sublayer styles.
| void SWMMVisProjectWindow::setTerrainLinkOffset | ( | double | offset | ) |
Sets link offset and forwards it to all add-link tools.
| void SWMMVisProjectWindow::setTerrainNodeOffset | ( | double | offset | ) |
Sets node offset and forwards it to all add-node tools.
| void SWMMVisProjectWindow::setTerrainVerticalUnit | ( | const QString & | unit | ) |
Sets the terrain raster's vertical unit and updates the conversion factor applied when computing node/link invert elevations.
|
inline |
Slice QA.2 — per-project registry that tags every loaded SWMMResultsLayer with a stable identity. Owned by the project window; lives for the project's lifetime. Consumers (the node attribute panel today, Slice CB Statistics dashboard tomorrow) read from this single source of truth so the "which output produced these stats?" answer is uniform across the GUI. Never null.
|
inline |
Signed link endpoint invert offset relative to terrain Z.
|
inline |
Signed node invert offset relative to terrain Z (model vertical units).
|
signal |
The TERRAIN-TOOLBAR channel — same polyline payload, but the main window routes it to a RasterProfilePlotDialog sampling the active DEM raster.
|
inline |
Multiplier that converts a raw raster sample (in the DEM's native vertical unit) into the model's vertical unit. Returns 1.0 when no terrain is active. Stays in sync with FLOW_UNITS changes via setTerrainVerticalUnit + the unitsChanged handler.
|
inline |
Vertical unit of the active terrain raster ("m" or "ft").
| QHash< OpenSWMMVisMapTool *, QString > SWMMVisProjectWindow::toolActionKeys | ( | ) | const |
Maps each tool pointer to a stable action-object-name key so the main window can sync toolbar checked states via activeToolChanged.
| UnitSystem * SWMMVisProjectWindow::unitSystem | ( | ) | const |
| void SWMMVisProjectWindow::zoomToFullExtent | ( | ) |