Bauteil: Ansichtsschraffur neben Schnittschraffur

Bauteil trägt jetzt zwei Schraffuren: die bestehende hatchId als
Schnittschraffur (nur wo tatsächlich aufgeschnitten) und ein neues
optionales Feld viewHatchId als Ansichtsschraffur für die frontale,
ungeschnittene Sicht. Die Deckenpoché im Grundriss — die Decke liegt
über der horizontalen Schnittebene, wird also frontal gesehen — nutzt
nun die Ansichtsschraffur (Default weiss/leer) statt pauschal keiner.
Schnitt-Pfade und die echt geschnittene Wand-Grundriss-Poché bleiben
auf der Schnittschraffur. Editierbar im Ressourcen-Manager.
This commit is contained in:
2026-07-03 23:30:48 +02:00
parent 93b70fa95a
commit 04c7334cc4
5 changed files with 64 additions and 12 deletions
+14 -1
View File
@@ -319,8 +319,17 @@ export const de = {
"objinfo.room.editStamp": "Stempel bearbeiten …", "objinfo.room.editStamp": "Stempel bearbeiten …",
"objinfo.wall.floorAboveNone": "Kein oberes Geschoss", "objinfo.wall.floorAboveNone": "Kein oberes Geschoss",
"levels.addFloor": "+ Geschoss", "levels.addFloor": "+ Geschoss",
"levels.addSection": "+ Schnitt",
"levels.addElevation": "+ Ansicht",
"levels.addDrawing": "+ Zeichnung", "levels.addDrawing": "+ Zeichnung",
"layers.addCategory": "+ Ebene", "layers.addCategory": "+ Ebene",
// ── Zeichnungsebenen: Kategorie-Titel (einklappbare Gruppen) ─────────────
"levelCat.floor": "Geschosse",
"levelCat.section": "Schnitte",
"levelCat.elevation": "Ansichten",
"levelCat.drawing": "2D-Zeichnungen",
"levelCat.collapse": "Kategorie ein-/ausklappen",
"nav.visibility": "Sichtbarkeit", "nav.visibility": "Sichtbarkeit",
"nav.hide": "Ausblenden", "nav.hide": "Ausblenden",
"nav.show": "Einblenden", "nav.show": "Einblenden",
@@ -417,6 +426,8 @@ export const de = {
// ── Default-Namen neuer Elemente ───────────────────────────────────────── // ── Default-Namen neuer Elemente ─────────────────────────────────────────
"default.floorName": "Geschoss {n}", "default.floorName": "Geschoss {n}",
"default.sectionName": "Schnitt {n}",
"default.elevationName": "Ansicht {n}",
"default.drawingName": "Zeichnung {n}", "default.drawingName": "Zeichnung {n}",
"default.categoryName": "Neue Ebene", "default.categoryName": "Neue Ebene",
"default.subCategoryName": "Neue Sub-Ebene", "default.subCategoryName": "Neue Sub-Ebene",
@@ -475,7 +486,9 @@ export const de = {
"resources.components.placeholder": "Bauteil", "resources.components.placeholder": "Bauteil",
"resources.col.name": "Name", "resources.col.name": "Name",
"resources.col.color": "Farbe", "resources.col.color": "Farbe",
"resources.col.hatch": "Schraffur", "resources.col.hatch": "Schnittschraffur",
"resources.col.viewHatch": "Ansichtsschraffur",
"resources.viewHatch.none": "(keine)",
"resources.col.prio": "Prio", "resources.col.prio": "Prio",
"resources.col.prio.hint": "Höhere Priorität läuft am Stoß durch", "resources.col.prio.hint": "Höhere Priorität läuft am Stoß durch",
"resources.col.texture": "Textur", "resources.col.texture": "Textur",
+14 -1
View File
@@ -317,8 +317,17 @@ export const en: Record<TranslationKey, string> = {
"objinfo.room.refFloor": "Reference floor", "objinfo.room.refFloor": "Reference floor",
"objinfo.room.editStamp": "Edit stamp …", "objinfo.room.editStamp": "Edit stamp …",
"levels.addFloor": "+ Floor", "levels.addFloor": "+ Floor",
"levels.addSection": "+ Section",
"levels.addElevation": "+ Elevation",
"levels.addDrawing": "+ Drawing", "levels.addDrawing": "+ Drawing",
"layers.addCategory": "+ Layer", "layers.addCategory": "+ Layer",
// Drawing levels: category titles (collapsible groups).
"levelCat.floor": "Floors",
"levelCat.section": "Sections",
"levelCat.elevation": "Elevations",
"levelCat.drawing": "2D drawings",
"levelCat.collapse": "Collapse/expand category",
"nav.visibility": "Visibility", "nav.visibility": "Visibility",
"nav.hide": "Hide", "nav.hide": "Hide",
"nav.show": "Show", "nav.show": "Show",
@@ -414,6 +423,8 @@ export const en: Record<TranslationKey, string> = {
// Default names. // Default names.
"default.floorName": "Floor {n}", "default.floorName": "Floor {n}",
"default.sectionName": "Section {n}",
"default.elevationName": "Elevation {n}",
"default.drawingName": "Drawing {n}", "default.drawingName": "Drawing {n}",
"default.categoryName": "New layer", "default.categoryName": "New layer",
"default.subCategoryName": "New sub-layer", "default.subCategoryName": "New sub-layer",
@@ -471,7 +482,9 @@ export const en: Record<TranslationKey, string> = {
"resources.components.placeholder": "Component", "resources.components.placeholder": "Component",
"resources.col.name": "Name", "resources.col.name": "Name",
"resources.col.color": "Color", "resources.col.color": "Color",
"resources.col.hatch": "Hatch", "resources.col.hatch": "Section hatch",
"resources.col.viewHatch": "View hatch",
"resources.viewHatch.none": "(none)",
"resources.col.prio": "Prio", "resources.col.prio": "Prio",
"resources.col.prio.hint": "Higher priority runs through at the join", "resources.col.prio.hint": "Higher priority runs through at the join",
"resources.col.texture": "Texture", "resources.col.texture": "Texture",
+8 -1
View File
@@ -108,8 +108,15 @@ export interface Component {
name: string; name: string;
/** Füllfarbe im Grundriss (Poché) und 3D-Diffusfarbe. */ /** Füllfarbe im Grundriss (Poché) und 3D-Diffusfarbe. */
color: string; color: string;
/** Schnitt-Schraffur → Hatch Manager. */ /** Schnitt-Schraffur → Hatch Manager. Gilt, wo das Bauteil echt geschnitten ist. */
hatchId: string; hatchId: string;
/**
* Ansichts-Schraffur → Hatch Manager. Gilt, wo das Bauteil frontal/ungeschnitten
* gesehen wird (z. B. Deckenpoché im Grundriss: die Decke liegt über der
* horizontalen Schnittebene und wird von unten gesehen, nicht aufgeschnitten).
* Leer/`undefined` ⇒ keine Schraffur (weiss).
*/
viewHatchId?: string;
/** Optionale 3D-Textur (vorerst ignoriert). */ /** Optionale 3D-Textur (vorerst ignoriert). */
texture3d?: string; texture3d?: string;
/** /**
+13 -7
View File
@@ -1200,8 +1200,9 @@ function addReferenceLine(out: Primitive[], wall: Wall, greyed: boolean): void {
* Schichtaufbau einer Decke in Z (oben → unten) — von oben unsichtbar. Die * Schichtaufbau einer Decke in Z (oben → unten) — von oben unsichtbar. Die
* Schichtbänderung erscheint daher NUR im Schnitt (siehe `toSection.ts`), nicht * Schichtbänderung erscheint daher NUR im Schnitt (siehe `toSection.ts`), nicht
* hier. Im Detailgrad „grob" entfällt die Schraffur (nur Fläche + Umriss); * hier. Im Detailgrad „grob" entfällt die Schraffur (nur Fläche + Umriss);
* „mittel"/„fein" zeigen die Component-Schraffur. `lwMm` ist die Kategorie- * „mittel"/„fein" zeigen die Ansichts-Schraffur des Bauteils (`viewHatchId`,
* Strichstärke. * Default weiss) — die frontal gesehene Aufsicht ist kein Schnitt. `lwMm` ist
* die Kategorie-Strichstärke.
*/ */
function addCeilingPoche( function addCeilingPoche(
out: Primitive[], out: Primitive[],
@@ -1219,11 +1220,16 @@ function addCeilingPoche(
const outlineMm = lwMm * OUTLINE_DETAIL_FACTOR[detail]; const outlineMm = lwMm * OUTLINE_DETAIL_FACTOR[detail];
const ceilingId = ceiling.id; const ceilingId = ceiling.id;
// Gefüllte Fläche, ohne Schraffur: die Decke wird im Grundriss frontal von // Gefüllte Fläche mit der Ansichts-Schraffur: die Decke wird im Grundriss
// oben gesehen, nicht aufgeschnitten — Bauteil-Schraffuren gehören nur auf // frontal von unten gesehen, nicht aufgeschnitten — daher greift hier
// Schnittflächen (siehe resolveCeilingSectionStyle/splitSlabLayers), nicht // NICHT die Schnitt-Schraffur (die gehört auf echte Schnittflächen, siehe
// auf die Aufsicht. // resolveCeilingSectionStyle/splitSlabLayers), sondern `viewHatchId`. Fehlt
const hatch = NO_HATCH; // sie (Default), bleibt die Aufsicht weiss. Im Detailgrad „grob" entfällt
// die Schraffur ganz (nur Fläche + Umriss).
const hatch =
detail !== "grob" && comp?.viewHatchId
? resolveHatch(project, comp.viewHatchId)
: NO_HATCH;
const solid = hatch.pattern === "solid"; const solid = hatch.pattern === "solid";
out.push({ out.push({
kind: "polygon", kind: "polygon",
+15 -2
View File
@@ -283,11 +283,12 @@ function ResCell({
// ── Bauteile (Components) ────────────────────────────────────────────────── // ── Bauteile (Components) ──────────────────────────────────────────────────
// Spalten: Name | Farbe | Schraffur | Prio | Textur | Material | (löschen). // Spalten: Name | Farbe | Schnittschraffur | Ansichtsschraffur | Prio | Textur | Material | (löschen).
const COMPONENT_COLUMNS: ResColumn[] = [ const COMPONENT_COLUMNS: ResColumn[] = [
{ titleKey: "resources.col.name" }, { titleKey: "resources.col.name" },
{ titleKey: "resources.col.color" }, { titleKey: "resources.col.color" },
{ titleKey: "resources.col.hatch" }, { titleKey: "resources.col.hatch" },
{ titleKey: "resources.col.viewHatch" },
{ {
titleKey: "resources.col.prio", titleKey: "resources.col.prio",
align: "right", align: "right",
@@ -298,7 +299,7 @@ const COMPONENT_COLUMNS: ResColumn[] = [
{ titleKey: "" }, { titleKey: "" },
]; ];
const COMPONENT_TEMPLATE = const COMPONENT_TEMPLATE =
"minmax(120px, 1fr) auto minmax(120px, 0.8fr) 64px minmax(90px, 0.7fr) minmax(130px, 0.9fr) 36px"; "minmax(120px, 1fr) auto minmax(120px, 0.8fr) minmax(120px, 0.8fr) 64px minmax(90px, 0.7fr) minmax(130px, 0.9fr) 36px";
/** /**
* Material-Zelle der Bauteil-Tabelle: ein Button, der den aktuellen Material- * Material-Zelle der Bauteil-Tabelle: ein Button, der den aktuellen Material-
@@ -766,6 +767,11 @@ function ComponentRow({
onDelete: () => void; onDelete: () => void;
}) { }) {
const hatchOptions = hatches.map((h) => ({ value: h.id, label: h.name })); const hatchOptions = hatches.map((h) => ({ value: h.id, label: h.name }));
// Ansichts-Schraffur ist optional; Leer-Eintrag = keine Schraffur (weiss).
const viewHatchOptions = [
{ value: "", label: t("resources.viewHatch.none") },
...hatchOptions,
];
return ( return (
<ResRow> <ResRow>
<ResCell> <ResCell>
@@ -788,6 +794,13 @@ function ComponentRow({
options={hatchOptions} options={hatchOptions}
/> />
</ResCell> </ResCell>
<ResCell>
<SelectField
value={component.viewHatchId ?? ""}
onChange={(viewHatchId) => onPatch({ viewHatchId: viewHatchId || undefined })}
options={viewHatchOptions}
/>
</ResCell>
<ResCell align="right" emphasis> <ResCell align="right" emphasis>
<NumberField <NumberField
value={component.joinPriority} value={component.joinPriority}