Regn omkretsen av gulv mot grunnen av geometrien
Release enok / bygg (release) Successful in 1m14s
test / test (push) Successful in 1m17s

B′ etter NS-EN ISO 13370 trenger omkretsen av grunnflaten. Den regnes nå av omrisset til
dekket i modellen, i stedet for å antas av arealet. For Nordhusstykket 5 gir modellen 39,7 m
mot 40 m satt for hånd.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
This commit is contained in:
bl
2026-09-21 20:42:21 +02:00
co-authored by Claude Opus 5
parent 1e5d4f05bf
commit cbb1cedc5b
4 changed files with 23 additions and 3 deletions
Generated
+1 -1
View File
@@ -222,7 +222,7 @@ dependencies = [
[[package]]
name = "enok"
version = "0.4.7"
version = "0.4.8"
dependencies = [
"anyhow",
"approx",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "enok"
version = "0.4.7"
version = "0.4.8"
edition = "2021"
description = "Årlig energiberegning og energirapport for boliger etter NS 3031 (timesmetode, ISO 52016-1)"
license = "MIT"
+5 -1
View File
@@ -187,6 +187,7 @@ pub fn fra_tekst_med(tekst: &str, standardnavn: &str, valg: &Importvalg) -> Resu
normal: flate.map(|f| f.normal),
z: plass.map(|p| p.2).unwrap_or(0.0) + flate.map(|f| f.hoyde).unwrap_or(0.0),
topp: plass.map(|p| p.2).unwrap_or(0.0) + flate.map(|f| f.topp).unwrap_or(0.0),
omkrets: flate.map(|f| f.omkrets()).unwrap_or(0.0),
});
}
@@ -391,7 +392,8 @@ pub fn fra_tekst_med(tekst: &str, standardnavn: &str, valg: &Importvalg) -> Resu
mot,
b_faktor: None,
absorptans: None,
omkrets: None,
omkrets: (typ == FlateType::Gulv && mot == Mot::Grunn && d.omkrets > 0.0)
.then_some(d.omkrets),
dybde: (i_kjeller && mot == Mot::Grunn).then_some(kjellerdybde - over_bakken),
over_terreng: (i_kjeller && mot == Mot::Grunn).then_some(over_bakken),
sone,
@@ -1320,6 +1322,8 @@ struct Del {
z: f64,
/// Overkanten av delen over byggets nullpunkt, m. For en kjellervegg er det overkant mur.
topp: f64,
/// Omkretsen av delens omriss, m. Et gulv mot grunnen trenger den for B.
omkrets: f64,
}
/// Oversetter en fritekstverdi fra modellen til en bygningskategori.
+16
View File
@@ -224,6 +224,22 @@ fn overlapper(a: &[f64; 4], b: &[f64; 4]) -> bool {
dekning(a[0], a[1], b[0], b[1]) && dekning(a[2], a[3], b[2], b[3])
}
impl Hovedflate {
/// Omkretsen av flatens omriss, m, regnet av utstrekningen i flatens eget plan.
///
/// Et gulv mot grunnen trenger omkretsen for B etter NS-EN ISO 13370. Omrisset regnes
/// som et rektangel, som stemmer godt for de fleste grunnflater.
pub fn omkrets(&self) -> f64 {
let bredde = self.plan[1] - self.plan[0];
let lengde = self.plan[3] - self.plan[2];
if bredde > 0.0 && lengde > 0.0 {
2.0 * (bredde + lengde)
} else {
0.0
}
}
}
/// Henter geometrien til et produkt via `Representation`, med én oppføring per geometridel.
pub fn netter_for_produkt(fil: &Fil, representasjon: Option<u64>) -> Vec<Nett> {
let mut deler = Vec::new();