Schnittebenen 2D↔3D Phase 1+2, native Fenster, Hell/Dunkel-Theme, SWISSIMAGE-Import
- Schnittebenen: 3D-Live-Schnitt folgt der gewählten Grundriss-Schnittlinie (section3dCutId/sectionPlaneFromLevel), Schalter "Im 3D schneiden" im Objekt-Info, Doppelklick auf Schnittlinie springt in 2D-Schnittansicht, unsichtbare Ebenen blenden ihre Führungslinie aus - Eigene native Tauri-Fenster für Kontext-Import/Zeichnungsebenen/ Ebenen-Einstellungen/Ressourcen/Einstellungen + klassische Menüleiste (AppMenuBar) neben der Wortmarke - Hell/Dunkel-Umschalter (Einstellungen → Darstellung), persistiert, flackerfrei vor erstem Render gesetzt - SWISSIMAGE-Luftbild-Import (swisstopo WMS) als Kontext-Hintergrundebene - UI-Politur: Werkzeug-Panel Symbole/Liste umschaltbar, Topbar-Quick-Access- Icons entfernt, Zahnrad→Einstellungen in Panel-Köpfen, Footerbar/ Snap-Marker/Maß-HUD auf helle Pillen-Sprache umgestellt - Neues Dachziegel-Material (RoofingTiles013A)
This commit is contained in:
@@ -42,6 +42,9 @@ function shiftContextObject(obj: ContextObject, dx: number, dy: number): Context
|
||||
if (obj.type === "contourSet") {
|
||||
return { ...obj, contours: obj.contours.map((c) => shiftContour(c, dx, dy)) };
|
||||
}
|
||||
if (obj.type === "image") {
|
||||
return { ...obj, min: shift(obj.min, dx, dy), max: shift(obj.max, dx, dy) };
|
||||
}
|
||||
const positions = obj.positions.slice();
|
||||
for (let i = 0; i + 2 < positions.length; i += 3) {
|
||||
positions[i] += dx;
|
||||
@@ -118,3 +121,28 @@ export function translateProject(project: Project, dx: number, dy: number): Proj
|
||||
: undefined,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Der LV95-Ursprung eines Projekts: die reale Landeskoordinate, die auf den
|
||||
* Modell-Nullpunkt (0,0) abgebildet wird. Aus `geoAnchor` abgeleitet
|
||||
* (`origin = lv95 − model`), oder `null`, wenn KEIN Standort-Bezug existiert.
|
||||
*/
|
||||
export function projectGeoOrigin(project: Project): { e: number; n: number } | null {
|
||||
const a = project.geoAnchor;
|
||||
if (!a) return null;
|
||||
return { e: a.lv95.e - a.model.x, n: a.lv95.n - a.model.y };
|
||||
}
|
||||
|
||||
/**
|
||||
* Kopie des Projekts mit SÄMTLICHER Geometrie auf die REALEN Weltkoordinaten
|
||||
* (LV95) verschoben — für georeferenzierte MODELL-Exporte (IFC/DXF): das Modell
|
||||
* wird lokal nahe (0,0) bearbeitet, der Export schreibt aber die wahren
|
||||
* Landeskoordinaten, damit die Datei in anderer CAD-/BIM-Software lagerichtig
|
||||
* sitzt. Ohne `geoAnchor` (kein Bezug) bleibt das Projekt unverändert (Identität).
|
||||
* NICHT für Papier-/Layout-Exporte (die bleiben in lokalen Koordinaten).
|
||||
*/
|
||||
export function projectToWorldCoords(project: Project): Project {
|
||||
const origin = projectGeoOrigin(project);
|
||||
if (!origin) return project;
|
||||
return translateProject(project, origin.e, origin.n);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user