Les høyden av geometrien, og tell dobbeltførte deler én gang
Release enok / bygg (release) Successful in 1m12s
test / test (push) Successful in 1m15s

Noen eksporter legger de samme veggene og dekkene i flere etasjer, og gir dem feil etasje.
Kopiene telles nå én gang, og den kopien som ligger i den etasjen høyden tilsier, er den som
regnes med. Vinduer i en kopi finner fortsatt veggen sin.

Klassifiseringen bruker høyden fra geometrien i stedet for etasjetilknytningen, som kan være
feil: et dekke mot grunnen kjennes på at det ligger nederst eller heter noe med «på grunn»,
og et dekke rett over kjelleren på høyden. Importen sier også hvilke deler som ikke er regnet
med i klimaskjermen, og en terrengmodell som ligger over gulvet i første etasje, forkastes.

Rapporten viser nå enok-versjonen og datoen den er laget.

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-20 20:21:58 +02:00
co-authored by Claude Opus 5
parent 70b9f9c647
commit e7d77547ac
5 changed files with 253 additions and 26 deletions
+39 -1
View File
@@ -530,9 +530,10 @@ fn kilde(r: &Resultat, scenarier: &[(String, Resultat)]) -> String {
}
s.push_str(&format!(
"\n#v(1em)\n#text(size: 8pt, fill: mid)[Beregnet med enok {} etter NS 3031:2025 (timesmetode, \
"\n#v(1em)\n#text(size: 8pt, fill: mid)[Beregnet {} med enok {} etter NS 3031:2025 (timesmetode, \
NS-EN ISO 52016-1). Karakterskala fastsatt av Enova SF, gjeldende fra 1. januar 2026. \
Klimadata: TMY for norske kommuner basert på CERRA 19912020 (CC-BY-4.0).]\n",
i_dag(),
env!("CARGO_PKG_VERSION")
));
s
@@ -550,9 +551,34 @@ fn bunntekst(r: &Resultat) -> String {
if let Some(e) = &b.energiraadgiver {
deler.push(e.clone());
}
deler.push(format!("enok {} · {}", env!("CARGO_PKG_VERSION"), i_dag()));
deler.join(" · ")
}
/// Dagens dato som ISO-8601 i UTC.
fn i_dag() -> String {
let sekunder = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_secs() as i64)
.unwrap_or(0);
let (aar, maaned, dag) = dato_av_dagnummer(sekunder.div_euclid(86_400));
format!("{aar:04}-{maaned:02}-{dag:02}")
}
/// Kalenderdato av antall døgn siden 1970-01-01, etter Howard Hinnants algoritme.
fn dato_av_dagnummer(dager: i64) -> (i64, i64, i64) {
let z = dager + 719_468;
let era = z.div_euclid(146_097);
let doe = z.rem_euclid(146_097);
let yoe = (doe - doe / 1460 + doe / 36_524 - doe / 146_096) / 365;
let doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
let mp = (5 * doy + 2) / 153;
let dag = doy - (153 * mp + 2) / 5 + 1;
let maaned = if mp < 10 { mp + 3 } else { mp - 9 };
let aar = yoe + era * 400 + i64::from(maaned <= 2);
(aar, maaned, dag)
}
fn himmelretning(orientering: f64, helning: f64) -> String {
if helning < 20.0 {
return "horisontal".into();
@@ -566,3 +592,15 @@ fn himmelretning(orientering: f64, helning: f64) -> String {
let i = (((orientering.rem_euclid(360.0)) + 22.5) / 45.0).floor() as usize % 8;
retninger[i].into()
}
#[cfg(test)]
mod tester {
use super::dato_av_dagnummer;
#[test]
fn dagnummer_gir_riktig_dato() {
assert_eq!(dato_av_dagnummer(0), (1970, 1, 1));
assert_eq!(dato_av_dagnummer(19_723), (2024, 1, 1));
assert_eq!(dato_av_dagnummer(20_351), (2025, 9, 20));
}
}