import React from 'react'; import { placeOnGround, createScene, createGcodeGeometry } from './utils.js'; import baseSettings from '../settings/default.yml'; import printerSettings from '../settings/printer.yml'; import materialSettings from '../settings/material.yml'; import qualitySettings from '../settings/quality.yml'; import PropTypes from 'proptypes'; import injectSheet from 'react-jss'; import { sliceGeometry } from '../slicer.js'; import * as THREE from 'three'; const styles = { container: { position: 'relative' }, canvas: { position: 'absolute', }, controlBar: { position: 'absolute', bottom: 0, left: 0 }, sliceBar: { position: 'absolute', top: 0, right: 0 } }; class Interface extends React.Component { static defaultProps = { width: 720, height: 480, printers: printerSettings, defaultPrinter: 'ultimaker2' }; static propTypes = { geometry: (props, propName) => { if (!(props[propName].isGeometry || props[propName].isBufferGeometry)) { throw new Error('invalid prop, is not geometry'); } }, width: PropTypes.number.isRequired, height: PropTypes.number.isRequired, classes: PropTypes.objectOf(PropTypes.string), printers: PropTypes.object.isRequired, defaultPrinter: PropTypes.string.isRequired, }; state = { controlMode: 'translate', sliced: false }; componentDidMount() { const { canvas } = this.refs; const scene = createScene(canvas, this.props, this.state); this.setState(scene); } resetMesh = () => { const { mesh, render } = this.state; if (mesh) { mesh.position.set(0, 0, 0); mesh.scale.set(1, 1, 1); mesh.rotation.set(0, 0, 0); mesh.updateMatrix(); placeOnGround(mesh); render(); } } slice = async () => { const { mesh, render, scene, control } = this.state; const settings = { ...baseSettings, ...materialSettings.pla, ...printerSettings[this.props.defaultPrinter] }; const { dimensions } = settings; const centerX = dimensions.x / 2; const centerY = dimensions.y / 2; const geometry = mesh.geometry.clone(); mesh.updateMatrix(); const matrix = new THREE.Matrix4().makeTranslation(centerY, 0, centerX).multiply(mesh.matrix); const { gcode, linePreview } = await sliceGeometry(settings, geometry, matrix, true, true, (process) => { console.log('process: ', process); }); // can't disable control so remove it control.dispose(); scene.remove(control, mesh); linePreview.position.x = -centerY; linePreview.position.z = -centerX; scene.add(linePreview); render(); this.setState({ sliced: true }); }; componentWillUnmount() { if (this.state.editorControls) this.state.editorControls.dispose(); if (this.state.control) this.state.control.dispose(); } componentWillUpdate(nextProps, nextState) { const { control } = this.state; if (control && nextState.controlMode !== this.state.controlMode) control.setMode(nextState.controlMode); } render() { const { width, height, classes } = this.props; const { sliced } = this.state; return (
{!sliced &&
} {!sliced &&
}
); } } export default injectSheet(styles)(Interface);