Snap-Bar + Drag-Reorder + Schnittperspektive + Top-View Z-Guard + Multi-Geschoss-Clipping
Snap-Bar (Oberleiste): - 4x2 Icon-Grid mit architektonischen Osnap-Modi (End/Mid/Int/Perp/Cen/Near) - Master-O Toggle + Grid-Sichtbarkeit - Symbol-Wahl angelehnt an Rhinos eigene Snap-Marker - Ortho + Grid-Snap raus (in Rhino-Footer) - Backend: _osnap_flag_map + _get/_set_osnap_modes + _set_grid_visible Drag-to-Reorder (GeschossManager): - HTML5-Drag auf jeder Zeile - Drop-Indikator (accent-Border oben/unten je nach Cursor-Position) - Gedraggte Row faded auf opacity 0.4 - Array-Reorder + onChange triggert recalcOkff -> OKFFs konsistent Schnittperspektive: - projection: 'parallel' | 'perspective' im Schnitt-Settings-Dialog - Augenhoehe (cameraHeight) nur bei Perspektive sichtbar - activate_schnitt mit ChangeToPerspectiveProjection(50 FOV) - skip_view=True bei Grip-Drag-Re-Activate damit View nicht ploetzlich in Section springt Top-View Z-Guard: - _is_active_view_top_like + _suppress_z_drift_if_top_view in _on_object_replaced — bei Plan-View wird Z-Drift einer source-curve automatisch zurueckgerollt (gegen ungewolltes Snappen auf z!=0 oder Gumball-Z) Multi-Geschoss-Clipping-UX: - Klick auf cut-Icon einer nicht-aktiven Geschoss-Zeile aktiviert das Geschoss mit + toggelt Clipping → Plane erscheint sofort Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+31
-6
@@ -247,8 +247,23 @@ def activate_schnitt(doc, z, skip_view=False):
|
||||
obj = _add_clipping_plane(doc, back_plane, du, dv, vp_ids, "back")
|
||||
if obj is not None: n_planes += 1
|
||||
|
||||
# View setzen: Parallel-Projektion, Kamera senkrecht zur Linie.
|
||||
# Bei skip_view=True (Grip-Drag-Re-Activate) komplett ueberspringen.
|
||||
# Projektion: 'parallel' (klassischer Schnitt) oder 'perspective'
|
||||
# (Schnittperspektive — perspektivische Section mit gleicher Cut-
|
||||
# Logik). Bei perspective wird Kamera leicht naeher geholt + FOV
|
||||
# gesetzt; Cut-Planes sind identisch.
|
||||
projection = (z.get("projection") or "parallel").strip().lower()
|
||||
if projection not in ("parallel", "perspective"): projection = "parallel"
|
||||
|
||||
# Kamera-Z fuer Perspektive: explizit ueber cameraHeight setzbar,
|
||||
# sonst Default = Mitte der Hoehenrange (= plane_z). Bei Parallel
|
||||
# ignoriert weil Kamera-Z in Orthoprojektion das Bild nicht aendert.
|
||||
try:
|
||||
cam_z = float(z.get("cameraHeight")) if z.get("cameraHeight") is not None else plane_z
|
||||
except Exception:
|
||||
cam_z = plane_z
|
||||
|
||||
# View setzen — Kamera senkrecht zur Linie. Bei skip_view=True
|
||||
# (Grip-Drag-Re-Activate) komplett ueberspringen.
|
||||
if not skip_view:
|
||||
try:
|
||||
view = doc.Views.ActiveView
|
||||
@@ -257,18 +272,28 @@ def activate_schnitt(doc, z, skip_view=False):
|
||||
if view is not None:
|
||||
vp = view.ActiveViewport
|
||||
cam_dist = max(50.0, depth_back * 3 + line_len)
|
||||
# Bei Perspektive: Kamera + Target auf cam_z. Bei Parallel:
|
||||
# plane_z (Mitte Hoehenrange) — Z spielt eh keine Rolle
|
||||
# fuers Bild, aber sauber gesetzt fuer konsistente
|
||||
# Kamera-Ausrichtung.
|
||||
view_z = cam_z if projection == "perspective" else plane_z
|
||||
cam_pos = rg.Point3d(
|
||||
mid.X - view_dir.X * cam_dist,
|
||||
mid.Y - view_dir.Y * cam_dist,
|
||||
plane_z)
|
||||
view_z)
|
||||
target = rg.Point3d(
|
||||
mid.X + view_dir.X * (depth_back * 0.5),
|
||||
mid.Y + view_dir.Y * (depth_back * 0.5),
|
||||
plane_z)
|
||||
vp.ChangeToParallelProjection(True)
|
||||
view_z)
|
||||
if projection == "perspective":
|
||||
vp.ChangeToPerspectiveProjection(True, 50.0)
|
||||
else:
|
||||
vp.ChangeToParallelProjection(True)
|
||||
vp.SetCameraLocations(target, cam_pos)
|
||||
vp.CameraUp = rg.Vector3d(0, 0, 1)
|
||||
# Zoom auf Schnitt-BoundingBox + etwas Rand
|
||||
# Zoom auf Schnitt-BoundingBox + etwas Rand. Bei Perspektive
|
||||
# macht ZoomBoundingBox auch Sinn — Rhino passt das FOV-Frame
|
||||
# entsprechend an.
|
||||
bb = rg.BoundingBox(
|
||||
rg.Point3d(min(p1.X, p2.X) - margin, min(p1.Y, p2.Y) - margin,
|
||||
h_min - margin),
|
||||
|
||||
Reference in New Issue
Block a user