1 Commits
Author SHA1 Message Date
blandClaude Opus 5 cbb1cedc5b 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
2026-09-21 20:42:21 +02:00
4 changed files with 23 additions and 3 deletions
Generated
+1 -1
View File
@@ -222,7 +222,7 @@ dependencies = [
[[package]] [[package]]
name = "enok" name = "enok"
version = "0.4.7" version = "0.4.8"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"approx", "approx",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "enok" name = "enok"
version = "0.4.7" version = "0.4.8"
edition = "2021" edition = "2021"
description = "Årlig energiberegning og energirapport for boliger etter NS 3031 (timesmetode, ISO 52016-1)" description = "Årlig energiberegning og energirapport for boliger etter NS 3031 (timesmetode, ISO 52016-1)"
license = "MIT" 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), 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), 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), 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, mot,
b_faktor: None, b_faktor: None,
absorptans: 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), dybde: (i_kjeller && mot == Mot::Grunn).then_some(kjellerdybde - over_bakken),
over_terreng: (i_kjeller && mot == Mot::Grunn).then_some(over_bakken), over_terreng: (i_kjeller && mot == Mot::Grunn).then_some(over_bakken),
sone, sone,
@@ -1320,6 +1322,8 @@ struct Del {
z: f64, z: f64,
/// Overkanten av delen over byggets nullpunkt, m. For en kjellervegg er det overkant mur. /// Overkanten av delen over byggets nullpunkt, m. For en kjellervegg er det overkant mur.
topp: f64, 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. /// 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]) 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. /// 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> { pub fn netter_for_produkt(fil: &Fil, representasjon: Option<u64>) -> Vec<Nett> {
let mut deler = Vec::new(); let mut deler = Vec::new();