fix extrude mesh save issue
This commit is contained in:
parent
5d782cf9a9
commit
132be08553
File diff suppressed because one or more lines are too long
37
src/Scene.js
37
src/Scene.js
@ -24,8 +24,6 @@ window.loader = new THREE.ObjectLoader();
|
||||
window.STLexp = new STLExporter();
|
||||
|
||||
window.id = 0
|
||||
// window.sid = 1
|
||||
// window.mid = 1
|
||||
|
||||
|
||||
const pointMaterial = new THREE.PointsMaterial({
|
||||
@ -141,7 +139,7 @@ export class Scene {
|
||||
|
||||
this.render = render.bind(this);
|
||||
this.addSketch = addSketch.bind(this);
|
||||
this.extrude = extrude.bind(this);
|
||||
this.extrude = this.extrude.bind(this);
|
||||
this.onHover = onHover.bind(this);
|
||||
this.onPick = onPick.bind(this);
|
||||
this.clearSelection = clearSelection.bind(this);
|
||||
@ -166,6 +164,8 @@ export class Scene {
|
||||
this.render();
|
||||
}
|
||||
|
||||
|
||||
|
||||
resizeCanvas(renderer) {
|
||||
const canvas = renderer.domElement;
|
||||
const width = canvas.clientWidth;
|
||||
@ -185,7 +185,6 @@ export class Scene {
|
||||
|
||||
clearScene() {
|
||||
const deleted = this.obj3d.children.splice(1)
|
||||
console.log(deleted)
|
||||
|
||||
for (let i = 0; i < deleted.length; i++) {
|
||||
deleted[i].traverse((obj) => {
|
||||
@ -195,6 +194,13 @@ export class Scene {
|
||||
}
|
||||
}
|
||||
|
||||
newPart() {
|
||||
this.clearScene()
|
||||
window.id = 0
|
||||
this.sid = 1
|
||||
this.mid = 1
|
||||
}
|
||||
|
||||
loadState(file) { //uglyyy
|
||||
|
||||
this.clearScene()
|
||||
@ -250,6 +256,21 @@ export class Scene {
|
||||
return entry
|
||||
}
|
||||
|
||||
extrude(sketch, depth) {
|
||||
const mesh = extrude(sketch, depth)
|
||||
mesh.name = 'e' + this.mid++
|
||||
|
||||
this.obj3d.add(mesh)
|
||||
|
||||
this.store.dispatch({ type: 'rx-extrusion', mesh, sketchId: sketch.obj3d.name })
|
||||
|
||||
if (this.activeSketch == sketch) {
|
||||
this.store.dispatch({ type: 'finish-sketch' })
|
||||
sketch.deactivate()
|
||||
}
|
||||
this.render()
|
||||
|
||||
}
|
||||
|
||||
boolOp(m1, m2, op, refresh = false) {
|
||||
let bspA = CSG.fromMesh(m1)
|
||||
@ -315,26 +336,30 @@ export class Scene {
|
||||
let curId
|
||||
let que = [id]
|
||||
let idx = 0
|
||||
// let newNodes = {}
|
||||
|
||||
const { byId, tree } = this.store.getState().treeEntries
|
||||
while (idx < que.length) {
|
||||
curId = que[idx++]
|
||||
|
||||
if (byId[curId].userData) {
|
||||
if (byId[curId].userData) { // if it is a mesh
|
||||
const info = byId[curId].userData.featureInfo
|
||||
let newNode
|
||||
if (info.length == 2) {
|
||||
newNode = this.extrude(byId[info[0]], info[1], true)
|
||||
newNode = extrude(byId[info[0]], info[1])
|
||||
} else if (info.length == 3) {
|
||||
newNode = this.boolOp(byId[info[0]], byId[info[1]], info[2], true)
|
||||
}
|
||||
byId[curId].geometry.copy(newNode.geometry)
|
||||
byId[curId].geometry.parameters = newNode.geometry.parameters // took 2 hours to figure out
|
||||
|
||||
}
|
||||
|
||||
for (let k in tree[curId]) {
|
||||
que.push(k)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import * as THREE from '../node_modules/three/src/Three';
|
||||
import { color } from './shared'
|
||||
export function extrude(sketch, depth, refresh=false) {
|
||||
export function extrude(sketch, depth) {
|
||||
|
||||
let constraints = sketch.constraints;
|
||||
let linkedObjs = sketch.linkedObjs;
|
||||
@ -90,7 +90,6 @@ export function extrude(sketch, depth, refresh=false) {
|
||||
|
||||
|
||||
|
||||
mesh.name = 'e' + this.mid++
|
||||
mesh.userData.type = 'mesh'
|
||||
mesh.userData.featureInfo = [sketch.obj3d.name, depth]
|
||||
mesh.layers.enable(1)
|
||||
@ -109,20 +108,8 @@ export function extrude(sketch, depth, refresh=false) {
|
||||
mesh.userData.inverted = true
|
||||
}
|
||||
|
||||
return mesh
|
||||
|
||||
if (!refresh) {
|
||||
this.obj3d.add(mesh)
|
||||
|
||||
this.store.dispatch({ type: 'rx-extrusion', mesh, sketchId: sketch.obj3d.name })
|
||||
|
||||
if (this.activeSketch == sketch) {
|
||||
this.store.dispatch({ type: 'finish-sketch' })
|
||||
sketch.deactivate()
|
||||
}
|
||||
this.render()
|
||||
} else {
|
||||
return mesh
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@ const link = document.createElement('a');
|
||||
link.style.display = 'none';
|
||||
document.body.appendChild(link);
|
||||
|
||||
function save(blob, filename) {
|
||||
function saveLegacy(blob, filename) {
|
||||
|
||||
link.href = URL.createObjectURL(blob);
|
||||
link.download = filename;
|
||||
@ -11,24 +11,17 @@ function save(blob, filename) {
|
||||
}
|
||||
|
||||
|
||||
function saveArrayBuffer(buffer, filename) {
|
||||
var tzoffset = (new Date()).getTimezoneOffset() * 60000;
|
||||
|
||||
// save( new Blob( [ buffer ], { type: 'application/octet-stream' } ), filename );
|
||||
save(new Blob([buffer], { type: 'model/stl' }), filename);
|
||||
|
||||
}
|
||||
|
||||
function saveString(text, filename) {
|
||||
|
||||
// save( new Blob( [ text ], { type: 'text/plain' } ), filename );
|
||||
save(new Blob([text], { type: 'application/json' }), filename);
|
||||
|
||||
}
|
||||
|
||||
export function STLExport() {
|
||||
export function STLExport(filename) {
|
||||
if (sc.selected[0] && sc.selected[0].userData.type == 'mesh') {
|
||||
|
||||
const result = STLexp.parse(sc.selected[0], { binary: true });
|
||||
saveArrayBuffer(result, 'box.stl');
|
||||
|
||||
const time = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -5).replace(/:/g, '-');
|
||||
|
||||
saveLegacy(new Blob([result], { type: 'model/stl' }), `${filename}_${time}.stl`);
|
||||
}
|
||||
}
|
||||
|
||||
@ -93,25 +86,6 @@ export async function saveFileAs(file, dispatch) {
|
||||
};
|
||||
|
||||
|
||||
async function verifyPermission(fileHandle, withWrite) {
|
||||
const opts = {};
|
||||
if (withWrite) {
|
||||
opts.writable = true;
|
||||
// For Chrome 86 and later...
|
||||
opts.mode = 'readwrite';
|
||||
}
|
||||
// Check if we already have permission, if so, return true.
|
||||
if (await fileHandle.queryPermission(opts) === 'granted') {
|
||||
return true;
|
||||
}
|
||||
// Request permission to the file, if the user grants permission, return true.
|
||||
if (await fileHandle.requestPermission(opts) === 'granted') {
|
||||
return true;
|
||||
}
|
||||
// The user did nt grant permission, return false.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
export async function openFile(dispatch) {
|
||||
// if (!app.confirmDiscard()) {
|
||||
@ -135,15 +109,13 @@ export async function openFile(dispatch) {
|
||||
if (!fileHandle) {
|
||||
return;
|
||||
}
|
||||
const file = await fileHandle.getFile();
|
||||
|
||||
readFile(file, fileHandle, dispatch);
|
||||
|
||||
|
||||
|
||||
try {
|
||||
const text = await readFile(file);
|
||||
const file = await fileHandle.getFile();
|
||||
const text = await file.text();;
|
||||
sc.loadState(text)
|
||||
|
||||
dispatch({ type: 'set-file-handle', fileHandle })
|
||||
// app.setModified(false);
|
||||
// app.setFocus(true);
|
@ -10,7 +10,7 @@ import { FaRegFolderOpen, FaFile } from 'react-icons/fa'
|
||||
|
||||
import * as Icon from "./icons";
|
||||
import { Dialog } from './dialog'
|
||||
import { STLExport, savePart, saveFile, openFile } from './fileExporter'
|
||||
import { STLExport, saveFile, openFile } from './fileHelpers'
|
||||
|
||||
|
||||
|
||||
@ -76,12 +76,25 @@ export const NavBar = () => {
|
||||
[Icon.Union, () => boolOp('u'), 'Union'],
|
||||
[Icon.Subtract, () => boolOp('s'), 'Subtract'],
|
||||
[Icon.Intersect, () => boolOp('i'), 'Intersect'],
|
||||
[MdInsertDriveFile, savePart, 'New [ctrl+n]'],
|
||||
[MdSave, () => {
|
||||
saveFile(fileHandle, sc.saveScene(), dispatch)
|
||||
}, 'Save [ctrl+s]'],
|
||||
[MdFolder, () => openFile(dispatch), 'Open'],
|
||||
[Icon.Stl, STLExport, 'Export STL'],
|
||||
[MdInsertDriveFile, () => {
|
||||
sc.newPart()
|
||||
dispatch({ type: 'new-part' })
|
||||
sc.render()
|
||||
}, 'New [ctrl+n]'],
|
||||
[MdSave,
|
||||
() => {
|
||||
saveFile(fileHandle, sc.saveScene(), dispatch)
|
||||
}
|
||||
, 'Save [ctrl+s]'],
|
||||
[MdFolder, () => {
|
||||
openFile(dispatch).then(
|
||||
()=>sc.render()
|
||||
)
|
||||
}, 'Open'],
|
||||
[Icon.Stl, () => {
|
||||
STLExport('box')
|
||||
},
|
||||
, 'Export STL'],
|
||||
]
|
||||
|
||||
const [_, forceUpdate] = useReducer(x => x + 1, 0);
|
||||
|
@ -97,9 +97,10 @@ export function treeEntries(state = defaultState, action) {
|
||||
const depTree = new DepTree(state)
|
||||
const obj = depTree.deleteNode(action.id)
|
||||
return update(state, { $merge: obj })
|
||||
|
||||
case 'restore-state':
|
||||
return action.state
|
||||
case 'new-part':
|
||||
return defaultState
|
||||
default:
|
||||
return state
|
||||
}
|
||||
@ -121,6 +122,11 @@ export function ui(state = { dialog: {}, filePane: false }, action) {
|
||||
fileHandle: { $set: action.fileHandle },
|
||||
modified: { $set: false },
|
||||
})
|
||||
case 'new-part':
|
||||
return update(state, {
|
||||
fileHandle: { $set: null },
|
||||
modified: { $set: false },
|
||||
})
|
||||
default:
|
||||
return state
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user