Decken-Panel: Aussparungen anzeigen + einzeln entfernen
Die Decken-Sektion listet die Aussparungen (BBox-Masse je Loch) mit Entfernen-Knopf; Anlegen über den Befehl 'Deckenloch'. CeilingInfo.openings, host.onRemoveCeilingOpening + App-Routing. 684/684 grün.
This commit is contained in:
@@ -3238,6 +3238,14 @@ export default function App() {
|
|||||||
if (selection?.kind === "ceiling")
|
if (selection?.kind === "ceiling")
|
||||||
setCeilingThickness(selection.id, thickness);
|
setCeilingThickness(selection.id, thickness);
|
||||||
},
|
},
|
||||||
|
onRemoveCeilingOpening: (index) => {
|
||||||
|
if (selection?.kind !== "ceiling") return;
|
||||||
|
const c = (project.ceilings ?? []).find((x) => x.id === selection.id);
|
||||||
|
if (!c?.openings || index < 0 || index >= c.openings.length) return;
|
||||||
|
updateCeiling(selection.id, {
|
||||||
|
openings: c.openings.filter((_, i) => i !== index),
|
||||||
|
});
|
||||||
|
},
|
||||||
onSetCeilingTop: (anchor) => {
|
onSetCeilingTop: (anchor) => {
|
||||||
if (selection?.kind === "ceiling")
|
if (selection?.kind === "ceiling")
|
||||||
updateCeiling(selection.id, { top: anchor ?? undefined });
|
updateCeiling(selection.id, { top: anchor ?? undefined });
|
||||||
|
|||||||
@@ -366,6 +366,8 @@ export const de = {
|
|||||||
"objinfo.ceiling.top": "Oberkante (OK)",
|
"objinfo.ceiling.top": "Oberkante (OK)",
|
||||||
"objinfo.ceiling.bottom": "Unterkante (UK)",
|
"objinfo.ceiling.bottom": "Unterkante (UK)",
|
||||||
"objinfo.ceiling.height": "Dicke (OK−UK)",
|
"objinfo.ceiling.height": "Dicke (OK−UK)",
|
||||||
|
"objinfo.ceiling.openings": "Aussparungen",
|
||||||
|
"objinfo.ceiling.removeOpening": "Aussparung entfernen",
|
||||||
"objinfo.ceiling.area": "Fläche",
|
"objinfo.ceiling.area": "Fläche",
|
||||||
"objinfo.ceiling.anchorFloor": "Gebunden",
|
"objinfo.ceiling.anchorFloor": "Gebunden",
|
||||||
"objinfo.ceiling.anchorCustom": "Eigene",
|
"objinfo.ceiling.anchorCustom": "Eigene",
|
||||||
|
|||||||
@@ -366,6 +366,8 @@ export const en: Record<TranslationKey, string> = {
|
|||||||
"objinfo.ceiling.top": "Top (OK)",
|
"objinfo.ceiling.top": "Top (OK)",
|
||||||
"objinfo.ceiling.bottom": "Bottom (UK)",
|
"objinfo.ceiling.bottom": "Bottom (UK)",
|
||||||
"objinfo.ceiling.height": "Thickness (OK−UK)",
|
"objinfo.ceiling.height": "Thickness (OK−UK)",
|
||||||
|
"objinfo.ceiling.openings": "Openings",
|
||||||
|
"objinfo.ceiling.removeOpening": "Remove opening",
|
||||||
"objinfo.ceiling.area": "Area",
|
"objinfo.ceiling.area": "Area",
|
||||||
"objinfo.ceiling.anchorFloor": "Bound",
|
"objinfo.ceiling.anchorFloor": "Bound",
|
||||||
"objinfo.ceiling.anchorCustom": "Custom",
|
"objinfo.ceiling.anchorCustom": "Custom",
|
||||||
|
|||||||
@@ -1050,6 +1050,33 @@ export function CeilingSection({
|
|||||||
<span className="objinfo-fval">{ceiling.volume.toFixed(2)} m³</span>
|
<span className="objinfo-fval">{ceiling.volume.toFixed(2)} m³</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Aussparungen (Treppenauge/Schacht) — Liste mit Entfernen je Loch.
|
||||||
|
Anlegen über den Befehl „Deckenloch" (BIM-Ribbon). */}
|
||||||
|
{ceiling.openings.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div className="objinfo-field">
|
||||||
|
<span className="objinfo-flabel">{t("objinfo.ceiling.openings")}</span>
|
||||||
|
<span className="objinfo-fval">{ceiling.openings.length}</span>
|
||||||
|
</div>
|
||||||
|
{ceiling.openings.map((o, i) => (
|
||||||
|
<div className="objinfo-field" key={i}>
|
||||||
|
<span className="objinfo-flabel objinfo-muted">
|
||||||
|
{`${i + 1}: ${o.width.toFixed(2)} × ${o.depth.toFixed(2)} m`}
|
||||||
|
</span>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="objinfo-typebtn"
|
||||||
|
title={t("objinfo.ceiling.removeOpening")}
|
||||||
|
aria-label={t("objinfo.ceiling.removeOpening")}
|
||||||
|
onClick={() => host.onRemoveCeilingOpening(i)}
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
<div className="objinfo-sep" />
|
<div className="objinfo-sep" />
|
||||||
|
|
||||||
{/* OK der Decke: an Geschoss gebunden ODER eigene Höhe. */}
|
{/* OK der Decke: an Geschoss gebunden ODER eigene Höhe. */}
|
||||||
|
|||||||
@@ -275,6 +275,8 @@ export interface PanelHostValue {
|
|||||||
onSetCeilingType: (ceilingTypeId: string) => void;
|
onSetCeilingType: (ceilingTypeId: string) => void;
|
||||||
/** Setzt die Gesamtdicke der Decke (Meter, thickness-Übersteuerung). */
|
/** Setzt die Gesamtdicke der Decke (Meter, thickness-Übersteuerung). */
|
||||||
onSetCeilingThickness: (thickness: number) => void;
|
onSetCeilingThickness: (thickness: number) => void;
|
||||||
|
/** Entfernt die Aussparung mit Index `index` der selektierten Decke. */
|
||||||
|
onRemoveCeilingOpening: (index: number) => void;
|
||||||
/** Setzt/entfernt die OK-Bindung der Decke (`null` = Geschoss-Oberkante). */
|
/** Setzt/entfernt die OK-Bindung der Decke (`null` = Geschoss-Oberkante). */
|
||||||
onSetCeilingTop: (anchor: VerticalAnchor | null) => void;
|
onSetCeilingTop: (anchor: VerticalAnchor | null) => void;
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -196,6 +196,8 @@ export interface CeilingInfo {
|
|||||||
/** Aufgelöste absolute UK/OK (Meter). */
|
/** Aufgelöste absolute UK/OK (Meter). */
|
||||||
zBottom: number;
|
zBottom: number;
|
||||||
zTop: number;
|
zTop: number;
|
||||||
|
/** Aussparungen (Treppenauge/Schacht) als BBox-Masse, Reihenfolge = Modell. */
|
||||||
|
openings: { width: number; depth: number }[];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -606,6 +608,11 @@ function ceilingSelection(project: Project, ceiling: Ceiling): Selection {
|
|||||||
bottom: ceiling.bottom,
|
bottom: ceiling.bottom,
|
||||||
zBottom,
|
zBottom,
|
||||||
zTop,
|
zTop,
|
||||||
|
// Aussparungen als anzeigefertige BBox-Masse (Breite × Tiefe je Loch).
|
||||||
|
openings: (ceiling.openings ?? []).map((hole) => {
|
||||||
|
const bb = outlineBBox(hole);
|
||||||
|
return { width: bb.maxX - bb.minX, depth: bb.maxY - bb.minY };
|
||||||
|
}),
|
||||||
};
|
};
|
||||||
return {
|
return {
|
||||||
kind: "ceiling",
|
kind: "ceiling",
|
||||||
|
|||||||
Reference in New Issue
Block a user