{"modules":{"0.22479242263560417":{"definition":"//\r\n// RNDMC server module\r\n//\r\n// Neil Gershenfeld \r\n// (c) Massachusetts Institute of Technology 2017\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function(){\r\n//\r\n// module globals\r\n//\r\nvar mod = {}\r\n//\r\n// name\r\n//\r\nvar name = 'WebSocket RNDMC'\r\n//\r\n// initialization\r\n//\r\nvar init = function() {\r\n mod.address.value = '127.0.0.1'\n mod.port.value = '1234'\n mod.socket = null\r\n socket_open()\r\n }\r\n//\r\n// inputs\r\n//\r\nvar inputs = {\r\n path:{type:'array',\r\n event: function (evt) {\r\n mod.path = evt.detail\r\n mod.label.nodeValue = 'send path to RNDMC'\r\n console.log(JSON.stringify(mod.path))\r\n }}}\r\n//\r\n// outputs\r\n//\r\nvar outputs = {\r\n }\r\n//\r\n// interface\r\n//\r\nvar interface = function(div){\r\n mod.div = div\r\n //\r\n // server\r\n //\r\n div.appendChild(document.createTextNode('address: '))\r\n input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.address = input\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0port: '))\r\n input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.port = input\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0status: '))\r\n input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.status = input\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // open/close\r\n //\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('open'))\r\n btn.addEventListener('click',function() {\r\n socket_open()\r\n })\r\n div.appendChild(btn)\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.addEventListener('click',function() {\r\n socket_close()\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n var btn = document.createElement('button')\r\n btn.style.padding = mods.ui.padding\r\n btn.style.margin = 1\r\n var span = document.createElement('span')\r\n var text = document.createTextNode('waiting for file')\r\n mod.label = text\r\n span.appendChild(text)\r\n mod.labelspan = span\r\n btn.appendChild(span)\r\n btn.addEventListener('click', function () {\r\n if (mod.socket == null) {\r\n mod.status.value = \"can't send, not open\"\r\n }\r\n else if (mod.label.nodeValue == 'send path to RNDMC') {\r\n socket_send(JSON.stringify(mod.path))\r\n mod.label.nodeValue = 'cancel'\r\n }\r\n else if (mod.label.nodeValue == 'cancel') {\r\n socket_send('cancel')\r\n }\r\n })\r\n div.appendChild(btn)\r\n }\r\n//\r\n// local functions\r\n//\r\nfunction socket_open() {\r\n var url = \"ws://\"+mod.address.value+':'+mod.port.value\r\n mod.socket = new WebSocket(url)\r\n mod.socket.onopen = function(event) {\r\n mod.status.value = \"socket opened\"\r\n }\r\n mod.socket.onerror = function(event) {\r\n mod.status.value = \"can not open socket\"\r\n mod.socket = null\r\n }\r\n mod.socket.onmessage = function(event) {\r\n mod.status.value = event.data\r\n if ((event.data == 'done') || (event.data == 'cancel')\r\n || (event.data.slice(0,5) == 'error')) {\r\n mod.label.nodeValue = 'waiting for path'\r\n mod.labelspan.style.fontWeight = 'normal'\r\n }\r\n }\r\n }\r\nfunction socket_close() {\r\n if (mod.socket) {\r\n mod.socket.close()\r\n mod.status.value = \"socket closed\"\r\n mod.socket = null\r\n }\r\n }\r\nfunction socket_send(msg) {\r\n if (mod.socket != null) {\r\n mod.status.value = \"send\"\r\n mod.socket.send(msg)\r\n }\r\n else {\r\n mod.status.value = \"can't send, not open\"\r\n }\r\n }\r\n//\r\n// return values\r\n//\r\nreturn ({\r\n mod:mod,\r\n name:name,\r\n init:init,\r\n inputs:inputs,\r\n outputs:outputs,\r\n interface:interface\r\n })\r\n}())\r\n","top":"348.87777325850277","left":"755.4800755846891","inputs":{},"outputs":{}},"0.7272977112269394":{"definition":"//\r\n// convert honeycomb SVG\r\n//\r\n// Neil Gershenfeld \r\n// (c) Massachusetts Institute of Technology 2016\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function () {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'convert honeycomb SVG'\r\n //\r\n // initialization\r\n //\r\n var init = function () {\r\n\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n SVG: {\r\n type: 'string',\r\n event: function (evt) {\r\n mod.svg = evt.detail\r\n mod.colorpaths = undefined;\r\n get_size()\r\n vectorize()\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n path:{type:'array',\r\n event: function () {\r\n mods.output(mod, 'path', mod.path)\r\n }}\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function (div) {\r\n mod.div = div\r\n //\r\n // on-screen SVG\r\n //\r\n var svgNS = \"http://www.w3.org/2000/svg\"\r\n var svg = document.createElementNS(svgNS, \"svg\")\r\n svg.setAttribute('id', mod.div.id + 'svg')\r\n svg.setAttributeNS(\"http://www.w3.org/2000/xmlns/\",\r\n \"xmlns:xlink\", \"http://www.w3.org/1999/xlink\")\r\n svg.setAttribute('width', mods.ui.canvas)\r\n svg.setAttribute('height', mods.ui.canvas)\r\n svg.style.backgroundColor = 'rgb(255,255,255)'\r\n var g = document.createElementNS(svgNS, 'g')\r\n g.setAttribute('id', mod.div.id + 'g')\r\n svg.appendChild(g)\r\n div.appendChild(svg)\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // off-screen image canvas\r\n //\r\n var canvas = document.createElement('canvas')\r\n mod.img = canvas\r\n //\r\n // colors\r\n //\r\n div.appendChild(document.createTextNode('select path:'))\r\n div.appendChild(document.createElement('br'))\r\n var select = document.createElement('select')\r\n select.setAttribute('style', 'width:150px');\r\n var el1 = document.createElement('option')\r\n el1.textContent = 'cut'\r\n el1.value = 'red'\r\n select.appendChild(el1)\r\n var el2 = document.createElement('option')\r\n el2.textContent = 'fold mountain'\r\n el2.value = 'green'\r\n select.appendChild(el2)\r\n var el3 = document.createElement('option')\r\n el3.textContent = 'fold valley'\r\n el3.value = 'blue'\r\n select.appendChild(el3)\r\n select.addEventListener(\"change\", function () {\r\n vectorize()\r\n });\r\n div.appendChild(select)\r\n mod.selectPaths = select\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // view button\r\n //\r\n var btn = document.createElement('button')\r\n btn.style.padding = mods.ui.padding\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('view'))\r\n btn.addEventListener('click', function () {\r\n var win = window.open('')\r\n var btn = document.createElement('button')\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.style.padding = mods.ui.padding\r\n btn.style.margin = 1\r\n btn.addEventListener('click', function () {\r\n win.close()\r\n })\r\n win.document.body.appendChild(btn)\r\n win.document.body.appendChild(document.createElement('br'))\r\n var svg = document.getElementById(mod.div.id + 'svg')\r\n var clone = svg.cloneNode(true)\r\n clone.setAttribute('width', mod.width)\r\n clone.setAttribute('height', mod.height)\r\n win.document.body.appendChild(clone)\r\n })\r\n div.appendChild(btn)\r\n }\r\n //\r\n // local functions\r\n //\r\n // get size\r\n //\r\n function get_size() {\r\n var i = mod.svg.indexOf(\"width\")\r\n if (i == -1) {\r\n var width = 1\r\n var height = 1\r\n var units = 90\r\n }\r\n else {\r\n var i1 = mod.svg.indexOf(\"\\\"\", i + 1)\r\n var i2 = mod.svg.indexOf(\"\\\"\", i1 + 1)\r\n var width = mod.svg.substring(i1 + 1, i2)\r\n i = mod.svg.indexOf(\"height\")\r\n i1 = mod.svg.indexOf(\"\\\"\", i + 1)\r\n i2 = mod.svg.indexOf(\"\\\"\", i1 + 1)\r\n var height = mod.svg.substring(i1 + 1, i2)\r\n ih = mod.svg.indexOf(\"height\")\r\n if (width.indexOf(\"px\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 90\r\n }\r\n else if (width.indexOf(\"mm\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 25.4\r\n }\r\n else if (width.indexOf(\"cm\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 2.54\r\n }\r\n else if (width.indexOf(\"in\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 1\r\n }\r\n else {\r\n var units = 90\r\n }\r\n }\r\n mod.width = Math.round(parseFloat(width))\r\n mod.height = Math.round(parseFloat(height))\r\n mod.units = units\r\n }\r\n //\r\n // local functions\r\n //\r\n // vectorize\r\n //\r\n function vectorize() {\r\n\r\n svg_to_path();\r\n mod.path = mod.colorpaths[mod.selectPaths.value]\r\n draw_path(mod.path);\r\n outputs.path.event(mod.path)\r\n }\r\n //\r\n // draw path\r\n //\r\n function draw_path(path) {\r\n var svg = document.getElementById(mod.div.id + 'svg')\r\n svg.setAttribute('viewBox', \"0 0 \" + (mod.width *1.1- 1) + \" \" + (mod.height- 1))\r\n var g = document.getElementById(mod.div.id + 'g')\r\n svg.removeChild(g)\r\n var g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\r\n g.setAttribute('id', mod.div.id + 'g')\r\n var h = mod.height\r\n var w = mod.width\r\n var xend = null\r\n var yend = null\r\n //\r\n // loop over segments\r\n //\r\n for (var segment in path) {\r\n if (path[segment].length > 1) {\r\n if (xend != null) {\r\n //\r\n // draw connection from previous segment\r\n //\r\n var line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\r\n line.setAttribute('stroke', 'red')\r\n line.setAttribute('stroke-width', 1)\r\n line.setAttribute('stroke-linecap', 'round')\r\n var x1 = xend\r\n var y1 = yend\r\n var x2 = path[segment][0][0]\r\n var y2 = h - path[segment][0][1] - 1\r\n line.setAttribute('x1', x1)\r\n line.setAttribute('y1', y1)\r\n line.setAttribute('x2', x2)\r\n line.setAttribute('y2', y2)\r\n var dx = x2 - x1\r\n var dy = y2 - y1\r\n var d = Math.sqrt(dx * dx + dy * dy)\r\n if (d > 0) {\r\n nx = 6 * dx / d\r\n ny = 6 * dy / d\r\n var tx = 3 * dy / d\r\n var ty = -3 * dx / d\r\n g.appendChild(line)\r\n triangle = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\r\n triangle.setAttribute('points', x2 + ',' + y2 + ' ' + (x2 - nx + tx) + ',' + (y2 - ny + ty)\r\n + ' ' + (x2 - nx - tx) + ',' + (y2 - ny - ty))\r\n triangle.setAttribute('fill', 'red')\r\n g.appendChild(triangle)\r\n }\r\n }\r\n //\r\n // loop over points\r\n //\r\n for (var point = 1; point < path[segment].length; ++point) {\r\n var line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\r\n line.setAttribute('stroke', 'black')\r\n line.setAttribute('stroke-width', 1)\r\n line.setAttribute('stroke-linecap', 'round')\r\n var x1 = path[segment][point - 1][0]\r\n var y1 = h - path[segment][point - 1][1] - 1\r\n var x2 = path[segment][point][0]\r\n var y2 = h - path[segment][point][1] - 1\r\n xend = x2\r\n yend = y2\r\n line.setAttribute('x1', x1)\r\n line.setAttribute('y1', y1)\r\n line.setAttribute('x2', x2)\r\n line.setAttribute('y2', y2)\r\n var dx = x2 - x1\r\n var dy = y2 - y1\r\n var d = Math.sqrt(dx * dx + dy * dy)\r\n if (d > 0) {\r\n nx = 6 * dx / d\r\n ny = 6 * dy / d\r\n var tx = 3 * dy / d\r\n var ty = -3 * dx / d\r\n g.appendChild(line)\r\n triangle = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\r\n triangle.setAttribute('points', x2 + ',' + y2 + ' ' + (x2 - nx + tx) + ',' + (y2 - ny + ty)\r\n + ' ' + (x2 - nx - tx) + ',' + (y2 - ny - ty))\r\n triangle.setAttribute('fill', 'black')\r\n g.appendChild(triangle)\r\n }\r\n }\r\n }\r\n }\r\n svg.appendChild(g)\r\n }\r\n //\r\n // convert honeycomb svg to path\r\n //\r\n function svg_to_path() {\r\n var svg = mod.svg\r\n if (mod.colorpaths) {\r\n return\r\n }\r\n var colorpaths = { 'red': [], 'blue': [], 'green': [] }\r\n var parser = new DOMParser();\r\n var doc = parser.parseFromString(svg, \"application/xml\");\r\n var nextElm = doc.children[0].firstElementChild;\r\n var colorpaths = { 'red': [], 'blue': [], 'green': [] };\r\n var valueToInt = function (val) {\r\n var mmToPixel = 3.7795275591;\r\n return Math.round(parseFloat(val) *mmToPixel)\r\n }\r\n var sameCoord = function (coord1, coord2) {\r\n return coord1[0] === coord2[0] && coord1[1] === coord2[1];\r\n }\r\n\r\n while (nextElm) {\r\n var color;\r\n var styles = nextElm.getAttribute('style').split(';');\r\n for (stylei in styles) {\r\n var style = styles[stylei].split(':')\r\n if (style[0] === 'stroke') {\r\n color = style[1];\r\n }\r\n }\r\n\r\n paths = colorpaths[color];\r\n if (nextElm.tagName === 'line') {\r\n var x1 = valueToInt(nextElm.getAttribute('x1'));\r\n var y1 = mod.height - valueToInt(nextElm.getAttribute('y1'));\r\n var x2 = valueToInt(nextElm.getAttribute('x2'));\r\n var y2 = mod.height - valueToInt(nextElm.getAttribute('y2'));\r\n var appended = false;\r\n for (pathi in paths) {\r\n var path = paths[pathi];\r\n if (sameCoord(path[path.length - 1], [x1, y1])) {\r\n path.push([x2, y2]);\r\n appended = true;\r\n }\r\n }\r\n if (!appended) {\r\n paths.push([[x1, y1], [x2, y2]])\r\n }\r\n }\r\n else if (nextElm.tagName === 'polyline') {\r\n var points = [];\r\n var pts = nextElm.getAttribute('points').split(' ');\r\n for (pti in pts) {\r\n var coords = pts[pti].split(',')\r\n points.push([valueToInt(coords[0]), mod.height - valueToInt(coords[1])]);\r\n }\r\n paths.push(points);\r\n }\r\n\r\n nextElm = nextElm.nextElementSibling;\r\n }\r\n \r\n mod.colorpaths = colorpaths;\r\n }\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())\r\n","top":"185.78584481355912","left":"379.4665171150598","inputs":{},"outputs":{}},"0.29776381938511776":{"definition":"//\r\n// Honeycomb module extracts flatten honeycomb sheet from Tools/FabLab Connect command of SolidWorks products\r\n// \r\n// Shawn Liu @ Dassault Systemes SolidWorks Corporation\r\n// (c) Massachusetts Institute of Technology 2019\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function(){\r\n//\r\n// module globals\r\n//\r\nvar mod = {}\r\n//\r\n// name\r\n//\r\nvar name = 'Honeycomb connect'\r\n//\r\n// initialization\r\n//\r\nvar init = function() {\r\n mod.address = getParameterByName('swIP') || '127.0.0.1'\r\n mod.port = getParameterByName('swPort') || '80'\r\n mod.socket = 0\r\n socket_open()\r\n }\r\n//\r\n// inputs\r\n//\r\nvar inputs = {}\r\n//\r\n// outputs\r\n//\r\nvar outputs = {\r\n SVG: {\r\n type: 'string',\r\n event: function () {\r\n mods.output(mod, 'SVG', mod.str)\r\n }\r\n },\r\n file: {\r\n type: 'object',\r\n event: function (str) {\r\n obj = {}\r\n obj.name = mod.partName + \".svg\"\r\n obj.contents = str\r\n mods.output(mod, 'file', obj)\r\n }\r\n }\r\n}\r\n//\r\n// interface\r\n//\r\nvar interface = function(div){\r\n mod.div = div\r\n\r\n // on-screen drawing canvas\r\n //\r\n var canvas = document.createElement('canvas')\r\n canvas.width = mods.ui.canvas\r\n canvas.height = mods.ui.canvas\r\n canvas.style.backgroundColor = 'rgb(255,255,255)'\r\n div.appendChild(canvas)\r\n mod.canvas = canvas\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // off-screen image canvas\r\n //\r\n var canvas = document.createElement('canvas')\r\n mod.img = canvas\r\n\r\n div.appendChild(document.createTextNode('server:'))\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode('address: ' + getParameterByName('swIP')))\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0port: ' + getParameterByName('swPort')))\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0status: '))\r\n input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 12\r\n div.appendChild(input)\r\n mod.status = input\r\n div.appendChild(document.createElement('br'))\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('open'))\r\n btn.addEventListener('click', function () {\r\n socket_open()\r\n })\r\n div.appendChild(btn)\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.addEventListener('click', function () {\r\n socket_close()\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('Extract SVG'))\r\n btn.addEventListener('click', function () {\r\n extract_SVG()\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // view button\r\n //\r\n var btn = document.createElement('button')\r\n btn.style.padding = mods.ui.padding\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('view'))\r\n btn.addEventListener('click', function () {\r\n var win = window.open('')\r\n var btn = document.createElement('button')\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.style.padding = mods.ui.padding\r\n btn.style.margin = 1\r\n btn.addEventListener('click', function () {\r\n win.close()\r\n })\r\n win.document.body.appendChild(btn)\r\n win.document.body.appendChild(document.createElement('br'))\r\n var canvas = document.createElement('canvas')\r\n canvas.width = mod.img.width\r\n canvas.height = mod.img.height\r\n win.document.body.appendChild(canvas)\r\n var ctx = canvas.getContext(\"2d\")\r\n ctx.drawImage(mod.img, 0, 0)\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n\r\n //\r\n // info div\r\n //\r\n var info = document.createElement('div')\r\n info.setAttribute('id', div.id + 'info')\r\n mod.name = document.createTextNode('name:')\r\n info.appendChild(mod.name)\r\n mod.thickness = document.createTextNode('thickness: ')\r\n div.appendChild(mod.thickness)\r\n info.appendChild(document.createElement('br'))\r\n mod.width = document.createTextNode('width:')\r\n info.appendChild(mod.width)\r\n info.appendChild(document.createElement('br'))\r\n mod.height = document.createTextNode('height:')\r\n info.appendChild(mod.height)\r\n div.appendChild(info)\r\n\r\n }\r\n//\r\n// local functions\r\n//\r\n\r\nfunction getParameterByName(name, url) {\r\n if (!url) url = window.location.href;\r\n name = name.replace(/[\\[\\]]/g, \"\\\\$&\");\r\n var regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\"),\r\n results = regex.exec(url);\r\n if (!results) return null;\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\r\n}\r\n\r\nfunction socket_open() {\r\n var url = \"ws://\"+mod.address+':'+mod.port\r\n mod.socket = new WebSocket(url)\r\n mod.socket.onopen = function(event) {\r\n mod.status.value = \"opened\"\r\n var connect = {}\r\n connect.modCmd = 'connect'\r\n connect.owner = getParameterByName('swOwner')\r\n connect.id = getParameterByName('swID')\r\n socket_send(JSON.stringify(connect))\r\n }\r\n mod.socket.onerror = function(event) {\r\n mod.status.value = \"can not open\"\r\n }\r\n mod.socket.onmessage = function(event) {\r\n mod.status.value = \"receive\"\r\n var swData = JSON.parse(event.data);\r\n if (swData.swType === \"HoneycombFlattenSVG\") {\r\n mod.partName = swData.data.partName\r\n var partName = swData.data.partName\r\n if (partName.length > 25)\r\n partName = partName.slice(0, 22) + '...'\r\n mod.name.nodeValue = \"name: \" + partName\r\n mod.thickness.nodeValue = \"thickness: \" + swData.data.thickness + ' (mm)';\r\n mod.str = swData.data.svg\r\n svg_load_handler()\r\n outputs.SVG.event(mod.str)\r\n outputs.file.event(mod.str)\r\n }\r\n }\r\n mod.socket.onclose = function (event) {\r\n mod.status.value = \"connection closed\"\r\n }\r\n }\r\nfunction socket_close() {\r\n mod.socket.close()\r\n mod.status.value = \"closed\"\r\n mod.socket = 0\r\n }\r\nfunction socket_send(msg) {\r\n if (mod.socket != 0) {\r\n mod.status.value = \"send\"\r\n mod.socket.send(msg)\r\n }\r\n else {\r\n mod.status.value = \"can't send, not open\"\r\n }\r\n }\r\nfunction extract_SVG() {\r\n var modcmd = new Object;\r\n modcmd.modCmd = \"AutoHoneycombFlatten\";\r\n socket_send(JSON.stringify(modcmd))\r\n }\r\n\r\n //\r\n // load handler\r\n //\r\nfunction svg_load_handler() {\r\n //\r\n // parse size\r\n //\r\n var i = mod.str.indexOf(\"width\")\r\n if (i == -1) {\r\n mod.width.nodeValue = \"width: not found\"\r\n mod.height.nodeValue = \"height: not found\"\r\n }\r\n else {\r\n var i1 = mod.str.indexOf(\"\\\"\", i + 1)\r\n var i2 = mod.str.indexOf(\"\\\"\", i1 + 1)\r\n var width = mod.str.substring(i1 + 1, i2)\r\n i = mod.str.indexOf(\"height\")\r\n i1 = mod.str.indexOf(\"\\\"\", i + 1)\r\n i2 = mod.str.indexOf(\"\\\"\", i1 + 1)\r\n var height = mod.str.substring(i1 + 1, i2)\r\n ih = mod.str.indexOf(\"height\")\r\n if (width.indexOf(\"px\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 90\r\n }\r\n else if (width.indexOf(\"mm\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 25.4\r\n }\r\n else if (width.indexOf(\"cm\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 2.54\r\n }\r\n else if (width.indexOf(\"in\") != -1) {\r\n width = width.slice(0, -2)\r\n height = height.slice(0, -2)\r\n var units = 1\r\n }\r\n else {\r\n var units = 90\r\n }\r\n mod.width.nodeValue = \"width: \" + width / 3.543307 + ' (mm)';\r\n mod.height.nodeValue = \"height: \" + height / 3.543307 + ' (mm)';\r\n }\r\n //\r\n // display\r\n //\r\n var img = new Image()\r\n var src = \"data:image/svg+xml;base64,\" + window.btoa(mod.str)\r\n img.setAttribute(\"src\", src)\r\n img.onload = function () {\r\n if (img.width > img.height) {\r\n var x0 = 0\r\n var y0 = mod.canvas.height * .5 * (1 - img.height / img.width)\r\n var w = mod.canvas.width\r\n var h = mod.canvas.width * img.height / img.width\r\n }\r\n else {\r\n var x0 = mod.canvas.width * .5 * (1 - img.width / img.height)\r\n var y0 = 0\r\n var w = mod.canvas.height * img.width / img.height\r\n var h = mod.canvas.height\r\n }\r\n var ctx = mod.canvas.getContext(\"2d\")\r\n ctx.clearRect(0, 0, mod.canvas.width, mod.canvas.height)\r\n ctx.drawImage(img, x0, y0, w, h)\r\n var ctx = mod.img.getContext(\"2d\")\r\n ctx.canvas.width = img.width\r\n ctx.canvas.height = img.height\r\n ctx.drawImage(img, 0, 0)\r\n outputs.SVG.event()\r\n }\r\n}\r\n\r\n\r\n//\r\n// return values\r\n//\r\nreturn ({\r\n mod:mod,\r\n name:name,\r\n init:init,\r\n inputs:inputs,\r\n outputs:outputs,\r\n interface:interface\r\n })\r\n}())\r\n","top":"44.031708627888705","left":"-17.91909545661251","inputs":{},"outputs":{}}},"links":["{\"source\":\"{\\\"id\\\":\\\"0.7272977112269394\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"path\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.22479242263560417\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"path\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.29776381938511776\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"SVG\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.7272977112269394\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"SVG\\\"}\"}"]}