From b73aa098a5c25581e57d36abc1ef2111ce5ece07 Mon Sep 17 00:00:00 2001 From: howard Date: Fri, 23 Apr 2021 13:13:49 -0700 Subject: [PATCH] implement dynamic import correctly --- package-lock.json | 108 +++++++++++++++++++++++++++++++++++++++ package.json | 1 + src/Scene.js | 2 +- src/drawDimension.js | 6 +-- src/drawEvents.js | 4 +- src/mouseEvents.js | 3 +- src/react/app.jsx | 19 +++++-- src/react/depTree.js | 4 +- src/react/dialog.jsx | 42 +++++++-------- src/react/dropDown.jsx | 15 +++--- src/react/fileHelpers.js | 6 ++- src/react/navBar.jsx | 65 ++++++++++++----------- src/react/reducer.js | 11 ++-- src/react/tree.jsx | 42 +++++++-------- static/index.html | 2 +- webpack.common.js | 2 +- 16 files changed, 235 insertions(+), 97 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71ca170..3c32972 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "@tailwindcss/jit": "^0.1.18", "babel-loader": "^8.2.2", "browser-fs-access": "^0.16.4", + "bson": "^4.3.0", "copy-webpack-plugin": "^8.1.1", "css-loader": "^5.1.3", "gh-pages": "^3.1.0", @@ -1284,6 +1285,26 @@ "node": ">=0.10.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -1428,6 +1449,42 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/bson": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.3.0.tgz", + "integrity": "sha512-LkKKeFJx5D6RRCRvLE+fDs40M2ZQNuk7W7tFXmKd7OOcQQ+BHdzCgRdL4XEGjc1UEGtiYuMvIVk91Bv8qsI50A==", + "dev": true, + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -3708,6 +3765,26 @@ "postcss": "^8.1.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -9601,6 +9678,12 @@ } } }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -9722,6 +9805,25 @@ "node-releases": "^1.1.70" } }, + "bson": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.3.0.tgz", + "integrity": "sha512-LkKKeFJx5D6RRCRvLE+fDs40M2ZQNuk7W7tFXmKd7OOcQQ+BHdzCgRdL4XEGjc1UEGtiYuMvIVk91Bv8qsI50A==", + "dev": true, + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -11557,6 +11659,12 @@ "dev": true, "requires": {} }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", diff --git a/package.json b/package.json index d83c8ea..bba02e9 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@tailwindcss/jit": "^0.1.18", "babel-loader": "^8.2.2", "browser-fs-access": "^0.16.4", + "bson": "^4.3.0", "copy-webpack-plugin": "^8.1.1", "css-loader": "^5.1.3", "gh-pages": "^3.1.0", diff --git a/src/Scene.js b/src/Scene.js index d28f3bf..b75cb3a 100644 --- a/src/Scene.js +++ b/src/Scene.js @@ -417,4 +417,4 @@ function addSketch() { return sketch } -window.sc = new Scene(store) \ No newline at end of file +// window.sc = new Scene(store) \ No newline at end of file diff --git a/src/drawDimension.js b/src/drawDimension.js index 4e62e51..29f87d4 100644 --- a/src/drawDimension.js +++ b/src/drawDimension.js @@ -155,7 +155,7 @@ export async function drawDimension() { } ) this.labelContainer.removeChild(this.labelContainer.lastChild); - sc.render() + this.scene.render() } if (this.mode == "dimension") { this.drawDimension() @@ -176,7 +176,7 @@ export function updateDim(c_id) { this.constraints.set(c_id, ent) this.updateOtherBuffers() this.solve() - sc.render() + this.scene.render() ev_focus.target.blur() this.updateBoundingSpheres() } else if (e.key == 'Escape') { @@ -217,7 +217,7 @@ export function _onMoveDimension(point, line, initial) { point, _p1, _p2, null, initial ) - sc.render() + this.scene.render() } } diff --git a/src/drawEvents.js b/src/drawEvents.js index 06b4030..2e84a5d 100644 --- a/src/drawEvents.js +++ b/src/drawEvents.js @@ -78,7 +78,7 @@ export function drawPreClick2(e) { } - sc.render() + this.scene.render() } export function drawOnClick2(e) { @@ -136,7 +136,7 @@ let ccw; export function drawPreClick3(e) { const mouseLoc = this.getLocation(e); ccw = drawArc4(mouseLoc, this.toPush) - sc.render() + this.scene.render() } export function drawOnClick3(e) { diff --git a/src/mouseEvents.js b/src/mouseEvents.js index c4d5439..5c6be46 100644 --- a/src/mouseEvents.js +++ b/src/mouseEvents.js @@ -219,7 +219,8 @@ export function onPick(e) { } // dont think this would have been possible without redux - if (obj.userData.type == 'sketch' && !sc.store.getState().treeEntries.visible[obj.name]) { + // if (obj.userData.type == 'sketch' && !sc.store.getState().treeEntries.visible[obj.name]) { + if (obj.userData.type == 'sketch' && !this.scene.store.getState().treeEntries.visible[obj.name]) { obj.visible = false } diff --git a/src/react/app.jsx b/src/react/app.jsx index 5212cb9..14c6584 100644 --- a/src/react/app.jsx +++ b/src/react/app.jsx @@ -11,8 +11,13 @@ import { ToolTip } from './toolTip' import './app.css' +// export async function serial(...args) { +// return (await import('bson')).serialize(...args); +// } - +// export async function deserial(...args) { +// return (await import('bson')).deserialize(...args); +// } let store if (process.env.NODE_ENV === 'production') { @@ -22,6 +27,7 @@ if (process.env.NODE_ENV === 'production') { store = createStore(reducer, {}, applyMiddleware(logger)) } + const App = ({ store }) => { return @@ -30,8 +36,15 @@ const App = ({ store }) => { } -document.addEventListener('DOMContentLoaded', () => { +export let sce + +document.addEventListener('DOMContentLoaded', async () => { + + const { Scene } = await import('../Scene') + sce = new Scene(store) + // window.sc = sce ReactDOM.render(, document.getElementById('react')); + }); -window.store = store \ No newline at end of file +// window.store = store \ No newline at end of file diff --git a/src/react/depTree.js b/src/react/depTree.js index 755b99f..8dcd21b 100644 --- a/src/react/depTree.js +++ b/src/react/depTree.js @@ -1,3 +1,4 @@ +import {sce} from './app' export class DepTree { constructor(obj) { @@ -64,7 +65,8 @@ export class DepTree { this.allIds.splice(spliceIdx, 1) - const deletedObj = sc.obj3d.children.splice(spliceIdx + 1, 1)[0] // first 1 elements are non geom + // const deletedObj = sc.obj3d.children.splice(spliceIdx + 1, 1)[0] // first 1 elements are non geom + const deletedObj = sce.obj3d.children.splice(spliceIdx + 1, 1)[0] // first 1 elements are non geom deletedObj.traverse((obj) => { if (obj.geometry) obj.geometry.dispose() diff --git a/src/react/dialog.jsx b/src/react/dialog.jsx index 9b1debd..5cad1e3 100644 --- a/src/react/dialog.jsx +++ b/src/react/dialog.jsx @@ -6,6 +6,8 @@ import { useDispatch, useSelector } from 'react-redux' import { MdDone, MdClose } from 'react-icons/md' import * as Icon from "./icons"; +import {sce} from './app' + export const Dialog = () => { @@ -21,22 +23,22 @@ export const Dialog = () => { }, [dialog]) const extrude = () => { - const mesh = sc.extrude(dialog.target, ref.current.value) + const mesh = sce.extrude(dialog.target, ref.current.value) dispatch({ type: 'rx-extrusion', mesh, sketchId: dialog.target.obj3d.name }) - if (sc.activeSketch == dialog.target) { + if (sce.activeSketch == dialog.target) { dispatch({ type: 'finish-sketch' }) dialog.target.deactivate() } dispatch({ type: "clear-dialog" }) - sc.render() + sce.render() } const extrudeCancel = () => { - if (sc.activeSketch == dialog.target) { // if extrude dialog launched from sketch mode we set dialog back to the sketch dialog + if (sce.activeSketch == dialog.target) { // if extrude dialog launched from sketch mode we set dialog back to the sketch dialog dispatch({ type: 'set-dialog', action: 'sketch' }) } else { dispatch({ type: "clear-dialog" }) @@ -46,41 +48,41 @@ export const Dialog = () => { const extrudeEdit = () => { dialog.target.userData.featureInfo[1] = ref.current.value - sc.refreshNode(dialog.target.name, treeEntries) + sce.refreshNode(dialog.target.name, treeEntries) dispatch({ type: 'set-modified', status: true }) dispatch({ type: "clear-dialog" }) - sc.render() + sce.render() } const extrudeEditCancel = () => dispatch({ type: "clear-dialog" }) const sketchDone = () => { - if (sc.activeSketch.hasChanged - || sc.activeSketch.idOnActivate != id - || sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id + if (sce.activeSketch.hasChanged + || sce.activeSketch.idOnActivate != id + || sce.activeSketch.c_idOnActivate != sce.activeSketch.c_id ) { - sc.refreshNode(sc.activeSketch.obj3d.name, treeEntries) + sce.refreshNode(sce.activeSketch.obj3d.name, treeEntries) dispatch({ type: 'set-modified', status: true }) } dispatch({ type: 'finish-sketch' }) - sc.activeSketch.deactivate() - sc.render() + sce.activeSketch.deactivate() + sce.render() dispatch({ type: "clear-dialog" }) } const sketchCancel = () => { - if (!sc.activeSketch.hasChanged - && sc.activeSketch.idOnActivate == id - && sc.activeSketch.c_idOnActivate == sc.activeSketch.c_id + if (!sce.activeSketch.hasChanged + && sce.activeSketch.idOnActivate == id + && sce.activeSketch.c_idOnActivate == sce.activeSketch.c_id ) { - if (sc.newSketch) { - dispatch({ type: 'delete-node', id: sc.activeSketch.obj3d.name }) - sc.sid -= 1 + if (sce.newSketch) { + dispatch({ type: 'delete-node', id: sce.activeSketch.obj3d.name }) + sce.sid -= 1 } else { dispatch({ type: "restore-sketch" }) } @@ -88,8 +90,8 @@ export const Dialog = () => { dispatch({ type: 'finish-sketch' }) - sc.activeSketch.deactivate() - sc.render() + sce.activeSketch.deactivate() + sce.render() dispatch({ type: "clear-dialog" }) } diff --git a/src/react/dropDown.jsx b/src/react/dropDown.jsx index 7f0fb0f..8fc6a85 100644 --- a/src/react/dropDown.jsx +++ b/src/react/dropDown.jsx @@ -3,6 +3,9 @@ import React, { useState } from 'react'; import { useDispatch, useSelector } from 'react-redux' +import {sce} from './app' + + export const DropDown = () => { const arr = [ @@ -30,17 +33,15 @@ export const DropDown = () => { } - const handleInsideClick = (e) => { + const handleInsideClick = async (e) => { // handles click inside dropdown, business logic here const idx = Array.prototype.indexOf.call(e.target.parentNode.children, e.target) if (idx !== -1) { console.log(idx) - fetch(arr[idx][0]) - .then(res => res.text()) - .then(text => { - dispatch({ type: 'restore-state', state: sc.loadState(text) }) - sc.render() - }) + const res = await fetch(arr[idx][0]) + const text = await res.text() + dispatch({ type: 'restore-state', state: sce.loadState(text) }) + sce.render() } } const fileHandle = useSelector(state => state.ui.fileHandle) diff --git a/src/react/fileHelpers.js b/src/react/fileHelpers.js index c8000db..bcd71c3 100644 --- a/src/react/fileHelpers.js +++ b/src/react/fileHelpers.js @@ -10,6 +10,8 @@ import { fileSave, } from 'browser-fs-access'; +import {sce} from './app' + // https://web.dev/file-system-access/ const link = document.createElement('a'); @@ -24,7 +26,7 @@ function saveLegacy(blob, filename) { var tzoffset = (new Date()).getTimezoneOffset() * 60000; export function STLExport(filename) { - const result = STLexp.parse(sc.selected[0], { binary: true }); + const result = STLexp.parse(sce.selected[0], { binary: true }); const time = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -5).replace(/:/g, '-'); saveLegacy(new Blob([result], { type: 'model/stl' }), `${filename}_${time}.stl`); } @@ -92,7 +94,7 @@ export async function openFile(dispatch) { try { const text = await file.text();; - dispatch({ type: 'restore-state', state: sc.loadState(text) }) + dispatch({ type: 'restore-state', state: sce.loadState(text) }) dispatch({ type: 'set-file-handle', fileHandle:file.handle }) } catch (ex) { diff --git a/src/react/navBar.jsx b/src/react/navBar.jsx index e91894c..4348a6f 100644 --- a/src/react/navBar.jsx +++ b/src/react/navBar.jsx @@ -12,6 +12,9 @@ import { Dialog } from './dialog' import { DropDown } from './dropDown' import { STLExport, saveFile, openFile, verifyPermission } from './fileHelpers' +import { sce } from './app' +// import { serial, deserial} from './app' + export const NavBar = () => { const dispatch = useDispatch() const sketchActive = useSelector(state => state.ui.sketchActive) @@ -20,15 +23,15 @@ export const NavBar = () => { const modified = useSelector(state => state.ui.modified) const boolOp = (code) => { - if (sc.selected.length != 2 || !sc.selected.every(e => e.userData.type == 'mesh')) { + if (sce.selected.length != 2 || !sce.selected.every(e => e.userData.type == 'mesh')) { alert('please first select two bodies for boolean operation') return } - const [m1, m2] = sc.selected + const [m1, m2] = sce.selected - const mesh = sc.boolOp(m1, m2, code) + const mesh = sce.boolOp(m1, m2, code) - sc.obj3d.add(mesh) + sce.obj3d.add(mesh) dispatch({ type: 'set-entry-visibility', obj: { @@ -43,13 +46,13 @@ export const NavBar = () => { }) - sc.render() + sce.render() forceUpdate() } const addSketch = () => { - const sketch = sc.addSketch() + const sketch = sce.addSketch() if (!sketch) { alert('please select a plane or 3 points to set the sketch plane') return @@ -59,7 +62,7 @@ export const NavBar = () => { sketch.activate() - sc.render() + sce.render() dispatch({ type: 'set-dialog', action: 'sketch' }) @@ -74,11 +77,11 @@ export const NavBar = () => { useEffect(() => { const onBeforeUnload = (e) => { if (modified || - (sc.activeSketch && + (sce.activeSketch && ( - sc.activeSketch.hasChanged - || sc.activeSketch.idOnActivate != id - || sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id + sce.activeSketch.hasChanged + || sce.activeSketch.idOnActivate != id + || sce.activeSketch.c_idOnActivate != sce.activeSketch.c_id ) ) ) { @@ -92,30 +95,31 @@ export const NavBar = () => { useEffect(() => { // hacky way to handle mounting and unmounting mouse listeners for feature mode if (!sketchActive) { - sc.canvas.addEventListener('pointermove', sc.onHover) - sc.canvas.addEventListener('pointerdown', sc.onPick) + sce.canvas.addEventListener('pointermove', sce.onHover) + sce.canvas.addEventListener('pointerdown', sce.onPick) return () => { - sc.canvas.removeEventListener('pointermove', sc.onHover) - sc.canvas.removeEventListener('pointerdown', sc.onPick) + sce.canvas.removeEventListener('pointermove', sce.onHover) + sce.canvas.removeEventListener('pointerdown', sce.onPick) } } }, [sketchActive]) const sketchModeButtons = [ [Icon.Extrude, () => { - dispatch({ type: 'set-dialog', action: 'extrude', target: sc.activeSketch }) + dispatch({ type: 'set-dialog', action: 'extrude', target: sce.activeSketch }) }, 'Extrude'], - [Icon.Line, () => sc.activeSketch.command('l'), 'Line (L)'], - [Icon.Arc, () => sc.activeSketch.command('a'), 'Arc (A)'], - [Icon.Dimension, () => sc.activeSketch.command('d'), 'Dimension (D)'], - [Icon.Coincident, () => sc.activeSketch.command('c'), 'Coincident (C)'], - [Icon.Vertical, () => sc.activeSketch.command('v'), 'Vertical (V)'], - [Icon.Horizontal, () => sc.activeSketch.command('h'), 'Horizontal (H)'], - [Icon.Tangent, () => sc.activeSketch.command('t'), 'Tangent (T)'], + [Icon.Line, () => sce.activeSketch.command('l'), 'Line (L)'], + [Icon.Arc, () => sce.activeSketch.command('a'), 'Arc (A)'], + [Icon.Dimension, () => sce.activeSketch.command('d'), 'Dimension (D)'], + [Icon.Coincident, () => sce.activeSketch.command('c'), 'Coincident (C)'], + [Icon.Vertical, () => sce.activeSketch.command('v'), 'Vertical (V)'], + [Icon.Horizontal, () => sce.activeSketch.command('h'), 'Horizontal (H)'], + [Icon.Tangent, () => sce.activeSketch.command('t'), 'Tangent (T)'], [MdSave, async () => { - saveFile(fileHandle, JSON.stringify([id, sc.sid, sc.mid, treeEntries]), dispatch) + saveFile(fileHandle, JSON.stringify([id, sce.sid, sce.mid, treeEntries]), dispatch) + // saveFile(fileHandle, serial([id, sce.sid, sce.mid, treeEntries]), dispatch) } , 'Save'], ] @@ -125,7 +129,7 @@ export const NavBar = () => { [FaEdit, addSketch, 'Sketch'], [Icon.Extrude, () => { try { - dispatch({ type: 'set-dialog', action: 'extrude', target: treeEntries.byId[sc.selected[0].name] }) + dispatch({ type: 'set-dialog', action: 'extrude', target: treeEntries.byId[sce.selected[0].name] }) } catch (err) { console.error(err) alert('please select a sketch from the left pane extrude') @@ -138,23 +142,24 @@ export const NavBar = () => { [Icon.Intersect, () => boolOp('i'), 'Intersect'], [MdInsertDriveFile, () => { if (!confirmDiscard()) return - sc.newPart() + sce.newPart() dispatch({ type: 'new-part' }) - sc.render() + sce.render() }, 'New'], [MdSave, () => { - saveFile(fileHandle, JSON.stringify([id, sc.sid, sc.mid, treeEntries]), dispatch) + saveFile(fileHandle, JSON.stringify([id, sce.sid, sce.mid, treeEntries]), dispatch) + // saveFile(fileHandle, serial([id, sce.sid, sce.mid, treeEntries]), dispatch) } , 'Save'], [MdFolder, () => { if (!confirmDiscard()) return openFile(dispatch).then( - sc.render + sce.render ) }, 'Open'], [Icon.Stl, () => { - if (sc.selected[0] && sc.selected[0].userData.type == 'mesh') { + if (sce.selected[0] && sce.selected[0].userData.type == 'mesh') { STLExport(fileHandle ? fileHandle.name.replace(/\.[^/.]+$/, "") : 'untitled') } else { alert('please first select one body to export') diff --git a/src/react/reducer.js b/src/react/reducer.js index 211c763..68c868a 100644 --- a/src/react/reducer.js +++ b/src/react/reducer.js @@ -3,6 +3,7 @@ import { DepTree } from './depTree' import update from 'immutability-helper' import { combineReducers } from 'redux'; +import { sce } from './app' const defaultState = { byId: {}, @@ -38,13 +39,13 @@ export function treeEntries(state = defaultState, action) { }) case 'finish-sketch': return update(state, { - visible: { [sc.activeSketch.obj3d.name]: { $set: false } }, + visible: { [sce.activeSketch.obj3d.name]: { $set: false } }, }) case 'restore-sketch': - const sketch = sc.loadSketch(cache) + const sketch = sce.loadSketch(cache) - const deletedObj = sc.obj3d.children.splice(state.order[sc.activeSketch.obj3d.name] + 1, 1, + const deletedObj = sce.obj3d.children.splice(state.order[sce.activeSketch.obj3d.name] + 1, 1, sketch.obj3d )[0] @@ -53,10 +54,10 @@ export function treeEntries(state = defaultState, action) { if (obj.material) obj.material.dispose() }) - sc.activeSketch = sketch + sce.activeSketch = sketch return update(state, { - byId: { [sc.activeSketch.obj3d.name]: { $set: sketch } }, + byId: { [sce.activeSketch.obj3d.name]: { $set: sketch } }, }) case 'rx-extrusion': diff --git a/src/react/tree.jsx b/src/react/tree.jsx index 039b164..b6baf75 100644 --- a/src/react/tree.jsx +++ b/src/react/tree.jsx @@ -6,6 +6,8 @@ import { MdVisibilityOff, MdVisibility, MdDelete } from 'react-icons/md' import { FaCube, FaEdit } from 'react-icons/fa' +import {sce} from './app' + export const Tree = () => { const treeEntries = useSelector(state => state.treeEntries) const fileHandle = useSelector(state => state.ui.fileHandle) @@ -53,19 +55,19 @@ const TreeEntry = ({ entId }) => { return
{ if (obj3d.userData.type == 'sketch') { - if (sc.activeSketch) { + if (sce.activeSketch) { dispatch({ type: 'finish-sketch' }) - sc.activeSketch.deactivate() + sce.activeSketch.deactivate() } sketch.activate() dispatch({ type: 'set-active-sketch', sketch }) - sc.clearSelection() - sc.activeSketch = sketch; + sce.clearSelection() + sce.activeSketch = sketch; dispatch({ type: 'set-dialog', action: 'sketch' }) - sc.render() + sce.render() } else if (obj3d.userData.featureInfo.length == 2) { dispatch({ type: 'set-dialog', action: 'extrude-edit', target: treeEntriesById[entId] }) } @@ -79,37 +81,37 @@ const TreeEntry = ({ entId }) => { obj3d.visible = true } - sc.setHover(obj3d, 1) - sc.render() + sce.setHover(obj3d, 1) + sce.render() }} onPointerLeave={() => { if (!mouseOn) return setMouseOn(false) if (obj3d.userData.type == 'sketch' - && !sc.selected.includes(obj3d) + && !sce.selected.includes(obj3d) && !visible ) { obj3d.visible = false } - if (sc.selected.includes(obj3d)) return + if (sce.selected.includes(obj3d)) return - sc.setHover(obj3d, 0) + sce.setHover(obj3d, 0) - sc.render() + sce.render() }} onClick={() => { - const idx = sc.selected.indexOf(obj3d) + const idx = sce.selected.indexOf(obj3d) if (idx == -1) { - sc.selected.push(obj3d) - sc.setHover(obj3d, 1) + sce.selected.push(obj3d) + sce.setHover(obj3d, 1) } else { - sc.setHover(sc.selected[idx], 0) - sc.selected.splice(idx, 1) + sce.setHover(sce.selected[idx], 0) + sce.selected.splice(idx, 1) } - sc.render() + sce.render() }} tooltip= {obj3d.name[0] !='(' && "double click to edit"} @@ -125,7 +127,7 @@ const TreeEntry = ({ entId }) => { { dispatch({ type: 'delete-node', id: entId }) - sc.render() + sce.render() e.stopPropagation() }} /> @@ -142,7 +144,7 @@ const TreeEntry = ({ entId }) => { obj3d.traverse((e) => e.layers.disable(1)) } - sc.render() + sce.render() forceUpdate() }} /> @@ -158,7 +160,7 @@ const TreeEntry = ({ entId }) => { e.layers.enable(1) }) } - sc.render() + sce.render() forceUpdate() }} /> diff --git a/static/index.html b/static/index.html index 2577082..7a84266 100644 --- a/static/index.html +++ b/static/index.html @@ -23,7 +23,7 @@
- + diff --git a/webpack.common.js b/webpack.common.js index 6198b66..79720c1 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -5,7 +5,7 @@ const tailwindcss = require('tailwindcss') module.exports = { entry: { app: './src/react/app.jsx', - scene: './src/Scene.js', + // scene: './src/Scene.js', }, output: { filename: '[name].bundle.js',