Beregn rett fra en BIM-modell, uten bygning.toml
«enok beregn modell.ifc» leser modellen, fletter inn en eventuell tilleggsfil og skriver bygningsbeskrivelsen den kom fram til, i utdatakatalogen, slik at beregningen kan etterprøves. Importen sier nå hvilke bygningsdeler som mangler U-verdi, ikke bare hvor mange. Vinduer og dører uten U-verdi i modellen får en typisk verdi for byggeåret, slik flatene alltid har fått, i stedet for faste 2,4 og 2,0 W/(m²K). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
This commit is contained in:
@@ -481,13 +481,13 @@ fn bygg(
|
||||
let areal = areal_av(a.areal, a.bredde, a.hoyde, &a.polygon);
|
||||
aapningsareal += areal;
|
||||
let vt = vindustyper.get(&a.vindustype);
|
||||
let u = vt.and_then(|v| v.u_verdi).unwrap_or_else(|| {
|
||||
let u = vt.and_then(|v| v.u_verdi);
|
||||
if u.is_none() {
|
||||
merknader.push(format!(
|
||||
"Åpningen «{}» mangler U-verdi i gbXML; satt til 2,4 W/(m²K).",
|
||||
"Åpningen «{}» mangler U-verdi i gbXML; verdien utledes av byggeåret.",
|
||||
a.navn
|
||||
));
|
||||
2.4
|
||||
});
|
||||
}
|
||||
let dor = a.typ.to_lowercase().contains("door");
|
||||
vinduer.push(Vindu {
|
||||
navn: vt
|
||||
@@ -687,7 +687,7 @@ mod tester {
|
||||
// Vinduet.
|
||||
assert_eq!(b.vindu.len(), 1);
|
||||
assert_eq!(b.vindu[0].areal, 3.0);
|
||||
assert_eq!(b.vindu[0].u_verdi, 1.2);
|
||||
assert_eq!(b.vindu[0].u_verdi, Some(1.2));
|
||||
assert_eq!(b.vindu[0].g_verdi, Some(0.5));
|
||||
}
|
||||
|
||||
|
||||
+32
-12
@@ -245,7 +245,7 @@ pub fn fra_tekst_med(tekst: &str, standardnavn: &str, valg: &Importvalg) -> Resu
|
||||
let mut kjellerflater: Vec<Flate> = Vec::new();
|
||||
let mut flater: Vec<Flate> = Vec::new();
|
||||
let mut utelatt: Vec<(String, f64, Option<f64>)> = Vec::new();
|
||||
let mut uten_uverdi = 0usize;
|
||||
let mut uten_uverdi: Vec<String> = Vec::new();
|
||||
let mut uten_geometri = 0usize;
|
||||
let mut asimut_for_vegg: HashMap<u64, f64> = HashMap::new();
|
||||
|
||||
@@ -287,7 +287,7 @@ pub fn fra_tekst_med(tekst: &str, standardnavn: &str, valg: &Importvalg) -> Resu
|
||||
(mot, None)
|
||||
};
|
||||
if d.u_verdi.is_none() {
|
||||
uten_uverdi += 1;
|
||||
uten_uverdi.push(d.navn.clone());
|
||||
}
|
||||
let mal = if i_kjeller {
|
||||
&mut kjellerflater
|
||||
@@ -358,14 +358,12 @@ pub fn fra_tekst_med(tekst: &str, standardnavn: &str, valg: &Importvalg) -> Resu
|
||||
.and_then(|v| asimut_for_vegg.get(v))
|
||||
.copied()
|
||||
.unwrap_or(0.0);
|
||||
let u = u_verdi(&egenskaper, r).unwrap_or_else(|| {
|
||||
uten_uverdi += 1;
|
||||
if dor {
|
||||
2.0
|
||||
} else {
|
||||
2.4
|
||||
}
|
||||
});
|
||||
// Uten U-verdi i modellen lar vi feltet stå tomt, slik at beregningen bruker en
|
||||
// typisk verdi for byggeåret i stedet for en fast standardverdi.
|
||||
let u = u_verdi(&egenskaper, r);
|
||||
if u.is_none() {
|
||||
uten_uverdi.push(navn_av(e, r, if dor { "Dør" } else { "Vindu" }));
|
||||
}
|
||||
vinduer.push(Vindu {
|
||||
navn: navn_av(e, r, if dor { "Dør" } else { "Vindu" }),
|
||||
areal,
|
||||
@@ -445,9 +443,31 @@ pub fn fra_tekst_med(tekst: &str, standardnavn: &str, valg: &Importvalg) -> Resu
|
||||
"{uten_geometri} bygningsdeler er utelatt fordi geometrien ikke ga noe areal."
|
||||
));
|
||||
}
|
||||
if uten_uverdi > 0 {
|
||||
if !uten_uverdi.is_empty() {
|
||||
// Navnene gjør det tydelig hva som må rettes i modellen. Flere elementer av samme
|
||||
// konstruksjon nevnes én gang, med antallet.
|
||||
let mut antall: Vec<(String, usize)> = Vec::new();
|
||||
for navn in &uten_uverdi {
|
||||
let kort = navn.split(" #").next().unwrap_or(navn).trim().to_string();
|
||||
match antall.iter_mut().find(|(n, _)| *n == kort) {
|
||||
Some((_, a)) => *a += 1,
|
||||
None => antall.push((kort, 1)),
|
||||
}
|
||||
}
|
||||
let liste: Vec<String> = antall
|
||||
.iter()
|
||||
.map(|(n, a)| {
|
||||
if *a > 1 {
|
||||
format!("{n} ×{a}")
|
||||
} else {
|
||||
n.clone()
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
merknader.push(format!(
|
||||
"{uten_uverdi} bygningsdeler mangler U-verdi i IFC-filen. Legg inn U-verdier, eller la enok bruke typiske verdier for byggeåret."
|
||||
"{} bygningsdeler mangler U-verdi i IFC-filen: {}. Legg inn U-verdier i modellen, eller la enok bruke typiske verdier for byggeåret.",
|
||||
uten_uverdi.len(),
|
||||
liste.join(", ")
|
||||
));
|
||||
}
|
||||
merknader.push(
|
||||
|
||||
@@ -153,7 +153,7 @@ pub fn fra_tekst(tekst: &str, standardnavn: &str) -> Result<Importrapport> {
|
||||
antall: tall(felt(8)).unwrap_or(1.0),
|
||||
orientering: tall(felt(4)).unwrap_or(0.0),
|
||||
helning: tall(felt(5)).unwrap_or(90.0),
|
||||
u_verdi: u,
|
||||
u_verdi: Some(u),
|
||||
g_verdi: tall(felt(7)),
|
||||
karmandel: None,
|
||||
solskjerming: None,
|
||||
|
||||
Reference in New Issue
Block a user