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