@pascal-app/editor 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -0
- package/package.json +40 -38
- package/src/components/editor/__bench__/room-label-placement.bench.ts +108 -0
- package/src/components/editor/bake-thumbnail.tsx +6 -15
- package/src/components/editor/construction-reveal-audio.test.tsx +150 -0
- package/src/components/editor/construction-reveal-audio.tsx +40 -0
- package/src/components/editor/custom-camera-controls.tsx +81 -8
- package/src/components/editor/editor-layout-mobile.tsx +1 -1
- package/src/components/editor/editor-layout-v2.tsx +1 -1
- package/src/components/editor/export-manager.tsx +14 -19
- package/src/components/editor/first-person/build-collider-world.test.ts +269 -0
- package/src/components/editor/first-person/build-collider-world.ts +22 -5
- package/src/components/editor/first-person/ground-holes.test.ts +128 -0
- package/src/components/editor/first-person/ground-holes.ts +130 -0
- package/src/components/editor/first-person/mechanism-targets.test.ts +89 -2
- package/src/components/editor/first-person/mechanism-targets.ts +52 -0
- package/src/components/editor/first-person-controls.tsx +19 -11
- package/src/components/editor/floor-aware-camera-controls.test.ts +24 -0
- package/src/components/editor/floorplan-mode-coordinator.tsx +2 -2
- package/src/components/editor/floorplan-panel.tsx +72 -23
- package/src/components/editor/follow-pascal.test.tsx +912 -0
- package/src/components/editor/follow-pascal.tsx +354 -0
- package/src/components/editor/group-actions.ts +2 -0
- package/src/components/editor/group-move-3d.ts +2 -0
- package/src/components/editor/group-rotate-handle.tsx +2 -0
- package/src/components/editor/group-transform-shared.test.ts +460 -0
- package/src/components/editor/index.tsx +166 -79
- package/src/components/editor/riser-diagram-panel.tsx +14 -7
- package/src/components/editor/room-highlight.tsx +13 -5
- package/src/components/editor/room-labels.test.ts +621 -128
- package/src/components/editor/room-labels.tsx +1090 -190
- package/src/components/editor/selection-manager.tsx +38 -117
- package/src/components/editor/slab-hole-highlights.tsx +2 -2
- package/src/components/editor/snapshot-capture-overlay.tsx +3 -2
- package/src/components/editor/snapshot-capture.test.ts +69 -58
- package/src/components/editor/snapshot-capture.ts +7 -1
- package/src/components/editor/thumbnail-generator.test.ts +350 -4
- package/src/components/editor/thumbnail-generator.tsx +128 -54
- package/src/components/editor/use-floorplan-background-placement.ts +3 -1
- package/src/components/editor/views/plugins-view.tsx +1 -8
- package/src/components/editor/views/view-bar.test.tsx +54 -0
- package/src/components/editor/views/view-bar.tsx +140 -17
- package/src/components/editor/wall-snap-beacon-layer.tsx +5 -4
- package/src/components/editor-2d/floorplan-group-move.tsx +3 -0
- package/src/components/editor-2d/floorplan-registered-tool-layer.tsx +2 -2
- package/src/components/editor-2d/floorplan-registry-move-overlay.tsx +3 -4
- package/src/components/editor-2d/renderers/floorplan-dimension-edit-overlay.test.ts +1 -1
- package/src/components/editor-2d/renderers/floorplan-registry-layer.tsx +29 -7
- package/src/components/editor-2d/renderers/floorplan-reveal.test.tsx +254 -0
- package/src/components/editor-2d/renderers/floorplan-reveal.ts +141 -0
- package/src/components/point-ask/bubble.tsx +538 -0
- package/src/components/point-ask/hover-chip.tsx +91 -0
- package/src/components/point-ask/mode-pill.tsx +92 -0
- package/src/components/point-ask/optional-motion.ts +22 -0
- package/src/components/point-ask/outline-corners.tsx +93 -0
- package/src/components/point-ask/pins.tsx +711 -0
- package/src/components/point-ask/point-ask-layer.tsx +83 -0
- package/src/components/point-ask/point-ask-styles.ts +105 -0
- package/src/components/point-ask/region-marquee-styles.ts +15 -0
- package/src/components/point-ask/region-marquee.tsx +64 -0
- package/src/components/systems/ceiling/ceiling-bracket-batch.test.ts +12 -2
- package/src/components/systems/roof/roof-edit-system.tsx +1 -0
- package/src/components/tools/distribution/connection-compatibility.test.ts +34 -0
- package/src/components/tools/distribution/connection-compatibility.ts +43 -0
- package/src/components/tools/distribution/distribution-public.ts +9 -0
- package/src/components/tools/distribution/distribution-run-contract.test.ts +26 -0
- package/src/components/tools/distribution/distribution-run-contract.ts +94 -0
- package/src/components/tools/distribution/distribution-run-tool.test.ts +241 -0
- package/src/components/tools/distribution/distribution-run-tool.test.tsx +125 -0
- package/src/components/tools/distribution/distribution-run-tool.tsx +1323 -0
- package/src/components/tools/distribution/draw-alignment.ts +35 -0
- package/src/components/tools/distribution/ports.test.ts +56 -0
- package/src/components/tools/distribution/ports.ts +378 -0
- package/src/components/tools/distribution/run-cursor.test.ts +135 -0
- package/src/components/tools/distribution/run-cursor.ts +36 -0
- package/src/components/tools/distribution/run-direction-feedback.test.ts +60 -0
- package/src/components/tools/distribution/run-direction-feedback.tsx +251 -0
- package/src/components/tools/distribution/run-port-snap.test.ts +79 -0
- package/src/components/tools/distribution/run-port-snap.ts +25 -0
- package/src/components/tools/distribution/run-screen-direction.test.ts +23 -0
- package/src/components/tools/distribution/run-screen-direction.ts +30 -0
- package/src/components/tools/elevator/elevator-tool.tsx +3 -6
- package/src/components/tools/elevator/move-elevator-tool.tsx +2 -3
- package/src/components/tools/item/item-surface-strategy-resolver.test.ts +67 -68
- package/src/components/tools/item/placement-history.test.tsx +38 -0
- package/src/components/tools/item/placement-strategies.test.ts +46 -1
- package/src/components/tools/item/placement-strategies.ts +3 -6
- package/src/components/tools/item/shelf-surface-strategy-resolver.test.ts +56 -56
- package/src/components/tools/item/use-draft-node.test.tsx +94 -94
- package/src/components/tools/item/use-placement-coordinator.tsx +55 -49
- package/src/components/tools/registry/item-surface-move.test.ts +62 -63
- package/src/components/tools/registry/item-surface-move.ts +2 -0
- package/src/components/tools/registry/item-surface-resolver.test.ts +26 -26
- package/src/components/tools/registry/move-registry-node-tool.test.ts +268 -1
- package/src/components/tools/registry/move-registry-node-tool.tsx +63 -29
- package/src/components/tools/tool-manager.tsx +14 -5
- package/src/components/tools/wall/wall-drafting.test.ts +170 -57
- package/src/components/ui/action-menu/action-button.tsx +6 -1
- package/src/components/ui/action-menu/camera-actions.tsx +7 -3
- package/src/components/ui/action-menu/control-modes.tsx +13 -7
- package/src/components/ui/action-menu/follow-pascal-pill.tsx +32 -0
- package/src/components/ui/action-menu/follow-pascal-toggle.tsx +36 -0
- package/src/components/ui/action-menu/index.tsx +56 -33
- package/src/components/ui/action-menu/measurement-control.tsx +11 -9
- package/src/components/ui/action-menu/placement.ts +20 -0
- package/src/components/ui/action-menu/point-ask-button.tsx +52 -0
- package/src/components/ui/action-menu/view-toggles.tsx +47 -42
- package/src/components/ui/build-panel/build-panel.tsx +10 -3
- package/src/components/ui/command-palette/editor-commands.tsx +3 -12
- package/src/components/ui/command-palette/index.tsx +45 -15
- package/src/components/ui/command-palette/ranked-groups.test.ts +31 -0
- package/src/components/ui/controls/action-button.tsx +5 -2
- package/src/components/ui/controls/metric-control.tsx +1 -1
- package/src/components/ui/controls/segmented-control.tsx +21 -8
- package/src/components/ui/controls/select-control.tsx +1 -1
- package/src/components/ui/controls/slider-control.tsx +1 -1
- package/src/components/ui/controls/toggle-control.tsx +3 -3
- package/src/components/ui/controls/tool-options-panel.tsx +1 -1
- package/src/components/ui/floating-level-selector.tsx +150 -45
- package/src/components/ui/helpers/contextual-helper-panel.tsx +32 -7
- package/src/components/ui/helpers/helper-manager.test.tsx +54 -2
- package/src/components/ui/helpers/helper-manager.tsx +7 -1
- package/src/components/ui/helpers/item-helper.tsx +9 -1
- package/src/components/ui/panels/collections/collections-popover.tsx +8 -8
- package/src/components/ui/panels/mobile-panel-sheet.tsx +2 -2
- package/src/components/ui/panels/mobile-selection-bar.tsx +6 -3
- package/src/components/ui/panels/multi-selection-panel.tsx +120 -3
- package/src/components/ui/panels/panel-wrapper.tsx +53 -27
- package/src/components/ui/panels/parametric-field-control.tsx +2 -2
- package/src/components/ui/panels/parametric-inspector.tsx +3 -3
- package/src/components/ui/panels/room-panel.tsx +65 -0
- package/src/components/ui/primitives/badge.tsx +8 -0
- package/src/components/ui/primitives/sidebar.tsx +1 -1
- package/src/components/ui/right-stack.tsx +21 -2
- package/src/components/ui/sidebar/app-sidebar.tsx +1 -1
- package/src/components/ui/sidebar/icon-rail.tsx +3 -3
- package/src/components/ui/sidebar/panels/items-panel/function-tree-panel.tsx +1 -1
- package/src/components/ui/sidebar/panels/items-panel/index.tsx +6 -6
- package/src/components/ui/sidebar/panels/settings-panel/animation-speed-setting.tsx +40 -0
- package/src/components/ui/sidebar/panels/settings-panel/audio-settings-dialog.tsx +7 -8
- package/src/components/ui/sidebar/panels/settings-panel/construction-animation-setting.test.tsx +170 -0
- package/src/components/ui/sidebar/panels/settings-panel/construction-animation-setting.tsx +92 -0
- package/src/components/ui/sidebar/panels/settings-panel/index.tsx +107 -23
- package/src/components/ui/sidebar/panels/settings-panel/interface-theme.test.tsx +20 -0
- package/src/components/ui/sidebar/panels/settings-panel/print-export-button.tsx +4 -10
- package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +3 -11
- package/src/components/ui/sidebar/panels/site-panel/index.tsx +5 -12
- package/src/components/ui/sidebar/panels/site-panel/tree-node.tsx +13 -10
- package/src/components/ui/sidebar/panels/zone-panel/index.tsx +2 -2
- package/src/components/ui/sidebar/tab-bar.tsx +4 -4
- package/src/components/viewer/viewer-controls-bar.tsx +18 -6
- package/src/components/viewer/viewer-rooms.tsx +16 -0
- package/src/hooks/use-auto-save.integration.test.tsx +96 -38
- package/src/hooks/use-auto-save.ts +26 -1
- package/src/hooks/use-ceiling-events.test.ts +123 -118
- package/src/hooks/use-grid-events.test.ts +105 -105
- package/src/hooks/use-keyboard.test.ts +65 -16
- package/src/hooks/use-keyboard.ts +29 -12
- package/src/hooks/use-placement-notice.test.ts +24 -1
- package/src/hooks/use-placement-notice.ts +37 -6
- package/src/index.tsx +71 -24
- package/src/lib/__fixtures__/owner-victor-seattle-parking.json +1 -0
- package/src/lib/__fixtures__/owner-villa-aurelia-basement.json +1 -0
- package/src/lib/add-storey.test.ts +177 -0
- package/src/lib/add-storey.ts +59 -0
- package/src/lib/below-grade.test.tsx +171 -0
- package/src/lib/below-grade.ts +133 -0
- package/src/lib/camera-facing.test.ts +24 -0
- package/src/lib/camera-facing.ts +24 -0
- package/src/lib/direct-manipulation.ts +2 -0
- package/src/lib/download-project-file.ts +17 -0
- package/src/lib/editor-level-display.ts +9 -2
- package/src/lib/editor-views.ts +35 -1
- package/src/lib/export-texture-utils.ts +2 -4
- package/src/lib/floor-foundation-support.test.ts +1 -0
- package/src/lib/floorplan/floorplan-pdfkit-document.ts +31 -16
- package/src/lib/floorplan/floorplan-pdfkit-renderer.test.ts +39 -0
- package/src/lib/floorplan/floorplan-pdfkit-renderer.ts +4 -0
- package/src/lib/floorplan/pdfkit-standard-fonts.d.ts +5 -0
- package/src/lib/floorplan/sheet-export.test.ts +24 -0
- package/src/lib/floorplan/site-plan/build-site-plan-drawing.ts +34 -45
- package/src/lib/floorplan/site-plan/coverage.ts +2 -4
- package/src/lib/floorplan/site-plan/front-edge.ts +2 -1
- package/src/lib/floorplan/site-plan/geometry.test.ts +9 -15
- package/src/lib/floorplan/site-plan/geometry.ts +1 -416
- package/src/lib/floorplan/site-plan/index.ts +0 -16
- package/src/lib/floorplan/site-plan/site-annotations.test.ts +117 -0
- package/src/lib/floorplan/site-plan/site-annotations.ts +3 -2
- package/src/lib/floorplan/site-plan/site-parts.ts +14 -106
- package/src/lib/floorplan/site-plan/yards.test.ts +2 -1
- package/src/lib/follow-pascal-exterior.test-fixture.ts +17 -0
- package/src/lib/follow-pascal-exterior.test.ts +171 -0
- package/src/lib/follow-pascal-exterior.ts +39 -0
- package/src/lib/follow-pascal-presentation.test.ts +203 -0
- package/src/lib/follow-pascal-presentation.ts +129 -0
- package/src/lib/follow-pascal-sight.ts +84 -0
- package/src/lib/follow-pascal-targets.test.ts +406 -0
- package/src/lib/follow-pascal-targets.ts +198 -0
- package/src/lib/follow-pascal.test.ts +350 -0
- package/src/lib/follow-pascal.ts +284 -0
- package/src/lib/fresh-planar-placement.test.ts +112 -0
- package/src/lib/fresh-planar-placement.ts +57 -3
- package/src/lib/geometry-script/author.ts +6 -1
- package/src/lib/geometry-script/client.ts +8 -1
- package/src/lib/geometry-script/finish-scripts.ts +127 -0
- package/src/lib/geometry-script/protocol.ts +1 -0
- package/src/lib/glb-export.test.ts +187 -162
- package/src/lib/glb-export.ts +4 -1
- package/src/lib/history.test.ts +12 -7
- package/src/lib/interaction/scope.ts +4 -0
- package/src/lib/level-selection.test.ts +57 -0
- package/src/lib/level-selection.ts +16 -1
- package/src/lib/lot/clean-ring.test.ts +2 -1
- package/src/lib/lot/drop-in.ts +9 -24
- package/src/lib/lot/lot-patch.test.ts +1 -1
- package/src/lib/lot/lot-patch.ts +2 -2
- package/src/lib/measurement-kind.test.ts +6 -8
- package/src/lib/measurements.test.ts +23 -0
- package/src/lib/orbit-floor-clearance.test.ts +36 -0
- package/src/lib/orbit-floor-clearance.ts +48 -0
- package/src/lib/paint-pass-through.test.ts +11 -0
- package/src/lib/paint-pass-through.ts +4 -2
- package/src/lib/paint-scope.ts +1 -0
- package/src/lib/parametric-node-update.ts +16 -7
- package/src/lib/plugin-chat.ts +15 -0
- package/src/lib/point-ask/__fixtures__/consumer-browser.tsx +76 -0
- package/src/lib/point-ask/__fixtures__/house.ts +81 -0
- package/src/lib/point-ask/ask-created.test.ts +195 -0
- package/src/lib/point-ask/ask-flow.test.ts +380 -0
- package/src/lib/point-ask/build-context.test.ts +173 -0
- package/src/lib/point-ask/build-context.ts +94 -0
- package/src/lib/point-ask/capture-crop.ts +129 -0
- package/src/lib/point-ask/choreography.ts +69 -0
- package/src/lib/point-ask/compare.test.ts +145 -0
- package/src/lib/point-ask/compare.ts +73 -0
- package/src/lib/point-ask/describe-target.test.ts +165 -0
- package/src/lib/point-ask/describe-target.ts +234 -0
- package/src/lib/point-ask/dictation.ts +79 -0
- package/src/lib/point-ask/edge-marker.test.ts +61 -0
- package/src/lib/point-ask/edge-marker.ts +27 -0
- package/src/lib/point-ask/frame-loop.ts +25 -0
- package/src/lib/point-ask/history-marks.test.ts +94 -0
- package/src/lib/point-ask/history-marks.ts +39 -0
- package/src/lib/point-ask/host-api.ts +32 -0
- package/src/lib/point-ask/outline-box.test.ts +30 -0
- package/src/lib/point-ask/outline-box.ts +11 -0
- package/src/lib/point-ask/overlay-metrics.ts +6 -0
- package/src/lib/point-ask/pick.test.ts +220 -0
- package/src/lib/point-ask/pick.ts +121 -0
- package/src/lib/point-ask/pin-machine.test.ts +494 -0
- package/src/lib/point-ask/pin-machine.ts +217 -0
- package/src/lib/point-ask/placement.test.ts +203 -0
- package/src/lib/point-ask/placement.ts +141 -0
- package/src/lib/point-ask/pointer-tracker.ts +34 -0
- package/src/lib/point-ask/projector.ts +83 -0
- package/src/lib/point-ask/region.test.ts +157 -0
- package/src/lib/point-ask/region.ts +136 -0
- package/src/lib/point-ask/retry.test.ts +217 -0
- package/src/lib/point-ask/retry.ts +37 -0
- package/src/lib/point-ask/scene-commit.test.ts +312 -0
- package/src/lib/point-ask/scene-commit.ts +32 -0
- package/src/lib/point-ask/session.ts +1391 -0
- package/src/lib/point-ask/spring-keyframes.test.ts +45 -0
- package/src/lib/point-ask/spring-keyframes.ts +38 -0
- package/src/lib/point-ask/spring.test.ts +63 -0
- package/src/lib/point-ask/spring.ts +107 -0
- package/src/lib/point-ask/suggestions.test.ts +80 -0
- package/src/lib/point-ask/suggestions.ts +125 -0
- package/src/lib/point-ask/target-scope.test.ts +622 -0
- package/src/lib/point-ask/target-scope.ts +338 -0
- package/src/lib/point-ask/types.ts +48 -0
- package/src/lib/portable-export.test.ts +34 -1
- package/src/lib/portable-export.ts +119 -53
- package/src/lib/print-feature-thickness.ts +10 -1
- package/src/lib/print-roof-solids.test.ts +39 -1
- package/src/lib/print-roof-solids.ts +43 -10
- package/src/lib/print-shell-compiler-manifold-core.ts +1 -1
- package/src/lib/room-assembly-overlay.ts +2 -3
- package/src/lib/room-selection.test.ts +45 -1
- package/src/lib/scene-clipboard.test.ts +246 -1
- package/src/lib/scene-clipboard.ts +44 -14
- package/src/lib/selection-routing.ts +1 -1
- package/src/lib/sfx-bus.ts +13 -0
- package/src/lib/sfx-player.test.ts +70 -9
- package/src/lib/sfx-player.ts +6 -0
- package/src/lib/stair-levels.test.ts +25 -0
- package/src/lib/stair-levels.ts +22 -3
- package/src/lib/terrace-draft.ts +2 -1
- package/src/lib/viewer-selection.ts +22 -11
- package/src/lib/wall-placement-pointer.test.ts +42 -0
- package/src/lib/wall-placement-pointer.ts +57 -0
- package/src/lib/window-changes.ts +35 -0
- package/src/store/use-audio.test.ts +146 -0
- package/src/store/use-audio.tsx +127 -3
- package/src/store/use-construction-reveal.test.ts +173 -0
- package/src/store/use-construction-reveal.ts +145 -0
- package/src/store/use-corner-snap-hint.test.ts +24 -0
- package/src/store/use-corner-snap-hint.ts +47 -0
- package/src/store/use-follow-pascal.test.ts +62 -0
- package/src/store/use-follow-pascal.ts +53 -0
- package/src/store/use-point-ask.ts +247 -0
- package/src/store/use-stair-build-preview.ts +25 -5
- package/src/store/view-layout.test.ts +27 -1
- package/src/store/view-layout.ts +4 -1
- package/src/test-utils/render-current-markup.tsx +16 -0
- package/src/components/tools/stair/stair-click-guard.test.ts +0 -58
- package/src/components/tools/stair/stair-click-guard.ts +0 -72
- package/src/components/tools/stair/stair-defaults.ts +0 -15
- package/src/components/tools/stair/stair-tool.tsx +0 -682
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
type AnyNode,
|
|
6
6
|
type AnyNodeId,
|
|
7
7
|
type BuildingNode,
|
|
8
|
+
type CameraControlFrameEvent,
|
|
8
9
|
type CeilingNode,
|
|
9
10
|
CeilingNode as CeilingNodeSchema,
|
|
10
11
|
type ColumnNode,
|
|
@@ -18,7 +19,6 @@ import {
|
|
|
18
19
|
type FenceNode,
|
|
19
20
|
type FloorplanGeometry,
|
|
20
21
|
type GeometryContext,
|
|
21
|
-
type GridEvent,
|
|
22
22
|
type GuideNode,
|
|
23
23
|
getRenderableSlabPolygon,
|
|
24
24
|
getWallChordFrame,
|
|
@@ -134,6 +134,7 @@ import {
|
|
|
134
134
|
zoneAtLevelPoint,
|
|
135
135
|
} from '../../lib/units'
|
|
136
136
|
import { cn } from '../../lib/utils'
|
|
137
|
+
import { framingAnimates } from '../../lib/viewer-selection'
|
|
137
138
|
import { getWallDrawVariant } from '../../lib/wall-draw-variant'
|
|
138
139
|
import {
|
|
139
140
|
addWallPolygonDraftCorner,
|
|
@@ -165,7 +166,13 @@ import useInteractionScope, {
|
|
|
165
166
|
import usePlacementPreview from '../../store/use-placement-preview'
|
|
166
167
|
import { expandSessionSelectionForNode } from '../../store/use-session-groups'
|
|
167
168
|
import { useStairBuildPreview } from '../../store/use-stair-build-preview'
|
|
168
|
-
import {
|
|
169
|
+
import {
|
|
170
|
+
activeViewLayout,
|
|
171
|
+
isViewVisible,
|
|
172
|
+
VIEW_2D,
|
|
173
|
+
VIEW_3D,
|
|
174
|
+
visibleScene,
|
|
175
|
+
} from '../../store/view-layout'
|
|
169
176
|
import { FloorplanAlignmentGuideLayer } from '../editor-2d/floorplan-alignment-guide-layer'
|
|
170
177
|
import { FloorplanCursorIndicatorOverlay as Editor2dFloorplanCursorIndicatorOverlay } from '../editor-2d/floorplan-cursor-indicator-overlay'
|
|
171
178
|
import { FloorplanGroupActionMenu } from '../editor-2d/floorplan-group-action-menu'
|
|
@@ -4196,6 +4203,8 @@ function FloorplanStairBuildPreviewLayer({
|
|
|
4196
4203
|
const point = useStairBuildPreview((s) => s.point)
|
|
4197
4204
|
const rotation = useStairBuildPreview((s) => s.rotation)
|
|
4198
4205
|
const rise = useStairBuildPreview((s) => s.rise)
|
|
4206
|
+
const length = useStairBuildPreview((s) => s.length)
|
|
4207
|
+
const stepCount = useStairBuildPreview((s) => s.stepCount)
|
|
4199
4208
|
const isActive = mode === 'build' && tool === 'stair'
|
|
4200
4209
|
|
|
4201
4210
|
const previewGeometry = useMemo(() => {
|
|
@@ -4204,6 +4213,8 @@ function FloorplanStairBuildPreviewLayer({
|
|
|
4204
4213
|
}
|
|
4205
4214
|
const previewSegment = {
|
|
4206
4215
|
...createSizedStairFlight(rise),
|
|
4216
|
+
...(length !== null ? { length } : {}),
|
|
4217
|
+
...(stepCount !== null ? { stepCount } : {}),
|
|
4207
4218
|
id: 'sseg_floorplan_preview' as const,
|
|
4208
4219
|
parentId: 'stair_floorplan_preview' as const,
|
|
4209
4220
|
}
|
|
@@ -4229,7 +4240,7 @@ function FloorplanStairBuildPreviewLayer({
|
|
|
4229
4240
|
}),
|
|
4230
4241
|
) ?? null
|
|
4231
4242
|
)
|
|
4232
|
-
}, [isActive, point, rotation, rise, palette])
|
|
4243
|
+
}, [isActive, point, rotation, rise, length, stepCount, palette])
|
|
4233
4244
|
|
|
4234
4245
|
if (!previewGeometry) return null
|
|
4235
4246
|
return <FloorplanGeometryRenderer geometry={previewGeometry} pointerEventsOverride="none" />
|
|
@@ -6683,6 +6694,58 @@ export function FloorplanPanel({
|
|
|
6683
6694
|
stopFloorplanViewAnimation,
|
|
6684
6695
|
])
|
|
6685
6696
|
|
|
6697
|
+
// A frame request ("show me this node") moves the 3D camera and the plan follows its pose; with no
|
|
6698
|
+
// 3D view on screen no pose reaches the plan, so it frames the node itself. The request waits for
|
|
6699
|
+
// the selection it came with to render: a node on another floor or in another building is placed
|
|
6700
|
+
// with that building's transform, after the floor change has reset the view.
|
|
6701
|
+
const [pendingFrame, setPendingFrame] = useState<CameraControlFrameEvent | null>(null)
|
|
6702
|
+
useEffect(() => {
|
|
6703
|
+
const frame = (event: CameraControlFrameEvent) => {
|
|
6704
|
+
if (isFloorplanOpenRef.current && !isViewVisible(useEditor.getState(), VIEW_3D))
|
|
6705
|
+
setPendingFrame(event)
|
|
6706
|
+
}
|
|
6707
|
+
emitter.on('camera-controls:frame', frame)
|
|
6708
|
+
return () => emitter.off('camera-controls:frame', frame)
|
|
6709
|
+
}, [])
|
|
6710
|
+
|
|
6711
|
+
useEffect(() => {
|
|
6712
|
+
if (!pendingFrame) return
|
|
6713
|
+
setPendingFrame(null)
|
|
6714
|
+
const userRotationDeg = latestFloorplanUserRotationDegRef.current
|
|
6715
|
+
const toLocal = (x: number, z: number) =>
|
|
6716
|
+
worldToFloorplanLocalPoint(x, z, buildingPosition, buildingRotationY)
|
|
6717
|
+
const { bounds, pose } = pendingFrame
|
|
6718
|
+
let centre: SvgPoint
|
|
6719
|
+
let width: number | undefined
|
|
6720
|
+
if (bounds) {
|
|
6721
|
+
// The box's corners as the plan shows them now, so it fits the pane at any turn and aspect.
|
|
6722
|
+
const sceneRotationDeg = FLOORPLAN_VIEW_ROTATION_DEG + userRotationDeg - buildingRotationDeg
|
|
6723
|
+
const shown = [bounds.min[0], bounds.max[0]].flatMap((x) =>
|
|
6724
|
+
[bounds.min[2], bounds.max[2]].map((z) => rotateSvgPoint(toLocal(x, z), sceneRotationDeg)),
|
|
6725
|
+
)
|
|
6726
|
+
const xs = shown.map((point) => point.x)
|
|
6727
|
+
const ys = shown.map((point) => point.y)
|
|
6728
|
+
centre = toLocal((bounds.min[0] + bounds.max[0]) / 2, (bounds.min[2] + bounds.max[2]) / 2)
|
|
6729
|
+
width = Math.max(
|
|
6730
|
+
Math.max(...xs) - Math.min(...xs) + FLOORPLAN_PADDING * 2,
|
|
6731
|
+
(Math.max(...ys) - Math.min(...ys) + FLOORPLAN_PADDING * 2) * svgAspectRatio,
|
|
6732
|
+
)
|
|
6733
|
+
} else if (pose) {
|
|
6734
|
+
// A saved view with nothing to measure: its target, at the zoom the person has.
|
|
6735
|
+
centre = toLocal(pose.target[0], pose.target[2])
|
|
6736
|
+
} else return
|
|
6737
|
+
// A floor change has just reset the view to the whole floor: glide from there, not from nothing.
|
|
6738
|
+
latestViewportRef.current ??= latestFittedViewportRef.current
|
|
6739
|
+
applyFloorplanNavigationView(centre, userRotationDeg, width, { smooth: framingAnimates() })
|
|
6740
|
+
}, [
|
|
6741
|
+
applyFloorplanNavigationView,
|
|
6742
|
+
buildingPosition,
|
|
6743
|
+
buildingRotationDeg,
|
|
6744
|
+
buildingRotationY,
|
|
6745
|
+
pendingFrame,
|
|
6746
|
+
svgAspectRatio,
|
|
6747
|
+
])
|
|
6748
|
+
|
|
6686
6749
|
const viewBox = useMemo(() => {
|
|
6687
6750
|
const currentViewport = viewport ?? fittedViewport
|
|
6688
6751
|
const width = currentViewport.width
|
|
@@ -7990,22 +8053,6 @@ export function FloorplanPanel({
|
|
|
7990
8053
|
useStairBuildPreview.getState().reset()
|
|
7991
8054
|
return
|
|
7992
8055
|
}
|
|
7993
|
-
|
|
7994
|
-
const handleGridMove = (event: GridEvent) => {
|
|
7995
|
-
// Publish to the dedicated store (deduped on the snapped point), NOT panel
|
|
7996
|
-
// state: the stair preview lives in `FloorplanStairBuildPreviewLayer`, so a
|
|
7997
|
-
// per-move update re-renders only that tiny leaf instead of this entire
|
|
7998
|
-
// (~200ms) panel — the same pattern that keeps column/elevator smooth.
|
|
7999
|
-
useStairBuildPreview
|
|
8000
|
-
.getState()
|
|
8001
|
-
.setPoint(getSnappedFloorplanPoint([event.localPosition[0], event.localPosition[2]]))
|
|
8002
|
-
}
|
|
8003
|
-
|
|
8004
|
-
emitter.on('grid:move', handleGridMove)
|
|
8005
|
-
|
|
8006
|
-
return () => {
|
|
8007
|
-
emitter.off('grid:move', handleGridMove)
|
|
8008
|
-
}
|
|
8009
8056
|
}, [isStairBuildActive])
|
|
8010
8057
|
|
|
8011
8058
|
useEffect(() => {
|
|
@@ -9278,7 +9325,9 @@ export function FloorplanPanel({
|
|
|
9278
9325
|
)
|
|
9279
9326
|
const fenceGridBase = snapWallPointToGrid(planPoint)
|
|
9280
9327
|
const fenceLocked =
|
|
9281
|
-
|
|
9328
|
+
event.altKey ||
|
|
9329
|
+
fenceSnapped[0] !== fenceGridBase[0] ||
|
|
9330
|
+
fenceSnapped[1] !== fenceGridBase[1]
|
|
9282
9331
|
let snappedPoint = fenceSnapped
|
|
9283
9332
|
if (fenceLocked) useAlignmentGuides.getState().clear()
|
|
9284
9333
|
// Alignment lines show in every mode; the pull applies only when
|
|
@@ -11265,7 +11314,7 @@ export function FloorplanPanel({
|
|
|
11265
11314
|
}}
|
|
11266
11315
|
>
|
|
11267
11316
|
<div className="mb-3 flex items-start gap-2.5">
|
|
11268
|
-
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-xl border border-border bg-white/5">
|
|
11317
|
+
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-xl border border-border bg-black/4 dark:bg-white/5">
|
|
11269
11318
|
<Ruler className="h-4 w-4 text-foreground/80" />
|
|
11270
11319
|
</div>
|
|
11271
11320
|
<div className="min-w-0">
|
|
@@ -11277,7 +11326,7 @@ export function FloorplanPanel({
|
|
|
11277
11326
|
</div>
|
|
11278
11327
|
</div>
|
|
11279
11328
|
|
|
11280
|
-
<div className="mb-3 rounded-xl border border-border/70 bg-white/5 px-3 py-2">
|
|
11329
|
+
<div className="mb-3 rounded-xl border border-border/70 bg-black/4 dark:bg-white/5 px-3 py-2">
|
|
11281
11330
|
<div className="text-[11px] text-muted-foreground uppercase tracking-wide">
|
|
11282
11331
|
Drawn line
|
|
11283
11332
|
</div>
|
|
@@ -11340,7 +11389,7 @@ export function FloorplanPanel({
|
|
|
11340
11389
|
|
|
11341
11390
|
<div className="mt-4 flex justify-end gap-2">
|
|
11342
11391
|
<button
|
|
11343
|
-
className="h-8 rounded-lg border border-border px-3 font-medium text-muted-foreground text-xs transition hover:bg-white/8 hover:text-foreground"
|
|
11392
|
+
className="h-8 rounded-lg border border-border px-3 font-medium text-muted-foreground text-xs transition hover:bg-black/5 dark:hover:bg-white/8 hover:text-foreground"
|
|
11344
11393
|
onClick={() => setPendingReferenceScale(null)}
|
|
11345
11394
|
type="button"
|
|
11346
11395
|
>
|