three.cad/src/react/navBar.jsx

94 lines
3.0 KiB
React
Raw Normal View History

2021-04-07 12:21:09 +08:00
2021-04-08 06:50:53 +08:00
import React, { useEffect, useReducer } from 'react';
2021-04-07 12:21:09 +08:00
import { useDispatch, useSelector } from 'react-redux'
import { FaCube, FaEdit } from 'react-icons/fa'
2021-04-14 04:39:33 +08:00
import { MdDone, MdSave, MdFolder} from 'react-icons/md'
2021-04-07 12:21:09 +08:00
import * as Icon from "./icons";
export const NavBar = () => {
const dispatch = useDispatch()
const treeEntries = useSelector(state => state.treeEntries)
2021-04-11 15:57:39 +08:00
const activeSketchId = useSelector(state => state.treeEntries.activeSketchId)
2021-04-07 12:21:09 +08:00
2021-04-13 09:37:16 +08:00
const boolOp = (code) => {
if (sc.selected.length != 2 || !sc.selected.every(e => e.userData.type == 'mesh')) return
const [m1, m2] = sc.selected
const mesh = sc.subtract(m1, m2, code)
dispatch({ type: 'rx-boolean', mesh, deps: [m1.name, m2.name] })
sc.render()
forceUpdate()
}
const extrude = () => {
console.log(treeEntries.tree[activeSketchId])
sc.extrude(treeEntries.byId[activeSketchId])
}
2021-04-07 12:21:09 +08:00
useEffect(() => {
if (!activeSketchId) {
sc.canvas.addEventListener('pointermove', sc.onHover)
sc.canvas.addEventListener('pointerdown', sc.onPick)
return () => {
sc.canvas.removeEventListener('pointermove', sc.onHover)
sc.canvas.removeEventListener('pointerdown', sc.onPick)
}
}
}, [activeSketchId])
const btnz = [
2021-04-14 04:39:33 +08:00
[MdDone, () => {
treeEntries.byId[activeSketchId].deactivate()
// dispatch({ type: 'update-descendents', sketch})
sc.activeSketch = null
sc.render()
forceUpdate()
// sc.activeDim = this.activeSketch.obj3d.children[1].children
}, 'Finish'],
[FaCube, extrude, 'Extrude [e]'],
2021-04-09 07:05:52 +08:00
[Icon.Dimension, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Dimension [d]'],
[Icon.Line, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Line [l]'],
[Icon.Arc, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Arc [a]'],
2021-04-14 04:39:33 +08:00
[Icon.Coincident, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Arc [a]'],
[Icon.Vertical, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Arc [a]'],
[Icon.Horizontal, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Arc [a]'],
]
const btnz2 = [
[FaEdit, sc.addSketch, 'Sketch [s]']
,
[FaCube, extrude, 'Extrude [e]'],
[Icon.Union, () => boolOp('u'), 'Union'],
[Icon.Subtract, () => boolOp('s'), 'Subtract'],
[Icon.Intersect, () => boolOp('i'), 'Intersect'],
[MdSave, () => boolOp('i'), 'Intersect'],
[MdFolder, () => boolOp('i'), 'Intersect'],
[Icon.Stl, () => boolOp('i'), 'Intersect'],
2021-04-07 12:21:09 +08:00
]
const [_, forceUpdate] = useReducer(x => x + 1, 0);
2021-04-11 07:16:08 +08:00
return <div className='topNav flex justify-center items-center bg-gray-700'>
2021-04-07 12:21:09 +08:00
{
2021-04-14 04:39:33 +08:00
activeSketchId ?
btnz.map(([Icon, fcn, txt, shortcut], idx) => (
<Icon className="btn w-auto h-full p-3.5" tooltip={txt}
onClick={fcn} key={idx}
/>
))
:
btnz2.map(([Icon, fcn, txt, shortcut], idx) => (
<Icon className="btn w-auto h-full p-3.5" tooltip={txt}
onClick={fcn} key={idx}
/>
))
2021-04-07 12:21:09 +08:00
}
</div>
}