forked from 1b-agent/opencadstudio-upstream
Adds a "Storm Sewer" ribbon tab backed by a new in-repo `stormsewer` engine crate (vendored under crates/). The engine implements standard public-domain methods — Rational-method peak-flow accumulation, Manning circular-pipe hydraulics, time-of-concentration / IDF intensity, and an HGL backwater pass with junction losses — with 24 unit tests and no external dependencies. Module (src/modules/storm_sewer/): - Drafting: SS_INLET / SS_JUNCTION / SS_OUTFALL place structure markers and SS_PIPE chains pipe runs (interactive CadCommands). - Analysis: SS_ANALYZE / SS_REPORT / SS_PROFILE open a .ssn network file, run the engine, draw the plan and HGL long-section, and print a report. - SVG icons; SS_* commands registered for command-line autocomplete. Integration is additive: build.rs auto-discovers the module and one dispatch block is added to src/app/commands.rs. 7 module integration tests. See src/modules/storm_sewer/INTEGRATION.md for the design and the optional follow-up (drive analysis from canvas geometry via XDATA). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46 lines
1.4 KiB
Rust
46 lines
1.4 KiB
Rust
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
//! # stormsewer
|
|
//!
|
|
//! Native-Rust storm-sewer network **hydrology & hydraulics** engine.
|
|
//!
|
|
//! It implements the standard, public-domain methods used by tools such as
|
|
//! Autodesk Hydraflow Storm Sewers:
|
|
//!
|
|
//! * **Rational method** peak-flow accumulation down a pipe network,
|
|
//! * **Manning** open-channel / partial-flow hydraulics for circular conduits,
|
|
//! * normal-depth, critical-depth and full-flow capacity,
|
|
//! * *(forthcoming)* **HEC-22** hydraulic-grade-line backwater with junction
|
|
//! and structure losses.
|
|
//!
|
|
//! This is an **engine only**: no GUI and no CAD dependencies, so it compiles
|
|
//! to a native library, to WASM (for hydrocomplete.com), and is consumable as
|
|
//! a module by an Open CAD Studio fork.
|
|
//!
|
|
//! ```
|
|
//! use stormsewer::{Network, Node, NodeKind, Pipe};
|
|
//! let net = Network {
|
|
//! nodes: vec![
|
|
//! Node::inlet("N1", 100.0, 105.0, 2.0, 0.7),
|
|
//! Node::outfall("OUT", 99.0, 104.0),
|
|
//! ],
|
|
//! pipes: vec![Pipe::new("P1", "N1", "OUT", 100.0, 1.5, 0.013)],
|
|
//! };
|
|
//! let results = net.analyze_rational(4.0).unwrap(); // i = 4 in/hr
|
|
//! assert_eq!(results.len(), 1);
|
|
//! assert!((results[0].design_q - 5.6).abs() < 1e-6); // 4 * (0.7*2.0)
|
|
//! ```
|
|
|
|
pub mod drawing;
|
|
pub mod hydraulics;
|
|
pub mod idf;
|
|
pub mod network;
|
|
pub mod parse;
|
|
pub mod report;
|
|
|
|
pub use drawing::*;
|
|
pub use hydraulics::*;
|
|
pub use idf::*;
|
|
pub use network::*;
|
|
pub use parse::*;
|