P2/P5: coordinate tabs and render feature preview

This commit is contained in:
2026-08-02 18:09:03 -04:00
parent cb6877be36
commit 709cfea1eb
7 changed files with 111 additions and 29 deletions

View File

@@ -136,6 +136,11 @@ function App() {
}
}), [facade])
useEffect(() => facade.project.subscribeExternalChanges((notice) => {
setNotice(`Project saved in another tab · v${notice.documentVersion}`)
window.setTimeout(() => setNotice(''), 2600)
}), [facade])
useEffect(() => () => facade.geometry.dispose(), [facade])
useEffect(() => {
@@ -386,7 +391,7 @@ function Viewport({ selectedObject, setSelectedObject, workbench, facade, showNo
const adapter = facade.viewport.createAdapter()
adapterRef.current = adapter
let cancelled = false
let shape: ShapeHandle | null = null
const shapes: ShapeHandle[] = []
try {
adapter.mount(host)
} catch (error) {
@@ -399,13 +404,17 @@ function Viewport({ selectedObject, setSelectedObject, workbench, facade, showNo
const capabilities = await facade.geometry.initialize()
if (capabilities.status !== 'ready') throw new Error(capabilities.reason || 'OCCT geometry runtime unavailable')
const document = facade.app.document.getActive()
shape = await facade.geometry.createBox({ width: 2.7, length: 1.4, height: 1.6, center: [0, 0, 0], originOnCenter: true, documentId: document.id, documentVersion: document.version })
const profile = { outer: [[-1.35, -0.7, 0], [1.35, -0.7, 0], [1.35, 0.7, 0], [-1.35, 0.7, 0]] as [number, number, number][] }
const pad = await facade.geometry.pad({ profile, length: 1.6, direction: [0, 0, 1], documentId: document.id, documentVersion: document.version })
shapes.push(pad)
const pocketProfile = { outer: [[-0.55, -0.32, 0], [0.55, -0.32, 0], [0.55, 0.32, 0], [-0.55, 0.32, 0]] as [number, number, number][] }
const pocket = await facade.geometry.pocket({ base: pad, profile: pocketProfile, length: 1.8, direction: [0, 0, 1], documentId: document.id, documentVersion: document.version })
shapes.push(pocket)
if (cancelled) {
await facade.geometry.release(shape)
shape = null
await Promise.all(shapes.map((entry) => facade.geometry.release(entry)))
return
}
const mesh = await facade.geometry.mesh(shape, 0.05)
const mesh = await facade.geometry.mesh(pocket, 0.05)
if (!cancelled) adapter.setMesh(mesh)
}
void loadGeometry().catch((error: unknown) => {
@@ -413,7 +422,7 @@ function Viewport({ selectedObject, setSelectedObject, workbench, facade, showNo
})
return () => {
cancelled = true
if (shape) void facade.geometry.release(shape)
void Promise.all(shapes.map((entry) => facade.geometry.release(entry)))
adapter.dispose()
adapterRef.current = null
}