Skip to content
Snippets Groups Projects
panels.js 5.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jake Read's avatar
    Jake Read committed
    /*
    gCodePanel.js
    
    input gcodes 
    
    Jake Read at the Center for Bits and Atoms
    (c) Massachusetts Institute of Technology 2020
    
    This work may be reproduced, modified, distributed, performed, and
    displayed for any purpose, but must acknowledge the open systems assembly protocol (OSAP) project.
    Copyright is retained and must be preserved. The work is provided as is;
    no warranty is provided, and users accept all liability.
    */
    
    /*
    notes on this thing
    
    this is pretty straightforward at the moment, it'll read small gcodes
    i.e. those used to mill circuits. for larger files, like 3DP files,
    reading times / manipulating large streams of texts needs to be handled 
    more intelligently, i.e. not rendering the whole file into the 'incoming' body. 
    
    */
    
    'use strict'
    
    import dt from './drawing/domtools.js'
    
    // reference:
    // spy from https://github.com/cncjs/gcode-parser/blob/master/src/index.js thx 
    /*
    G00:        move at rapids speed 
    G01:        move at last G01 F<num>
    G04 P<num>:  dwell for P milliseconds or X seconds 
    G20:        set coordinates to inches 
    G21:        set coordinates to mm 
    G28:        do homing routine 
    G90:        positions are absolute w/r/t zero 
    G91:        positions are incremenetal w/r/t last moves 
    G94:        feedrates are per minute 
    */
    /*
    F<num>:     set feedrate for modal G 
    M03 S<num>: set clockwise rotation 
    M04 S<num>: set counter-clockwise rotation 
    M05:        stop spindle 
    M83:        use extruder relative motion 
    */
    
    function Plane() {
        // setup drawing env
        let plane = $('<div>').addClass('plane').get(0)
        let wrapper = $('#wrapper').get(0)
        // odd, but w/o this, scaling the plane & the background together introduces some numerical errs,
        // probably because the DOM is scaling a zero-size plane, or somesuch.
        $(plane).css('background', 'url("/client/drawing/bg.png")').css('width', '100px').css('height', '100px')
        let cs = 1 // current scale,
        let dft = { s: cs, x: 0, y: 0, ox: 0, oy: 0 } // default transform
    
        // init w/ defaults,
        dt.writeTransform(plane, dft)
        dt.writeBackgroundTransform(wrapper, dft)
    
        $(wrapper).append(plane)
    }
    
    function Button(xPlace, yPlace, width, height, text) {
        let btn = $('<div>').addClass('button')
            .text(text)
            .get(0)
        placeField(btn, width, height, xPlace, yPlace)
        return btn
    }
    
    function TextInput(xPlace, yPlace, width, height, text) {
        let input = $('<input>').addClass('inputwrap').get(0)
        input.value = text
        placeField(input, width, height, xPlace, yPlace)
        return input
    }
    
    let BTN_RED = 'rgb(242, 201, 201)'
    let BTN_GRN = 'rgb(201, 242, 201)'
    let BTN_YLW = 'rgb(240, 240, 180)'
    let BTN_GREY = 'rgb(242, 242, 242)'
    let BTN_HANGTIME = 1000
    let BTN_ERRTIME = 2000
    
    function AutoPlot(xPlace, yPlace, xSize, ySize) {
        let chart = $('<div>').get(0)
        $(chart).css('background-color', BTN_GREY)
        let uid = `lineChart_${Math.round(Math.random() * 1000)}_uid`
        $(chart).attr('id', uid)
        placeField(chart, xSize, ySize, xPlace, yPlace)
    
        // the data 
        var datas = [[0, 0]]
        var numToHold = 100
    
        // our vars,
        var margin = {
            top: 20,
            right: 20,
            bottom: 30,
            left: 50
        }
        var width = xSize - margin.left - margin.right
        var height = ySize - margin.top - margin.bottom
        var x = d3.scaleLinear().range([0, width])
        var y = d3.scaleLinear().range([height, 0])
        var thesvg = null
    
        // redraw 
        this.redraw = () => {
            var valueline = d3.line()
                .x(function (d) {
                    return x(d[0])
                })
                .y(function (d) {
                    return y(d[1])
                })
            // scale
            x.domain([d3.min(datas, function (d) {
                return d[0]
            }), d3.max(datas, function (d) {
                return d[0];
            })])
            y.domain([d3.min(datas, function (d) {
                return d[1]
            }), d3.max(datas, function (d) {
                return d[1];
            })])
            if (thesvg) {
                d3.select(`#${uid}`).selectAll("*").remove()
            }
            thesvg = d3.select(`#${uid}`).append("svg")
                .attr("width", width + margin.left + margin.right)
                .attr("height", height + margin.top + margin.bottom)
                .append("g")
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
            // write it?
            thesvg.append("path")
                .data([datas])
                .attr("fill", "none")
                .attr("stroke", "black")
                .attr("stroke-width", "4px")
                .attr("d", valueline)
            // write the x axis
            thesvg.append("g")
                .attr("transform", "translate(0," + height + ")")
                .call(d3.axisBottom(x))
            // the y axis
            thesvg.append("g")
                .call(d3.axisLeft(y))
        }
        // startup
        this.redraw()
        // add new pts 
        this.pushPt = (pt) => {
            datas.push(pt)
            if (datas.length > numToHold) {
                datas.shift()
            }
        }
        // set draw length 
        this.setDrawLength = (len) => {
            numToHold = len
            if (datas.length > numToHold) {
                datas = datas.slice(datas.length - numToHold)
            }
        }
    }
    
    let placeField = (field, width, height, xpos, ypos) => {
        $(field).css('position', 'absolute')
            .css('border', 'none')
            .css('width', `${width}px`)
            .css('height', `${height}px`)
        $($('.plane').get(0)).append(field)
        let dft = { s: 1, x: xpos, y: ypos, ox: 0, oy: 0 }
        dt.writeTransform(field, dft)
    }
    
    export { Plane, Button, TextInput, AutoPlot }