diff --git a/icon/svgr_raw/flip.svg b/icon/svgr_raw/flip.svg new file mode 100644 index 0000000..a9010f8 --- /dev/null +++ b/icon/svgr_raw/flip.svg @@ -0,0 +1,67 @@ + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/Scene.js b/src/Scene.js index eefca32..f06ea0f 100644 --- a/src/Scene.js +++ b/src/Scene.js @@ -347,7 +347,7 @@ async function addSketch() { } window.sc = new Scene(store) -sc.loadState() +// sc.loadState() // sc.camera.layers.enable(1) // rc.layers.set(1) \ No newline at end of file diff --git a/src/extrude.js b/src/extrude.js index 00b5c19..9c68abf 100644 --- a/src/extrude.js +++ b/src/extrude.js @@ -1,6 +1,7 @@ import * as THREE from '../node_modules/three/src/Three'; import { color} from './shared' -export function extrude(sketch) { +export function extrude(sketch, depth) { + console.log(sketch,'here') let constraints = sketch.constraints; let linkedObjs = sketch.linkedObjs; @@ -67,7 +68,7 @@ export function extrude(sketch) { findPair(children[4]) //??? need fixing const shape = new THREE.Shape(v2s); - const extrudeSettings = { depth: 8, bevelEnabled: false }; + const extrudeSettings = { depth, bevelEnabled: false }; const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings); @@ -100,6 +101,7 @@ export function extrude(sketch) { sketch.deactivate() } + // this.clearSelection() this.render() } diff --git a/src/mouseEvents.js b/src/mouseEvents.js index a873c25..45a2e04 100644 --- a/src/mouseEvents.js +++ b/src/mouseEvents.js @@ -114,8 +114,8 @@ export function onHover(e) { let draggedLabel; export function onPick(e) { - console.log(e) if (this.mode || e.buttons != 1) return + // if (this.mode || e.buttons != 1 || e.ctrlKey || e.metaKey) return if (this.hovered.length) { let obj = this.hovered[this.hovered.length - 1] diff --git a/src/react/app.css b/src/react/app.css index 2329f06..0326244 100644 --- a/src/react/app.css +++ b/src/react/app.css @@ -36,6 +36,12 @@ body { width: var(--sideNavW); } +.dialog { + position: absolute; + top: var(--topNavH); + left: var(--sideNavW); +} + #labels > div { position: absolute; diff --git a/src/react/app.jsx b/src/react/app.jsx index b07d366..2c84bc1 100644 --- a/src/react/app.jsx +++ b/src/react/app.jsx @@ -1,27 +1,43 @@ import ReactDOM from 'react-dom' -import React from 'react' +import React, { useState } from 'react' import { createStore, applyMiddleware} from 'redux' import { Provider } from 'react-redux' -import { reducer, preloadedState } from './reducer' +import { reducer } from './reducer' import logger from 'redux-logger' import { Tree } from './tree' import { NavBar } from './navBar' import { ToolTip} from './toolTip' +import { Dialog } from './dialog' import './app.css' -const store = createStore(reducer, preloadedState, applyMiddleware(logger)) +const preloadedState = { + treeEntries: { + byId: {}, + allIds: [], + tree: {}, + order: {}, + visible: {}, + activeSketchId: "" + }, +} -const App = ({ store }) => ( - - +// const store = createStore(reducer, preloadedState, applyMiddleware(logger)) +const store = createStore(reducer, {}, applyMiddleware(logger)) + +const App = ({ store }) => { + const [dialog, setDialog] = useState() + + return + + -); +}; document.addEventListener('DOMContentLoaded', () => { ReactDOM.render(, document.getElementById('react')); diff --git a/src/react/dialog.jsx b/src/react/dialog.jsx new file mode 100644 index 0000000..f21dbb8 --- /dev/null +++ b/src/react/dialog.jsx @@ -0,0 +1,52 @@ + + +import React, { useEffect, useReducer, useRef, useState } from 'react'; + +import { useDispatch, useSelector } from 'react-redux' + +import { MdDone, MdClose } from 'react-icons/md' +import { GiVerticalFlip } from 'react-icons/gi' +import * as Icon from "./icons"; + + +export const Dialog = ({ dd }) => { + if (!dd) return null + + const dispatch = useDispatch() + const treeEntriesById = useSelector(state => state.treeEntries.byId) + const activeSketchId = useSelector(state => state.treeEntries.activeSketchId) + + const ref = useRef() + useEffect(() => { + ref.current.focus() + }, []) + + const extrude = () => { + if (sc.activeSketch) { + sc.extrude(sc.activeSketch, ref.current.value) + } else if (sc.selected.length === 1 && sc.selected[0].userData.type == 'sketch') { + sc.extrude(treeEntriesById[sc.selected[0].name], ref.current.value) + } else { + console.log('invalid selection') + } + } + + + const [_, forceUpdate] = useReducer(x => x + 1, 0); + + return
+ + + + +
+} + + +export const useNumField = (initValue = 0) => { + const [value, setValue] = useState(initValue); + const onChange = e => setValue(e.target.value); + return { value, onChange }; +} \ No newline at end of file diff --git a/src/react/icons.jsx b/src/react/icons.jsx index dfaf4e5..988281e 100644 --- a/src/react/icons.jsx +++ b/src/react/icons.jsx @@ -250,6 +250,24 @@ function Extrude_master(props) { ); } +function Flip(props) { + return ( + + + + + ); +} + function Horizontal(props) { return ( ); } -export { Arc, Coincident, Dimension, Extrude, Extrude_master, Horizontal, Intersect, Intersect_thin, Line, Stl, Subtract, Tangent, Union, Union_thin, Vertical }; \ No newline at end of file +export { Arc, Coincident, Dimension, Extrude, Extrude_master, Flip, Horizontal, Intersect, Intersect_thin, Line, Stl, Subtract, Tangent, Union, Union_thin, Vertical }; \ No newline at end of file diff --git a/src/react/navBar.jsx b/src/react/navBar.jsx index 1caaba7..d06935b 100644 --- a/src/react/navBar.jsx +++ b/src/react/navBar.jsx @@ -10,7 +10,7 @@ import { MdDone, MdSave, MdFolder } from 'react-icons/md' import * as Icon from "./icons"; -export const NavBar = () => { +export const NavBar = ({setDialog}) => { const dispatch = useDispatch() const treeEntriesById = useSelector(state => state.treeEntries.byId) const activeSketchId = useSelector(state => state.treeEntries.activeSketchId) @@ -25,13 +25,19 @@ export const NavBar = () => { forceUpdate() } const extrude = () => { - // sc.extrude(treeEntriesById[activeSketchId]) - sc.extrude(sc.activeSketch) + setDialog('dd') + // if (sc.activeSketch) { + // sc.extrude(sc.activeSketch) + // } else if (sc.selected.length === 1 && sc.selected[0].userData.type == 'sketch') { + // sc.extrude(treeEntriesById[sc.selected[0].name]) + // } else { + // console.log('invalid selection') + // } } const addSketch = () => { sc.addSketch() - console.log(!!sc.activeSketch,'state') + console.log(!!sc.activeSketch, 'state') forceUpdate() } @@ -46,9 +52,9 @@ export const NavBar = () => { } }, [activeSketchId]) - useEffect(() => { - console.log(treeEntriesById) - }, [treeEntriesById]) + // useEffect(() => { + // console.log(treeEntriesById) + // }, [treeEntriesById]) const btnz = [ @@ -87,7 +93,7 @@ export const NavBar = () => { return
{ - activeSketchId? + activeSketchId ? btnz.map(([Icon, fcn, txt, shortcut], idx) => (