From d502c7f77ac32a1fa0c4533953be52bcb9209ba2 Mon Sep 17 00:00:00 2001 From: zavx0z Date: Fri, 24 Nov 2023 09:52:04 +0300 Subject: [PATCH] nodeFabric --- horse_r.png | Bin 9142 -> 0 bytes index.html | 50 +++--------------------- index.js | 14 +------ lib/draw.js | 12 ++++++ opencv-thinning-src-img.png | Bin 21369 -> 0 bytes utils.js | 76 ++++++++++++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 56 deletions(-) delete mode 100644 horse_r.png create mode 100644 lib/draw.js delete mode 100644 opencv-thinning-src-img.png create mode 100644 utils.js diff --git a/horse_r.png b/horse_r.png deleted file mode 100644 index c66000c5bfd0c6d704246c81da323c4ce13edeb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9142 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 skeleton-tracing - - + diff --git a/index.js b/index.js index cf2b38f..6ed2955 100644 --- a/index.js +++ b/index.js @@ -1,17 +1,7 @@ // https://github.com/LingDong-/skeleton-tracing/tree/master/wasm const html = String.raw -function visualize(polylines, width, height, scale, stroke) { - let svg = `` - for (let i = 0; i < polylines.length; i++) { - svg += `` - } - svg += "" - return svg -} +import { visualize } from "./lib/draw.js" + class Component extends HTMLElement { static tag = "skeleton-tracing" name = { ru: "Центральная линия", en: "skeleton-tracing" } diff --git a/lib/draw.js b/lib/draw.js new file mode 100644 index 0000000..361d1b6 --- /dev/null +++ b/lib/draw.js @@ -0,0 +1,12 @@ +export function visualize(polylines, width, height, scale, stroke) { + let svg = `` + for (let i = 0; i < polylines.length; i++) { + svg += `` + } + svg += "" + return svg + } diff --git a/opencv-thinning-src-img.png b/opencv-thinning-src-img.png deleted file mode 100644 index a9d416d0b819cc910f421eae03992c6d127525c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21369 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 { + const canvas = document.createElement("canvas") + try { + const ctx = canvas.getContext("2d", { willReadFrequently: true }) + document.createElement("canvas").getContext("2d") + const img = new Image() + img.onload = () => { + canvas.width = img.width + canvas.height = img.height + ctx.drawImage(img, 0, 0) + const imageData = ctx.getImageData(0, 0, img.width, img.height) + res({ img, imageData }) + } + img.src = imagePath + } catch (e) { + rej(JSON.stringify(e)) + } finally { + canvas.remove() + } + }) +} + +export function i18n(param) { + if (param && typeof param === "object") { + const current = document.documentElement.lang + const exist = Object.keys(param) + return exist.includes(current) ? param[current] : exist.includes("en") ? param["en"] : param[exist[0]] + } else return "" +} +const html = String.raw + +export function nodeFabric(actor) { + const template = document.createElement("template") + template.innerHTML = html` +

${i18n(actor.name)}

+
+ ${Object.entries(actor.input) + .map(([key, socket]) => { + switch (socket.type) { + case "Boolean": + return html` +
+ + +
+ ` + case "String": + return html` +
+ + +
+ ` + default: + return "" + } + }) + .join("")} +
+ ` + template.content.querySelector("form").addEventListener("change", (e) => { + e.preventDefault() + const formData = new FormData(e.currentTarget) + const props = {} + for (const key in actor.input) { + const value = formData.get(key) + if (actor.input[key].type === "Boolean") { + props[key] = value === "on" + } else props[key] = value + } + actor.send(props) + }) + template.content.appendChild(actor) + return template.content +}