// // frep involute rack // // Neil Gershenfeld // (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 = 'frep involute rack' // // initialization // var init = function() { mod.module.value = '1' mod.angle.value = '20' mod.teeth.value = '10' mod.addendum.value = '1' mod.dedendum.value = '1.1' } // // inputs // var inputs = { variables:{type:'', event:function(evt){ for (var p in evt.detail) mod[p].value = evt.detail[p] outputs.variables.event() outputs.shape.event() }}} // // outputs // var outputs = { shape:{type:'', event:function(){ var module = parseFloat(mod.module.value) var angle = Math.PI*parseFloat(mod.angle.value)/180 var teeth = parseFloat(mod.teeth.value) var addendum = parseFloat(mod.addendum.value) var dedendum = parseFloat(mod.dedendum.value) // // pitch // var p = Math.PI*module mod.info.innerHTML = `pitch: ${p.toFixed(3)} mm
` // // length // var l = p*teeth mod.info.innerHTML += `length: ${l.toFixed(3)} mm
` // // addendum height // var ha = addendum*module // // dedendum height // var hd = dedendum*module mod.info.innerHTML += `pitch height: ${hd.toFixed(3)} mm
` // // triangle base // var bt = (ha+hd)*Math.tan(angle) // // pitch base // var bp = ha*Math.tan(angle) // // slope // var s = 1/Math.tan(angle) // // shapes // // left // var fn = `${s}*X-Y` // // right // var fn = `Math.min(${fn},${s}*(${p/2+2*(bt-bp)}-X)-Y)` // // top // var fn = `Math.min(${fn},${ha+hd}-Y)` // // bottom // var fn = `Math.min(${fn},Y)` // // repeat // fn = fn.replace(/X/g,`(X%${p})`) // // bound // var fn = `Math.min(${fn},X)` var fn = `Math.min(${fn},${l}-X)` // // output // var variables = ['X','Y'] var limits = [[0,l],[0,ha+hd]] var type = 'Magnitude' var shape = {function:fn,variables:variables,limits:limits,type:type} mods.output(mod,'shape',shape)}}, variables:{type:'', event:function(){ var module = parseFloat(mod.module.value) var angle = Math.PI*parseFloat(mod.angle.value)/180 var teeth = parseFloat(mod.teeth.value) var addendum = parseFloat(mod.addendum.value) var dedendum = parseFloat(mod.dedendum.value) var p = Math.PI*module var l = p*teeth var ha = addendum*module var hd = dedendum*module var bt = (ha+hd)*Math.tan(angle) var bp = ha*Math.tan(angle) var s = 1/Math.tan(angle) var vars = {module:module,angle:angle,teeth:teeth,p:p,l:l,ha:ha,hd:hd,bt:bt,bp:bp,s:s} mods.output(mod,'variables',vars)} }} // // interface // var interface = function(div){ mod.div = div // // module // div.appendChild(document.createTextNode('module (m): ')) var input = document.createElement('input') input.type = 'text' input.size = 3 div.appendChild(input) mod.module = input div.appendChild(document.createTextNode(' (mm)')) div.appendChild(document.createElement('br')) // // addendum // div.appendChild(document.createTextNode('addendum: ')) var input = document.createElement('input') input.type = 'text' input.size = 3 div.appendChild(input) mod.addendum = input div.appendChild(document.createTextNode(' (m)')) div.appendChild(document.createElement('br')) // // dedendum // div.appendChild(document.createTextNode('dedendum: ')) var input = document.createElement('input') input.type = 'text' input.size = 3 div.appendChild(input) mod.dedendum = input div.appendChild(document.createTextNode(' (m)')) div.appendChild(document.createElement('br')) // // angle // div.appendChild(document.createTextNode('pressure angle: ')) var input = document.createElement('input') input.type = 'text' input.size = 3 div.appendChild(input) mod.angle = input div.appendChild(document.createElement('br')) // // teeth // div.appendChild(document.createTextNode('number of teeth: ')) var input = document.createElement('input') input.type = 'text' input.size = 3 div.appendChild(input) mod.teeth = input div.appendChild(document.createElement('br')) // // info // var info = document.createElement('span') div.appendChild(info) mod.info = info // // output button // var btn = document.createElement('button') btn.style.padding = mods.ui.padding btn.style.margin = 1 btn.appendChild(document.createTextNode('output')) btn.addEventListener('click',function(){ outputs.variables.event() outputs.shape.event() }) div.appendChild(btn) } // // local functions // ; // // return values // return ({ mod:mod, name:name, init:init, inputs:inputs, outputs:outputs, interface:interface }) }())