T-Stoss: materialgleicher Nah-Putz verschmilzt ohne L-Trennnaht (TS+Rust)

Die L-Seitenlinie am T-Stoss wird nur noch gezeichnet, wenn der getrimmte
Abzweig-Putz materialFREMD zum durchgehenden Nah-Putz der Durchgangswand ist.
Bei materialgleichem Putz (z. B. iw-Innenputz auf iw-Innenputz) fuellt der
Nah-Putz die Putzflanken durchgehend (spanCutout schneidet nur die Kernbreite)
-> durchgehendes Putz-L ohne Naht. Tests entsprechend gezogen.
This commit is contained in:
2026-07-04 23:17:18 +02:00
parent 9a80d9cf42
commit aa4205bf0b
4 changed files with 58 additions and 33 deletions
+27 -10
View File
@@ -228,6 +228,18 @@ fn apply_layer_cuts(
// Rueckgrat-Nahflaeche ab (nicht an der Wandachse). In einem Block, damit die
// mutable Ausleihe von `result[branch_wall_idx]` vor dem Zugriff auf die
// Durchgangswand unten endet.
// Nah-Putz-Komponenten der Durchgangswand (dieselbe sign-Seite wie
// near_plaster oben): ist die getrimmte Abzweig-Schicht materialgleich mit
// einer davon, fuellt der Nah-Putz den Abzweig-Putz an dieser Stelle
// durchgehend (spanCutout schneidet nur die KERN-Breite aus, nicht die
// schmalen Putzflanken) -> Putz-L OHNE Trennnaht, also KEINE L-Seitenlinie.
let near_plaster_comps: Vec<&str> = through_layers
.iter()
.enumerate()
.filter(|(i, _)| if sign > 0.0 { *i > backbone_idx } else { *i < backbone_idx })
.map(|(_, l)| l.component_id.as_str())
.collect();
{
let side_line = merge_cut;
let (face_arr, side_arr) = match branch_end {
@@ -238,7 +250,13 @@ fn apply_layer_cuts(
face_arr[i] = if merged[i] { Some(merge_cut) } else { Some(face_cut) };
let adj_merged =
!merged[i] && ((i > 0 && merged[i - 1]) || (i + 1 < n && merged[i + 1]));
side_arr[i] = if adj_merged { Some(side_line) } else { None };
let merges_with_near_plaster =
near_plaster_comps.contains(&branch_layers[i].component_id.as_str());
side_arr[i] = if adj_merged && !merges_with_near_plaster {
Some(side_line)
} else {
None
};
}
}
@@ -936,8 +954,8 @@ mod tests {
// Wie t_junction_branch_gets_face_cut, aber alle drei Waende vom
// W9-artigen Wandtyp: der Backstein-Kern (Index 1) sticht durch den
// Nah-Putz und stoppt an der Kern-Nahflaeche (y=0.06), die beiden
// Innenputz-Schichten (Index 0/2) werden getrimmt und bekommen
// zusaetzlich die seitliche L-Linie an derselben Flaeche.
// Innenputz-Schichten (Index 0/2) werden getrimmt. Da der Nah-Putz der
// Durchgangswand materialgleich ist, entsteht KEINE L-Trennnaht.
let input = JoinInput {
walls: vec![
w_iw("A", 0.0, 0.0, 5.0, 0.0),
@@ -972,13 +990,12 @@ mod tests {
let l2 = lc.start[2].expect("Schicht 2 getrimmt");
assert!((l0.point.y - 0.075).abs() < 1e-9);
assert!((l2.point.y - 0.075).abs() < 1e-9);
// ... UND die seitliche L-Linie an der Rueckgrat-Nahflaeche (y=0.06,
// parallel zur x-Achse).
let s0 = lc.start_side[0].expect("Schicht 0 hat L-Seitenlinie");
let s2 = lc.start_side[2].expect("Schicht 2 hat L-Seitenlinie");
assert!(dist(s0, Vec2 { x: 5.0, y: 0.06 }) < 1e-9);
assert!(dist(s0, Vec2 { x: 0.0, y: 0.06 }) < 1e-9);
assert!(dist(s2, Vec2 { x: 5.0, y: 0.06 }) < 1e-9);
// ... aber KEINE seitliche L-Linie: der Innenputz der Durchgangswand ist
// materialgleich und fuellt den getrimmten Abzweig-Putz durchgehend
// (Putz-L ohne Trennnaht). Nur bei materialFREMDEM Nah-Putz stuende hier
// eine L-Linie.
assert!(lc.start_side[0].is_none());
assert!(lc.start_side[2].is_none());
// Die kollineare Durchgangswand bleibt bei den layerCuts unangetastet.
let ca = find(&out, "A");