From a6f0173b65ba24253a067ddffa98e36cab725934 Mon Sep 17 00:00:00 2001 From: Sean Hickey <hisean@media.mit.edu> Date: Thu, 9 Aug 2018 13:41:25 -0400 Subject: [PATCH] Added really basic clay pot module --- modules/hardware/pot | 236 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 modules/hardware/pot diff --git a/modules/hardware/pot b/modules/hardware/pot new file mode 100644 index 0000000..5386b80 --- /dev/null +++ b/modules/hardware/pot @@ -0,0 +1,236 @@ +// +// print a pot +// +// Sean Hickey +// (c) Massachusetts Institute of Technology 2018 +// +// This work may be reproduced, modified, distributed, performed, and +// displayed for any purpose, but must acknowledge the mods +// project. Copyright is retained and must be preserved. The work is +// provided as is; no warranty is provided, and users accept all +// liability. + + +// +// closure +// +(function() { + // + // module globals + // + var mod = {} + // + // name + // + var name = 'print a pot!' + // + // initialization + // + var init = function() { + + // Load three.js + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.onload = threeJsLoaded; + script.src = 'js/three.js/three.min.js'; + mod.div.appendChild(script); + } + // + // inputs + // + var inputs = { + // gcode: { + // type: 'string', + // label: 'gcode', + // event: function(evt) { + // parseGCode(evt.detail) + // } + // } + } + // + // outputs + // + var outputs = { + instructions: { + type: 'object', + label: 'instructions', + event: function(obj) { + mods.output(mod, 'instructions', obj) + } + } + } + // + // interface + // + var interface = function(div) { + mod.div = div + + // Three.js viewer div + var viewer = document.createElement('div'); + viewer.style.width = '300px'; + viewer.style.height = '200px'; + div.appendChild(viewer); + + mod.viewer = viewer; + + // + // inputs + // + mod.sendButton = make_button_input(div, 'send') + mod.sendButton.addEventListener('click', function() { + outputs.instructions.event(mod.instructionArray); + }) + } + + function distance(v0, v1) { + return Math.sqrt( ((v1.x - v0.x) * (v1.x - v0.x)) + ((v1.y - v0.y) * (v1.y - v0.y)) ); + } + + function threeJsLoaded() { + var renderer = new THREE.WebGLRenderer(); + renderer.setSize( mod.viewer.clientWidth, mod.viewer.clientHeight ); + mod.viewer.appendChild( renderer.domElement ); + + var scene = new THREE.Scene(); + var camera = new THREE.PerspectiveCamera( 75, mod.viewer.clientWidth / mod.viewer.clientHeight, 0.1, 1000 ); + // var controls = new THREE.OrbitControls( camera ); + + camera.position.z = 50; + + var points = []; + for ( var i = 0; i < 20; i ++ ) { + points.push( new THREE.Vector2( Math.sin( i * 0.1 ) * 10 + 5, i) ); + } + + // Create revolved geometry + var geometry = new THREE.LatheGeometry( points ); + var material = new THREE.MeshBasicMaterial( { color: 0x0000ff } ); + var pot = new THREE.Mesh( geometry, material ); + + // Rotate the vertex order so that we spiral up from the bottom + var potVerts = pot.geometry.vertices; + var clayGeometry = new THREE.Geometry(); + var segments = geometry.parameters.segments || 12; + for ( var pt = 0; pt < points.length; ++pt ) { + for ( var seg = 0; seg < segments; ++seg ) { + var vert = potVerts[(points.length * seg) + pt]; + clayGeometry.vertices.push(vert); + } + } + var pathMat = new THREE.LineBasicMaterial( { color: 0x00ff00 } ); + var path = new THREE.Line(clayGeometry, pathMat); + // scene.add(pot); + scene.add(path); + + /************************************************************ + * + * Generate move instructions + * + * NOTE: We rotate the coordinate system from Y-up to Z-up + * + ************************************************************/ + var verts = clayGeometry.vertices; + var totalExtrusion = 0; + const EXTRUSION_RATE = 20; + var instructions = []; + + // Add the first instruction manually + instructions.push({ + type: "move", + speed: EXTRUSION_RATE, + position: { + X: verts[0].x, + Y: verts[0].z, + Z: verts[0].y, + E: 0 + } + }); + + for (var i = 1; i < verts.length; ++i) { + var currentVert = verts[i]; + var previousVert = verts[i - 1]; + totalExtrusion += distance(currentVert, previousVert); + instructions.push({ + type: "move", + speed: EXTRUSION_RATE, + position: { + X: verts[i].x, + Y: verts[i].z, + Z: verts[i].y, + E: totalExtrusion + } + }) + } + + mod.instructionArray = instructions; + + + // Render + + var animate = function () { + requestAnimationFrame( animate ); + + renderer.render( scene, camera ); + }; + + animate(); + } + + /* + UI helpers + */ + function make_text_input(div, name, size) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(name + ': ')) + var input = document.createElement('input') + input.type = 'text' + input.size = size + div.appendChild(input) + + return input + } + + function make_button_input(div, text) { + div.appendChild(document.createElement('br')) + var button = document.createElement('button') + button.style.padding = mods.ui.padding + button.style.margin = 1 + button.appendChild(document.createTextNode(text)) + div.appendChild(button) + + return button + } + + function make_checkbox_input(div, prefix) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(prefix + ': ')) + var checkbox = document.createElement('input') + checkbox.type = 'checkbox' + div.appendChild(checkbox) + + return checkbox + } + + function make_text_display(div, prefix) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(prefix + ': ')) + var span = document.createElement('span') + span.innerHTML = '' + div.appendChild(span) + + return span + } + + + // + // return values + // + return ({ + mod: mod, + name: name, + init: init, + inputs: inputs, + outputs: outputs, + interface: interface + }) +}()) \ No newline at end of file -- GitLab