Material/Ebene-Separation: Hatch raus aus Material (Refactor a)
Material ist jetzt rein 3D — Section-Hatch (2D-Schnitt) wird nicht mehr
am Material definiert, sondern am Layer (via Rhino-Layer-Dialog oder
spaeter via Ebenen-Settings + neuer Hatch-Tab im Project-Settings).
Schema-Aenderungen:
- _normalize_material: hatch + scale entfernt
- _MATERIAL_LIBRARY (elemente.py): hatch + scale aus allen Builtin-Mats
- _get_all_materials: ohne hatch
- _send_state materials payload: nur {name, color}
- Library import_material: PBR + Texturen werden weitergegeben
Backend:
- _ensure_material_sublayer: erstellt Sublayer mit Color, RESETTET aber
alten SectionHatchIndex auf -1 (= "kein eigener Hatch") damit
Inheritance/User-Override greift. Vorher wurden alte Material-Hatch-
Werte da haengen geblieben.
Frontend:
- MaterialDetail: Schraffur-Section entfernt
- hatchPatterns-Prop entfernt
Konsequenz: existierende Waende verlieren ihren Section-Hatch beim
naechsten Regen. User definiert Section-Hatches jetzt auf Layer-Ebene.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -208,8 +208,9 @@ function DetailSection({ title, children }) {
|
||||
}
|
||||
|
||||
/* MaterialDetail — rechte Seite (ArchiCAD-Stil): editiert das aktuell
|
||||
ausgewaehlte Material. Builtin: Name read-only. */
|
||||
function MaterialDetail({ mat, isBuiltin, hatchPatterns, onChange, onDelete }) {
|
||||
ausgewaehlte Material. Material = REIN 3D (Color + PBR + Texturen).
|
||||
Section-Hatch (2D-Schnitt) wird via Ebenen-Settings am Layer gesetzt. */
|
||||
function MaterialDetail({ mat, isBuiltin, onChange, onDelete }) {
|
||||
if (!mat) {
|
||||
return (
|
||||
<div style={{ padding: 40, textAlign: 'center',
|
||||
@@ -271,27 +272,6 @@ function MaterialDetail({ mat, isBuiltin, hatchPatterns, onChange, onDelete }) {
|
||||
</div>
|
||||
</DetailSection>
|
||||
|
||||
<DetailSection title="Schraffur (2D-Schnitt)">
|
||||
<div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
|
||||
<select value={mat.hatch || 'Solid'}
|
||||
onChange={(ev) => onChange({ ...mat, hatch: ev.target.value })}
|
||||
style={{ flex: 1, height: BAR_H, fontSize: 11 }}>
|
||||
{(hatchPatterns || []).map(h => (
|
||||
<option key={h} value={h}>{h}</option>
|
||||
))}
|
||||
</select>
|
||||
<input type="number" step="0.1" min="0.1"
|
||||
value={mat.scale ?? 1.0}
|
||||
onChange={(ev) => onChange({ ...mat, scale: parseFloat(ev.target.value) || 1.0 })}
|
||||
title="Skalierung"
|
||||
style={{ width: 70, height: BAR_H, padding: '0 10px',
|
||||
fontSize: 11, textAlign: 'right' }} />
|
||||
</div>
|
||||
<div style={{ fontSize: 9, color: 'var(--text-muted)', marginTop: 4 }}>
|
||||
Hatch-Pattern + Skalierung fuer die Sektion-Ansicht (Clipping Plane).
|
||||
</div>
|
||||
</DetailSection>
|
||||
|
||||
<DetailSection title="Texturen (3D-Render)">
|
||||
<TextureSlot label="Diffuse" slot="diffuse"
|
||||
tex={mat.textures?.diffuse}
|
||||
@@ -364,7 +344,6 @@ export default function ProjectSettingsDialog({
|
||||
})
|
||||
const [matSearch, setMatSearch] = useState('')
|
||||
const builtin = initial.builtinMaterials || []
|
||||
const hatchPatterns = initial.hatchPatterns || ['Solid']
|
||||
|
||||
// Aktuell ausgewaehltes Material aus Selection ableiten
|
||||
const selectedMat = (() => {
|
||||
@@ -572,7 +551,6 @@ export default function ProjectSettingsDialog({
|
||||
<MaterialDetail
|
||||
mat={selectedMat}
|
||||
isBuiltin={selectedIsBuiltin}
|
||||
hatchPatterns={hatchPatterns}
|
||||
onChange={updateSelected}
|
||||
onDelete={selMat?.kind === 'local' ? deleteSelected : null} />
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user