memoscan
← all memos

Memo 0xeab14cd9…4af167 on Ethereum

const loadScript = (url, callback) => { var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.onreadystatechange = callback; script.onload = callback; head.appendChild(script); } const spongenuityScript = function() { let svg, path; let x = 0; let i = 500; let pause = false var prevX; var prevY; var embCode = []; var half_w; var half_h; var sel_width; var sel_height; var currentX; var currentY; var stitch_point = 0; var color_change = 0; var DEFAULT_WIDTH = 1122 var DEFAULT_HEIGHT = 1587 var WIDTH = window.innerWidth var HEIGHT = window.innerHeight var DIM = Math.min(WIDTH, HEIGHT) var M = DIM / DEFAULT_WIDTH var M2 = DIM / DEFAULT_HEIGHT let tokenId = tokenData.tokenId; let fullTokenID = parseInt(tokenId); console.log(fullTokenID) preload = () => { svg = loadSVG(`https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/${fullTokenID}.svg`); } setup = () => { createCanvas(WIDTH, HEIGHT, SVG); imageMode(CORNER); background(0); stroke(255); image(svg,0, 0, WIDTH, HEIGHT); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var svgRect = path0.getBoundingClientRect(); var svgRectB = path0.getBBox(); var scaling = WIDTH/HEIGHT; var screenMidPointX = WIDTH/2; var rectMidPointX = svgRect.width/2; var centerX = screenMidPointX - rectMidPointX - svgRect.left var screenMidPointY = HEIGHT/2; var rectMidPointY = svgRect.height/2; var centerY = screenMidPointY - rectMidPointY - svgRect.top console.log('M', M) console.log('scaling', scaling) console.log('svgRect.top', svgRect.top) if(scaling === 1){ console.log('scaling = 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } if(scaling === 0.7){ console.log('scaling = 0.7') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } else if( scaling > 1){ console.log('scaling > 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling*M2)}, ${centerY*(scaling*M2)}), scale(${scaling*M2})`); } else if(0.5 > scaling < 1) { console.log('0.5 > scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling)}, ${centerY*(scaling)}), scale(${scaling})`); } else if(scaling < 0.5) { console.log('scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M2)- svgRect.left/2}, ${centerY*(M2)- svgRect.left/2}), scale(${scaling})`); } } draw = () => { noFill(); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var length = path0.getTotalLength(); let size = 0.27; path.attribute('stroke', 'white'); path.attribute('stroke-width', size); path.attribute('stroke-dasharray', length); path.attribute('stroke-dashoffset', length - x); x = x + i; if (x >= length && pause == false) { x = length; i = 0; pause = true; setTimeout(function () { cont(); }, 5000); } if (x >= length * 2) { x = 0; i = 0; pause = false; setTimeout(function () { beginning(); }, 5000); } function beginning() { if (x >= 0 && pause == false) { i = 500; } } function cont() { if (x >= length && pause == true) { i = 500; } } } keyPressed = function () { if (keyCode === 49) { path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".png"); } if (keyCode === 50) { // console.log('key 2 pressed') path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".svg"); } if (keyCode === 51) { confirmation(); } } const confirmDialog = (msg) => { return new Promise(function (resolve, reject) { let confirmed = window.confirm(msg); return confirmed ? resolve(true) : reject(false); }); } function delay(milliseconds) { return new Promise(resolve => { setTimeout(resolve, milliseconds); }); } const confirmation = async () => { var pathLength = document.querySelector('path').getTotalLength(); try { await confirmDialog("You have selected to create an embroidery file. This may take a few minutes. Are you sure you want to continue?"); console.time("timer"); console.timeLog("timer"); x = pathLength; i = 0; pause = true; await delay(1000); const polygonPoints = await createPolyline(); console.log(polygonPoints); await convertToDST(polygonPoints); pause = false; console.timeEnd("timer"); } catch (err) { console.log('cancelled', err); } } function createPolyline() { return new Promise((resolve, reject) => { var fullPath = document.querySelector('path'); var pathLength = fullPath.getTotalLength(); var polygonPoints = []; var numPoints = Math.floor(pathLength/50); for (var i = 0; i < numPoints; i++) { var p = fullPath.getPointAtLength(i * pathLength / numPoints); polygonPoints.push(p.x,p.y); } console.log('polygonPoints', polygonPoints); console.log('pathLength', pathLength); resolve(polygonPoints); }); } const convertToDST = (array) => { return new Promise((resolve, reject) => { try { embCode = []; stitch_point = 0; var target_array; prevX = prevY = 0; for (var i = 0; i < array.length; i++) { target_array = array; for (var i = 0; i < target_array.length; i += 2) { currentX = target_array[i]; currentY = target_array[i + 1]; writeBinary(prevX - currentX, -(prevY - currentY)); prevX = currentX; prevY = currentY; stitch_point++; } } saveFile(); resolve(embCode); } catch (error) { reject(error); } }); } function writeBinary(moveX, moveY) { var b1 = 0x0; var b2 = 0x0; var b3 = 0x0; var mx = moveX; var my = moveY; var over_mx = 0; var over_my = 0; if (Math.abs(mx) > 121 || Math.abs(my) > 121) { over_mx = mx > 121 ? mx - 121 : mx < -121 ? mx + 121 : 0; over_my = my > 121 ? my - 121 : my < -121 ? my + 121 : 0; mx = mx > 121 ? 121 : mx < -121 ? -121 : mx; my = my > 121 ? 121 : my < -121 ? -121 : my; b3 |= 0x80; } if (mx >= 41) { b3 |= 0x8; mx -= 81; } if (mx <= -41) { b3 |= 0x4; mx += 81; } if (my >= 41) { b3 |= 0x10; my -= 81; } if (my <= -41) { b3 |= 0x20; my += 81; } if (mx >= 14) { b2 |= 0x8; mx -= 27; } if (mx <= -14) { b2 |= 0x4; mx += 27; } if (my >= 14) { b2 |= 0x10; my -= 27; } if (my <= -14) { b2 |= 0x20; my += 27; } if (mx >= 5) { b1 |= 0x8; mx -= 9; } if (mx <= -5) { b1 |= 0x4; mx += 9; } if (my >= 5) { b1 |= 0x10; my -= 9; } if (my <= -5) { b1 |= 0x20; my += 9; } if (mx >= 2) { b2 |= 0x2; mx -= 3; } if (mx <= -2) { b2 |= 0x1; mx += 3; } if (my >= 2) { b2 |= 0x40; my -= 3; } if (my <= -2) { b2 |= 0x80; my += 3; } if (mx >= 1) { b1 |= 0x2; mx -= 1; } if (mx <= -1) { b1 |= 0x1; mx += 1; } if (my >= 1) { b1 |= 0x40; my -= 1; } if (my <= -1) { b1 |= 0x80; my += 1; } b3 |= 0x3; embCode.push(b1, b2, b3); if (over_mx || over_my) { writeBinary(over_mx, over_my); } } function saveFile() { const fileName = "embroidery.dst"; loading = false; sel_width = 1000; sel_height = 1000; half_w = Math.round(sel_width / 2); half_h = Math.round(sel_height / 2); let str = ""; str += "LA: " + fileName; str += "\rST: " + stitch_point; str += "\rCO: " + color_change; str += "\r+X: " + half_w; str += "\r-X: " + half_w; str += "\r+Y: " + half_h; str += "\r-Y: " + half_h; str += "\rAX:+ " + 0; str += "\rAY:+ " + 0; str += "\rMX:+ " + 0; str += "\rMY:+ " + 0; str += "\rPD:" + "******" str += "\r"; const blank_num = 512 - str.length; for (let k = 0; k < blank_num; k++) { str += " "; } embCode.unshift(0x00, 0x00, 0x83); embCode.push(0x00, 0x00, 0xF3); const u8_embCode = new Uint8Array(embCode); const blob = new Blob([str, u8_embCode], { type: "application/octet-binary" }); const a = document.createElement('a'); a.download = fileName; a.target = '_blank'; if (window.navigator.msSaveBlob) { window.navigator.msSaveBlob(blob, fileName); } else if (window.URL && window.URL.createObjectURL) { a.href = window.URL.createObjectURL(blob); document.body.appendChild(a); a.click(); document.body.removeChild(a); } else if (window.webkitURL && window.webkitURL.createObject) { a.href = window.webkitURL.createObjectURL(blob); a.click(); } else { window.open('data:' + mimeType + ';base64,' + window.Base64.encode(content), '_blank'); } } } loadScript('https://lavender-advanced-hummingbird-947.mypinata.cloud/ipfs/QmU28NZxGoJ7dTWdJPj2Y52aBVpDcCt12AWiRBZDGkPbem', spongenuityScript);