From 3c4080f3f15b93da16f1182173baa01aa72c0270 Mon Sep 17 00:00:00 2001 From: 24kycj <1637269896@qq.com> Date: Mon, 15 Dec 2025 02:55:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/design1.js | 299 ++- lib/design1/core.js | 162 +- lib/design1/output.js | 39 +- lib/design1/ui.js | 4755 +++++++++++++++++++++-------------------- lib/design2.js | 8 - lib/design2/core.js | 250 ++- lib/design2/output.js | 38 +- lib/design2/ui.js | 904 ++------ 8 files changed, 3048 insertions(+), 3407 deletions(-) diff --git a/lib/design1.js b/lib/design1.js index b998d09..188ece5 100644 --- a/lib/design1.js +++ b/lib/design1.js @@ -17,23 +17,23 @@ if (typeof console !== 'undefined' && console.warn) { // Electron相关导入 const remote = require('@electron/remote'); -var path = require('path'); + var path = require('path'); const exePath = remote.app.getPath('userData'); const { ipcRenderer } = require('electron'); const { dialog } = require('@electron/remote'); -var jrQrcode = require('jr-qrcode'); -var JsBarcode = require('jsbarcode'); + var jrQrcode = require('jr-qrcode'); + var JsBarcode = require('jsbarcode'); const { clipboard } = require('electron'); const dpi = 600; // 发送IPC消息 -ipcRenderer.send('get-sys-fonts'); -ipcRenderer.send('get-scale-rate'); + ipcRenderer.send('get-sys-fonts'); + ipcRenderer.send('get-scale-rate'); // 使用layui -layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { - let myDate = new Date(); - let s_lan = ""; + layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { + let myDate = new Date(); + let s_lan = ""; // 确保 s_lan 在全局作用域中可用(用于 .jsc 文件加载) if (typeof window !== 'undefined') { window.s_lan = s_lan; @@ -41,8 +41,8 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { if (typeof global !== 'undefined') { global.s_lan = s_lan; } - ipcRenderer.send('get-sys-language'); - + ipcRenderer.send('get-sys-language'); + var $ = layui.$; var layer = layui.layer; var slider = layui.slider; @@ -88,7 +88,7 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { var layer = layui.layer; var slider = layui.slider; var colorpicker = layui.colorpicker; - + // 历史记录文件路径(供 output.js 使用) var fullPath = path.join(exePath, 'data.json'); // 确保 fullPath 在全局作用域中可用(用于 .jsc 文件加载) @@ -100,26 +100,25 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { global.fullPath = fullPath; global.exePath = exePath; } - + // ========================================== // 公共函数定义(需要在layui.use回调内部,因为依赖jQuery) // 注意:所有函数都附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 // ========================================== - + // DES加密函数 window.desEncrypt = function desEncrypt(str, key = "df6a551ca43181fc485f3043bcdd2fbc") { var APIFMS; try { // 确保输入字符串是 UTF-8 编码 - var keyHex = CryptoJS.enc.Utf8.parse(key); - var encrypted = CryptoJS.DES.encrypt(str, keyHex, { - mode: CryptoJS.mode.ECB, - padding: CryptoJS.pad.Pkcs7 - }); + var keyHex = CryptoJS.enc.Utf8.parse(key); + var encrypted = CryptoJS.DES.encrypt(str, keyHex, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); // 使用 Base64 编码确保中文字符正确输出 APIFMS = CryptoJS.enc.Base64.stringify(encrypted.ciphertext); } catch (err) { - console.log('des 加密错误:', err); APIFMS = ''; } return APIFMS; @@ -128,49 +127,49 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { function desEncrypt(str, key = "df6a551ca43181fc485f3043bcdd2fbc") { return window.desEncrypt(str, key); } - + // 多语言切换 window.langua_ge = function langua_ge(lan = 'zh') { - $("[language='m']").each(function (i) { - $(this).html($(this).attr(lan)); + $("[language='m']").each(function (i) { + $(this).html($(this).attr(lan)); }); - $("[language='t']").each(function (i) { - $(this).attr("title", $(this).attr(lan)); + $("[language='t']").each(function (i) { + $(this).attr("title", $(this).attr(lan)); }); }; // 向后兼容 function langua_ge(lan = 'zh') { return window.langua_ge(lan); - } - + } + // 多语言字符串获取 window.language_str = function language_str(str) { - let t = { - "whetherSave": { zh: "是否保存当前文件?", ozh: "是否保存當前文件?", en: "Do you want to save the current file?" }, - "save": { zh: "保存", ozh: "保存", en: "Save" }, - "noSave": { zh: "不保存", ozh: "不保存", en: "No saving" }, - "cancel": { zh: "取消", ozh: "取消", en: "Cancel" }, - "saveSucc": { zh: "保存成功至", ozh: "保存成功至", en: "Save successfully to" }, - "saveFile": { zh: "保存文件", ozh: "保存文件", en: "Save file" }, - "display": { zh: "预览", ozh: "預覽", en: "Display" }, - "output": { zh: "导出", ozh: "導出", en: "Export" }, - "bg": { zh: "背景", ozh: "背景", en: "Background" }, - "selectPic": { zh: "请选择图片", ozh: "請選擇圖片", en: "Please select a picture" }, - "img": { zh: "圖片", ozh: "圖片", en: "Image" }, - "simg": { zh: "合成圖片", ozh: "合成圖片", en: "Synthesized Image" }, - "text": { zh: "文本", ozh: "文本", en: "Text" }, - "ctext": { zh: "圆形文本", ozh: "圆形文本", en: "Circle Text" }, - "stext": { zh: "合成文本", ozh: "合成文本", en: "Synthesized Text" }, - "rect": { zh: "矩形", ozh: "矩形", en: "Rectangle" }, - "circ": { zh: "圓形", ozh: "圓形", en: "Circle" }, - "line": { zh: "直線", ozh: "直線", en: "Line" }, - "qrc": { zh: "二維碼", ozh: "二維碼", en: "QR code" }, - "barc": { zh: "條形碼", ozh: "條形碼", en: "Barcode" }, - "counter": { zh: "計數器", ozh: "计数器", en: "Counter" }, - "about": { zh: "关于Soon Design", ozh: "關於Soon Design", en: "About Soon Design" }, - "vers": { zh: "版本", ozh: "版本", en: "Version" }, - "comf": { zh: "确认", ozh: "確認", en: "Select" }, - "copyright": { zh: "© 2022 cardsoon Co., Ltd. All rights reserved.", ozh: "© 2022 cardsoon Co., Ltd. All rights reserved.", en: "© 2022 cardsoon Co., Ltd. All rights reserved." } + let t = { + "whetherSave": { zh: "是否保存当前文件?", ozh: "是否保存當前文件?", en: "Do you want to save the current file?" }, + "save": { zh: "保存", ozh: "保存", en: "Save" }, + "noSave": { zh: "不保存", ozh: "不保存", en: "No saving" }, + "cancel": { zh: "取消", ozh: "取消", en: "Cancel" }, + "saveSucc": { zh: "保存成功至", ozh: "保存成功至", en: "Save successfully to" }, + "saveFile": { zh: "保存文件", ozh: "保存文件", en: "Save file" }, + "display": { zh: "预览", ozh: "預覽", en: "Display" }, + "output": { zh: "导出", ozh: "導出", en: "Export" }, + "bg": { zh: "背景", ozh: "背景", en: "Background" }, + "selectPic": { zh: "请选择图片", ozh: "請選擇圖片", en: "Please select a picture" }, + "img": { zh: "圖片", ozh: "圖片", en: "Image" }, + "simg": { zh: "合成圖片", ozh: "合成圖片", en: "Synthesized Image" }, + "text": { zh: "文本", ozh: "文本", en: "Text" }, + "ctext": { zh: "圆形文本", ozh: "圆形文本", en: "Circle Text" }, + "stext": { zh: "合成文本", ozh: "合成文本", en: "Synthesized Text" }, + "rect": { zh: "矩形", ozh: "矩形", en: "Rectangle" }, + "circ": { zh: "圓形", ozh: "圓形", en: "Circle" }, + "line": { zh: "直線", ozh: "直線", en: "Line" }, + "qrc": { zh: "二維碼", ozh: "二維碼", en: "QR code" }, + "barc": { zh: "條形碼", ozh: "條形碼", en: "Barcode" }, + "counter": { zh: "計數器", ozh: "计数器", en: "Counter" }, + "about": { zh: "关于Soon Design", ozh: "關於Soon Design", en: "About Soon Design" }, + "vers": { zh: "版本", ozh: "版本", en: "Version" }, + "comf": { zh: "确认", ozh: "確認", en: "Select" }, + "copyright": { zh: "© 2022 cardsoon Co., Ltd. All rights reserved.", ozh: "© 2022 cardsoon Co., Ltd. All rights reserved.", en: "© 2022 cardsoon Co., Ltd. All rights reserved." } }; // 从全局作用域获取 s_lan(支持 .jsc 文件加载) const currentLang = (typeof global !== 'undefined' && global.s_lan) ? global.s_lan : @@ -185,7 +184,7 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { function language_str(str) { return window.language_str(str); } - + // 获取URL参数 window.GetFile = function GetFile() { const params = new URLSearchParams(window.location.search); @@ -195,27 +194,27 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { function GetFile() { return window.GetFile(); } - + // 日期格式化 window.getDate = function getDate() { - let date = new Date(); - return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); + let date = new Date(); + return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); }; // 向后兼容 function getDate() { return window.getDate(); - } - + } + // 获取对象的绝对坐标 window.getAbsoluteXY = function getAbsoluteXY(_obj) { - let coord = _obj.get("lineCoords"); + let coord = _obj.get("lineCoords"); return [_obj.get("left"), _obj.get("top")]; }; // 向后兼容 function getAbsoluteXY(_obj) { return window.getAbsoluteXY(_obj); } - + // 计算两点之间的距离 window.getDisdance = function getDisdance(x1, y1, x2, y2) { var dx = Math.abs(x2 - x1); @@ -227,7 +226,7 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { function getDisdance(x1, y1, x2, y2) { return window.getDisdance(x1, y1, x2, y2); } - + // 计算角度(相对于画布中心) window.getDeg = function getDeg(pointer, canvas) { var centerX = canvas.width / 2; @@ -248,138 +247,138 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { function getDeg(pointer, canvas) { return window.getDeg(pointer, canvas); } - + // 检查字段名是否重复 window.checkName = function checkName(name, objs1, objs2) { - for (let item of objs1) { - if (item.name == name) { - return false; - } - } - for (let item of objs2) { - if (item.name == name) { - return false; - } - } - return true; + for (let item of objs1) { + if (item.name == name) { + return false; + } + } + for (let item of objs2) { + if (item.name == name) { + return false; + } + } + return true; }; // 向后兼容 function checkName(name, objs1, objs2) { return window.checkName(name, objs1, objs2); - } - + } + // 返回不重复的字段名 window.resName = function resName(pre_name, objs1, objs2) { - let num = (objs1.length + objs2.length) - 1; - do { - num++; - } + let num = (objs1.length + objs2.length) - 1; + do { + num++; + } while (!window.checkName(pre_name + num, objs1, objs2)); - return pre_name + num; + return pre_name + num; }; // 向后兼容 function resName(pre_name, objs1, objs2) { return window.resName(pre_name, objs1, objs2); - } - + } + // 获取对象在画布中的索引 window.getIndex = function getIndex(target, canvas, _canvas = null) { - let temp_objs; - let useCanvas = (_canvas == null) ? canvas : _canvas; - if (_canvas == null) { - temp_objs = canvas.getObjects(); - } else { - temp_objs = _canvas.getObjects(); - } - let i = 0; - for (let res of temp_objs) { - if (target == res) { - return i; - } - i++; - } - return 0; + let temp_objs; + let useCanvas = (_canvas == null) ? canvas : _canvas; + if (_canvas == null) { + temp_objs = canvas.getObjects(); + } else { + temp_objs = _canvas.getObjects(); + } + let i = 0; + for (let res of temp_objs) { + if (target == res) { + return i; + } + i++; + } + return 0; }; // 向后兼容 function getIndex(target, canvas, _canvas = null) { return window.getIndex(target, canvas, _canvas); - } - + } + // 获取对象类型 window.getType = function getType(target, canvas, objs) { - let temp_objs = canvas.getObjects(); - let i = 0; - for (let res of temp_objs) { - if (target == res) { - return objs[i].type; - } - i++; - } + let temp_objs = canvas.getObjects(); + let i = 0; + for (let res of temp_objs) { + if (target == res) { + return objs[i].type; + } + i++; + } }; // 向后兼容 function getType(target, canvas, objs) { return window.getType(target, canvas, objs); - } - + } + // 获取坐标的最小X值 window.getCoordsMinX = function getCoordsMinX(acoords) { let x = acoords[0].x; - for (let item of acoords) { - if (item.x < x) { + for (let item of acoords) { + if (item.x < x) { x = item.x; - } - } - return x; + } + } + return x; }; // 向后兼容 function getCoordsMinX(acoords) { return window.getCoordsMinX(acoords); - } - + } + // 获取坐标的最大X值 window.getCoordsMaxX = function getCoordsMaxX(acoords) { let x = acoords[0].x; - for (let item of acoords) { - if (item.x > x) { + for (let item of acoords) { + if (item.x > x) { x = item.x; - } - } - return x; + } + } + return x; }; // 向后兼容 function getCoordsMaxX(acoords) { return window.getCoordsMaxX(acoords); - } - + } + // 获取坐标的最小Y值 window.getCoordsMinY = function getCoordsMinY(acoords) { let y = acoords[0].y; - for (let item of acoords) { - if (item.y < y) { + for (let item of acoords) { + if (item.y < y) { y = item.y; - } - } - return y; + } + } + return y; }; // 向后兼容 function getCoordsMinY(acoords) { return window.getCoordsMinY(acoords); - } - + } + // 获取坐标的最大Y值 window.getCoordsMaxY = function getCoordsMaxY(acoords) { let y = acoords[0].y; - for (let item of acoords) { - if (item.y > y) { + for (let item of acoords) { + if (item.y > y) { y = item.y; - } - } - return y; + } + } + return y; }; // 向后兼容 function getCoordsMaxY(acoords) { return window.getCoordsMaxY(acoords); - } + } // ========================================== // 全局变量定义(所有模块共享) @@ -392,20 +391,20 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { window.bg_version = 1; // front_bg1.png front_bg2.png window.zoom = 1; window.pre_add_image = undefined; // 预添加的图片对象(用于addPic) - + // 内部剪贴板 window.clipboardData = { data: null, offset: 10 // 粘贴位置偏移量 }; - + // 文件管理 window.openAs = { _name: "", set name(val) { if (val == "") { $("title").html('Soon Design'); - } else { + } else { $("title").html('Soon Design - ' + val); } this._name = val; @@ -414,7 +413,7 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { return this._name }, }; - + // 对象数组和历史记录 window.objs1 = []; window.objs2 = []; @@ -440,7 +439,7 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { window.next_json2 = []; window.pre_json = window.pre_json1; window.next_json = window.next_json1; - + // Canvas对象(将在core.js中初始化) window.canvas1 = undefined; window.canvas2 = undefined; @@ -489,17 +488,16 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { var ctx1 = window.ctx1; var ctx2 = window.ctx2; let is_bgi_add = window.is_bgi_add; - + // 加载design1模块 const fs = require('fs'); let bytenode; - try { + try { bytenode = require('bytenode'); require.extensions['.dl'] = require.extensions['.jsc']; - } catch (e) { - console.warn('[加载模块] bytenode 未安装,无法加载 .jsc 文件'); + } catch (e) { } - + const appPath = (() => { try { return remote.app.getAppPath(); } catch (e) { return __dirname || process.cwd(); } })(); // 读取模块映射配置(从 lib 目录读取,跨平台兼容) @@ -510,7 +508,6 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); } } catch (e) { - console.warn('[加载模块] 无法读取模块映射配置,使用默认文件名'); } // 获取映射后的文件名(跨平台兼容) @@ -530,10 +527,8 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { if (fs.existsSync(jscPath) && bytenode) { try { require(jscPath); - console.log(`[加载模块] ✅ ${moduleName} → ${mappedName}.jsc`); return; } catch (e) { - console.error(`[加载模块] ❌ ${moduleName}.jsc 加载失败:`, e.message); } } @@ -541,14 +536,12 @@ layui.use(['layer', 'slider', 'form', 'colorpicker'], function () { if (fs.existsSync(jsPath)) { try { eval(fs.readFileSync(jsPath, 'utf8')); - console.log(`[加载模块] ✅ ${moduleName} → ${moduleName}.js`); - } catch (e) { - console.error(`[加载模块] ❌ ${moduleName}.js 加载失败:`, e.message); + } catch (e) { alert(`加载 ${moduleName} 失败!\n\n错误: ${e.message}`); } } else { alert(`文件不存在!\n\n请检查:\n1. ${jscPath}\n2. ${jsPath}`); - } + } }; loadModule('output'); // 先加载 output,因为 core 中的 addBackground() 需要调用 output 中的 open() loadModule('core'); diff --git a/lib/design1/core.js b/lib/design1/core.js index 04cbaea..e0f6588 100644 --- a/lib/design1/core.js +++ b/lib/design1/core.js @@ -280,7 +280,6 @@ var zoomSlider = slider.render({ max: 500, value: 100, change(val) { - console.log(val, zoomSlider) canvas.zoomToPoint( new fabric.Point(0, 0), val / 100 @@ -379,7 +378,7 @@ function addBackground() { //pre_json1.push(canvas1.toJSON(["selectable","hoverable","hoverCursor"])); recordObjs1.push(JSON.stringify(objs1)); - recordJson1.push(canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"])); + recordJson1.push(canvas1.toJSON(TO_JSON_PROPERTIES)); }); // 类型改变 fabric.Image.fromURL('./public/images/bg_back.png', function (image) { @@ -399,7 +398,7 @@ function addBackground() { //pre_json2.push(canvas2.toJSON(["selectable","hoverable","hoverCursor"])); recordObjs2.push(JSON.stringify(objs2)); - recordJson2.push(canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"])); + recordJson2.push(canvas2.toJSON(TO_JSON_PROPERTIES)); let file = GetFile().get('file') if (file && file != 'empty') { @@ -663,18 +662,25 @@ function addCircleText(pointer) { window.recordState(); } -function selectCircleText(target, index) { +function selectCircleText() { + // 检查是否有选中对象 + if (!canvas || !canvas.getActiveObject()) return; + let idx = getIndex(canvas.getActiveObject()); $("#circle_text_control").show(); $("#circle_text_color").val(canvas.getActiveObject().get("fill")); $("#circle_text_back_color").val(canvas.getActiveObject().get("textBackgroundColor") == "" ? '#ffffff' : canvas.getActiveObject().get("textBackgroundColor")); - if (typeof circle_text_size !== 'undefined' && circle_text_size.setValue) { + + // 检查 circle_text_size 是否存在且有 setValue 方法 + if (typeof circle_text_size !== 'undefined' && circle_text_size && typeof circle_text_size.setValue === 'function') { circle_text_size.setValue(canvas.getActiveObject().get("fontSize") - 10); } else { $("#circle_text_size").next().children(".layui-slider-bar").css("width", ((canvas.getActiveObject().get("fontSize") - 10 - 10) / (120 - 10)) * 100 + "%"); $("#circle_text_size").next().children(".layui-slider-handle").css("left", ((canvas.getActiveObject().get("fontSize") - 10 - 10) / (120 - 10)) * 100 + "%"); } - if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter.setValue) { + + // 检查 circle_text_diameter 是否存在且有 setValue 方法 + if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter && typeof circle_text_diameter.setValue === 'function') { circle_text_diameter.setValue(canvas.getActiveObject().get("diameter") - 500); } else { $("#circle_text_diameter").next().children(".layui-slider-bar").css("width", ((canvas.getActiveObject().get("diameter") - 500 - 500) / (4000 - 500)) * 100 + "%"); @@ -851,7 +857,6 @@ function selectRect(target, index) { $("#rect_op").next().children(".layui-slider-handle").css("left", (1 - canvas.getActiveObject().get("opacity")) * 100 + "%"); } let a = canvas.getActiveObject().getCoords(); - console.log(getCoordsMinX(a)); $("#pic_control").hide(); $("#set_bg").hide(); $("#out_pic_control").hide(); @@ -1045,7 +1050,6 @@ function addCounter(pointer) { canvas.renderAll(); updateList(); window.recordState(); - console.log(canvas.getObjects()) } function selectCounter(target, index) { @@ -1126,7 +1130,7 @@ window.updateList = function updateList() { const lockIcon = isLocked ? '' : ''; - + // 组装 HTML str = `
@@ -1151,6 +1155,9 @@ window.updateList = function updateList() { } // 将 selectObj 附加到 window 对象,确保全局可访问 +// 标记是否通过对象列表选中(用于区分鼠标点击和列表点击) +window._selectingFromList = false; + window.selectObj = function selectObj(objIndices, isFromCanvas = false) { let indicesArray = (Array.isArray(objIndices)) ? objIndices : ((typeof objIndices === 'number' && objIndices >= 0) ? [objIndices] : []); @@ -1166,16 +1173,6 @@ window.selectObj = function selectObj(objIndices, isFromCanvas = false) { if (indicesArray.includes(idIndex)) { $(this).css("background-color", "#6F7A84"); - // 如果对象被锁定,临时允许选中以便解锁 - if (idIndex >= 0 && canvas.getObjects()[idIndex + 1]) { - let obj = canvas.getObjects()[idIndex + 1]; - if (obj && obj.get('lockMovementX') === true) { - obj.set({ - selectable: true, - evented: true - }) - } - } // 自动滚动到可视区域 if (isFromCanvas && indicesArray[0] === idIndex) { @@ -1188,15 +1185,39 @@ window.selectObj = function selectObj(objIndices, isFromCanvas = false) { if (!isFromCanvas && indicesArray.length === 1) { let target = canvas.getObjects()[indicesArray[0] + 1]; if (target) { - // 如果对象被锁定,临时允许选中以便解锁 - if (target.get('lockMovementX') === true) { + // 检查对象是否被锁定 + let isLocked = isObjectLocked(target); + + // 设置标志位,表示这是通过对象列表选中的(无论是否锁定) + window._selectingFromList = true; + + // 如果被锁定,临时设置 selectable 和 evented 为 true,以便能够选中 + if (isLocked) { target.set({ selectable: true, evented: true - }) + }); } + canvas.setActiveObject(target); canvas.requestRenderAll(); + + // 如果对象被锁定,选中后立即恢复锁定状态(但保持选中状态) + if (isLocked) { + setTimeout(() => { + target.set({ + selectable: false, + evented: false + }); + canvas.requestRenderAll(); + }, 0); + } + + // 清除标志位(延迟清除,确保事件处理完成) + setTimeout(() => { + window._selectingFromList = false; + }, 10); + handleObjectSelected(); } } @@ -1217,7 +1238,7 @@ window.recordState = function recordState() { //recordObjs.splice(step.val, 1, JSON.stringify(objs)) //recordJson.splice(step.val, 1, canvas.toJSON(["selectable","hoverable","hoverCursor","text","fontStyle","fontWeight","underline"])) recordObjs.push(JSON.stringify(objs)) - j = canvas.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + j = canvas.toJSON(TO_JSON_PROPERTIES); j.objects[0].hoverCursor = "default"; recordJson.push(j); } @@ -1228,7 +1249,6 @@ window.getIndex = function getIndex(target, _canvas = null) { // 使用 window.canvas 作为默认值,确保在 eval() 执行时也能访问 const currentCanvas = _canvas || window.canvas || canvas; if (!currentCanvas) { - console.error('getIndex: canvas is undefined'); return 0; } temp_objs = currentCanvas.getObjects(); @@ -1377,6 +1397,16 @@ function handleObjectSelected(e) { // 2. 获取索引 let i = getIndex(select_obj, canvas); + + // 如果不是通过对象列表选中的,且对象被锁定,则取消选中 + if (!window._selectingFromList && isObjectLocked(select_obj)) { + canvas.discardActiveObject(); + canvas.renderAll(); + $("#base_control, #line_control, #pic_control, #out_pic_control, #text_control, #circle_text_control, #out_text_control, #rect_control, #circle_control, #counter_control, #qrcode_Controll, #barcode_controll").hide(); + $("#component_type").text(language_str("bg")); + selectObj(-1, true); + return; + } if (i != 0) { // --- 选中了普通对象 --- @@ -1450,6 +1480,61 @@ function handleObjectMoving(e) { updateControls(); } +// 辅助函数:检查对象是否被锁定 +// 只有当 lockMovementX 为 true 时才认为对象被锁定 +// selectable 为 false 可能是其他原因(如背景图),所以只检查 lockMovementX +function isObjectLocked(obj) { + if (!obj) return false; + // 主要检查 lockMovementX,这是锁定的主要标志 + return obj.get('lockMovementX') === true; +} +// 暴露到全局作用域,确保其他模块可以访问 +window.isObjectLocked = isObjectLocked; + +// 统一的 toJSON 属性列表,不包含锁定相关属性(锁定状态不应被保存) +const TO_JSON_PROPERTIES = [ + "selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "evented" +]; +// 暴露到全局作用域 +window.TO_JSON_PROPERTIES = TO_JSON_PROPERTIES; + +// 辅助函数:解锁所有对象(加载时使用) +function unlockAllObjects(canvas) { + if (!canvas) return; + const objects = canvas.getObjects(); + objects.forEach((obj, index) => { + // 背景对象(索引0)保持锁定状态 + if (index === 0) { + obj.set({ + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + lockSkewingX: true, + lockSkewingY: true, + selectable: false, + evented: false + }); + } else { + // 其他对象默认解锁 + obj.set({ + lockMovementX: false, + lockMovementY: false, + lockRotation: false, + lockScalingX: false, + lockScalingY: false, + lockSkewingX: false, + lockSkewingY: false, + selectable: true, + evented: true + }); + } + }); +} +// 暴露到全局作用域 +window.unlockAllObjects = unlockAllObjects; + // 将 handleObjectSelected 附加到 window 对象,确保全局可访问 window.handleObjectSelected = handleObjectSelected; @@ -1489,6 +1574,17 @@ function initCanvasEvents() { objs = (currentCanvas === canvas1) ? objs1 : objs2; handleObjectSelected(e); }); + + // 阻止被锁定的对象被框选选中(只过滤被锁定的对象,保留未锁定的对象) + currentCanvas.on('before:selection:created', (e) => { + if (!e.targets || e.targets.length === 0) return; + // 过滤掉被锁定的对象,保留辅助线和未锁定的对象 + e.targets = e.targets.filter(target => { + if (target.isGuideLine) return true; // 保留辅助线 + return !isObjectLocked(target); // 移除被锁定的对象,保留未锁定的对象 + }); + }); + // 添加 selection 事件以确保对象选中时正确显示属性面板 currentCanvas.on('selection:created', (e) => { canvas = currentCanvas; @@ -1504,16 +1600,12 @@ function initCanvasEvents() { canvas = currentCanvas; objs = (currentCanvas === canvas1) ? objs1 : objs2; - // 阻止背景图(索引0)被选中(如果已锁定) - let selectedObj = e.target; - let idx = getIndex(selectedObj); - if (idx === 0) { - let bgObj = currentCanvas.getObjects()[0]; - if (bgObj && (bgObj.get('lockMovementX') === true || bgObj.get('selectable') === false)) { - currentCanvas.discardActiveObject(); - currentCanvas.renderAll(); - return; - } + // 如果不是通过对象列表选中的,且对象被锁定,则取消选中 + // 注意:只有真正被锁定的对象才会被取消选中,未锁定的对象应该正常选中 + if (!window._selectingFromList && e.target && isObjectLocked(e.target)) { + currentCanvas.discardActiveObject(); + currentCanvas.renderAll(); + return; } handleObjectSelected(e); @@ -1582,7 +1674,6 @@ function initCanvasEvents() { if (typeof window.updateList === 'function') { window.updateList(); } - console.warn('objData is undefined or missing type at index', idx - 1); return; } let target = event.target; @@ -2081,7 +2172,6 @@ window.copySelection = function copySelection() { }); clipboardData.offset = 10; // 重置偏移量 - console.log(`已复制 ${activeObjects.length} 个对象`); layer.msg("已复制"); } diff --git a/lib/design1/output.js b/lib/design1/output.js index 751e54f..81fdfbf 100644 --- a/lib/design1/output.js +++ b/lib/design1/output.js @@ -25,17 +25,14 @@ async function saveImageAsPNG(buffer) { }); if (canceled) { - console.log('用户取消了保存操作'); return; } // 将Buffer写入PNG文件到用户选择的路径 fs.writeFile(filePath, buffer, (err) => { if (err) { - console.error('写入文件失败:', err); } else { layer.msg(language_str("saveSucc") + filePath);//'保存成功至' - console.log('PNG文件已保存至:', filePath); } }); } @@ -1110,15 +1107,31 @@ window.openFile = function open(file) { }); canvas1.loadFromJSON(j.f, function () { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas1); + } if (typeof window.regenerateQrCodesAndBarcodes === 'function') { window.regenerateQrCodesAndBarcodes(canvas1, fo); } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } canvas1.renderAll(); }); canvas2.loadFromJSON(j.b, function () { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas2); + } if (typeof window.regenerateQrCodesAndBarcodes === 'function') { window.regenerateQrCodesAndBarcodes(canvas2, bo); } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } canvas2.renderAll(); }); @@ -1165,12 +1178,13 @@ window.openFile = function open(file) { } setTimeout(() => { recordObjs1.push(JSON.stringify(objs1)) - let j1 = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + const props = window.TO_JSON_PROPERTIES || ["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "evented"]; + let j1 = canvas1.toJSON(props); j1.objects[0].hoverCursor = "default"; recordJson1.push(j1); recordObjs2.push(JSON.stringify(objs2)) - let j2 = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + let j2 = canvas2.toJSON(props); recordJson2.push(j2); }, 0); } catch (e) { @@ -1229,8 +1243,9 @@ function saveAs(op1, callback) { } }); - let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + const props = window.TO_JSON_PROPERTIES || ["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "lockMovementX", "lockMovementY", "lockRotation", "lockScalingX", "lockScalingY", "lockSkewingX", "lockSkewingY", "evented"]; + let j = canvas1.toJSON(props); + let b = canvas2.toJSON(props); // 恢复辅助线 guideLines1.forEach(obj => canvas1.add(obj)); @@ -1271,7 +1286,6 @@ function saveAs(op1, callback) { callback(); } }).catch(err => { - console.log() }) } @@ -1292,8 +1306,9 @@ function save(op1, callback) { } }); - let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + const props = window.TO_JSON_PROPERTIES || ["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "lockMovementX", "lockMovementY", "lockRotation", "lockScalingX", "lockScalingY", "lockSkewingX", "lockSkewingY", "evented"]; + let j = canvas1.toJSON(props); + let b = canvas2.toJSON(props); // 恢复辅助线 guideLines1.forEach(obj => canvas1.add(obj)); @@ -1346,7 +1361,6 @@ function save(op1, callback) { callback(); } }).catch(err => { - console.log() }) } @@ -1365,7 +1379,6 @@ window.saveHistory = function saveHistory() { } } } catch (e) { - console.error("读取历史记录失败,将重置:", e); // 出错时使用默认空数组,不中断流程 j = { history: [] }; } @@ -1398,7 +1411,6 @@ window.saveHistory = function saveHistory() { try { fs.writeFileSync(fullPath, JSON.stringify(j), 'utf8'); } catch (e) { - console.error("写入历史记录失败:", e); } }; // 向后兼容 @@ -1448,7 +1460,6 @@ function clearAll() { if (typeof window.updateList === 'function') { window.updateList(); } - console.log(); } // 将 clearAll 附加到 window 对象,确保全局可访问 diff --git a/lib/design1/ui.js b/lib/design1/ui.js index a795d54..c3d6027 100644 --- a/lib/design1/ui.js +++ b/lib/design1/ui.js @@ -1,2338 +1,2417 @@ -var _keyctrl = false, _keyc = false, _textEdit = false, _inputEdit = false; -$("input").focus(function () { - console.log(1) - _inputEdit = true -}) -$("input").blur(function () { - _inputEdit = false -}) -$("textarea").focus(function () { - console.log(1) - _inputEdit = true -}) -$("textarea").blur(function () { - _inputEdit = false -}) -$("body").keyup(function (event) { - // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�? - if (event.keyCode == 17 || event.keyCode == 91 || event.keyCode == 93) { // Ctrl 键或 Meta 键(Mac Cmd)释�? - _keyctrl = false; - }; - if (event.keyCode == 67) { - _keyc = false; - }; -}) -$("body").keydown(function (event) { - // 统一的快捷键处理(兼�?Windows/Linux: Ctrl, Mac: Cmd/Meta�? - const isModifierKey = event.ctrlKey || event.metaKey; // 兼容三端 - - // 快捷键处理(在输入框或文本区域中时不触发,除了删除相关的�? - if (!_inputEdit && !_textEdit) { - // CTRL/CMD+N - 新建 - if (isModifierKey && event.keyCode == 78) { - event.preventDefault(); - $("#new").click(); - return; - } - // CTRL/CMD+O - 打开 - if (isModifierKey && event.keyCode == 79) { - event.preventDefault(); - $("#open").click(); - return; - } - // CTRL/CMD+S - 保存 - if (isModifierKey && !event.shiftKey && event.keyCode == 83) { - event.preventDefault(); - $("#save").click(); - return; - } - // CTRL/CMD+SHIFT+S - 保存副本 - if (isModifierKey && event.shiftKey && event.keyCode == 83) { - event.preventDefault(); - if (typeof window.output === 'function') { - window.output(null, saveAs); - } - return; - } - // CTRL/CMD+Z - 还原 - if (isModifierKey && !event.shiftKey && event.keyCode == 90) { - event.preventDefault(); - $("#previous").click(); - return; - } - // CTRL/CMD+Y - 重做 - if (isModifierKey && !event.shiftKey && event.keyCode == 89) { - event.preventDefault(); - $("#next").click(); - return; - } - // CTRL/CMD+C - 复制 - if (isModifierKey && event.keyCode == 67 && event.target.nodeName == 'BODY') { - event.preventDefault(); - window.copySelection(); - return; - } - // CTRL/CMD+V - 粘贴 - if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') { - event.preventDefault(); - window.pasteFromClipboard(); - return; - } - - // CTRL/CMD + SHIFT + DEL (Windows) �?CMD + SHIFT + Backspace (Mac) - 清空 - if (isModifierKey && event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) { - event.preventDefault(); - $("#clean").click(); - return; - } - - // CTRL/CMD + DEL (Windows) �?CMD + Backspace (Mac) - 删除 - if (isModifierKey && !event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) { - event.preventDefault(); - $("#delete").click(); - return; - } - - } - // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�? - if (event.keyCode == 17 || event.metaKey) { // Ctrl 键或 Meta 键(Mac Cmd�? - _keyctrl = true; - if (_keyc && _textEdit) { - //同时按下且在编辑状�? - setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1) - //clipboard.writeText((clipboard.readText()+' ')) - } - } - if (event.keyCode == 67) { - _keyc = true; - if (_keyctrl & _textEdit) { - //同时按下且在编辑状�? - setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1) - //clipboard.writeText((clipboard.readText()+' ')) - } - } - if (event.keyCode == 37) { - //left - let v = -1; - if (_keyctrl || event.ctrlKey || event.metaKey) { - v = -5; - } - let x = canvas.getActiveObject().get("left"); - x += v; - canvas.getActiveObject().set("left", x); - canvas.renderAll(); - window.recordState(); - updateControls(); - } - if (event.keyCode == 38) { - //up - let v = -1; - if (_keyctrl || event.ctrlKey || event.metaKey) { - v = -5; - } - let y = canvas.getActiveObject().get("top"); - y += v; - canvas.getActiveObject().set("top", y); - canvas.renderAll(); - window.recordState(); - updateControls(); - } - if (event.keyCode == 39) { - //right - let v = 1; - if (_keyctrl || event.ctrlKey || event.metaKey) { - v = 5; - } - let x = canvas.getActiveObject().get("left"); - x += v; - canvas.getActiveObject().set("left", x); - canvas.renderAll(); - window.recordState(); - updateControls(); - } - if (event.keyCode == 40) { - //down - let v = +1; - if (_keyctrl || event.ctrlKey || event.metaKey) { - v = 5; - } - let y = canvas.getActiveObject().get("top"); - y += v; - canvas.getActiveObject().set("top", y); - canvas.renderAll(); - window.recordState(); - updateControls(); - } - // 普通删除键(DEL键,没有按CTRL/CMD�? - if (event.keyCode == 46 && !isModifierKey && !_inputEdit && !_textEdit) { - // 使用 window.canvas 作为后备,确保在 eval() 加载 .jsc 时也能访问 - const currentCanvas = window.canvas || canvas; - const currentObjs = window.objs || objs; - if (!currentCanvas) { - console.error('canvas is undefined in delete handler'); - return; - } - let actObjs = currentCanvas.getActiveObjects(); - let allObjs = currentCanvas.getObjects(); - let flag = 0; - for (let item of actObjs) { - if (item != allObjs[0]) { - let i = getIndex(item, currentCanvas);//0是背景,所以从1开始,但objs不包含背景图片,故要-1 - currentObjs.splice(i - 1, 1); - currentCanvas.remove(item); - flag = 1; - - } - } - if (typeof window.updateList === 'function') { - window.updateList(); - } - currentCanvas.discardActiveObject(); - if (flag == 1) { - window.recordState(); - canvas.renderAll(); - handleObjectSelected() - } - } -}); -// pre_add_image 已在 design1.js 中定义为全局变量 -$("#addPic").click(function () { - OpenDialog(); - function OpenDialog() { - dialog.showOpenDialog({ - title: language_str("selectPic"),//请选择图片 - buttonLabel: language_str("comf"),//"确认" - filters: [ - { name: 'Image File Type', extensions: ['png', 'jpg', 'jpeg'] }, - ] - }).then(result => { - if (result.canceled) return; - //console.log(result.filePaths) - fabric.Image.fromURL(result.filePaths[0], function (image) { - //image.left = pointer.x; - image.setSrc(image.toDataURL(), function (image) { - pre_add_image = image; - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 1; - }); - //canvas.add(image); - }); - }).catch(err => { - console.log(err) - }) - } -}); -$("#addOutPic").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 2; -}); -$("#addText").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 3; -}); - -$("#addCircleText").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 11; -}); -$("#addOutText").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 4; -}); -$("#addRect").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 5; -}); -$("#addCircle").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 6; -}); -$("#addLine").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 7; -}); -$("#addQrCode").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 8; -}); -$("#addBarCode").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addCounter").css("background-color", ""); - addState = 9; -}); -$("#addCounter").click(function () { - background_image.hoverCursor = "crosshair"; - $(this).css("background-color", "#646E76"); - - $("#addPic").css("background-color", ""); - $("#addOutPic").css("background-color", ""); - $("#addText").css("background-color", ""); - $("#addCircleText").css("background-color", ""); - $("#addOutText").css("background-color", ""); - $("#addRect").css("background-color", ""); - $("#addCircle").css("background-color", ""); - $("#addLine").css("background-color", ""); - $("#addQrCode").css("background-color", ""); - $("#addBarCode").css("background-color", ""); - addState = 10; -}); -$("#version_change").click(function () { - if (bg_version == 1) { - bg_version = 2; - } else { - bg_version = 1; - } - // 类型改变 - $("#source_front").attr("src", "./public/images/front_bg" + bg_version + "_1.png"); - canvas.renderAll(); - -}); -$("#front_side").click(function () { - $(this).addClass("ui-button-active"); - $("#back_side").removeClass("ui-button-active"); - $(".canvas-container:eq(0)").show(); - $(".canvas-container:eq(1)").hide(); - console.log("------"); - console.log(recordObjs1); - console.log("------"); - canvas = canvas1; - objs = objs1; - background_image = background_image1; - window.canvas = canvas; - window.objs = objs; - window.background_image = background_image; - next_objs = next_objs1; - pre_objs = pre_objs1; - next_json = next_json1; - pre_json = pre_json1; - recordObjs = recordObjs1; - recordJson = recordJson1; - step = step1; - if (typeof window.updateList === 'function') { - window.updateList(); - } - - $("#line_control").hide(); - $("#base_control").hide(); - $("#pic_control").hide(); - $("#out_pic_control").hide(); - $("#text_control").hide(); - $("#circle_text_control").hide(); - $("#out_text_control").hide(); - $("#rect_control").hide(); - $("#circle_control").hide(); - $("#counter_control").hide(); - $("#qrcode_Controll").hide(); - $("#barcode_controll").hide(); - $("#component_type").text(language_str("bg"));//背景 -}); -$("#back_side").click(function () { - $(this).addClass("ui-button-active"); - $("#front_side").removeClass("ui-button-active"); - $(".canvas-container:eq(0)").hide(); - $(".canvas-container:eq(1)").show(); - canvas = canvas2; - objs = objs2; - background_image = background_image2; - window.canvas = canvas; - window.objs = objs; - window.background_image = background_image; - next_objs = next_objs2; - pre_objs = pre_objs2; - next_json = next_json2; - pre_json = pre_json2; - recordObjs = recordObjs2; - recordJson = recordJson2; - step = step2; - if (typeof window.updateList === 'function') { - window.updateList(); - } - $("#line_control").hide(); - $("#base_control").hide(); - $("#pic_control").hide(); - $("#out_pic_control").hide(); - $("#text_control").hide(); - $("#circle_text_control").hide(); - $("#out_text_control").hide(); - $("#rect_control").hide(); - $("#circle_control").hide(); - $("#counter_control").hide(); - $("#qrcode_Controll").hide(); - $("#barcode_controll").hide(); - $("#component_type").text(language_str("bg"));//"背景" -}); -$("#top_alignment").click(function () { - let _objs = canvas.getActiveObjects(); - if (_objs.length == 1) { - //只选中了一�? - let obj = _objs[0]; - obj.setCoords(); - let coords = obj.getCoords(true); - let objMinY = getCoordsMinY(coords); - let bgMinY = getCoordsMinY(background_image.getCoords(true)); - let deltaY = bgMinY - objMinY; - obj.set("top", obj.get("top") + deltaY); - obj.setCoords(); - canvas.renderAll(); - window.recordState(); - return; - } - // 多个对象对齐:找到所有对象边界框的最小Y值 - let minTop = Infinity; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinY = getCoordsMinY(coords); - if (itemMinY < minTop) { - minTop = itemMinY; - } - } - // 将所有对象对齐到最小Y值 - groupItems = []; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinY = getCoordsMinY(coords); - let deltaY = minTop - itemMinY; - item.set("top", item.get("top") + deltaY); - item.setCoords(); - groupItems.push(item); - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); - -}); -$("#bottom_alignment").click(function () { - let _objs = canvas.getActiveObjects(); - if (_objs.length == 1) { - //只选中了一�? - let idx = getIndex(_objs[0]); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = _objs[0].get("strokeWidth") - } - let obj = _objs[0]; - obj.setCoords(); - let coords = obj.getCoords(true); - let objMaxY = getCoordsMaxY(coords); - let bgMaxY = getCoordsMaxY(background_image.getCoords(true)); - let deltaY = bgMaxY - objMaxY; - obj.set("top", obj.get("top") + deltaY); - obj.setCoords(); - canvas.renderAll(); - window.recordState(); - return; - } - // 多个对象对齐:找到所有对象边界框的最大Y值 - let maxBottom = -Infinity; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMaxY = getCoordsMaxY(coords); - if (itemMaxY > maxBottom) { - maxBottom = itemMaxY; - } - } - // 将所有对象对齐到最大Y值 - groupItems = []; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMaxY = getCoordsMaxY(coords); - let deltaY = maxBottom - itemMaxY; - item.set("top", item.get("top") + deltaY); - item.setCoords(); - groupItems.push(item); - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); - -}); -$("#center_y_alignment").click(function () { - let _objs = canvas.getActiveObjects(); - if (_objs.length == 1) { - //只选中了一�? - let idx = getIndex(_objs[0]); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = _objs[0].get("strokeWidth") - } - let obj = _objs[0]; - obj.setCoords(); - let coords = obj.getCoords(true); - let objMinY = getCoordsMinY(coords); - let objMaxY = getCoordsMaxY(coords); - let objCenterY = (objMinY + objMaxY) / 2; - let bgCoords = background_image.getCoords(true); - let bgMinY = getCoordsMinY(bgCoords); - let bgMaxY = getCoordsMaxY(bgCoords); - let bgCenterY = (bgMinY + bgMaxY) / 2; - let deltaY = bgCenterY - objCenterY; - obj.set("top", obj.get("top") + deltaY); - obj.setCoords(); - canvas.renderAll(); - window.recordState(); - return; - } - // 多个对象对齐:找到所有对象边界框的中心Y值 - let minTop = Infinity; - let maxBottom = -Infinity; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinY = getCoordsMinY(coords); - let itemMaxY = getCoordsMaxY(coords); - if (itemMinY < minTop) minTop = itemMinY; - if (itemMaxY > maxBottom) maxBottom = itemMaxY; - } - let groupCenterY = (minTop + maxBottom) / 2; - // 将所有对象对齐到中心Y值 - groupItems = []; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinY = getCoordsMinY(coords); - let itemMaxY = getCoordsMaxY(coords); - let itemCenterY = (itemMinY + itemMaxY) / 2; - let deltaY = groupCenterY - itemCenterY; - item.set("top", item.get("top") + deltaY); - item.setCoords(); - groupItems.push(item); - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); - window.recordState(); -}); -$("#left_alignment").click(function () { - let _objs = canvas.getActiveObjects(); - if (_objs.length == 1) { - //只选中了一�? - let obj = _objs[0]; - obj.setCoords(); - let coords = obj.getCoords(true); - let objMinX = getCoordsMinX(coords); - let bgMinX = getCoordsMinX(background_image.getCoords(true)); - let deltaX = bgMinX - objMinX; - obj.set("left", obj.get("left") + deltaX); - obj.setCoords(); - canvas.renderAll(); - window.recordState(); - return; - } - // 多个对象对齐:找到所有对象边界框的最小X值 - let minLeft = Infinity; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinX = getCoordsMinX(coords); - if (itemMinX < minLeft) { - minLeft = itemMinX; - } - } - // 将所有对象对齐到最小X值 - groupItems = []; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinX = getCoordsMinX(coords); - let deltaX = minLeft - itemMinX; - item.set("left", item.get("left") + deltaX); - item.setCoords(); - groupItems.push(item); - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); - window.recordState(); -}); -$("#right_alignment").click(function () { - let _objs = canvas.getActiveObjects(); - if (_objs.length == 1) { - //只选中了一�? - let idx = getIndex(_objs[0]); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get("strokeWidth") - } - let obj = _objs[0]; - obj.setCoords(); - let coords = obj.getCoords(true); - let objMaxX = getCoordsMaxX(coords); - let bgMaxX = getCoordsMaxX(background_image.getCoords(true)); - let deltaX = bgMaxX - objMaxX; - obj.set("left", obj.get("left") + deltaX); - obj.setCoords(); - canvas.renderAll(); - window.recordState(); - return; - } - // 多个对象对齐:找到所有对象边界框的最大X值 - let maxRight = -Infinity; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMaxX = getCoordsMaxX(coords); - if (itemMaxX > maxRight) { - maxRight = itemMaxX; - } - } - // 将所有对象对齐到最大X值 - let groupItems = []; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMaxX = getCoordsMaxX(coords); - let deltaX = maxRight - itemMaxX; - item.set("left", item.get("left") + deltaX); - item.setCoords(); - groupItems.push(item); - } - //BUG1 - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); - window.recordState(); -}); -$("#center_x_alignment").click(function () { - let _objs = canvas.getActiveObjects(); - if (_objs.length == 1) { - //只选中了一�? - let idx = getIndex(_objs[0]); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = _objs[0].get("strokeWidth") - } - let obj = _objs[0]; - obj.setCoords(); - let coords = obj.getCoords(true); - let objMinX = getCoordsMinX(coords); - let objMaxX = getCoordsMaxX(coords); - let objCenterX = (objMinX + objMaxX) / 2; - let bgCoords = background_image.getCoords(true); - let bgMinX = getCoordsMinX(bgCoords); - let bgMaxX = getCoordsMaxX(bgCoords); - let bgCenterX = (bgMinX + bgMaxX) / 2; - let deltaX = bgCenterX - objCenterX; - obj.set("left", obj.get("left") + deltaX); - obj.setCoords(); - canvas.renderAll(); - window.recordState(); - return; - } - // 多个对象对齐:找到所有对象边界框的中心X值 - let minLeft = Infinity; - let maxRight = -Infinity; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinX = getCoordsMinX(coords); - let itemMaxX = getCoordsMaxX(coords); - if (itemMinX < minLeft) minLeft = itemMinX; - if (itemMaxX > maxRight) maxRight = itemMaxX; - } - let groupCenterX = (minLeft + maxRight) / 2; - // 将所有对象对齐到中心X值 - groupItems = []; - for (let item of _objs) { - item.setCoords(); - let coords = item.getCoords(true); - let itemMinX = getCoordsMinX(coords); - let itemMaxX = getCoordsMaxX(coords); - let itemCenterX = (itemMinX + itemMaxX) / 2; - let deltaX = groupCenterX - itemCenterX; - item.set("left", item.get("left") + deltaX); - item.setCoords(); - groupItems.push(item); - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); - window.recordState(); -}); -$("#up_obj").click(function () {//上移,放到前�?数组中在后面 - let idx = getIndex(canvas.getActiveObject()); - if (idx + 1 != canvas.getObjects().length) { - canvas.bringForward(canvas.getActiveObject()); - canvas.renderAll(); - let temp = objs[idx - 1]; - objs[idx - 1] = objs[idx]; - objs[idx] = temp; - //console.log(objs); - - window.recordState(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - if (typeof window.selectObj === 'function') { - window.selectObj(idx); - } - } -}); -$("#down_obj").click(function () {//下移,放到后�?数组中在前面 - let idx = getIndex(canvas.getActiveObject()); - if (idx != 1) { - canvas.sendBackwards(canvas.getActiveObject()); - canvas.renderAll(); - //[objs[idx-2],objs[idx-1]] = [objs[idx-1],objs[idx-2]]; - - let temp = objs[idx - 1]; - objs[idx - 1] = objs[idx - 2]; - objs[idx - 2] = temp; - window.recordState(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - if (typeof window.selectObj === 'function') { - window.selectObj(idx - 2); - } - } -}); -$("#set_bg").click(function () {//设置为背�? - let obj = canvas.getActiveObject(); - console.log(obj, obj.get("selectable")) - let idx = getIndex(obj); - const scaleX = 2787 / obj.width - const scaleY = 2787 / obj.height - // 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致 - const scaledWidth = obj.width * scaleX; - const scaledHeight = obj.height * scaleY; - obj.set({ - scaleX: scaleX, - scaleY: scaleY, - left: ($('#canvas1').width() - scaledWidth) / 2, - top: ($('#canvas1').height() - scaledHeight) / 2, - }); - $('#text_w').val(2787) - $('#text_h').val(2787) - $('#text_x').val(0) - $('#text_y').val(0) - if (obj.get("selectable")) { - obj.set("selectable", false); - $("#lock_img").attr("src", "public/images/lock20.png") - } - canvas.sendToBack(obj); - canvas.bringForward(obj); - canvas.renderAll(); - let objItem = objs.splice(idx - 1, 1)[0] - objs.unshift(objItem) - window.recordState(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - if (typeof window.selectObj === 'function') { - window.selectObj(0); - } -}); - -// ========================================== -// onStateRestored 函数在 core.js 中定义并附加到 window 对象 -// ========================================== -$("#previous").click(function () { - if (step.val == 0) return; - - step.val--; - - // 判断当前是正面还是背面 - if ($("#front_side").hasClass("ui-button-active")) { - // 1. 恢复业务数据 - objs1 = JSON.parse(recordObjs1[step.val]); - objs = objs1; - - // 2. 恢复画布 (使用回调函数) - canvas.loadFromJSON(recordJson1[step.val], function () { - if (typeof window.onStateRestored === 'function') { - window.onStateRestored(); // 图片加载完才执行这一行 - } - }); - } else { - // 背面逻辑 - objs2 = JSON.parse(recordObjs2[step.val]); - objs = objs2; - - canvas.loadFromJSON(recordJson2[step.val], function () { - if (typeof window.onStateRestored === 'function') { - window.onStateRestored(); - } - }); - } -}); -// ========================================== -$("#next").click(function () { - // 获取当前历史记录的最大长度 - let maxLen = $("#front_side").hasClass("ui-button-active") ? recordObjs1.length : recordObjs2.length; - - if (step.val >= maxLen - 1) return; - - step.val++; - - if ($("#front_side").hasClass("ui-button-active")) { - objs1 = JSON.parse(recordObjs1[step.val]); - objs = objs1; - - canvas.loadFromJSON(recordJson1[step.val], function () { - if (typeof window.onStateRestored === 'function') { - window.onStateRestored(); // 图片加载完才执行这一行 - } - }); - } else { - objs2 = JSON.parse(recordObjs2[step.val]); - objs = objs2; - - canvas.loadFromJSON(recordJson2[step.val], function () { - if (typeof window.onStateRestored === 'function') { - window.onStateRestored(); - } - }); - } -}); - -$("#clean").click(function () { - objs.splice(0, objs.length); - - let allObjs = canvas.getObjects(); - for (let item of allObjs) { - if (item != allObjs[0]) { - canvas.remove(item); - } - } - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); -}); -$("#rotate").click(function () { - let obj = canvas.getActiveObject(); - obj.rotate(Math.round((obj.get("angle") + 90) % 360)); - $("#text_r").val(obj.get("angle")); - canvas.renderAll(); - updateControls(); - window.recordState(); -}); -$('#vertical_obj').click(function () { - let obj = canvas.getActiveObject(); - obj.set("flipY", !obj.get("flipY")); - canvas.renderAll(); - updateControls(); - window.recordState(); -}); -$('#align_obj').click(function () { - let obj = canvas.getActiveObject(); - obj.set("flipX", !obj.get("flipX")); - canvas.renderAll(); - updateControls(); - window.recordState(); -}); -$("#text_italics").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�? - canvas.getActiveObject().set("fontStyle", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("fontStyle", "italic") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#text_bold").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�?恢复正常 - canvas.getActiveObject().set("fontWeight", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("fontWeight", "bold") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#text_underline").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�? - canvas.getActiveObject().set("underline", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("underline", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#text_linethrough").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�? - canvas.getActiveObject().set("linethrough", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("linethrough", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); - -$("#circle_text_italics").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�? - canvas.getActiveObject().set("fontStyle", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("fontStyle", "italic") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_text_bold").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�?恢复正常 - canvas.getActiveObject().set("fontWeight", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("fontWeight", "bold") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); - -$('#out_left_alignment').click(function () { - $('#out_left_alignment').parent().removeClass('tool1') - $('#out_right_alignment').parent().removeClass('tool1') - $('#out_center_alignment').parent().removeClass('tool1') - setTimeout(() => { - $('#out_left_alignment').parent().addClass('tool1') - }); - canvas.getActiveObject().set('textAlign', 'left') - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].align = 'left' - window.recordState(); - canvas.renderAll(); -}) -$('#out_right_alignment').click(function () { - $('#out_left_alignment').parent().removeClass('tool1') - $('#out_right_alignment').parent().removeClass('tool1') - $('#out_center_alignment').parent().removeClass('tool1') - setTimeout(() => { - $('#out_right_alignment').parent().addClass('tool1') - }); - canvas.getActiveObject().set('textAlign', 'right') - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].align = 'right' - window.recordState(); - canvas.renderAll(); -}) -$('#out_center_alignment').click(function () { - $('#out_left_alignment').parent().removeClass('tool1') - $('#out_right_alignment').parent().removeClass('tool1') - $('#out_center_alignment').parent().removeClass('tool1') - setTimeout(() => { - $('#out_center_alignment').parent().addClass('tool1') - }); - canvas.getActiveObject().set('textAlign', 'center') - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].align = 'center' - window.recordState(); - canvas.renderAll(); -}) - -$("#out_text_italics").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�? - canvas.getActiveObject().set("fontStyle", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("fontStyle", "italic") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_bold").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�?恢复正常 - canvas.getActiveObject().set("fontWeight", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("fontWeight", "bold") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_underline").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�? - canvas.getActiveObject().set("underline", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("underline", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_linethrough").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已�? - canvas.getActiveObject().set("linethrough", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未�? - canvas.getActiveObject().set("linethrough", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#lock").off('click').on('click', function (e) { - e.stopPropagation(); - if (!canvas.getActiveObject()) return; - let obj = canvas.getActiveObject(); - // 检查是否已锁定(通过lockMovementX判断,因为锁定时会设置所有lock属性) - let isLocked = obj.get("lockMovementX") === true; - let shouldLock = !isLocked; - - // 锁定/解锁所有编辑操作,锁定后不可选中 - obj.set({ - lockMovementX: shouldLock, - lockMovementY: shouldLock, - lockRotation: shouldLock, - lockScalingX: shouldLock, - lockScalingY: shouldLock, - lockSkewingX: shouldLock, - lockSkewingY: shouldLock, - // 锁定时不可选中,解锁时可选中 - selectable: !shouldLock, - evented: !shouldLock - }); - if (shouldLock) { - $("#lock_img").attr("src", "public/images/lock20.png")//已锁定//已经上锁,需要解�? - // 锁定后取消选中 - canvas.discardActiveObject(); - } else { - $("#lock_img").attr("src", "public/images/unlock20.png")//已解锁 - } - updateControls(); - window.recordState(); - // 更新对象列表以同步锁状态 - if (typeof window.updateList === 'function') { - window.updateList(); - } - canvas.renderAll(); - window.recordState(); -}); -$("#text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#text_back_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#circle_text_back_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#out_text_back_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#rect_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#rect_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#rect_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#rect_stroke").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#circle_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#circle_stroke").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); - -// saveAs 函数保留,因为它被作为回调传递给 output 函数(第52行) -function saveAs(op1, callback) { - let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - - // 清理不需要的 src 字段(使用 window.cleanupSrcFields,在 output.js 中定义) - if (typeof window.cleanupSrcFields === 'function') { - window.cleanupSrcFields(j.objects, objs1); - window.cleanupSrcFields(b.objects, objs2); - } - - let o = { f: j, b: {}, fo: objs1, bo: objs2 }; - let con_o = Object.assign(o, op1); - dialog.showSaveDialog({ - title: language_str("saveFile"),//'保存文件' - filters: [ - { name: 'Soon File Type', extensions: ['soon'] }, - ] - }).then(result => { - if (result.filePath == "") { return; } - if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) { - result.filePath += '.soon'; - } - let fs = require('fs') - con_o.soonType = 1 - fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8') - openAs.name = result.filePath; - layer.msg(language_str("saveSucc") + openAs.name);//'保存成功�? - if (typeof window.saveHistory === 'function') { - window.saveHistory(); - } - if (callback && typeof callback === 'function') { - callback(); - } - }).catch(err => { - console.log() - }) -} -// save 函数已在 output.js 中定义 -$("#copy").click(function () { - window.copySelection(); -}) -// 粘贴 -$("#paste").click(function () { - window.pasteFromClipboard(); -}) - -// 保存 (保持你原有的保存逻辑不变) -$("#save").click(function () { - if (typeof window.output === 'function') { - window.output(); // 这里调用你的 output 函数 - } - return; - // ... (下面是你原有的被 return 截断的代码,建议以后清理掉,但这里我按要求保�? - let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - // ... (省略你原来那段很长的保存代码) ... -}); - -function getDate() { - let date = new Date(); - return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); -} -function getAbsoluteXY(_obj) { - let coord = _obj.get("lineCoords"); - return [_obj.get("left"), _obj.get("top")] -} -// fullPath 和 saveHistory 已在 output.js 中定义 -$("#open").click(function () { - if (step.val == 0) { - OpenDialog(); - return; - } - layer.confirm('' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�? - if (typeof window.output === 'function') { - window.output(OpenDialog); - } - layer.close(index); - - }, function (index) { - OpenDialog(); - }); - function OpenDialog() { - dialog.showOpenDialog({ - title: "请选择文件", - buttonLabel: language_str("comf"), - filters: [ - { name: 'Soon File Type', extensions: ['soon'] }, - ] - }).then(result => { - if (result.canceled) return; - let filePath = result.filePaths[0]; - let fs = require('fs'); - let fsData = fs.readFileSync(filePath); - let j = JSON.parse(fsData.toString()); - let type = j.soonType ? j.soonType : j.backBlackPic ? 2 : 1; - - if (type == 2) { - ipcRenderer.send('open-design-page', filePath, type); - return; - } - - // 调用 output.js 中的 openFile 函数 - if (typeof window.openFile === 'function') { - window.openFile(filePath); - } else { - console.error('openFile 函数未定义!'); - } - }).catch(err => { - console.log(err) - }) - } -}); - //let blank = "{\"f\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":2787,\"height\":2787,\"fill\":\"#000000\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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YFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAX2YPDVmXlAHjVBgAABAgQIECBAgAABAgQIlAh8bQ8Gt83MQ0oWtiYBAgQIECBAgAABAgQIECCQBW7fg8GtM/OoPGuCAAECBAgQIECAAAECBAgQKBG4dQ8GN8zMdSULW5MAAQIECBAgQIAAAQIECBDIAjfuweADM/OsPGuCAAECBAgQIECAAAECBAgQKBH44B4M3jIzLy9Z2JoECBAgQIAAAQIECBAgQIBAFnjrHgxeMDPvzrMmCBAgQIAAAQIECBAgQIAAgRKBn9uDwYmZ+UTJwtYkQIAAAQIECBAgQIAAAQIEssCJPRg8cGa+ODNX5XkTBAgQIECAAAECBAgQIECAwGUucMfMPGztS27b9qGZedplvrD1CBAgQIAAAQIECBAgQIAAgSzw4bXW008Gg/1LD/cvP/QgQIAAAQIECBAgQIAAAQIEugVevtb6zZPB4JqZuanbw/YECBAgQIAAAQIECBAgQIDAzFy71rr568Fgf2zbdv3MPBENAQIECBAgQIAAAQIECBAgUCtw/VrrSfv2pwaDF8/Mb9eSWJwAAQIECBAgQIAAAQIECBB48VrrHXcPBg+dmc/OzLfwIUCAAAECBAgQIECAAAECBOoE/ntmrl5r3fYNwWD/H9u2vW1mXlJHYmECBAgQIECAAAECBAgQIEDg7Wutl55kuOufJByCwWNm5p9n5kGcCBAgQIAAAQIECBAgQIAAgRqB/5uZ711r3XKPweAQDd41Mz9fQ2JRAgQIECBAgAABAgQIECBA4HfXWi88leEbPmFwCAaPPHzK4CpeBAgQIECAAAECBAgQIECAwGUvcMfMPHattX+v4V2P04LBIRq8embecNmTWJAAAQIECBAgQIAAAQIECBB47VrrtAZwpmCwf4fBDTPzeG4ECBAgQIAAAQIECBAgQIDAZSvwqZk5sdb6yt03vMdgsA9t23ZiZj42M1dctiwWI0CAAAECBAgQIECAAAECvQJ3zsxT1lr7BwZOe5wxGByiwS/OzK/32tmcAAECBAgQIECAAAECBAhctgKvWmv92pm2S8Fg//M/nplnX7Y8FiNAgAABAgQIECBAgAABAn0C75uZ56y1tnMKBvsPbdv2rTPz5zPz5D4/GxMgQIAAAQIECBAgQIAAgctO4OMz87S11u1n2+ysnzA4+YPbtj388H0G1152TBYiQIAAAQIECBAgQIAAAQI9AjcdvrfgC2nlIwWD/Um2bXvMzHx0Zh6VntSfEyBAgAABAgQIECBAgAABAvc7gc/MzFPXWjcf5Z0dORgcosE1M/ORmfmuozy5GQIECBAgQIAAAQIECBAgQOB+IfDpmfnxtdb+CYMjPY4VDA7RYP+EwZ/MzBOO9AqGCBAgQIAAAQIECBAgQIAAgftS4JMz88y11v4JgyM/jh0MDtHgwTPzhzPzk0d+JYMECBAgQIAAAQIECBAgQIDAxRZ4/8w8f631peO+8DkFg0M02H/2lTPzKzNzxXFf2DwBAgQIECBAgAABAgQIECBwwQTunJlfnpk3ne1XJ57t1c85GJx80m3bThw+bfC4C7amJyZAgAABAgQIECBAgAABAgSOKvCPM/O8tdaNR/2Be5q718Fgf9Jt2/ZPGOyfNnj1zFx1b96QnyVAgAABAgQIECBAgAABAgTOSeCOmXnj4VMF+ycM7tXjvASDk+9g27ZHzMzrZuZnZ+ab7tU788MECBAgQIAAAQIECBAgQIDAUQT+d2Z+b2Zev9b6/FF+4Cgz5zUYnBIOrp6ZV8zMi2bmyqO8ETMECBAgQIAAAQIECBAgQIDAsQS+PDPvnJk3r7U+d6yfPMLwBQkGp4SDh87Mc/d/OzEzP3iE92OEAAECBAgQIECAAAECBAgQOLvA9TPznpl571rrtguFdUGDwalvetu2x8zMM2bmR2bmqTPzsAu1lOclQIAAAQIECBAgQIAAAQKXkcAXZ+avZ+avZubP1lo3X4zdLlowuFs8eMDMPGFmrpuZ75uZa2bmO2fm2w9fmrh/MsGDAAECBAgQIECAAAECBAi0COyfFNi/tPDfZ+bWmbllZvbfdrD/poNPrrW+drEh/h+5oaPdsxLhuQAAAABJRU5ErkJggg==\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"b\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":2787,\"height\":2787,\"fill\":\"rgb(0,0,0)\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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YFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMT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\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"fo\":[],\"bo\":[]}"; - let t_objs1 = canvas1.getObjects(); - let t_objs2 = canvas2.getObjects(); - for (let i = 1; i < t_objs1.length; i++) { - canvas1.remove(t_objs1[i]); - } - for (let i = 1; i < t_objs2.length; i++) { - canvas2.remove(t_objs2[i]); - } - objs2 = []; - objs1 = []; - step1.val = 0; - step2.val = 0; - recordJson1 = []; - recordJson2 = []; - recordObjs1 = []; - recordObjs2 = []; - if ($("#front_side").hasClass("ui-button-active")) { - objs = objs1; - recordObjs = recordObjs1; - recordJson = recordJson1; - step = step1; - } else if ($("#back_side").hasClass("ui-button-active")) { - objs = objs2; - recordObjs = recordObjs2; - recordJson = recordJson2; - step = step2; - } - openAs.name = ""; - canvas1.renderAll(); - canvas2.renderAll(); - if (typeof window.updateList === 'function') { - window.updateList(); - } -$("#new").click(function () { - if (step.val == 0) { - ipcRenderer.send('open-first-page'); - return; - } - layer.confirm('' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�? - if (typeof window.output === 'function') { - window.output(() => ipcRenderer.send('open-first-page')); - } - }, function (index) { - ipcRenderer.send('open-first-page'); - }); -}); - -// =========================================================== -$("#text_y").bind('input propertychange', function () { - if (!canvas.getActiveObject()) return; - if ($("#text_y").val() == "") { - $("#text_y").val(0) - } - let val = background_image.top; - if ($("#text_y").val() != "") { - val = background_image.top + parseInt($("#text_y").val()); - } - canvas.getActiveObject().set("top", val) - canvas.renderAll(); - window.recordState(); -}) -$("#text_x").bind('input propertychange', function () { - if (!canvas.getActiveObject()) return; - if ($("#text_x").val() == "") { - $("#text_x").val(0) - } - let val = background_image.left; - if ($("#text_x").val() != "") { - val = background_image.left + parseInt($("#text_x").val()); - } - canvas.getActiveObject().set("left", val) - canvas.renderAll(); - window.recordState(); -}) -$("#text_w").bind('input propertychange', function () { - if (!canvas.getActiveObject()) return; - let val = "0"; - if ($("#text_w").val() != "") { - val = $("#text_w").val(); - } - let idx = getIndex(canvas.getActiveObject()); - if (idx <= 0 || !objs[idx - 1]) return; - let type = objs[idx - 1].type; - if (type == 3 || type == 4) { - canvas.getActiveObject().set("width", parseInt(val)) - } else { - canvas.getActiveObject().set("scaleX", parseInt(val) / canvas.getActiveObject().get("width")) - } - - canvas.renderAll(); - window.recordState(); -}) -$("#text_h").bind('input propertychange', function () { - if (!canvas.getActiveObject()) return; - let idx = getIndex(canvas.getActiveObject()); - if (idx <= 0 || !objs[idx - 1]) return; - if (objs[idx - 1].type == 7) { - if ($("#text_h").val() == "") { - $("#text_h").val(canvas.getActiveObject().get("strokeWidth")); - } - canvas.getActiveObject().set("strokeWidth", parseInt($("#text_h").val())); - canvas.renderAll(); - return; - } - let val = "0"; - if ($("#text_h").val() != "") { - val = $("#text_h").val(); - } - let type = objs[idx - 1].type; - if (type == 3 || type == 4) { - canvas.getActiveObject().set("height", parseInt(val)) - } else { - canvas.getActiveObject().set("scaleY", parseInt(val) / canvas.getActiveObject().get("height")) - } - - canvas.renderAll(); - window.recordState(); -}) -$("#text_r").bind('input propertychange', function () { - if (!canvas.getActiveObject()) return; - if ($("#text_r").val() == "") { - $("#text_r").val("0") - } - $("#text_r").val(parseInt($("#text_r").val()) % 360) - //canvas.getActiveObject().set("rotate", val) - canvas.getActiveObject().rotate(parseInt($("#text_r").val())) - canvas.renderAll(); - window.recordState(); -}) -$("#out_pic_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#out_pic_field_name").val(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); -}) - -$("#text_black").click(function () { - let idx = getIndex(canvas.getActiveObject()); - if ($(this).prop("checked")) { - objs[idx - 1].black = true; - } else { - objs[idx - 1].black = false; - } - window.recordState(); -}); -$("#out_text_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#out_text_field_name").val(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); -}) -$("#qrcode_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#qrcode_field_name").val(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); -}) -$("#qrcode_color").bind('input propertychange', function () { - let item = canvas.getActiveObject(); - let qr = jrQrcode.getQrBase64($("#qrcode_val").val(), { padding: 0, foreground: $(this).val() }); - let idx = getIndex(item); - objs[idx - 1].color = $(this).val(); - item.setSrc(qr, function (img) { - canvas.renderAll(); - window.recordState(); - }); -}); -$("#qrcode_val").bind('change', function () { - let val = $(this).val() ? $(this).val() : 'https://www.cardsoon.com' - let item = canvas.getActiveObject(); - let qr = jrQrcode.getQrBase64(val, { padding: 0, foreground: $("#qrcode_color").val() }); - let idx = getIndex(item); - objs[idx - 1].val = val; - item.setSrc(qr, function (img) { - canvas.renderAll(); - window.recordState(); - }); -}); -$("#barcode_color").bind('input propertychange', function () { - let item = canvas.getActiveObject(); - let idx = getIndex(item); - objs[idx - 1].color = $(this).val(); - JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); - let barcode = document.getElementById('barcode'); - let bar = barcode.toDataURL("image/png"); - item.setSrc(bar, function (img) { - canvas.renderAll(); - window.recordState(); - }); -}); -$("#barcode_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#barcode_field_name").val(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); -}) -$("#text_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#text_color").val()); - canvas.renderAll(); - window.recordState(); -}) -$("#text_back_color").bind('input propertychange', function () { - canvas.getActiveObject().set("textBackgroundColor", $("#text_back_color").val()); - canvas.renderAll(); - window.recordState(); -}) -$("#text_size").bind('input propertychange', function () { - let val = 1 - if (parseFloat($("#text_size").val())) { - val = parseFloat($("#text_size").val()) - if (val < 1) { - val = 1 - } else if (val > dpi) { - val = dpi - } else if (val % 0.5 !== 0) { - val = Math.round(val * 2) / 2 - } - - } - $("#text_size").val(val) - canvas.getActiveObject().set("fontSize", val * dpi / 72); - $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0)); - $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0)); - canvas.renderAll(); - window.recordState(); -}) -$("#circle_text_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#circle_text_color").val()); - canvas.renderAll(); - window.recordState(); -}) -$("#circle_text_back_color").bind('input propertychange', function () { - canvas.getActiveObject().set("textBackgroundColor", $("#circle_text_back_color").val()); - - canvas.renderAll(); - window.recordState(); -}) -$("#circle_text_text").bind('input propertychange', function () { - let val = $("#circle_text_text").val().trim() - canvas.getActiveObject().set("text", ` ${val} `); - canvas.renderAll(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); -}) -$("#out_text_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#out_text_color").val()); - canvas.renderAll(); - window.recordState(); -}) -$("#out_text_back_color").bind('input propertychange', function () { - canvas.getActiveObject().set("textBackgroundColor", $("#out_text_back_color").val()); - - canvas.renderAll(); - window.recordState(); -}) -$("#out_text_size").bind('input propertychange', function () { - let val = 1 - if (parseFloat($("#out_text_size").val())) { - val = parseFloat($("#out_text_size").val()) - if (val < 1) { - val = 1 - } else if (val > dpi) { - val = dpi - } else if (val % 0.5 !== 0) { - val = Math.round(val * 2) / 2 - } - - } - $("#out_text_size").val(val) - canvas.getActiveObject().set("fontSize", val * dpi / 72); - $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0)); - $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0)); - canvas.renderAll(); - window.recordState(); -}) -// 监听合成文本输入框 (占位符) -$("#out_text_text").on('input propertychange', function () { - let val = $(this).val(); - - // 【核心修改】如果值为空,强制给 2 个空格 - if (val === "") { - val = " "; - } - - let obj = canvas.getActiveObject(); - if (obj) { - obj.set("text", val); - obj.setCoords(); - canvas.requestRenderAll(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); - } -}); -$("#rect_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#rect_color").val()); - - canvas.renderAll(); - window.recordState(); -}) -$("#rect_stroke").bind('input propertychange', function () { - canvas.getActiveObject().set("stroke", $("#rect_stroke").val()); - - canvas.renderAll(); - window.recordState(); -}) -$("#rect_stroke_width").bind('input propertychange', function () { - if ($("#rect_stroke_width").val() == "") { - $("#rect_stroke_width").val("0") - } else { - $("#rect_stroke_width").val(parseInt($("#rect_stroke_width").val())) - } - canvas.getActiveObject().set("strokeWidth", parseInt($("#rect_stroke_width").val())); - canvas.renderAll(); - window.recordState(); -}) -$("#rect_radius").bind('input propertychange', function () { - if ($("#rect_radius").val() == "") { - $("#rect_radius").val("0") - } else { - $("#rect_radius").val(parseInt($("#rect_radius").val())) - } - canvas.getActiveObject().set("rx", parseInt($("#rect_radius").val())); - canvas.getActiveObject().set("ry", parseInt($("#rect_radius").val())); - canvas.renderAll(); - window.recordState(); -}) -$("#circle_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#circle_color").val()); - - canvas.renderAll(); - window.recordState(); -}) -$("#circle_stroke").bind('input propertychange', function () { - canvas.getActiveObject().set("stroke", $("#circle_stroke").val()); - - canvas.renderAll(); - window.recordState(); -}) -$("#circle_stroke_width").bind('input propertychange', function () { - if ($("#circle_stroke_width").val() == "") { - $("#circle_stroke_width").val("0") - } else { - $(this).val(parseInt($(this).val())) - } - canvas.getActiveObject().set("strokeWidth", parseInt($("#circle_stroke_width").val())); - canvas.renderAll(); - window.recordState(); -}) -$("#counter_start").bind('input propertychange', function () { - canvas.getActiveObject().set("text", $("#counter_start").val()); - let item = canvas.getActiveObject(); - let idx = getIndex(item); - objs[idx - 1].start = $(this).val(); - canvas.renderAll(); - window.recordState(); -}) -$("#counter_add").bind('input propertychange', function () { - let item = canvas.getActiveObject(); - let idx = getIndex(item); - objs[idx - 1].add = $(this).val(); - canvas.renderAll(); - window.recordState(); -}) -$("#counter_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#counter_color").val()); - canvas.renderAll(); - window.recordState(); -}) -$("#count_size").bind('input propertychange', function () { - let val = 1 - if (parseFloat($("#count_size").val())) { - val = parseFloat($("#count_size").val()) - if (val < 1) { - val = 1 - } else if (val > dpi) { - val = dpi - } else if (val % 0.5 !== 0) { - val = Math.round(val * 2) / 2 - } - - } - $("#count_size").val(val) - canvas.getActiveObject().set("fontSize", val * dpi / 72); - $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0)); - $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0)); - canvas.renderAll(); - window.recordState(); -}) -$("#line_color").bind('input propertychange', function () { - canvas.getActiveObject().set("stroke", $("#line_color").val()); - canvas.renderAll(); - window.recordState(); -}) -$("#line_dist").bind('input propertychange', function () { - if ($("#line_dist").val() == "") { - $("#line_dist").val(0) - } - canvas.getActiveObject().set("strokeDashArray", [parseInt($("#line_dist").val()), parseInt($("#line_dist").val())]) - canvas.renderAll(); - window.recordState(); -}) -// 监听普通文本输入 (占位符) -$("#text_text").on('input propertychange', function () { - // 1. 获取输入框的值,不要用 trim(),否则无法输入空格 - let val = $(this).val(); - - // 2. 核心修改:只有当删光时,才给 4 个空格作为占位符 - if (val === "") { - val = " "; // 4个空格,比原来的2个更宽,更好点 - } - // 3. 更新对象 - canvas.getActiveObject().set("text", val); - canvas.requestRenderAll(); // 使用 requestRenderAll 性能更好 - if (typeof window.updateList === 'function') { - window.updateList(); - } - window.recordState(); -}); -$("#barcode_val").bind('input propertychange', function () { - let item = canvas.getActiveObject(); - let idx = getIndex(item); - objs[idx - 1].val = $(this).val(); - JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); - - let barcode = document.getElementById('barcode'); - let bar = barcode.toDataURL("image/png"); - item.setSrc(bar, function (img) { - canvas.renderAll(); - window.recordState(); - }); -}) -$("#barcode_show").click(function () { - let item = canvas.getActiveObject(); - let idx = getIndex(canvas.getActiveObject()); - let val = $("#barcode_size").val() - if ($(this).prop("checked")) { - objs[idx - 1].show = true; - val = 0 - } else { - objs[idx - 1].show = false; - } - JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: val * dpi / 72, font: objs[idx - 1].font }); - let barcode = document.getElementById('barcode'); - let bar = barcode.toDataURL("image/png"); - item.setSrc(bar, function (img) { - canvas.renderAll(); - window.recordState(); - }); -}); -$("#barcode_size").bind('input propertychange', function () { - let item = canvas.getActiveObject(); - let idx = getIndex(item); - let val = 1 - if (parseFloat($(this).val())) { - val = parseFloat($(this).val()) - if (val < 1) { - val = 1 - } else if (val > dpi) { - val = dpi - } else if (val % 0.5 !== 0) { - val = Math.round(val * 2) / 2 - } - - } - $("#barcode_size").val(val) - objs[idx - 1].fontSize = val * dpi / 72; - JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); - - let barcode = document.getElementById('barcode'); - let bar = barcode.toDataURL("image/png"); - item.setSrc(bar, function (img) { - canvas.renderAll(); - window.recordState(); - }); -}) -$('#count_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - window.recordState(); -}); -$('#text_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - window.recordState(); -}); - -$('#circle_text_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - window.recordState(); -}); - -$('#language_select').on('change', function () {//语言选择 - langua_ge($(this).find('option:selected').val()); - s_lan = $(this).find('option:selected').val(); - localStorage.setItem("lang", s_lan); -}); -$('#barcode_font_family').on('change', function () { - let item = canvas.getActiveObject(); - let idx = getIndex(item); - objs[idx - 1].font = $(this).find('option:selected').text(); - JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); - - let barcode = document.getElementById('barcode'); - let bar = barcode.toDataURL("image/png"); - item.setSrc(bar, function (img) { - canvas.renderAll(); - window.recordState(); - }); - //window.recordState(); -}); -$('#out_text_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - window.recordState(); -}); -$(".obj_list").on("click", "div", function () { - let idx = objs.length - 1 - $(this).index(); - if (typeof window.selectObj === 'function') { - window.selectObj(idx); - } -}); -$("#exceed").click(function () { - let idx = getIndex(canvas.getActiveObject()); - if ($(this).prop("checked")) { - objs[idx - 1].exceed = true; - } else { - objs[idx - 1].exceed = false; - } - window.recordState(); -}); -$("#autoWrap").click(function () { - let idx = getIndex(canvas.getActiveObject()); - if ($(this).prop("checked")) { - - objs[idx - 1].autoWrap = true; - } else { - objs[idx - 1].autoWrap = false; - } - window.recordState(); -}); -$("#fixSize").click(function () { - let idx = getIndex(canvas.getActiveObject()); - if ($(this).prop("checked")) { - - objs[idx - 1].fixSize = true; - } else { - objs[idx - 1].fixSize = false; - } - window.recordState(); -}); -$("#circle_text_center").click(function () { - let idx = getIndex(canvas.getActiveObject()); - if ($(this).prop("checked")) { - objs[idx - 1].circleCenter = 1; - } else { - objs[idx - 1].circleCenter = 0; - } - window.recordState(); -}); - -// =========================================================== -$("#text_italics").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选 - canvas.getActiveObject().set("fontStyle", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("fontStyle", "italic") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#text_bold").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选,恢复正常 - canvas.getActiveObject().set("fontWeight", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("fontWeight", "bold") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#text_underline").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选 - canvas.getActiveObject().set("underline", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("underline", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#text_linethrough").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选 - canvas.getActiveObject().set("linethrough", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("linethrough", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); - -$("#circle_text_italics").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选 - canvas.getActiveObject().set("fontStyle", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("fontStyle", "italic") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_text_bold").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选,恢复正常 - canvas.getActiveObject().set("fontWeight", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("fontWeight", "bold") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); - -$('#out_left_alignment').click(function () { - $('#out_left_alignment').parent().removeClass('tool1') - $('#out_right_alignment').parent().removeClass('tool1') - $('#out_center_alignment').parent().removeClass('tool1') - setTimeout(() => { - $('#out_left_alignment').parent().addClass('tool1') - }); - canvas.getActiveObject().set('textAlign', 'left') - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].align = 'left' - window.recordState(); - canvas.renderAll() -}) -$('#out_right_alignment').click(function () { - $('#out_left_alignment').parent().removeClass('tool1') - $('#out_right_alignment').parent().removeClass('tool1') - $('#out_center_alignment').parent().removeClass('tool1') - setTimeout(() => { - $('#out_right_alignment').parent().addClass('tool1') - }); - canvas.getActiveObject().set('textAlign', 'right') - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].align = 'right' - window.recordState(); - canvas.renderAll() -}) -$('#out_center_alignment').click(function () { - $('#out_left_alignment').parent().removeClass('tool1') - $('#out_right_alignment').parent().removeClass('tool1') - $('#out_center_alignment').parent().removeClass('tool1') - setTimeout(() => { - $('#out_center_alignment').parent().addClass('tool1') - }); - canvas.getActiveObject().set('textAlign', 'center') - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].align = 'center' - window.recordState(); - canvas.renderAll() -}) - -$("#out_text_italics").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选 - canvas.getActiveObject().set("fontStyle", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("fontStyle", "italic") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_bold").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选,恢复正常 - canvas.getActiveObject().set("fontWeight", "normal") - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("fontWeight", "bold") - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_underline").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选 - canvas.getActiveObject().set("underline", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("underline", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_linethrough").click(function () { - if ($(this).hasClass("ui-radio-acitve")) { - //已选 - canvas.getActiveObject().set("linethrough", false) - $(this).removeClass("ui-radio-acitve") - } else { - //未选 - canvas.getActiveObject().set("linethrough", true) - $(this).addClass("ui-radio-acitve") - } - window.recordState(); - canvas.renderAll(); - window.recordState(); -}); - -// =========================================================== -$("#delete").click(function () { - let actObjs = canvas.getActiveObjects(); - let allObjs = canvas.getObjects(); - let flag = 0; - for (let item of actObjs) { - if (item != allObjs[0]) { - let i = getIndex(item);//0是背景,所以从1开始,但objs不包含背景图片,故要-1 - objs.splice(i - 1, 1); - canvas.remove(item); - flag = 1; - - } - } - if (typeof window.updateList === 'function') { - window.updateList(); - } - canvas.discardActiveObject(); - if (flag == 1) { - window.recordState(); - canvas.renderAll(); - } -}); -$("#up_obj").click(function () {//上移,放到前面 数组中在后面 - let idx = getIndex(canvas.getActiveObject()); - if (idx + 1 != canvas.getObjects().length) { - canvas.bringForward(canvas.getActiveObject()); - canvas.renderAll(); - let temp = objs[idx - 1]; - objs[idx - 1] = objs[idx]; - objs[idx] = temp; - //console.log(objs); - - window.recordState(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - if (typeof window.selectObj === 'function') { - window.selectObj(idx); - } - } -}); -$("#down_obj").click(function () {//下移,放到后面 数组中在前面 - let idx = getIndex(canvas.getActiveObject()); - if (idx != 1) { - canvas.sendBackwards(canvas.getActiveObject()); - canvas.renderAll(); - //[objs[idx-2],objs[idx-1]] = [objs[idx-1],objs[idx-2]]; - - let temp = objs[idx - 1]; - objs[idx - 1] = objs[idx - 2]; - objs[idx - 2] = temp; - window.recordState(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - if (typeof window.selectObj === 'function') { - window.selectObj(idx - 2); - } - } -}); -$("#set_bg").click(function () {//设置为背景 - let obj = canvas.getActiveObject(); - console.log(obj, obj.get("selectable")) - let idx = getIndex(obj); - const scaleX = 2787 / obj.width - const scaleY = 2787 / obj.height - // 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致 - const scaledWidth = obj.width * scaleX; - const scaledHeight = obj.height * scaleY; - obj.set({ - scaleX: scaleX, - scaleY: scaleY, - left: ($('#canvas1').width() - scaledWidth) / 2, - top: ($('#canvas1').height() - scaledHeight) / 2, - }); - $('#text_w').val(2787) - $('#text_h').val(2787) - $('#text_x').val(0) - $('#text_y').val(0) - // 设为背景时,锁定所有编辑操作,并设置为不可选中 - obj.set({ - lockMovementX: true, - lockMovementY: true, - lockRotation: true, - lockScalingX: true, - lockScalingY: true, - lockSkewingX: true, - lockSkewingY: true, - selectable: false, - evented: false - }); - $("#lock_img").attr("src", "public/images/lock20.png") - canvas.sendToBack(obj); - canvas.bringForward(obj); - canvas.renderAll(); - let objItem = objs.splice(idx - 1, 1)[0] - objs.unshift(objItem) - - // 确保背景图(索引0)的锁定属性被正确设置 - setTimeout(() => { - let bgObj = canvas.getObjects()[0]; - if (bgObj) { - bgObj.set({ - lockMovementX: true, - lockMovementY: true, - lockRotation: true, - lockScalingX: true, - lockScalingY: true, - lockSkewingX: true, - lockSkewingY: true, - selectable: false, - evented: false - }); - canvas.renderAll(); - } - }, 100); - - window.recordState(); - if (typeof window.updateList === 'function') { - window.updateList(); - } - if (typeof window.selectObj === 'function') { - window.selectObj(0); - } -}); -// 重复的lock点击事件已移除,使用第一处的绑定 -$("#text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#text_back_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#circle_text_back_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#out_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#out_text_back_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#rect_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#rect_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#rect_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#rect_stroke").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#circle_color").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); -$("#circle_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#circle_stroke").val("#ffffff"); - canvas.renderAll(); - window.recordState(); -}); - -// =========================================================== -$("#about").click(async function () { - // 1. 先异步获取版本号 - let version = "0.0.0"; // 默认值,防止获取失败 - try { - if (window.sysAPI && window.sysAPI.getAppVersion) { - const v = await window.sysAPI.getAppVersion(); - version = "v" + v; // 拼接一个 v,变成 v2.3.017 - } - } catch (e) { - console.error("获取版本号失败", e); - } - - // 2. 获取成功后再弹出窗口 - layer.open({ - type: 1 - , title: language_str("about") - , area: '450px;' - , id: 'LAY_layuipro' - , moveType: 1 - , content: '
' + - '
' + - '
Soon Design
' + - // 【修改点】这里使用了刚才获取到的 version 变量 - '
' + language_str("vers") + ' ' + version + '
' + - '
' + language_str("copyright") + '
' + - '
' - }); -}) -$("#help").click(() => { - ipcRenderer.send('open-help-file'); -}); - -// =========================================================== -$('#display').on('click', function () { - // 类型改变 - fabric.Image.fromURL('./public/images/front_bg' + bg_version + '_1.png', function (i1) { - i1.left = background_image.left; - i1.top = background_image.top; - let img1 = i1; - - fabric.Image.fromURL('./public/images/back_bg_1.png', function (i2) { - i2.left = background_image.left; - i2.top = background_image.top; - let img2 = i2; - fabric.Image.fromURL('./public/images/op_1.png', function (i3) { - i3.left = background_image.left; - i3.top = background_image.top; - let img3 = i3; - if (typeof window.display_func === 'function') { - window.display_func(img1, img2, img3); - } - }) - }) - }) -}); -$("#output").click(function () { - // 另存为:传递 saveAs 函数作为第二个参数 - if (typeof window.output === 'function') { - window.output(null, saveAs); // 调用output函数,使用saveAs进行另存为 - } -}); +// 移至上层和移至下层的事件处理在下方(第 2179 行),避免重复绑定 + +var _keyctrl = false, + _keyc = false, + _textEdit = false, + _inputEdit = false; +$('input').focus(function () { + _inputEdit = true; +}); +$('input').blur(function () { + _inputEdit = false; +}); +$('textarea').focus(function () { + _inputEdit = true; +}); +$('textarea').blur(function () { + _inputEdit = false; +}); +$("body").keyup(function (event) { + // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�? + if (event.keyCode == 17 || event.keyCode == 91 || event.keyCode == 93) { // Ctrl 键或 Meta 键(Mac Cmd)释�? + _keyctrl = false; + }; + if (event.keyCode == 67) { + _keyc = false; + }; +}) +$("body").keydown(function (event) { + // 统一的快捷键处理(兼�?Windows/Linux: Ctrl, Mac: Cmd/Meta�? + const isModifierKey = event.ctrlKey || event.metaKey; // 兼容三端 + + // 快捷键处理(在输入框或文本区域中时不触发,除了删除相关的�? + if (!_inputEdit && !_textEdit) { + // CTRL/CMD+N - 新建 + if (isModifierKey && event.keyCode == 78) { + event.preventDefault(); + $("#new").click(); + return; + } + // CTRL/CMD+O - 打开 + if (isModifierKey && event.keyCode == 79) { + event.preventDefault(); + $("#open").click(); + return; + } + // CTRL/CMD+S - 保存 + if (isModifierKey && !event.shiftKey && event.keyCode == 83) { + event.preventDefault(); + $("#save").click(); + return; + } + // CTRL/CMD+SHIFT+S - 保存副本 + if (isModifierKey && event.shiftKey && event.keyCode == 83) { + event.preventDefault(); + if (typeof window.output === 'function') { + window.output(null, saveAs); + } + return; + } + // CTRL/CMD+Z - 还原 + if (isModifierKey && !event.shiftKey && event.keyCode == 90) { + event.preventDefault(); + $("#previous").click(); + return; + } + // CTRL/CMD+Y - 重做 + if (isModifierKey && !event.shiftKey && event.keyCode == 89) { + event.preventDefault(); + $("#next").click(); + return; + } + // CTRL/CMD+C - 复制 + if (isModifierKey && event.keyCode == 67 && event.target.nodeName == 'BODY') { + event.preventDefault(); + window.copySelection(); + return; + } + // CTRL/CMD+V - 粘贴 + if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') { + event.preventDefault(); + window.pasteFromClipboard(); + return; + } + + // CTRL/CMD + SHIFT + DEL (Windows) �?CMD + SHIFT + Backspace (Mac) - 清空 + if (isModifierKey && event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) { + event.preventDefault(); + $("#clean").click(); + return; + } + + // CTRL/CMD + DEL (Windows) �?CMD + Backspace (Mac) - 删除 + if (isModifierKey && !event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) { + event.preventDefault(); + $("#delete").click(); + return; + } + + } + // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�? + if (event.keyCode == 17 || event.metaKey) { // Ctrl 键或 Meta 键(Mac Cmd�? + _keyctrl = true; + if (_keyc && _textEdit) { + //同时按下且在编辑状�? + setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1) + //clipboard.writeText((clipboard.readText()+' ')) + } + } + if (event.keyCode == 67) { + _keyc = true; + if (_keyctrl & _textEdit) { + //同时按下且在编辑状�? + setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1) + //clipboard.writeText((clipboard.readText()+' ')) + } + } + if (event.keyCode == 37) { + //left + let v = -1; + if (_keyctrl || event.ctrlKey || event.metaKey) { + v = -5; + } + const currentCanvas = window.canvas || canvas; + if (currentCanvas && currentCanvas.getActiveObject()) { + let x = currentCanvas.getActiveObject().get('left'); + x += v; + currentCanvas.getActiveObject().set('left', x); + currentCanvas.renderAll(); + if (typeof window.recordState === 'function') { + window.recordState(); + } else if (typeof recordState === 'function') { + recordState(); + } + if (typeof updateControls === 'function') { + updateControls(); + } + } + } + if (event.keyCode == 38) { + //up + let v = -1; + if (_keyctrl || event.ctrlKey || event.metaKey) { + v = -5; + } + const currentCanvas = window.canvas || canvas; + if (currentCanvas && currentCanvas.getActiveObject()) { + let y = currentCanvas.getActiveObject().get('top'); + y += v; + currentCanvas.getActiveObject().set('top', y); + currentCanvas.renderAll(); + if (typeof window.recordState === 'function') { + window.recordState(); + } else if (typeof recordState === 'function') { + recordState(); + } + if (typeof updateControls === 'function') { + updateControls(); + } + } + } + if (event.keyCode == 39) { + //right + let v = 1; + if (_keyctrl || event.ctrlKey || event.metaKey) { + v = 5; + } + const currentCanvas = window.canvas || canvas; + if (currentCanvas && currentCanvas.getActiveObject()) { + let x = currentCanvas.getActiveObject().get('left'); + x += v; + currentCanvas.getActiveObject().set('left', x); + currentCanvas.renderAll(); + if (typeof window.recordState === 'function') { + window.recordState(); + } else if (typeof recordState === 'function') { + recordState(); + } + if (typeof updateControls === 'function') { + updateControls(); + } + } + } + if (event.keyCode == 40) { + //down + let v = 1; + if (_keyctrl || event.ctrlKey || event.metaKey) { + v = 5; + } + const currentCanvas = window.canvas || canvas; + if (currentCanvas && currentCanvas.getActiveObject()) { + let y = currentCanvas.getActiveObject().get('top'); + y += v; + currentCanvas.getActiveObject().set('top', y); + currentCanvas.renderAll(); + if (typeof window.recordState === 'function') { + window.recordState(); + } else if (typeof recordState === 'function') { + recordState(); + } + if (typeof updateControls === 'function') { + updateControls(); + } + } + } + // 普通删除键(DEL键,没有按CTRL/CMD�? + if (event.keyCode == 46 && !isModifierKey && !_inputEdit && !_textEdit) { + // 使用 window.canvas 作为后备,确保在 eval() 加载 .jsc 时也能访问 + const currentCanvas = window.canvas || canvas; + const currentObjs = window.objs || objs; + if (!currentCanvas) { + return; + } + let actObjs = currentCanvas.getActiveObjects(); + let allObjs = currentCanvas.getObjects(); + let flag = 0; + for (let item of actObjs) { + if (item != allObjs[0]) { + let i = getIndex(item, currentCanvas);//0是背景,所以从1开始,但objs不包含背景图片,故要-1 + currentObjs.splice(i - 1, 1); + currentCanvas.remove(item); + flag = 1; + + } + } + if (typeof window.updateList === 'function') { + window.updateList(); + } + currentCanvas.discardActiveObject(); + if (flag == 1) { + if (typeof window.recordState === 'function') { + window.recordState(); + } else if (typeof recordState === 'function') { + recordState(); + } + currentCanvas.renderAll(); + if (typeof window.handleObjectSelected === 'function') { + window.handleObjectSelected(); + } + } + } +}); +// pre_add_image 已在 design1.js 中定义为全局变量 +$("#addPic").click(function () { + OpenDialog(); + function OpenDialog() { + dialog.showOpenDialog({ + title: language_str("selectPic"),//请选择图片 + buttonLabel: language_str("comf"),//"确认" + filters: [ + { name: 'Image File Type', extensions: ['png', 'jpg', 'jpeg'] }, + ] + }).then(result => { + if (result.canceled) return; + //console.log(result.filePaths) + fabric.Image.fromURL(result.filePaths[0], function (image) { + //image.left = pointer.x; + image.setSrc(image.toDataURL(), function (image) { + pre_add_image = image; + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 1; + }); + //canvas.add(image); + }); + }).catch(err => { + }) + } +}); +$("#addOutPic").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 2; +}); +$("#addText").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 3; +}); + +$("#addCircleText").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 11; +}); +$("#addOutText").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 4; +}); +$("#addRect").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 5; +}); +$("#addCircle").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 6; +}); +$("#addLine").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 7; +}); +$("#addQrCode").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 8; +}); +$("#addBarCode").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addCounter").css("background-color", ""); + addState = 9; +}); +$("#addCounter").click(function () { + background_image.hoverCursor = "crosshair"; + $(this).css("background-color", "#646E76"); + + $("#addPic").css("background-color", ""); + $("#addOutPic").css("background-color", ""); + $("#addText").css("background-color", ""); + $("#addCircleText").css("background-color", ""); + $("#addOutText").css("background-color", ""); + $("#addRect").css("background-color", ""); + $("#addCircle").css("background-color", ""); + $("#addLine").css("background-color", ""); + $("#addQrCode").css("background-color", ""); + $("#addBarCode").css("background-color", ""); + addState = 10; +}); +$("#version_change").click(function () { + if (bg_version == 1) { + bg_version = 2; + } else { + bg_version = 1; + } + // 类型改变 + $("#source_front").attr("src", "./public/images/front_bg" + bg_version + "_1.png"); + canvas.renderAll(); + +}); +$("#front_side").click(function () { + $(this).addClass("ui-button-active"); + $("#back_side").removeClass("ui-button-active"); + $(".canvas-container:eq(0)").show(); + $(".canvas-container:eq(1)").hide(); + canvas = canvas1; + objs = objs1; + background_image = background_image1; + window.canvas = canvas; + window.objs = objs; + window.background_image = background_image; + next_objs = next_objs1; + pre_objs = pre_objs1; + next_json = next_json1; + pre_json = pre_json1; + recordObjs = recordObjs1; + recordJson = recordJson1; + step = step1; + if (typeof window.updateList === 'function') { + window.updateList(); + } + + $("#line_control").hide(); + $("#base_control").hide(); + $("#pic_control").hide(); + $("#out_pic_control").hide(); + $("#text_control").hide(); + $("#circle_text_control").hide(); + $("#out_text_control").hide(); + $("#rect_control").hide(); + $("#circle_control").hide(); + $("#counter_control").hide(); + $("#qrcode_Controll").hide(); + $("#barcode_controll").hide(); + $("#component_type").text(language_str("bg"));//背景 +}); +$("#back_side").click(function () { + $(this).addClass("ui-button-active"); + $("#front_side").removeClass("ui-button-active"); + $(".canvas-container:eq(0)").hide(); + $(".canvas-container:eq(1)").show(); + canvas = canvas2; + objs = objs2; + background_image = background_image2; + window.canvas = canvas; + window.objs = objs; + window.background_image = background_image; + next_objs = next_objs2; + pre_objs = pre_objs2; + next_json = next_json2; + pre_json = pre_json2; + recordObjs = recordObjs2; + recordJson = recordJson2; + step = step2; + if (typeof window.updateList === 'function') { + window.updateList(); + } + $("#line_control").hide(); + $("#base_control").hide(); + $("#pic_control").hide(); + $("#out_pic_control").hide(); + $("#text_control").hide(); + $("#circle_text_control").hide(); + $("#out_text_control").hide(); + $("#rect_control").hide(); + $("#circle_control").hide(); + $("#counter_control").hide(); + $("#qrcode_Controll").hide(); + $("#barcode_controll").hide(); + $("#component_type").text(language_str("bg"));//"背景" +}); +$("#top_alignment").click(function () { + let _objs = canvas.getActiveObjects(); + if (_objs.length == 1) { + //只选中了一�? + let obj = _objs[0]; + obj.setCoords(); + let coords = obj.getCoords(true); + let objMinY = getCoordsMinY(coords); + let bgMinY = getCoordsMinY(background_image.getCoords(true)); + let deltaY = bgMinY - objMinY; + obj.set("top", obj.get("top") + deltaY); + obj.setCoords(); + canvas.renderAll(); + window.recordState(); + return; + } + // 多个对象对齐:找到所有对象边界框的最小Y值 + let minTop = Infinity; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinY = getCoordsMinY(coords); + if (itemMinY < minTop) { + minTop = itemMinY; + } + } + // 将所有对象对齐到最小Y值 + groupItems = []; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinY = getCoordsMinY(coords); + let deltaY = minTop - itemMinY; + item.set("top", item.get("top") + deltaY); + item.setCoords(); + groupItems.push(item); + } + canvas.discardActiveObject(); + let sel = new fabric.ActiveSelection(groupItems, { + canvas: canvas, + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + canvas.renderAll(); + +}); +$("#bottom_alignment").click(function () { + let _objs = canvas.getActiveObjects(); + if (_objs.length == 1) { + //只选中了一�? + let idx = getIndex(_objs[0]); + let type = objs[idx - 1].type; + let other = 0;//strokeWidth + if (type == 5 || type == 6 || type == 7) { + other = _objs[0].get("strokeWidth") + } + let obj = _objs[0]; + obj.setCoords(); + let coords = obj.getCoords(true); + let objMaxY = getCoordsMaxY(coords); + let bgMaxY = getCoordsMaxY(background_image.getCoords(true)); + let deltaY = bgMaxY - objMaxY; + obj.set("top", obj.get("top") + deltaY); + obj.setCoords(); + canvas.renderAll(); + window.recordState(); + return; + } + // 多个对象对齐:找到所有对象边界框的最大Y值 + let maxBottom = -Infinity; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMaxY = getCoordsMaxY(coords); + if (itemMaxY > maxBottom) { + maxBottom = itemMaxY; + } + } + // 将所有对象对齐到最大Y值 + groupItems = []; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMaxY = getCoordsMaxY(coords); + let deltaY = maxBottom - itemMaxY; + item.set("top", item.get("top") + deltaY); + item.setCoords(); + groupItems.push(item); + } + canvas.discardActiveObject(); + let sel = new fabric.ActiveSelection(groupItems, { + canvas: canvas, + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + canvas.renderAll(); + +}); +$("#center_y_alignment").click(function () { + let _objs = canvas.getActiveObjects(); + if (_objs.length == 1) { + //只选中了一�? + let idx = getIndex(_objs[0]); + let type = objs[idx - 1].type; + let other = 0;//strokeWidth + if (type == 5 || type == 6 || type == 7) { + other = _objs[0].get("strokeWidth") + } + let obj = _objs[0]; + obj.setCoords(); + let coords = obj.getCoords(true); + let objMinY = getCoordsMinY(coords); + let objMaxY = getCoordsMaxY(coords); + let objCenterY = (objMinY + objMaxY) / 2; + let bgCoords = background_image.getCoords(true); + let bgMinY = getCoordsMinY(bgCoords); + let bgMaxY = getCoordsMaxY(bgCoords); + let bgCenterY = (bgMinY + bgMaxY) / 2; + let deltaY = bgCenterY - objCenterY; + obj.set("top", obj.get("top") + deltaY); + obj.setCoords(); + canvas.renderAll(); + window.recordState(); + return; + } + // 多个对象对齐:找到所有对象边界框的中心Y值 + let minTop = Infinity; + let maxBottom = -Infinity; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinY = getCoordsMinY(coords); + let itemMaxY = getCoordsMaxY(coords); + if (itemMinY < minTop) minTop = itemMinY; + if (itemMaxY > maxBottom) maxBottom = itemMaxY; + } + let groupCenterY = (minTop + maxBottom) / 2; + // 将所有对象对齐到中心Y值 + groupItems = []; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinY = getCoordsMinY(coords); + let itemMaxY = getCoordsMaxY(coords); + let itemCenterY = (itemMinY + itemMaxY) / 2; + let deltaY = groupCenterY - itemCenterY; + item.set("top", item.get("top") + deltaY); + item.setCoords(); + groupItems.push(item); + } + canvas.discardActiveObject(); + let sel = new fabric.ActiveSelection(groupItems, { + canvas: canvas, + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + canvas.renderAll(); + window.recordState(); +}); +$("#left_alignment").click(function () { + let _objs = canvas.getActiveObjects(); + if (_objs.length == 1) { + //只选中了一�? + let obj = _objs[0]; + obj.setCoords(); + let coords = obj.getCoords(true); + let objMinX = getCoordsMinX(coords); + let bgMinX = getCoordsMinX(background_image.getCoords(true)); + let deltaX = bgMinX - objMinX; + obj.set("left", obj.get("left") + deltaX); + obj.setCoords(); + canvas.renderAll(); + window.recordState(); + return; + } + // 多个对象对齐:找到所有对象边界框的最小X值 + let minLeft = Infinity; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinX = getCoordsMinX(coords); + if (itemMinX < minLeft) { + minLeft = itemMinX; + } + } + // 将所有对象对齐到最小X值 + groupItems = []; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinX = getCoordsMinX(coords); + let deltaX = minLeft - itemMinX; + item.set("left", item.get("left") + deltaX); + item.setCoords(); + groupItems.push(item); + } + canvas.discardActiveObject(); + let sel = new fabric.ActiveSelection(groupItems, { + canvas: canvas, + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + canvas.renderAll(); + window.recordState(); +}); +$("#right_alignment").click(function () { + let _objs = canvas.getActiveObjects(); + if (_objs.length == 1) { + //只选中了一�? + let idx = getIndex(_objs[0]); + let type = objs[idx - 1].type; + let other = 0;//strokeWidth + if (type == 5 || type == 6 || type == 7) { + other = item.get("strokeWidth") + } + let obj = _objs[0]; + obj.setCoords(); + let coords = obj.getCoords(true); + let objMaxX = getCoordsMaxX(coords); + let bgMaxX = getCoordsMaxX(background_image.getCoords(true)); + let deltaX = bgMaxX - objMaxX; + obj.set("left", obj.get("left") + deltaX); + obj.setCoords(); + canvas.renderAll(); + window.recordState(); + return; + } + // 多个对象对齐:找到所有对象边界框的最大X值 + let maxRight = -Infinity; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMaxX = getCoordsMaxX(coords); + if (itemMaxX > maxRight) { + maxRight = itemMaxX; + } + } + // 将所有对象对齐到最大X值 + let groupItems = []; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMaxX = getCoordsMaxX(coords); + let deltaX = maxRight - itemMaxX; + item.set("left", item.get("left") + deltaX); + item.setCoords(); + groupItems.push(item); + } + //BUG1 + canvas.discardActiveObject(); + let sel = new fabric.ActiveSelection(groupItems, { + canvas: canvas, + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + canvas.renderAll(); + window.recordState(); +}); +$("#center_x_alignment").click(function () { + let _objs = canvas.getActiveObjects(); + if (_objs.length == 1) { + //只选中了一�? + let idx = getIndex(_objs[0]); + let type = objs[idx - 1].type; + let other = 0;//strokeWidth + if (type == 5 || type == 6 || type == 7) { + other = _objs[0].get("strokeWidth") + } + let obj = _objs[0]; + obj.setCoords(); + let coords = obj.getCoords(true); + let objMinX = getCoordsMinX(coords); + let objMaxX = getCoordsMaxX(coords); + let objCenterX = (objMinX + objMaxX) / 2; + let bgCoords = background_image.getCoords(true); + let bgMinX = getCoordsMinX(bgCoords); + let bgMaxX = getCoordsMaxX(bgCoords); + let bgCenterX = (bgMinX + bgMaxX) / 2; + let deltaX = bgCenterX - objCenterX; + obj.set("left", obj.get("left") + deltaX); + obj.setCoords(); + canvas.renderAll(); + window.recordState(); + return; + } + // 多个对象对齐:找到所有对象边界框的中心X值 + let minLeft = Infinity; + let maxRight = -Infinity; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinX = getCoordsMinX(coords); + let itemMaxX = getCoordsMaxX(coords); + if (itemMinX < minLeft) minLeft = itemMinX; + if (itemMaxX > maxRight) maxRight = itemMaxX; + } + let groupCenterX = (minLeft + maxRight) / 2; + // 将所有对象对齐到中心X值 + groupItems = []; + for (let item of _objs) { + item.setCoords(); + let coords = item.getCoords(true); + let itemMinX = getCoordsMinX(coords); + let itemMaxX = getCoordsMaxX(coords); + let itemCenterX = (itemMinX + itemMaxX) / 2; + let deltaX = groupCenterX - itemCenterX; + item.set("left", item.get("left") + deltaX); + item.setCoords(); + groupItems.push(item); + } + canvas.discardActiveObject(); + let sel = new fabric.ActiveSelection(groupItems, { + canvas: canvas, + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + canvas.renderAll(); + window.recordState(); +}); +$("#up_obj").click(function () {//上移,放到前�?数组中在后面 + let idx = getIndex(canvas.getActiveObject()); + if (idx + 1 != canvas.getObjects().length) { + canvas.bringForward(canvas.getActiveObject()); + canvas.renderAll(); + let temp = objs[idx - 1]; + objs[idx - 1] = objs[idx]; + objs[idx] = temp; + //console.log(objs); + + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(idx); + } + } +}); +$("#down_obj").click(function () {//下移,放到后�?数组中在前面 + let idx = getIndex(canvas.getActiveObject()); + if (idx != 1) { + canvas.sendBackwards(canvas.getActiveObject()); + canvas.renderAll(); + //[objs[idx-2],objs[idx-1]] = [objs[idx-1],objs[idx-2]]; + + let temp = objs[idx - 1]; + objs[idx - 1] = objs[idx - 2]; + objs[idx - 2] = temp; + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(idx - 2); + } + } +}); +$("#set_bg").click(function () {//设置为背�? + let obj = canvas.getActiveObject(); + let idx = getIndex(obj); + const scaleX = 2787 / obj.width + const scaleY = 2787 / obj.height + // 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致 + const scaledWidth = obj.width * scaleX; + const scaledHeight = obj.height * scaleY; + obj.set({ + scaleX: scaleX, + scaleY: scaleY, + left: ($('#canvas1').width() - scaledWidth) / 2, + top: ($('#canvas1').height() - scaledHeight) / 2, + }); + $('#text_w').val(2787) + $('#text_h').val(2787) + $('#text_x').val(0) + $('#text_y').val(0) + if (obj.get("selectable")) { + obj.set("selectable", false); + $("#lock_img").attr("src", "public/images/lock20.png") + } + canvas.sendToBack(obj); + canvas.bringForward(obj); + canvas.renderAll(); + let objItem = objs.splice(idx - 1, 1)[0] + objs.unshift(objItem) + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(0); + } +}); + +// ========================================== +// onStateRestored 函数在 core.js 中定义并附加到 window 对象 +// ========================================== +$("#previous").click(function () { + if (step.val == 0) return; + + step.val--; + + // 判断当前是正面还是背面 + if ($("#front_side").hasClass("ui-button-active")) { + // 1. 恢复业务数据 + objs1 = JSON.parse(recordObjs1[step.val]); + objs = objs1; + + // 2. 恢复画布 (使用回调函数) + canvas.loadFromJSON(recordJson1[step.val], function () { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas); + } + if (typeof window.onStateRestored === 'function') { + window.onStateRestored(); // 图片加载完才执行这一行 + } + }); + } else { + // 背面逻辑 + objs2 = JSON.parse(recordObjs2[step.val]); + objs = objs2; + + canvas.loadFromJSON(recordJson2[step.val], function () { + if (typeof window.onStateRestored === 'function') { + window.onStateRestored(); + } + }); + } +}); +// ========================================== +$("#next").click(function () { + // 获取当前历史记录的最大长度 + let maxLen = $("#front_side").hasClass("ui-button-active") ? recordObjs1.length : recordObjs2.length; + + if (step.val >= maxLen - 1) return; + + step.val++; + + if ($("#front_side").hasClass("ui-button-active")) { + objs1 = JSON.parse(recordObjs1[step.val]); + objs = objs1; + + canvas.loadFromJSON(recordJson1[step.val], function () { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas); + } + if (typeof window.onStateRestored === 'function') { + window.onStateRestored(); // 图片加载完才执行这一行 + } + }); + } else { + objs2 = JSON.parse(recordObjs2[step.val]); + objs = objs2; + + canvas.loadFromJSON(recordJson2[step.val], function () { + if (typeof window.onStateRestored === 'function') { + window.onStateRestored(); + } + }); + } +}); + +$("#clean").click(function () { + objs.splice(0, objs.length); + + let allObjs = canvas.getObjects(); + for (let item of allObjs) { + if (item != allObjs[0]) { + canvas.remove(item); + } + } + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); +}); +$("#rotate").click(function () { + let obj = canvas.getActiveObject(); + obj.rotate(Math.round((obj.get("angle") + 90) % 360)); + $("#text_r").val(obj.get("angle")); + canvas.renderAll(); + updateControls(); + window.recordState(); +}); +$('#vertical_obj').click(function () { + let obj = canvas.getActiveObject(); + obj.set("flipY", !obj.get("flipY")); + canvas.renderAll(); + updateControls(); + window.recordState(); +}); +$('#align_obj').click(function () { + let obj = canvas.getActiveObject(); + obj.set("flipX", !obj.get("flipX")); + canvas.renderAll(); + updateControls(); + window.recordState(); +}); +$("#text_italics").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�? + canvas.getActiveObject().set("fontStyle", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("fontStyle", "italic") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#text_bold").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�?恢复正常 + canvas.getActiveObject().set("fontWeight", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("fontWeight", "bold") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#text_underline").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�? + canvas.getActiveObject().set("underline", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("underline", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#text_linethrough").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�? + canvas.getActiveObject().set("linethrough", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("linethrough", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); + +$("#circle_text_italics").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�? + canvas.getActiveObject().set("fontStyle", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("fontStyle", "italic") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_text_bold").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�?恢复正常 + canvas.getActiveObject().set("fontWeight", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("fontWeight", "bold") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); + +$('#out_left_alignment').click(function () { + $('#out_left_alignment').parent().removeClass('tool1') + $('#out_right_alignment').parent().removeClass('tool1') + $('#out_center_alignment').parent().removeClass('tool1') + setTimeout(() => { + $('#out_left_alignment').parent().addClass('tool1') + }); + canvas.getActiveObject().set('textAlign', 'left') + let idx = getIndex(canvas.getActiveObject()) + objs[idx - 1].align = 'left' + window.recordState(); + canvas.renderAll(); +}) +$('#out_right_alignment').click(function () { + $('#out_left_alignment').parent().removeClass('tool1') + $('#out_right_alignment').parent().removeClass('tool1') + $('#out_center_alignment').parent().removeClass('tool1') + setTimeout(() => { + $('#out_right_alignment').parent().addClass('tool1') + }); + canvas.getActiveObject().set('textAlign', 'right') + let idx = getIndex(canvas.getActiveObject()) + objs[idx - 1].align = 'right' + window.recordState(); + canvas.renderAll(); +}) +$('#out_center_alignment').click(function () { + $('#out_left_alignment').parent().removeClass('tool1') + $('#out_right_alignment').parent().removeClass('tool1') + $('#out_center_alignment').parent().removeClass('tool1') + setTimeout(() => { + $('#out_center_alignment').parent().addClass('tool1') + }); + canvas.getActiveObject().set('textAlign', 'center') + let idx = getIndex(canvas.getActiveObject()) + objs[idx - 1].align = 'center' + window.recordState(); + canvas.renderAll(); +}) + +$("#out_text_italics").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�? + canvas.getActiveObject().set("fontStyle", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("fontStyle", "italic") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_bold").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�?恢复正常 + canvas.getActiveObject().set("fontWeight", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("fontWeight", "bold") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_underline").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�? + canvas.getActiveObject().set("underline", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("underline", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_linethrough").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已�? + canvas.getActiveObject().set("linethrough", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未�? + canvas.getActiveObject().set("linethrough", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#lock").off('click').on('click', function (e) { + e.stopPropagation(); + if (!canvas.getActiveObject()) return; + let obj = canvas.getActiveObject(); + // 检查是否已锁定(通过lockMovementX判断,因为锁定时会设置所有lock属性) + let isLocked = obj.get("lockMovementX") === true; + let shouldLock = !isLocked; + + // 锁定/解锁所有编辑操作,但保持选中状态(不取消选中) + obj.set({ + lockMovementX: shouldLock, + lockMovementY: shouldLock, + lockRotation: shouldLock, + lockScalingX: shouldLock, + lockScalingY: shouldLock, + lockSkewingX: shouldLock, + lockSkewingY: shouldLock, + // 锁定时不可选中,解锁时可选中(但保持当前选中状态) + selectable: !shouldLock, + evented: !shouldLock + }); + if (shouldLock) { + $("#lock_img").attr("src", "public/images/lock20.png")//已锁定 + } else { + $("#lock_img").attr("src", "public/images/unlock20.png")//已解锁 + } + updateControls(); + window.recordState(); + // 更新对象列表以同步锁状态 + if (typeof window.updateList === 'function') { + window.updateList(); + } + canvas.renderAll(); +}); +$("#text_back_transparent").click(function () { + canvas.getActiveObject().set("textBackgroundColor", ""); + $("#text_back_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_text_back_transparent").click(function () { + canvas.getActiveObject().set("textBackgroundColor", ""); + $("#circle_text_back_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_back_transparent").click(function () { + canvas.getActiveObject().set("textBackgroundColor", ""); + $("#out_text_back_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#rect_transparent").click(function () { + canvas.getActiveObject().set("fill", ""); + $("#rect_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#rect_stroke_transparent").click(function () { + canvas.getActiveObject().set("stroke", ""); + $("#rect_stroke").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_transparent").click(function () { + canvas.getActiveObject().set("fill", ""); + $("#circle_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_stroke_transparent").click(function () { + canvas.getActiveObject().set("stroke", ""); + $("#circle_stroke").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); + +// saveAs 函数保留,因为它被作为回调传递给 output 函数(第52行) +function saveAs(op1, callback) { + let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + + // 清理不需要的 src 字段(使用 window.cleanupSrcFields,在 output.js 中定义) + if (typeof window.cleanupSrcFields === 'function') { + window.cleanupSrcFields(j.objects, objs1); + window.cleanupSrcFields(b.objects, objs2); + } + + let o = { f: j, b: {}, fo: objs1, bo: objs2 }; + let con_o = Object.assign(o, op1); + dialog.showSaveDialog({ + title: language_str("saveFile"),//'保存文件' + filters: [ + { name: 'Soon File Type', extensions: ['soon'] }, + ] + }).then(result => { + if (result.filePath == "") { return; } + if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) { + result.filePath += '.soon'; + } + let fs = require('fs') + con_o.soonType = 1 + fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8') + openAs.name = result.filePath; + layer.msg(language_str("saveSucc") + openAs.name);//'保存成功�? + if (typeof window.saveHistory === 'function') { + window.saveHistory(); + } + if (callback && typeof callback === 'function') { + callback(); + } + }).catch(err => { + }) +} +// save 函数已在 output.js 中定义 +$("#copy").click(function () { + window.copySelection(); +}) +// 粘贴 +$("#paste").click(function () { + window.pasteFromClipboard(); +}) + +// 保存 (保持你原有的保存逻辑不变) +$("#save").click(function () { + if (typeof window.output === 'function') { + window.output(); // 这里调用你的 output 函数 + } + return; + // ... (下面是你原有的被 return 截断的代码,建议以后清理掉,但这里我按要求保�? + let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + // ... (省略你原来那段很长的保存代码) ... +}); + +function getDate() { + let date = new Date(); + return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); +} +function getAbsoluteXY(_obj) { + let coord = _obj.get("lineCoords"); + return [_obj.get("left"), _obj.get("top")] +} +// fullPath 和 saveHistory 已在 output.js 中定义 +$("#open").click(function () { + if (step.val == 0) { + OpenDialog(); + return; + } + layer.confirm('' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�? + if (typeof window.output === 'function') { + window.output(OpenDialog); + } + layer.close(index); + + }, function (index) { + OpenDialog(); + }); + function OpenDialog() { + dialog.showOpenDialog({ + title: "请选择文件", + buttonLabel: language_str("comf"), + filters: [ + { name: 'Soon File Type', extensions: ['soon'] }, + ] + }).then(result => { + if (result.canceled) return; + let filePath = result.filePaths[0]; + let fs = require('fs'); + let fsData = fs.readFileSync(filePath); + let j = JSON.parse(fsData.toString()); + let type = j.soonType ? j.soonType : j.backBlackPic ? 2 : 1; + + if (type == 2) { + ipcRenderer.send('open-design-page', filePath, type); + return; + } + + // 调用 output.js 中的 openFile 函数 + if (typeof window.openFile === 'function') { + window.openFile(filePath); + } + }).catch(err => { + }) + } +}); + //let blank = "{\"f\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":2787,\"height\":2787,\"fill\":\"#000000\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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YFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMT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\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"b\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":2787,\"height\":2787,\"fill\":\"rgb(0,0,0)\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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YFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMT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\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"fo\":[],\"bo\":[]}"; + let t_objs1 = canvas1.getObjects(); + let t_objs2 = canvas2.getObjects(); + for (let i = 1; i < t_objs1.length; i++) { + canvas1.remove(t_objs1[i]); + } + for (let i = 1; i < t_objs2.length; i++) { + canvas2.remove(t_objs2[i]); + } + objs2 = []; + objs1 = []; + step1.val = 0; + step2.val = 0; + recordJson1 = []; + recordJson2 = []; + recordObjs1 = []; + recordObjs2 = []; + if ($("#front_side").hasClass("ui-button-active")) { + objs = objs1; + recordObjs = recordObjs1; + recordJson = recordJson1; + step = step1; + } else if ($("#back_side").hasClass("ui-button-active")) { + objs = objs2; + recordObjs = recordObjs2; + recordJson = recordJson2; + step = step2; + } + openAs.name = ""; + canvas1.renderAll(); + canvas2.renderAll(); + if (typeof window.updateList === 'function') { + window.updateList(); +} +$("#new").click(function () { + if (step.val == 0) { + ipcRenderer.send('open-first-page'); + return; + } + layer.confirm('' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�? + if (typeof window.output === 'function') { + window.output(() => ipcRenderer.send('open-first-page')); + } + }, function (index) { + ipcRenderer.send('open-first-page'); + }); +}); + +// =========================================================== +$("#text_y").bind('input propertychange', function () { + if (!canvas.getActiveObject()) return; + if ($("#text_y").val() == "") { + $("#text_y").val(0) + } + let val = background_image.top; + if ($("#text_y").val() != "") { + val = background_image.top + parseInt($("#text_y").val()); + } + canvas.getActiveObject().set("top", val) + canvas.renderAll(); + window.recordState(); +}) +$("#text_x").bind('input propertychange', function () { + if (!canvas.getActiveObject()) return; + if ($("#text_x").val() == "") { + $("#text_x").val(0) + } + let val = background_image.left; + if ($("#text_x").val() != "") { + val = background_image.left + parseInt($("#text_x").val()); + } + canvas.getActiveObject().set("left", val) + canvas.renderAll(); + window.recordState(); +}) +$("#text_w").bind('input propertychange', function () { + if (!canvas.getActiveObject()) return; + let val = "0"; + if ($("#text_w").val() != "") { + val = $("#text_w").val(); + } + let idx = getIndex(canvas.getActiveObject()); + if (idx <= 0 || !objs[idx - 1]) return; + let type = objs[idx - 1].type; + if (type == 3 || type == 4) { + canvas.getActiveObject().set("width", parseInt(val)) + } else { + canvas.getActiveObject().set("scaleX", parseInt(val) / canvas.getActiveObject().get("width")) + } + + canvas.renderAll(); + window.recordState(); +}) +$("#text_h").bind('input propertychange', function () { + if (!canvas.getActiveObject()) return; + let idx = getIndex(canvas.getActiveObject()); + if (idx <= 0 || !objs[idx - 1]) return; + if (objs[idx - 1].type == 7) { + if ($("#text_h").val() == "") { + $("#text_h").val(canvas.getActiveObject().get("strokeWidth")); + } + canvas.getActiveObject().set("strokeWidth", parseInt($("#text_h").val())); + canvas.renderAll(); + return; + } + let val = "0"; + if ($("#text_h").val() != "") { + val = $("#text_h").val(); + } + let type = objs[idx - 1].type; + if (type == 3 || type == 4) { + canvas.getActiveObject().set("height", parseInt(val)) + } else { + canvas.getActiveObject().set("scaleY", parseInt(val) / canvas.getActiveObject().get("height")) + } + + canvas.renderAll(); + window.recordState(); +}) +$("#text_r").bind('input propertychange', function () { + if (!canvas.getActiveObject()) return; + if ($("#text_r").val() == "") { + $("#text_r").val("0") + } + $("#text_r").val(parseInt($("#text_r").val()) % 360) + //canvas.getActiveObject().set("rotate", val) + canvas.getActiveObject().rotate(parseInt($("#text_r").val())) + canvas.renderAll(); + window.recordState(); +}) +$("#out_pic_field_name").bind('input propertychange', function () { + let idx = getIndex(canvas.getActiveObject()); + objs[idx - 1].name = $("#out_pic_field_name").val(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); +}) + +$("#text_black").click(function () { + let idx = getIndex(canvas.getActiveObject()); + if ($(this).prop("checked")) { + objs[idx - 1].black = true; + } else { + objs[idx - 1].black = false; + } + window.recordState(); +}); +$("#out_text_field_name").bind('input propertychange', function () { + let idx = getIndex(canvas.getActiveObject()); + objs[idx - 1].name = $("#out_text_field_name").val(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); +}) +$("#qrcode_field_name").bind('input propertychange', function () { + let idx = getIndex(canvas.getActiveObject()); + objs[idx - 1].name = $("#qrcode_field_name").val(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); +}) +$("#qrcode_color").bind('input propertychange', function () { + let item = canvas.getActiveObject(); + let qr = jrQrcode.getQrBase64($("#qrcode_val").val(), { padding: 0, foreground: $(this).val() }); + let idx = getIndex(item); + objs[idx - 1].color = $(this).val(); + item.setSrc(qr, function (img) { + canvas.renderAll(); + window.recordState(); + }); +}); +$("#qrcode_val").bind('change', function () { + let val = $(this).val() ? $(this).val() : 'https://www.cardsoon.com' + let item = canvas.getActiveObject(); + let qr = jrQrcode.getQrBase64(val, { padding: 0, foreground: $("#qrcode_color").val() }); + let idx = getIndex(item); + objs[idx - 1].val = val; + item.setSrc(qr, function (img) { + canvas.renderAll(); + window.recordState(); + }); +}); +$("#barcode_color").bind('input propertychange', function () { + let item = canvas.getActiveObject(); + let idx = getIndex(item); + objs[idx - 1].color = $(this).val(); + JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); + let barcode = document.getElementById('barcode'); + let bar = barcode.toDataURL("image/png"); + item.setSrc(bar, function (img) { + canvas.renderAll(); + window.recordState(); + }); +}); +$("#barcode_field_name").bind('input propertychange', function () { + let idx = getIndex(canvas.getActiveObject()); + objs[idx - 1].name = $("#barcode_field_name").val(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); +}) +$("#text_color").bind('input propertychange', function () { + canvas.getActiveObject().set("fill", $("#text_color").val()); + canvas.renderAll(); + window.recordState(); +}) +$("#text_back_color").bind('input propertychange', function () { + canvas.getActiveObject().set("textBackgroundColor", $("#text_back_color").val()); + canvas.renderAll(); + window.recordState(); +}) +$("#text_size").bind('input propertychange', function () { + let val = 1 + if (parseFloat($("#text_size").val())) { + val = parseFloat($("#text_size").val()) + if (val < 1) { + val = 1 + } else if (val > dpi) { + val = dpi + } else if (val % 0.5 !== 0) { + val = Math.round(val * 2) / 2 + } + + } + $("#text_size").val(val) + canvas.getActiveObject().set("fontSize", val * dpi / 72); + $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0)); + $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0)); + canvas.renderAll(); + window.recordState(); +}) +$("#circle_text_color").bind('input propertychange', function () { + canvas.getActiveObject().set("fill", $("#circle_text_color").val()); + canvas.renderAll(); + window.recordState(); +}) +$("#circle_text_back_color").bind('input propertychange', function () { + canvas.getActiveObject().set("textBackgroundColor", $("#circle_text_back_color").val()); + + canvas.renderAll(); + window.recordState(); +}) +$("#circle_text_text").bind('input propertychange', function () { + let val = $("#circle_text_text").val().trim() + canvas.getActiveObject().set("text", ` ${val} `); + canvas.renderAll(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); +}) +$("#out_text_color").bind('input propertychange', function () { + canvas.getActiveObject().set("fill", $("#out_text_color").val()); + canvas.renderAll(); + window.recordState(); +}) +$("#out_text_back_color").bind('input propertychange', function () { + canvas.getActiveObject().set("textBackgroundColor", $("#out_text_back_color").val()); + + canvas.renderAll(); + window.recordState(); +}) +$("#out_text_size").bind('input propertychange', function () { + let val = 1 + if (parseFloat($("#out_text_size").val())) { + val = parseFloat($("#out_text_size").val()) + if (val < 1) { + val = 1 + } else if (val > dpi) { + val = dpi + } else if (val % 0.5 !== 0) { + val = Math.round(val * 2) / 2 + } + + } + $("#out_text_size").val(val) + canvas.getActiveObject().set("fontSize", val * dpi / 72); + $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0)); + $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0)); + canvas.renderAll(); + window.recordState(); +}) +// 监听合成文本输入框 (占位符) +$("#out_text_text").on('input propertychange', function () { + let val = $(this).val(); + + // 【核心修改】如果值为空,强制给 2 个空格 + if (val === "") { + val = " "; + } + + let obj = canvas.getActiveObject(); + if (obj) { + obj.set("text", val); + obj.setCoords(); + canvas.requestRenderAll(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); + } +}); +$("#rect_color").bind('input propertychange', function () { + canvas.getActiveObject().set("fill", $("#rect_color").val()); + + canvas.renderAll(); + window.recordState(); +}) +$("#rect_stroke").bind('input propertychange', function () { + canvas.getActiveObject().set("stroke", $("#rect_stroke").val()); + + canvas.renderAll(); + window.recordState(); +}) +$("#rect_stroke_width").bind('input propertychange', function () { + if ($("#rect_stroke_width").val() == "") { + $("#rect_stroke_width").val("0") + } else { + $("#rect_stroke_width").val(parseInt($("#rect_stroke_width").val())) + } + canvas.getActiveObject().set("strokeWidth", parseInt($("#rect_stroke_width").val())); + canvas.renderAll(); + window.recordState(); +}) +$("#rect_radius").bind('input propertychange', function () { + if ($("#rect_radius").val() == "") { + $("#rect_radius").val("0") + } else { + $("#rect_radius").val(parseInt($("#rect_radius").val())) + } + canvas.getActiveObject().set("rx", parseInt($("#rect_radius").val())); + canvas.getActiveObject().set("ry", parseInt($("#rect_radius").val())); + canvas.renderAll(); + window.recordState(); +}) +$("#circle_color").bind('input propertychange', function () { + canvas.getActiveObject().set("fill", $("#circle_color").val()); + + canvas.renderAll(); + window.recordState(); +}) +$("#circle_stroke").bind('input propertychange', function () { + canvas.getActiveObject().set("stroke", $("#circle_stroke").val()); + + canvas.renderAll(); + window.recordState(); +}) +$("#circle_stroke_width").bind('input propertychange', function () { + if ($("#circle_stroke_width").val() == "") { + $("#circle_stroke_width").val("0") + } else { + $(this).val(parseInt($(this).val())) + } + canvas.getActiveObject().set("strokeWidth", parseInt($("#circle_stroke_width").val())); + canvas.renderAll(); + window.recordState(); +}) +$("#counter_start").bind('input propertychange', function () { + canvas.getActiveObject().set("text", $("#counter_start").val()); + let item = canvas.getActiveObject(); + let idx = getIndex(item); + objs[idx - 1].start = $(this).val(); + canvas.renderAll(); + window.recordState(); +}) +$("#counter_add").bind('input propertychange', function () { + let item = canvas.getActiveObject(); + let idx = getIndex(item); + objs[idx - 1].add = $(this).val(); + canvas.renderAll(); + window.recordState(); +}) +$("#counter_color").bind('input propertychange', function () { + canvas.getActiveObject().set("fill", $("#counter_color").val()); + canvas.renderAll(); + window.recordState(); +}) +$("#count_size").bind('input propertychange', function () { + let val = 1 + if (parseFloat($("#count_size").val())) { + val = parseFloat($("#count_size").val()) + if (val < 1) { + val = 1 + } else if (val > dpi) { + val = dpi + } else if (val % 0.5 !== 0) { + val = Math.round(val * 2) / 2 + } + + } + $("#count_size").val(val) + canvas.getActiveObject().set("fontSize", val * dpi / 72); + $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0)); + $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0)); + canvas.renderAll(); + window.recordState(); +}) +$("#line_color").bind('input propertychange', function () { + canvas.getActiveObject().set("stroke", $("#line_color").val()); + canvas.renderAll(); + window.recordState(); +}) +$("#line_dist").bind('input propertychange', function () { + if ($("#line_dist").val() == "") { + $("#line_dist").val(0) + } + canvas.getActiveObject().set("strokeDashArray", [parseInt($("#line_dist").val()), parseInt($("#line_dist").val())]) + canvas.renderAll(); + window.recordState(); +}) +// 监听普通文本输入 (占位符) +$("#text_text").on('input propertychange', function () { + // 1. 获取输入框的值,不要用 trim(),否则无法输入空格 + let val = $(this).val(); + + // 2. 核心修改:只有当删光时,才给 4 个空格作为占位符 + if (val === "") { + val = " "; // 4个空格,比原来的2个更宽,更好点 + } + // 3. 更新对象 + canvas.getActiveObject().set("text", val); + canvas.requestRenderAll(); // 使用 requestRenderAll 性能更好 + if (typeof window.updateList === 'function') { + window.updateList(); + } + window.recordState(); +}); +$("#barcode_val").bind('input propertychange', function () { + let item = canvas.getActiveObject(); + let idx = getIndex(item); + objs[idx - 1].val = $(this).val(); + JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); + + let barcode = document.getElementById('barcode'); + let bar = barcode.toDataURL("image/png"); + item.setSrc(bar, function (img) { + canvas.renderAll(); + window.recordState(); + }); +}) +$("#barcode_show").click(function () { + let item = canvas.getActiveObject(); + let idx = getIndex(canvas.getActiveObject()); + let val = $("#barcode_size").val() + if ($(this).prop("checked")) { + objs[idx - 1].show = true; + val = 0 + } else { + objs[idx - 1].show = false; + } + JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: val * dpi / 72, font: objs[idx - 1].font }); + let barcode = document.getElementById('barcode'); + let bar = barcode.toDataURL("image/png"); + item.setSrc(bar, function (img) { + canvas.renderAll(); + window.recordState(); + }); +}); +$("#barcode_size").bind('input propertychange', function () { + let item = canvas.getActiveObject(); + let idx = getIndex(item); + let val = 1 + if (parseFloat($(this).val())) { + val = parseFloat($(this).val()) + if (val < 1) { + val = 1 + } else if (val > dpi) { + val = dpi + } else if (val % 0.5 !== 0) { + val = Math.round(val * 2) / 2 + } + + } + $("#barcode_size").val(val) + objs[idx - 1].fontSize = val * dpi / 72; + JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); + + let barcode = document.getElementById('barcode'); + let bar = barcode.toDataURL("image/png"); + item.setSrc(bar, function (img) { + canvas.renderAll(); + window.recordState(); + }); +}) +$('#count_font_family').on('change', function () { + canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) + canvas.renderAll() + window.recordState(); +}); +$('#text_font_family').on('change', function () { + canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) + canvas.renderAll() + window.recordState(); +}); + +$('#circle_text_font_family').on('change', function () { + canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) + canvas.renderAll() + window.recordState(); +}); + +$('#language_select').on('change', function () {//语言选择 + langua_ge($(this).find('option:selected').val()); + s_lan = $(this).find('option:selected').val(); + localStorage.setItem("lang", s_lan); +}); +$('#barcode_font_family').on('change', function () { + let item = canvas.getActiveObject(); + let idx = getIndex(item); + objs[idx - 1].font = $(this).find('option:selected').text(); + JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font }); + + let barcode = document.getElementById('barcode'); + let bar = barcode.toDataURL("image/png"); + item.setSrc(bar, function (img) { + canvas.renderAll(); + window.recordState(); + }); + //window.recordState(); +}); +$('#out_text_font_family').on('change', function () { + canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) + canvas.renderAll() + window.recordState(); +}); +$(".obj_list").on("click", "div", function () { + let idx = objs.length - 1 - $(this).index(); + if (typeof window.selectObj === 'function') { + window.selectObj(idx); + } +}); +$("#exceed").click(function () { + let idx = getIndex(canvas.getActiveObject()); + if ($(this).prop("checked")) { + objs[idx - 1].exceed = true; + } else { + objs[idx - 1].exceed = false; + } + window.recordState(); +}); +$("#autoWrap").click(function () { + let idx = getIndex(canvas.getActiveObject()); + if ($(this).prop("checked")) { + + objs[idx - 1].autoWrap = true; + } else { + objs[idx - 1].autoWrap = false; + } + window.recordState(); +}); +$("#fixSize").click(function () { + let idx = getIndex(canvas.getActiveObject()); + if ($(this).prop("checked")) { + + objs[idx - 1].fixSize = true; + } else { + objs[idx - 1].fixSize = false; + } + window.recordState(); +}); +$("#circle_text_center").click(function () { + let idx = getIndex(canvas.getActiveObject()); + if ($(this).prop("checked")) { + objs[idx - 1].circleCenter = 1; + } else { + objs[idx - 1].circleCenter = 0; + } + window.recordState(); +}); + +// =========================================================== +$("#text_italics").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选 + canvas.getActiveObject().set("fontStyle", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("fontStyle", "italic") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#text_bold").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选,恢复正常 + canvas.getActiveObject().set("fontWeight", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("fontWeight", "bold") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#text_underline").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选 + canvas.getActiveObject().set("underline", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("underline", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#text_linethrough").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选 + canvas.getActiveObject().set("linethrough", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("linethrough", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); + +$("#circle_text_italics").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选 + canvas.getActiveObject().set("fontStyle", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("fontStyle", "italic") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_text_bold").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选,恢复正常 + canvas.getActiveObject().set("fontWeight", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("fontWeight", "bold") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); + +$('#out_left_alignment').click(function () { + $('#out_left_alignment').parent().removeClass('tool1') + $('#out_right_alignment').parent().removeClass('tool1') + $('#out_center_alignment').parent().removeClass('tool1') + setTimeout(() => { + $('#out_left_alignment').parent().addClass('tool1') + }); + canvas.getActiveObject().set('textAlign', 'left') + let idx = getIndex(canvas.getActiveObject()) + objs[idx - 1].align = 'left' + window.recordState(); + canvas.renderAll() +}) +$('#out_right_alignment').click(function () { + $('#out_left_alignment').parent().removeClass('tool1') + $('#out_right_alignment').parent().removeClass('tool1') + $('#out_center_alignment').parent().removeClass('tool1') + setTimeout(() => { + $('#out_right_alignment').parent().addClass('tool1') + }); + canvas.getActiveObject().set('textAlign', 'right') + let idx = getIndex(canvas.getActiveObject()) + objs[idx - 1].align = 'right' + window.recordState(); + canvas.renderAll() +}) +$('#out_center_alignment').click(function () { + $('#out_left_alignment').parent().removeClass('tool1') + $('#out_right_alignment').parent().removeClass('tool1') + $('#out_center_alignment').parent().removeClass('tool1') + setTimeout(() => { + $('#out_center_alignment').parent().addClass('tool1') + }); + canvas.getActiveObject().set('textAlign', 'center') + let idx = getIndex(canvas.getActiveObject()) + objs[idx - 1].align = 'center' + window.recordState(); + canvas.renderAll() +}) + +$("#out_text_italics").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选 + canvas.getActiveObject().set("fontStyle", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("fontStyle", "italic") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_bold").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选,恢复正常 + canvas.getActiveObject().set("fontWeight", "normal") + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("fontWeight", "bold") + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_underline").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选 + canvas.getActiveObject().set("underline", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("underline", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_linethrough").click(function () { + if ($(this).hasClass("ui-radio-acitve")) { + //已选 + canvas.getActiveObject().set("linethrough", false) + $(this).removeClass("ui-radio-acitve") + } else { + //未选 + canvas.getActiveObject().set("linethrough", true) + $(this).addClass("ui-radio-acitve") + } + window.recordState(); + canvas.renderAll(); + window.recordState(); +}); + +// =========================================================== +$("#delete").click(function () { + let actObjs = canvas.getActiveObjects(); + let allObjs = canvas.getObjects(); + let flag = 0; + for (let item of actObjs) { + if (item != allObjs[0]) { + let i = getIndex(item);//0是背景,所以从1开始,但objs不包含背景图片,故要-1 + objs.splice(i - 1, 1); + canvas.remove(item); + flag = 1; + + } + } + if (typeof window.updateList === 'function') { + window.updateList(); + } + canvas.discardActiveObject(); + if (flag == 1) { + window.recordState(); + canvas.renderAll(); + } +}); +// 移至上层和移至下层:先取消所有绑定(包括第一处的绑定),然后重新绑定(确保只绑定一次) +// 注意:第一处的事件绑定(第 842 行和第 861 行)会被这里的 off('click') 取消 +$("#up_obj").off('click').on('click', function () {//上移,放到前面 数组中在后面 + let idx = getIndex(canvas.getActiveObject()); + if (idx + 1 != canvas.getObjects().length) { + canvas.bringForward(canvas.getActiveObject()); + canvas.renderAll(); + let temp = objs[idx - 1]; + objs[idx - 1] = objs[idx]; + objs[idx] = temp; + + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(idx); + } + } +}); +$("#down_obj").off('click').on('click', function () {//下移,放到后面 数组中在前面 + let idx = getIndex(canvas.getActiveObject()); + if (idx != 1) { + canvas.sendBackwards(canvas.getActiveObject()); + canvas.renderAll(); + + let temp = objs[idx - 1]; + objs[idx - 1] = objs[idx - 2]; + objs[idx - 2] = temp; + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(idx - 2); + } + } +}); +$("#set_bg").click(function () {//设置为背景 + let obj = canvas.getActiveObject(); + let idx = getIndex(obj); + const scaleX = 2787 / obj.width + const scaleY = 2787 / obj.height + // 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致 + const scaledWidth = obj.width * scaleX; + const scaledHeight = obj.height * scaleY; + obj.set({ + scaleX: scaleX, + scaleY: scaleY, + left: ($('#canvas1').width() - scaledWidth) / 2, + top: ($('#canvas1').height() - scaledHeight) / 2, + }); + $('#text_w').val(2787) + $('#text_h').val(2787) + $('#text_x').val(0) + $('#text_y').val(0) + // 设为背景时,锁定所有编辑操作,并设置为不可选中 + obj.set({ + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + lockSkewingX: true, + lockSkewingY: true, + selectable: false, + evented: false + }); + $("#lock_img").attr("src", "public/images/lock20.png") + canvas.sendToBack(obj); + canvas.bringForward(obj); + canvas.renderAll(); + let objItem = objs.splice(idx - 1, 1)[0] + objs.unshift(objItem) + + // 确保背景图(索引0)的锁定属性被正确设置 + setTimeout(() => { + let bgObj = canvas.getObjects()[0]; + if (bgObj) { + bgObj.set({ + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + lockSkewingX: true, + lockSkewingY: true, + selectable: false, + evented: false + }); + canvas.renderAll(); + } + }, 100); + + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(0); + } +}); +// 重复的lock点击事件已移除,使用第一处的绑定 +$("#text_back_transparent").click(function () { + canvas.getActiveObject().set("textBackgroundColor", ""); + $("#text_back_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_text_back_transparent").click(function () { + canvas.getActiveObject().set("textBackgroundColor", ""); + $("#circle_text_back_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#out_text_back_transparent").click(function () { + canvas.getActiveObject().set("textBackgroundColor", ""); + $("#out_text_back_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#rect_transparent").click(function () { + canvas.getActiveObject().set("fill", ""); + $("#rect_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#rect_stroke_transparent").click(function () { + canvas.getActiveObject().set("stroke", ""); + $("#rect_stroke").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_transparent").click(function () { + canvas.getActiveObject().set("fill", ""); + $("#circle_color").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); +$("#circle_stroke_transparent").click(function () { + canvas.getActiveObject().set("stroke", ""); + $("#circle_stroke").val("#ffffff"); + canvas.renderAll(); + window.recordState(); +}); + +// =========================================================== +$("#about").click(async function () { + // 1. 先异步获取版本号 + let version = "0.0.0"; // 默认值,防止获取失败 + try { + if (window.sysAPI && window.sysAPI.getAppVersion) { + const v = await window.sysAPI.getAppVersion(); + version = "v" + v; // 拼接一个 v,变成 v2.3.017 + } + } catch (e) { + } + + // 2. 获取成功后再弹出窗口 + layer.open({ + type: 1 + , title: language_str("about") + , area: '450px;' + , id: 'LAY_layuipro' + , moveType: 1 + , content: '
' + + '
' + + '
Soon Design
' + + // 【修改点】这里使用了刚才获取到的 version 变量 + '
' + language_str("vers") + ' ' + version + '
' + + '
' + language_str("copyright") + '
' + + '
' + }); +}) +$("#help").click(() => { + ipcRenderer.send('open-help-file'); +}); + +// =========================================================== +$('#display').on('click', function () { + // 类型改变 + fabric.Image.fromURL('./public/images/front_bg' + bg_version + '_1.png', function (i1) { + i1.left = background_image.left; + i1.top = background_image.top; + let img1 = i1; + + fabric.Image.fromURL('./public/images/back_bg_1.png', function (i2) { + i2.left = background_image.left; + i2.top = background_image.top; + let img2 = i2; + fabric.Image.fromURL('./public/images/op_1.png', function (i3) { + i3.left = background_image.left; + i3.top = background_image.top; + let img3 = i3; + if (typeof window.display_func === 'function') { + window.display_func(img1, img2, img3); + } + }) + }) + }) +}); +$("#output").click(function () { + // 另存为:传递 saveAs 函数作为第二个参数 + if (typeof window.output === 'function') { + window.output(null, saveAs); // 调用output函数,使用saveAs进行另存为 + } +}); + +// 确保移至上层和移至下层的事件绑定正确(在文件末尾再次确认) +// 取消所有绑定,然后重新绑定第二处的实现(第 2171 行和第 2189 行) +$(document).ready(function() { + setTimeout(function() { + $("#up_obj").off('click').on('click', function () { + let idx = getIndex(canvas.getActiveObject()); + if (idx + 1 != canvas.getObjects().length) { + canvas.bringForward(canvas.getActiveObject()); + canvas.renderAll(); + let temp = objs[idx - 1]; + objs[idx - 1] = objs[idx]; + objs[idx] = temp; + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(idx); + } + } + }); + $("#down_obj").off('click').on('click', function () { + let idx = getIndex(canvas.getActiveObject()); + if (idx != 1) { + canvas.sendBackwards(canvas.getActiveObject()); + canvas.renderAll(); + let temp = objs[idx - 1]; + objs[idx - 1] = objs[idx - 2]; + objs[idx - 2] = temp; + window.recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(idx - 2); + } + } + }); + }, 100); +}); diff --git a/lib/design2.js b/lib/design2.js index fad71b9..d5f5910 100644 --- a/lib/design2.js +++ b/lib/design2.js @@ -108,8 +108,6 @@ ipcRenderer.send('get-scale-rate'); }); APIFMS = CryptoJS.enc.Base64.stringify(encrypted.ciphertext); } catch (err) { - console.log('des 加密 -------------------------'); - console.log(err); } return APIFMS; }; @@ -491,7 +489,6 @@ ipcRenderer.send('get-scale-rate'); bytenode = require('bytenode'); require.extensions['.dl'] = require.extensions['.jsc']; } catch(e) { - console.warn('[加载模块] bytenode 未安装,无法加载 .jsc 文件'); } const appPath = (() => { try { return remote.app.getAppPath(); } catch(e) { return __dirname || process.cwd(); } })(); @@ -504,7 +501,6 @@ ipcRenderer.send('get-scale-rate'); moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); } } catch (e) { - console.warn('[加载模块] 无法读取模块映射配置,使用默认文件名'); } // 获取映射后的文件名(跨平台兼容) @@ -524,10 +520,8 @@ ipcRenderer.send('get-scale-rate'); if (fs.existsSync(jscPath) && bytenode) { try { require(jscPath); - console.log(`[加载模块] ✅ ${moduleName} → ${mappedName}.jsc`); return; } catch (e) { - console.error(`[加载模块] ❌ ${moduleName}.jsc 加载失败:`, e.message); } } @@ -535,9 +529,7 @@ ipcRenderer.send('get-scale-rate'); if (fs.existsSync(jsPath)) { try { eval(fs.readFileSync(jsPath, 'utf8')); - console.log(`[加载模块] ✅ ${moduleName} → ${moduleName}.js`); } catch (e) { - console.error(`[加载模块] ❌ ${moduleName}.js 加载失败:`, e.message); alert(`加载 ${moduleName} 失败!\n\n错误: ${e.message}`); } } else { diff --git a/lib/design2/core.js b/lib/design2/core.js index bd9f730..d39803b 100644 --- a/lib/design2/core.js +++ b/lib/design2/core.js @@ -425,17 +425,17 @@ function initRulers() { function createFabricGuide(type, domX, domY) { // domX 和 domY 是相对于 canvas-wrapper 的坐标 // 需要转换为相对于 canvas 的坐标,然后再转换为 Fabric 画布坐标 - + // 获取 canvas 相对于 canvas-wrapper 的位置 let canvas1El = $('#canvas1'); let canvasPosition = canvas1El.position(); let canvasMarginLeft = parseFloat(canvas1El.css('margin-left')) || 0; let canvasMarginTop = parseFloat(canvas1El.css('margin-top')) || 0; - + // 计算相对于 canvas 的坐标(减去 canvas 在 wrapper 中的位置和 margin) let relX = domX - canvasPosition.left - canvasMarginLeft; let relY = domY - canvasPosition.top - canvasMarginTop; - + // 转为 Fabric 坐标 (除以 zoom) let canvasX = relX / zoom; let canvasY = relY / zoom; @@ -555,22 +555,18 @@ function selectObject(target, index) { function selectPic(target, index) { // 检查是否有选中对象,如果没有则直接返回 if (!canvas || !canvas.getActiveObject()) return; - + $("#pic_control").show(); $("#set_bg").show(); let activeObj = canvas.getActiveObject(); - - // 检查对象是否被锁定或设为背景(索引0且已锁定) - let idx = getIndex(activeObj, canvas); - if (idx === 0) { - // 如果是背景图且已锁定,不应该显示图片控件 - if (activeObj.get('lockMovementX') === true || activeObj.get('selectable') === false) { - canvas.discardActiveObject(); - canvas.renderAll(); - return; - } + + // 检查对象是否被锁定 + if (isObjectLocked(activeObj)) { + canvas.discardActiveObject(); + canvas.renderAll(); + return; } - + if (typeof pic_op !== 'undefined' && pic_op && typeof pic_op.setValue === 'function') { pic_op.setValue(100 - (activeObj.get("opacity") * 100)); } else { @@ -656,44 +652,48 @@ function selectText(target, index) { } function selectCircleText(target, index) { - let idx = getIndex(canvas.getActiveObject(), canvas); + const activeObj = target || canvas.getActiveObject(); + if (!activeObj) return; + + let idx = getIndex(activeObj); $("#circle_text_control").show(); - $("#circle_text_color").val(canvas.getActiveObject().get("fill")); - $("#circle_text_back_color").val(canvas.getActiveObject().get("textBackgroundColor") == "" ? '#ffffff' : canvas.getActiveObject().get("textBackgroundColor")); - if (typeof circle_text_size !== 'undefined' && circle_text_size.setValue) { - circle_text_size_updating = true; // 设置标志位 - circle_text_size.setValue(canvas.getActiveObject().get("fontSize")); - circle_text_size_updating = false; // 清除标志位 - } else { - $("#circle_text_size").next().children(".layui-slider-bar").css("width", ((canvas.getActiveObject().get("fontSize") - 10) / (120 - 10)) * 100 + "%"); - $("#circle_text_size").next().children(".layui-slider-handle").css("left", ((canvas.getActiveObject().get("fontSize") - 10) / (120 - 10)) * 100 + "%"); + $("#circle_text_color").val(activeObj.get("fill")); + $("#circle_text_back_color").val(activeObj.get("textBackgroundColor") == "" ? '#ffffff' : activeObj.get("textBackgroundColor")); + + if (typeof circle_text_size !== 'undefined' && circle_text_size && typeof circle_text_size.setValue === 'function') { + if (typeof circle_text_size_updating !== 'undefined') { + circle_text_size_updating = true; + } + circle_text_size.setValue(activeObj.get("fontSize") - 10); + if (typeof circle_text_size_updating !== 'undefined') { + circle_text_size_updating = false; + } } - if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter.setValue) { - circle_text_diameter.setValue(canvas.getActiveObject().get("diameter")); - } else { - $("#circle_text_diameter").next().children(".layui-slider-bar").css("width", ((canvas.getActiveObject().get("diameter") - 50) / (1100 - 50)) * 100 + "%"); - $("#circle_text_diameter").next().children(".layui-slider-handle").css("left", ((canvas.getActiveObject().get("diameter") - 50) / (1100 - 50)) * 100 + "%"); + + if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter && typeof circle_text_diameter.setValue === 'function') { + circle_text_diameter.setValue(activeObj.get("diameter") - 50); } + $("#circle_text_center").prop("checked", objs[idx - 1].circleCenter ? 'checked' : ''); - $("#circle_text_text").val(canvas.getActiveObject().get("text")); - $("#circle_text_font_family").val(canvas.getActiveObject().get("fontFamily")); + $("#circle_text_text").val(activeObj.get("text")); + $("#circle_text_font_family").val(activeObj.get("fontFamily")); - if (canvas.getActiveObject().get("underline") == true) { + if (activeObj.get("underline") == true) { $("#circle_text_underline").addClass("ui-radio-acitve") } else { $("#circle_text_underline").removeClass("ui-radio-acitve") } - if (canvas.getActiveObject().get("fontWeight") == "bold") { + if (activeObj.get("fontWeight") == "bold") { $("#circle_text_bold").addClass("ui-radio-acitve") } else { $("#circle_text_bold").removeClass("ui-radio-acitve") } - if (canvas.getActiveObject().get("fontStyle") == "italic") { + if (activeObj.get("fontStyle") == "italic") { $("#circle_text_italics").addClass("ui-radio-acitve") } else { $("#circle_text_italics").removeClass("ui-radio-acitve") } - if (canvas.getActiveObject().get("linethrough") == true) { + if (activeObj.get("linethrough") == true) { $("#circle_text_linethrough").addClass("ui-radio-acitve") } else { $("#circle_text_linethrough").removeClass("ui-radio-acitve") @@ -931,18 +931,15 @@ function handleObjectSelected(e) { // 3. 获取索引 let i = getIndex(select_obj, canvas); - - // 检查对象是否被锁定或设为背景(索引0且已锁定) - if (i === 0) { - if (select_obj.get('lockMovementX') === true || select_obj.get('selectable') === false) { - // 如果是背景图且已锁定,取消选中 - canvas.discardActiveObject(); - canvas.renderAll(); - $("#base_control, #line_control, #pic_control, #out_pic_control, #text_control, #circle_text_control, #out_text_control, #rect_control, #circle_control, #counter_control, #qrcode_Controll, #barcode_controll").hide(); - $("#component_type").text(language_str("bg")); - selectObj(-1, true); - return; - } + + // 如果不是通过对象列表选中的,且对象被锁定,则取消选中 + if (!window._selectingFromList && isObjectLocked(select_obj)) { + canvas.discardActiveObject(); + canvas.renderAll(); + $("#base_control, #line_control, #pic_control, #out_pic_control, #text_control, #circle_text_control, #out_text_control, #rect_control, #circle_control, #counter_control, #qrcode_Controll, #barcode_controll").hide(); + $("#component_type").text(language_str("bg")); + selectObj(-1, true); + return; } if (i != 0) { @@ -1026,6 +1023,61 @@ function handleObjectMoving(e) { updateControls(); } +// 辅助函数:检查对象是否被锁定 +// 只有当 lockMovementX 为 true 时才认为对象被锁定 +// selectable 为 false 可能是其他原因(如背景图),所以只检查 lockMovementX +function isObjectLocked(obj) { + if (!obj) return false; + // 主要检查 lockMovementX,这是锁定的主要标志 + return obj.get('lockMovementX') === true; +} +// 暴露到全局作用域,确保其他模块可以访问 +window.isObjectLocked = isObjectLocked; + +// 统一的 toJSON 属性列表,不包含锁定相关属性(锁定状态不应被保存) +const TO_JSON_PROPERTIES = [ + "selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "evented" +]; +// 暴露到全局作用域 +window.TO_JSON_PROPERTIES = TO_JSON_PROPERTIES; + +// 辅助函数:解锁所有对象(加载时使用) +function unlockAllObjects(canvas) { + if (!canvas) return; + const objects = canvas.getObjects(); + objects.forEach((obj, index) => { + // 背景对象(索引0)保持锁定状态 + if (index === 0) { + obj.set({ + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + lockSkewingX: true, + lockSkewingY: true, + selectable: false, + evented: false + }); + } else { + // 其他对象默认解锁 + obj.set({ + lockMovementX: false, + lockMovementY: false, + lockRotation: false, + lockScalingX: false, + lockScalingY: false, + lockSkewingX: false, + lockSkewingY: false, + selectable: true, + evented: true + }); + } + }); +} +// 暴露到全局作用域 +window.unlockAllObjects = unlockAllObjects; + // 将 handleObjectSelected 附加到 window 对象,确保全局可访问 window.handleObjectSelected = handleObjectSelected; @@ -1087,6 +1139,16 @@ function initCanvasEvents() { objs = (currentCanvas === canvas1) ? objs1 : objs2; handleObjectSelected(e); }); + // 阻止被锁定的对象被框选选中(只过滤被锁定的对象,保留未锁定的对象) + currentCanvas.on('before:selection:created', (e) => { + if (!e.targets || e.targets.length === 0) return; + // 过滤掉被锁定的对象,保留辅助线和未锁定的对象 + e.targets = e.targets.filter(target => { + if (target.isGuideLine) return true; // 保留辅助线 + return !isObjectLocked(target); // 移除被锁定的对象,保留未锁定的对象 + }); + }); + // 添加 selection 事件以确保对象选中时正确显示属性面板 currentCanvas.on('selection:created', (e) => { canvas = currentCanvas; @@ -1101,19 +1163,15 @@ function initCanvasEvents() { currentCanvas.on('object:selected', (e) => { canvas = currentCanvas; objs = (currentCanvas === canvas1) ? objs1 : objs2; - - // 阻止背景图(索引0)被选中(如果已锁定) - let selectedObj = e.target; - let idx = getIndex(selectedObj, currentCanvas); - if (idx === 0) { - let bgObj = currentCanvas.getObjects()[0]; - if (bgObj && (bgObj.get('lockMovementX') === true || bgObj.get('selectable') === false)) { - currentCanvas.discardActiveObject(); - currentCanvas.renderAll(); - return; - } + + // 如果不是通过对象列表选中的,且对象被锁定,则取消选中 + // 注意:只有真正被锁定的对象才会被取消选中,未锁定的对象应该正常选中 + if (!window._selectingFromList && e.target && isObjectLocked(e.target)) { + currentCanvas.discardActiveObject(); + currentCanvas.renderAll(); + return; } - + handleObjectSelected(e); // 更新对象列表以同步锁状态 if (typeof window.updateList === 'function') { @@ -1157,7 +1215,6 @@ function initCanvasEvents() { let objData = objs[idx - 1]; // 安全检查:确保 objData 存在且有 type 属性 if (!objData || typeof objData.type === 'undefined') { - console.warn('objData is undefined or missing type at index', idx - 1); return; } let target = event.target; @@ -1228,10 +1285,10 @@ window.updateList = function updateList() { let canvasObj = canvas.getObjects()[i + 1]; isLocked = canvasObj.get('lockMovementX') === true; } - + // 锁定状态图标 - const lockIcon = isLocked ? - '' : + const lockIcon = isLocked ? + '' : ''; // 组装 HTML @@ -1257,6 +1314,9 @@ window.updateList = function updateList() { }); } +// 标记是否通过对象列表选中(用于区分鼠标点击和列表点击) +window._selectingFromList = false; + // 将 selectObj 附加到 window 对象,确保全局可访问 window.selectObj = function selectObj(objIndices, isFromCanvas = false) { let indicesArray = (Array.isArray(objIndices)) ? objIndices : ((typeof objIndices === 'number' && objIndices >= 0) ? [objIndices] : []); @@ -1285,8 +1345,39 @@ window.selectObj = function selectObj(objIndices, isFromCanvas = false) { if (!isFromCanvas && indicesArray.length === 1) { let target = canvas.getObjects()[indicesArray[0] + 1]; if (target) { + // 检查对象是否被锁定 + let isLocked = isObjectLocked(target); + + // 设置标志位,表示这是通过对象列表选中的(无论是否锁定) + window._selectingFromList = true; + + // 如果被锁定,临时设置 selectable 和 evented 为 true,以便能够选中 + if (isLocked) { + target.set({ + selectable: true, + evented: true + }); + } + canvas.setActiveObject(target); canvas.requestRenderAll(); + + // 如果对象被锁定,选中后立即恢复锁定状态(但保持选中状态) + if (isLocked) { + setTimeout(() => { + target.set({ + selectable: false, + evented: false + }); + canvas.requestRenderAll(); + }, 0); + } + + // 清除标志位(延迟清除,确保事件处理完成) + setTimeout(() => { + window._selectingFromList = false; + }, 10); + handleObjectSelected(); } } @@ -1306,7 +1397,8 @@ window.recordState = function recordState() { currentRecordJson.pop(); } currentRecordObjs.push(JSON.stringify(currentObjs)) - let j = currentCanvas.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + // 保存所有锁定相关的属性,确保锁定状态可以正确恢复 + let j = currentCanvas.toJSON(TO_JSON_PROPERTIES); j.objects[0].hoverCursor = "default"; currentRecordJson.push(j); }; @@ -1321,7 +1413,6 @@ window.getIndex = function getIndex(target, _canvas = null) { // 使用 window.canvas 作为默认值,确保在 eval() 执行时也能访问 const currentCanvas = _canvas || window.canvas || canvas; if (!currentCanvas) { - console.error('getIndex: canvas is undefined'); return 0; } temp_objs = currentCanvas.getObjects(); @@ -1487,7 +1578,7 @@ function addBackground() { canvas2.renderAll() recordObjs2.push(JSON.stringify(objs2)) - recordJson2.push(canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])) + recordJson2.push(canvas2.toJSON(TO_JSON_PROPERTIES)) let file = GetFile().get('file') if (file && file != 'empty') { @@ -1909,12 +2000,16 @@ var circle_text_size = slider.render({ max: 120, value: 50, change: function (value) { - if (circle_text_size_updating) return; // 如果正在更新slider,跳过change事件 - if (canvas.getActiveObject()) { + if (circle_text_size_updating) return; + if (canvas && canvas.getActiveObject && canvas.getActiveObject()) { canvas.getActiveObject().set('fontSize', value); canvas.renderAll(); - updateControls(); - recordState(); + if (typeof updateControls === 'function') { + updateControls(); + } + if (typeof recordState === 'function') { + recordState(); + } } } }); @@ -1925,11 +2020,15 @@ var circle_text_diameter = slider.render({ max: 1100, value: 500, change: function (value) { - if (canvas.getActiveObject()) { + if (canvas && canvas.getActiveObject && canvas.getActiveObject()) { canvas.getActiveObject().set('diameter', value); canvas.renderAll(); - updateControls(); - recordState(); + if (typeof updateControls === 'function') { + updateControls(); + } + if (typeof recordState === 'function') { + recordState(); + } } } }); @@ -2030,17 +2129,14 @@ window.savePdf = async function savePdf(buffer) { }); if (canceled) { - console.log('用户取消了保存操作'); return; } // 将Buffer写入PDF文件到用户选择的路径 fs.writeFile(filePath, buffer, (err) => { if (err) { - console.error('写入文件失败:', err); } else { layer.msg(language_str("saveSucc") + filePath);//'保存成功至' - console.log('PDF文件已保存至:', filePath); } }); }; diff --git a/lib/design2/output.js b/lib/design2/output.js index 7be7afb..e957e3f 100644 --- a/lib/design2/output.js +++ b/lib/design2/output.js @@ -346,8 +346,6 @@ window.display_func = function display_func(img1, img2, img3) { // 只处理导出(保存PDF) if (typeof window.savePdf === 'function') { window.savePdf(Buffer.from(pdfBuffer)); - } else { - console.error('savePdf 函数未定义!'); } }, btn2: function () { @@ -1045,8 +1043,9 @@ function saveAs(op1, callback) { } }) - let j = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) - let b = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) + const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented']; + let j = canvas1.toJSON(props) + let b = canvas2.toJSON(props) // 恢复辅助线 guideLines1.forEach(obj => canvas1.add(obj)) @@ -1112,8 +1111,9 @@ function save(op1, callback) { } }) - let j = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) - let b = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) + const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented']; + let j = canvas1.toJSON(props) + let b = canvas2.toJSON(props) // 恢复辅助线 guideLines1.forEach(obj => canvas1.add(obj)) @@ -1248,15 +1248,31 @@ window.openFile = function open(file) { // 加载 JSON,并在回调中重新生成二维码和条形码 canvas1.loadFromJSON(j.f, function () { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas1); + } if (typeof window.regenerateQrCodesAndBarcodes === 'function') { window.regenerateQrCodesAndBarcodes(canvas1, fo); } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } canvas1.renderAll() }) canvas2.loadFromJSON(j.b, function () { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas2); + } if (typeof window.regenerateQrCodesAndBarcodes === 'function') { window.regenerateQrCodesAndBarcodes(canvas2, bo); } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } canvas2.renderAll() }) background_image1 = canvas1.getObjects()[0] @@ -1296,19 +1312,18 @@ window.openFile = function open(file) { setTimeout(() => { if (typeof window.updateList === 'function') { window.updateList(); - } else { - console.error('[open函数] ❌ updateList 函数未定义!'); } }, 100); } setTimeout(() => { recordObjs1.push(JSON.stringify(objs1)) - let j1 = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) + const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented']; + let j1 = canvas1.toJSON(props) j1.objects[0].hoverCursor = 'default' recordJson1.push(j1) recordObjs2.push(JSON.stringify(objs2)) - let j2 = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) + let j2 = canvas2.toJSON(props) j2.objects[0].hoverCursor = 'default' recordJson2.push(j2) }, 0) @@ -1359,12 +1374,9 @@ function clearAll() { setTimeout(() => { if (typeof window.updateList === 'function') { window.updateList(); - } else { - console.error('[clearAll] ❌ updateList 函数未定义!'); } }, 100); } - console.log() } // 将 clearAll 附加到 window 对象,确保全局可访问 diff --git a/lib/design2/ui.js b/lib/design2/ui.js index fc7d430..f7b97ce 100644 --- a/lib/design2/ui.js +++ b/lib/design2/ui.js @@ -79,14 +79,14 @@ $('body').keydown(function (event) { window.pasteFromClipboard(); return; } - // CTRL/CMD+SHIFT+DEL - 清空 - if (isModifierKey && event.shiftKey && event.keyCode == 46) { + // CTRL/CMD+SHIFT+DEL (Windows) 或 CMD+SHIFT+Backspace (Mac) - 清空 + if (isModifierKey && event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) { event.preventDefault(); $('#clean').click(); return; } - // CTRL/CMD+DEL - 删除 - if (isModifierKey && !event.shiftKey && event.keyCode == 46) { + // CTRL/CMD+DEL (Windows) 或 CMD+Backspace (Mac) - 删除 + if (isModifierKey && !event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) { event.preventDefault(); $('#delete').click(); return; @@ -156,17 +156,24 @@ $('body').keydown(function (event) { } if (event.keyCode == 40) { //down - let v = +1 + let v = 1; if (_keyctrl || event.ctrlKey || event.metaKey) { - v = 5 + v = 5; } - if (canvas.getActiveObject()) { - let y = canvas.getActiveObject().get('top') - y += v - canvas.getActiveObject().set('top', y) - canvas.renderAll() - recordState() - updateControls() + const currentCanvas = window.canvas || canvas; + if (currentCanvas && currentCanvas.getActiveObject()) { + let y = currentCanvas.getActiveObject().get('top'); + y += v; + currentCanvas.getActiveObject().set('top', y); + currentCanvas.renderAll(); + if (typeof window.recordState === 'function') { + window.recordState(); + } else if (typeof recordState === 'function') { + recordState(); + } + if (typeof updateControls === 'function') { + updateControls(); + } } } // 普通删除键(DEL键,没有按CTRL/CMD) @@ -175,7 +182,6 @@ $('body').keydown(function (event) { const currentCanvas = window.canvas || canvas; const currentObjs = window.objs || objs; if (!currentCanvas) { - console.error('canvas is undefined in delete handler'); return; } let actObjs = currentCanvas.getActiveObjects() @@ -194,10 +200,14 @@ $('body').keydown(function (event) { } currentCanvas.discardActiveObject() if (flag == 1) { - recordState() - canvas.renderAll() + if (typeof window.recordState === 'function') { + window.recordState(); + } else if (typeof recordState === 'function') { + recordState(); + } + currentCanvas.renderAll(); if (typeof window.handleObjectSelected === 'function') { - window.handleObjectSelected() + window.handleObjectSelected(); } } } @@ -607,7 +617,7 @@ $('#center_y_alignment').click(function () { let itemMaxY = getCoordsMaxY(coords) if (itemMinY < minTop) minTop = itemMinY if (itemMaxY > maxBottom) maxBottom = itemMaxY - } + } let groupCenterY = (minTop + maxBottom) / 2 // 将所有对象对齐到中心Y值 groupItems = [] @@ -754,7 +764,7 @@ $('#center_x_alignment').click(function () { let itemMaxX = getCoordsMaxX(coords) if (itemMinX < minLeft) minLeft = itemMinX if (itemMaxX > maxRight) maxRight = itemMaxX - } + } let groupCenterX = (minLeft + maxRight) / 2 // 将所有对象对齐到中心X值 groupItems = [] @@ -893,20 +903,40 @@ $('#previous').click(function () { if ($('#front_side').hasClass('ui-button-active')) { // 使用 recordJson1 和 recordObjs1 if (recordJson1 && recordJson1[step.val]) { - canvas.loadFromJSON(recordJson1[step.val]) + canvas.loadFromJSON(recordJson1[step.val], function() { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas); + } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } + canvas.renderAll(); + }) } if (recordObjs1 && recordObjs1[step.val]) { objs1 = JSON.parse(recordObjs1[step.val]) - objs = objs1 + objs = objs1 } } else if ($('#back_side').hasClass('ui-button-active')) { // 使用 recordJson2 和 recordObjs2 if (recordJson2 && recordJson2[step.val]) { - canvas.loadFromJSON(recordJson2[step.val]) + canvas.loadFromJSON(recordJson2[step.val], function() { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas); + } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } + canvas.renderAll(); + }) } if (recordObjs2 && recordObjs2[step.val]) { objs2 = JSON.parse(recordObjs2[step.val]) - objs = objs2 + objs = objs2 } } @@ -938,7 +968,7 @@ $('#next').click(function () { // 根据当前是正面还是背面检查对应的 recordObjs 长度 if ($('#front_side').hasClass('ui-button-active')) { if (step.val >= recordObjs1.length - 1) { - return + return } } else if ($('#back_side').hasClass('ui-button-active')) { if (step.val >= recordObjs2.length - 1) { @@ -950,20 +980,40 @@ $('#next').click(function () { if ($('#front_side').hasClass('ui-button-active')) { // 使用 recordJson1 和 recordObjs1 if (recordJson1 && recordJson1[step.val]) { - canvas.loadFromJSON(recordJson1[step.val]) + canvas.loadFromJSON(recordJson1[step.val], function() { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas); + } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } + canvas.renderAll(); + }) } if (recordObjs1 && recordObjs1[step.val]) { objs1 = JSON.parse(recordObjs1[step.val]) - objs = objs1 + objs = objs1 } } else if ($('#back_side').hasClass('ui-button-active')) { // 使用 recordJson2 和 recordObjs2 if (recordJson2 && recordJson2[step.val]) { - canvas.loadFromJSON(recordJson2[step.val]) + canvas.loadFromJSON(recordJson2[step.val], function() { + // 加载后解锁所有对象(背景除外) + if (typeof window.unlockAllObjects === 'function') { + window.unlockAllObjects(canvas); + } + // 加载后更新列表和图标显示 + if (typeof window.updateList === 'function') { + window.updateList(); + } + canvas.renderAll(); + }) } if (recordObjs2 && recordObjs2[step.val]) { objs2 = JSON.parse(recordObjs2[step.val]) - objs = objs2 + objs = objs2 } } background_image = canvas.getObjects()[0] @@ -1200,7 +1250,7 @@ $('#lock').off('click').on('click', function (e) { let isLocked = obj.get('lockMovementX') === true; let shouldLock = !isLocked; - // 锁定/解锁所有编辑操作,锁定后不可选中 + // 锁定/解锁所有编辑操作,但保持选中状态(不取消选中) obj.set({ lockMovementX: shouldLock, lockMovementY: shouldLock, @@ -1209,29 +1259,23 @@ $('#lock').off('click').on('click', function (e) { lockScalingY: shouldLock, lockSkewingX: shouldLock, lockSkewingY: shouldLock, - // 锁定时不可选中,解锁时可选中 + // 锁定时不可选中,解锁时可选中(但保持当前选中状态) selectable: !shouldLock, evented: !shouldLock }); if (shouldLock) { $('#lock_img').attr('src', 'public/images/lock20.png') //已锁定 - // 锁定后取消选中 - canvas.discardActiveObject(); - canvas.renderAll(); - // 锁定后不需要调用 updateControls,因为已经没有选中对象了 } else { $('#lock_img').attr('src', 'public/images/unlock20.png') //已解锁 - // 解锁后更新控件 - updateControls(); } + // 更新控件(保持选中状态,所以可以更新) + updateControls(); recordState() // 更新对象列表以同步锁状态 if (typeof window.updateList === 'function') { window.updateList(); } - if (!shouldLock) { - canvas.renderAll(); - } + canvas.renderAll(); }) $('#text_back_transparent').click(function () { canvas.getActiveObject().set('textBackgroundColor', '') @@ -1376,12 +1420,9 @@ $('#open').click(function () { // 调用 output.js 中的 openFile 函数 if (typeof window.openFile === 'function') { window.openFile(filePath); - } else { - console.error('openFile 函数未定义!'); } }) .catch((err) => { - console.log(err); }) } }) @@ -1423,7 +1464,8 @@ function addBackground() { //pre_objs1.push(JSON.stringify(objs1)); recordObjs1.push(JSON.stringify(objs1)) - recordJson1.push(canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])) + const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented']; + recordJson1.push(canvas1.toJSON(props)) }) // 类型改变 fabric.Image.fromURL('./public/images/bg_back_2.png', function (image) { @@ -1441,14 +1483,13 @@ function addBackground() { //pre_objs2.push(JSON.stringify(objs2)); recordObjs2.push(JSON.stringify(objs2)) - recordJson2.push(canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])) + const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented']; + recordJson2.push(canvas2.toJSON(props)) let file = GetFile().get('file') if (file && file != 'empty') { if (typeof window.openFile === 'function') { window.openFile(file); - } else { - console.error('openFile 函数未定义!'); } } }) @@ -1521,15 +1562,11 @@ function selectPic(target, index) { let activeObj = canvas.getActiveObject(); - // 检查对象是否被锁定或设为背景(索引0且已锁定) - let idx = getIndex(activeObj, canvas); - if (idx === 0) { - // 如果是背景图且已锁定,不应该显示图片控件 - if (activeObj.get('lockMovementX') === true || activeObj.get('selectable') === false) { - canvas.discardActiveObject(); - canvas.renderAll(); - return; - } + // 检查对象是否被锁定 + if (isObjectLocked(activeObj)) { + canvas.discardActiveObject(); + canvas.renderAll(); + return; } //透明度 @@ -2128,7 +2165,8 @@ function recordState() { } //recordObjs.splice(step.val, 1, JSON.stringify(objs)) recordObjs.push(JSON.stringify(objs)) - j = canvas.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) + const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY', 'lockSkewingX', 'lockSkewingY', 'evented']; + j = canvas.toJSON(props) j.objects[0].hoverCursor = 'default' recordJson.push(j) } @@ -2698,7 +2736,6 @@ $("#about").click(async function () { version = "v" + v; // 拼接一个 v,变成 v2.3.017 } } catch (e) { - console.error("获取版本号失败", e); } // 2. 获取成功后再弹出窗口 @@ -2750,721 +2787,52 @@ $("#output").click(function () { window.output(null, saveAs); // 调用output函数,使用saveAs进行另存为 } }); -function handleObjectSelected() { - let select_obj = canvas.getActiveObject() - if (!select_obj) { - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#circle_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() - $('#component_type').text(language_str('bg')) //comfirm - return - } - - // 如果是辅助线,直接返回,不处理 - if (select_obj.isGuideLine) { - return - } - - let i = getIndex(select_obj) - if (i != 0) { - //不是背景 - --i - - // 安全检查:确保 objs[i] 存在且有 type 属性 - if (!objs[i] || typeof objs[i].type === 'undefined') { - return - } - - switch (objs[i].type) { - case 1: - //console.log("图片"); - $('#component_type').text(language_str('img')) //"图片" - selectObject(select_obj, i) - selectPic(select_obj, i) - break - case 2: - //console.log("预留图片"); - - $('#component_type').text(language_str('simg')) //"合成图片" - selectObject(select_obj, i) - selectOutPic(select_obj, i) - break - case 3: - $('#component_type').text(language_str('text')) //"文字" - //console.log("文字"); - selectObject(select_obj, i) - selectText(select_obj, i) - break - case 4: - //console.log("标签"); - - $('#component_type').text(language_str('stext')) //"合成文字" - selectObject(select_obj, i) - selectOutText(select_obj, i) - break - case 5: - //console.log("矩形"); - - $('#component_type').text(language_str('rect')) //"矩形" - selectObject(select_obj, i) - selectRect(select_obj, i) - break - case 6: - //console.log("圆形"); - - $('#component_type').text(language_str('circ')) //"圆形" - selectObject(select_obj, i) - selectCircle(select_obj, i) - break - case 7: - //console.log("直线"); - - $('#component_type').text(language_str('line')) //"直线" - selectObject(select_obj, i) - selectLine(select_obj, i) - break - case 8: - //console.log("二维码"); - - $('#component_type').text(language_str('qrc')) //"二维码" - selectObject(select_obj, i) - selectQrCode(select_obj, i) - break - case 9: - //console.log("条形码"); - - $('#component_type').text(language_str('barc')) //"条形码" - selectObject(select_obj, i) - selectBarCode(select_obj, i) - break - case 10: - //console.log("计数器"); - - $('#component_type').text(language_str('counter')) //"计数器" - selectObject(select_obj, i) - selectCounter(select_obj, i) - break - case 11: - - $("#component_type").text(language_str("ctext"));//"圆形文字" - //console.log("圆形文字"); - selectObject(select_obj, i); - selectCircleText(select_obj, i); - break; - } - } else { - //背景,收起对象属性 - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#circle_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() - $('#component_type').text(language_str('bg')) - } -} // 防止重复初始化事件监听器 if (typeof window._design2CanvasEventsInitialized === 'undefined') { window._design2CanvasEventsInitialized = true; - canvas1.on('mouse:move', (e) => { - if (!e.pointer || typeof background_image === 'undefined' || !background_image) return; - let width = canvas.getWidth() - let height = canvas.getHeight() - $('#posText').text( - 'X: ' + (e.pointer.x - (width / 2 - (width / 2 - background_image.left) * zoom)).toFixed(0) + ' Y: ' + (e.pointer.y - (height / 2 - (height / 2 - background_image.top) * zoom)).toFixed(0) - ) - }) - canvas1.on("object:moving", function (e) { - let obj = canvas1.getActiveObject() - let idx = getIndex(e.target, canvas1); - // 添加边界检查,避免访问 undefined - if (idx > 0 && idx <= objs1.length && objs1[idx - 1] && objs1[idx - 1].type && objs1[idx - 1].type === 11 && $("#circle_text_center").prop("checked")) { - let pointer = { - x: obj.left, - y: obj.top - } - let distance = getDisdance(pointer.x, pointer.y, canvas1.width / 2, canvas1.height / 2) - let angleDeg = getDeg(pointer) - let flipped = pointer.y > canvas1.height / 2 ? true : false - if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter.setValue) { - circle_text_diameter.setValue(distance * 2 - 50); - } - obj.set("diameter", distance * 2); - obj.set("angle", angleDeg); - obj.set("flipped", flipped); - } - updateControls(); - }); - canvas1.on('object:scaling', function (event) { - updateControls(); - }) - canvas1.on('object:rotating', function (e) { - updateControls() - }) - canvas1.on('object:rotated', function (e) { - recordState() - }) - canvas1.on('object:added', function (e) { - //recordState(); - }) - canvas1.on('mouse:down', (e) => { - //单选 - canvas = canvas1; - objs = objs1; - let select_obj = canvas.getActiveObject() +// 所有 canvas 事件已在 core.js 的 initCanvasEvents() 中统一处理,这里不再重复监听 +// 如果需要 canvas1 特定的 mouse:move 处理,可以在这里添加 +canvas1.on('mouse:move', (e) => { + if (!e.pointer || typeof background_image === 'undefined' || !background_image) return; + let width = canvas.getWidth() + let height = canvas.getHeight() + $('#posText').text( + 'X: ' + (e.pointer.x - (width / 2 - (width / 2 - background_image.left) * zoom)).toFixed(0) + ' Y: ' + (e.pointer.y - (height / 2 - (height / 2 - background_image.top) * zoom)).toFixed(0) + ) +}) +// 注意:以下事件已在 core.js 的 initCanvasEvents() 中统一处理,移除重复监听以避免冲突: +// - mouse:down (通过 handleObjectSelected 处理) +// - object:scaling, object:rotating, object:rotated +// - text:editing:entered, text:editing:exited +// - object:modified (已在 core.js 中处理) +// - mouse:up (已在 core.js 中处理) +// 如果需要 canvas1 特定的处理逻辑,请修改 core.js 中的相应函数 - // 如果是辅助线,直接返回,不处理 - if (select_obj && select_obj.isGuideLine) { - return - } - - let i = getIndex(select_obj, canvas) - if (i != 0) { - //不是背景 - --i - - // 安全检查:确保 objs[i] 存在且有 type 属性 - if (!objs[i] || typeof objs[i].type === 'undefined') { - return - } - - switch (objs[i].type) { - case 1: - $('#component_type').text(language_str('img')) - selectObject(select_obj, i) - selectPic(select_obj, i) - break - case 2: - $('#component_type').text(language_str('simg')) - selectObject(select_obj, i) - selectOutPic(select_obj, i) - break - case 3: - $('#component_type').text(language_str('text')) - selectObject(select_obj, i) - selectText(select_obj, i) - break - case 4: - $('#component_type').text(language_str('stext')) - selectObject(select_obj, i) - selectOutText(select_obj, i) - break - case 5: - $('#component_type').text(language_str('rect')) - selectObject(select_obj, i) - selectRect(select_obj, i) - break - case 6: - $('#component_type').text(language_str('circ')) - selectObject(select_obj, i) - selectCircle(select_obj, i) - break - case 7: - $('#component_type').text(language_str('line')) - selectObject(select_obj, i) - selectLine(select_obj, i) - break - case 8: - $('#component_type').text(language_str('qrc')) - selectObject(select_obj, i) - selectQrCode(select_obj, i) - break - case 9: - $('#component_type').text(language_str('barc')) - selectObject(select_obj, i) - selectBarCode(select_obj, i) - break - case 10: - $('#component_type').text(language_str('counter')) - selectObject(select_obj, i) - selectCounter(select_obj, i) - break - case 11: - $("#component_type").text(language_str("ctext")); - selectObject(select_obj, i); - selectCircleText(select_obj, i); - break; - } - selectObj(i, true) - } else { - //背景,收起对象属性 - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#circle_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() - $('#counter_control').hide() - selectObj(-1) - $('#component_type').text(language_str('bg')) - } - }) - canvas1.on('text:editing:entered', function () { - _textEdit = true - }) - canvas1.on('text:editing:exited', function () { - _textEdit = false - }) - canvas1.on('object:modified', function (event) { - if (canvas1.getActiveObjects().length > 1) { - return - } - - // 跳过辅助线 - if (event.target.isGuideLine) { - return - } - - let idx = getIndex(event.target, canvas1); - if (idx <= 0) return; - - // 安全检查:确保 objs[idx - 1] 存在且有 type 属性 - if (!objs[idx - 1] || typeof objs[idx - 1].type === 'undefined') { - return - } - - if (objs[idx - 1].type == 3) { - event.target.fontSize *= event.target.scaleX - event.target.fontSize = event.target.fontSize.toFixed(0) - event.target.scaleX = 1 - event.target.scaleY = 1 - event.target._clearCache() - canvas1.renderAll() - updateControls() - } else if (objs[idx - 1].type == 4) { - event.target.fontSize *= event.target.scaleX - event.target.fontSize = event.target.fontSize.toFixed(0) - event.target.scaleX = 1 - event.target.scaleY = 1 - event.target._clearCache() - canvas1.renderAll() - } else if (objs[idx - 1].type == 10) { - event.target.fontSize *= event.target.scaleX - event.target.fontSize = event.target.fontSize.toFixed(0) - event.target.scaleX = 1 - event.target.scaleY = 1 - event.target._clearCache() - canvas1.renderAll() - } else if (objs[idx - 1].type == 5) { - canvas1.getActiveObject().set('width', canvas1.getActiveObject().get('width') * canvas1.getActiveObject().get('scaleX')) - canvas1.getActiveObject().set('height', canvas1.getActiveObject().get('height') * canvas1.getActiveObject().get('scaleY')) - canvas1.getActiveObject().set('scaleX', 1) - canvas1.getActiveObject().set('scaleY', 1) - updateControls() - } - recordState() - }) - canvas1.on('mouse:up', (e) => { - canvas = canvas1; - objs = objs1; - switch (addState) { - case 1: - addPic(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addPic').css('background-color', '') - break - case 2: - addOutPic(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addOutPic').css('background-color', '') - break - case 3: - addText(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addText').css('background-color', '') - break - case 4: - addOutText(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addOutText').css('background-color', '') - break - case 5: - addRect(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addRect').css('background-color', '') - break - case 6: - addCircle(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addCircle').css('background-color', '') - break - case 7: - addLine(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addLine').css('background-color', '') - break - case 8: - addQrCode(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addQrCode').css('background-color', '') - break - case 9: - addBarCode(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas1.renderAll() - $('#addBarCode').css('background-color', '') - break - case 10: - addCounter(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - $('#addCounter').css('background-color', '') - break - case 11: - addCircleText(e.pointer); - addState = 0; - background_image.hoverCursor = "default"; - canvas1.renderAll(); - $("#addCircleText").css("background-color", ""); - break; - } - }) - canvas1.on('text:changed', (e) => { - $('#text_text').val(e.target.get('text')) - }) - canvas1.on('after:render', function () { - if (is_bgi_add) { - var image = document.getElementById('source_front') - ctx1.drawImage(image, (canvas.width - $('#source_front').width()) / 2, (canvas.height - $('#source_front').height()) / 2, $('#source_front').width(), $('#source_front').height()) - } - }) - canvas2.on('text:editing:entered', function () { - _textEdit = true - }) - canvas2.on('text:editing:exited', function () { - _textEdit = false - }) - canvas2.on('after:render', function () { - if (is_bgi_add) { - var image = document.getElementById('source_back') - ctx2.drawImage(image, (canvas.width - $('#source_back').width()) / 2, (canvas1.height - $('#source_back').height()) / 2, $('#source_back').width(), $('#source_back').height()) - } - }) - canvas2.on('mouse:move', (e) => { - if (!e.pointer || typeof background_image === 'undefined' || !background_image) return; - canvas = canvas2; - objs = objs2; - $('#posText').text('X: ' + (e.pointer.x - background_image.left).toFixed(0) + ' Y: ' + (e.pointer.y - background_image.top).toFixed(0)) - }) - canvas2.on("object:moving", function (e) { - canvas = canvas2; - objs = objs2; - let obj = canvas2.getActiveObject() - let idx = getIndex(e.target, canvas2); - // 添加边界检查,避免访问 undefined - if (idx > 0 && idx <= objs2.length && objs2[idx - 1] && objs2[idx - 1].type && objs2[idx - 1].type === 11 && $("#circle_text_center").prop("checked")) { - let pointer = { - x: obj.left, - y: obj.top - } - let distance = getDisdance(pointer.x, pointer.y, canvas2.width / 2, canvas2.height / 2) - // 计算角度时需要使用 canvas2 - let centerX = canvas2.width / 2; - let centerY = canvas2.height / 2; - let mouseX = pointer.x; - let mouseY = pointer.y; - let dx = mouseX - centerX; - let dy = mouseY - centerY; - let angleRad = Math.atan2(dy, dx); - let angleDeg = angleRad * (180 / Math.PI); - if (angleDeg < 0) { - angleDeg += 360; - } - angleDeg += 90; - let flipped = pointer.y > canvas2.height / 2 ? true : false - if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter.setValue) { - circle_text_diameter.setValue(distance * 2 - 50); - } - obj.set("diameter", distance * 2); - obj.set("angle", angleDeg); - obj.set("flipped", flipped); - } - updateControls(); - }); - canvas2.on('object:scaling', function (e) { - canvas = canvas2; - objs = objs2; - updateControls() - }) - canvas2.on('object:rotating', function (e) { - canvas = canvas2; - objs = objs2; - updateControls() - }) - canvas2.on('object:rotated', function (e) { - canvas = canvas2; - objs = objs2; - recordState() - }) - canvas2.on('object:added', function (e) { - //recordState(); - }) - canvas2.on('mouse:down', (e) => { - //单选 - canvas = canvas2; - objs = objs2; - let select_obj = canvas.getActiveObject() - - // 如果是辅助线,直接返回,不处理 - if (select_obj && select_obj.isGuideLine) { - return - } - - let i = getIndex(select_obj, canvas) - if (i != 0) { - //不是背景 - --i - - // 安全检查:确保 objs[i] 存在且有 type 属性 - if (!objs[i] || typeof objs[i].type === 'undefined') { - return - } - - switch (objs[i].type) { - case 1: - $('#component_type').text(language_str('img')) - selectObject(select_obj, i) - selectPic(select_obj, i) - break - case 2: - $('#component_type').text(language_str('simg')) - selectObject(select_obj, i) - selectOutPic(select_obj, i) - break - case 3: - $('#component_type').text(language_str('text')) - selectObject(select_obj, i) - selectText(select_obj, i) - break - case 4: - $('#component_type').text(language_str('stext')) - selectObject(select_obj, i) - selectOutText(select_obj, i) - break - case 5: - $('#component_type').text(language_str('rect')) - selectObject(select_obj, i) - selectRect(select_obj, i) - break - case 6: - $('#component_type').text(language_str('circ')) - selectObject(select_obj, i) - selectCircle(select_obj, i) - break - case 7: - $('#component_type').text(language_str('line')) - selectObject(select_obj, i) - selectLine(select_obj, i) - break - case 8: - $('#component_type').text(language_str('qrc')) - selectObject(select_obj, i) - selectQrCode(select_obj, i) - break - case 9: - $('#component_type').text(language_str('barc')) - selectObject(select_obj, i) - selectBarCode(select_obj, i) - break - case 10: - $('#component_type').text(language_str('counter')) - selectObject(select_obj, i) - selectCounter(select_obj, i) - break - case 11: - $("#component_type").text(language_str("ctext")); - selectObject(select_obj, i); - selectCircleText(select_obj, i); - break; - } - selectObj(i, true) - } else { - //背景,收起对象属性 - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#circle_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() - $('#counter_control').hide() - selectObj(-1) - $('#component_type').text(language_str('bg')) - } - }) - canvas2.on('object:modified', function (event) { - canvas = canvas2; - objs = objs2; - if (canvas.getActiveObjects().length > 1) { - return - } - - // 跳过辅助线 - if (event.target.isGuideLine) { - return - } - - let idx = getIndex(event.target, canvas2); - if (idx <= 0) return; - - // 安全检查:确保 objs[idx - 1] 存在且有 type 属性 - if (!objs[idx - 1] || typeof objs[idx - 1].type === 'undefined') { - return - } - - if (objs[idx - 1].type == 3) { - event.target.fontSize *= event.target.scaleX - event.target.fontSize = event.target.fontSize.toFixed(0) - event.target.scaleX = 1 - event.target.scaleY = 1 - event.target._clearCache() - canvas2.renderAll() - } else if (objs[idx - 1].type == 4) { - event.target.fontSize *= event.target.scaleX - event.target.fontSize = event.target.fontSize.toFixed(0) - event.target.scaleX = 1 - event.target.scaleY = 1 - event.target._clearCache() - canvas2.renderAll() - } else if (objs[idx - 1].type == 10) { - event.target.fontSize *= event.target.scaleX - event.target.fontSize = event.target.fontSize.toFixed(0) - event.target.scaleX = 1 - event.target.scaleY = 1 - event.target._clearCache() - canvas2.renderAll() - } else if (objs[idx - 1].type == 5) { - canvas2.getActiveObject().set('width', canvas2.getActiveObject().get('width') * canvas2.getActiveObject().get('scaleX')) - canvas2.getActiveObject().set('height', canvas2.getActiveObject().get('height') * canvas2.getActiveObject().get('scaleY')) - canvas2.getActiveObject().set('scaleX', 1) - canvas2.getActiveObject().set('scaleY', 1) - updateControls() - } - recordState() - }) - canvas2.on('mouse:up', (e) => { - canvas = canvas2; - objs = objs2; - switch (addState) { - case 1: - addPic(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addPic').css('background-color', '') - break - case 2: - addOutPic(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addOutPic').css('background-color', '') - break - case 3: - addText(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addText').css('background-color', '') - break - case 4: - addOutText(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addOutText').css('background-color', '') - break - case 5: - addRect(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addRect').css('background-color', '') - break - case 6: - addCircle(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addCircle').css('background-color', '') - break - case 7: - addLine(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addLine').css('background-color', '') - break - case 8: - addQrCode(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addQrCode').css('background-color', '') - break - case 9: - addBarCode(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - canvas2.renderAll() - $('#addBarCode').css('background-color', '') - break - case 10: - addCounter(e.pointer) - addState = 0 - background_image.hoverCursor = 'default' - $('#addCounter').css('background-color', '') - break - case 11: - addCircleText(e.pointer); - addState = 0; - background_image.hoverCursor = "default"; - canvas2.renderAll(); - $("#addCircleText").css("background-color", ""); - break; - } - }) +// 保留 canvas1 特定的 after:render 处理 +canvas1.on('after:render', function () { + if (is_bgi_add) { + var image = document.getElementById('source_front') + ctx1.drawImage(image, (canvas.width - $('#source_front').width()) / 2, (canvas.height - $('#source_front').height()) / 2, $('#source_front').width(), $('#source_front').height()) + } +}) +// 保留 canvas1 特定的 text:changed 处理 +canvas1.on('text:changed', (e) => { + $('#text_text').val(e.target.get('text')) +}) +// 保留 canvas2 特定的 after:render 处理 +canvas2.on('after:render', function () { + if (is_bgi_add) { + var image = document.getElementById('source_back') + ctx2.drawImage(image, (canvas.width - $('#source_back').width()) / 2, (canvas1.height - $('#source_back').height()) / 2, $('#source_back').width(), $('#source_back').height()) + } +}) +// 注意:以下事件已在 core.js 的 initCanvasEvents() 中统一处理,移除重复监听以避免冲突: +// - mouse:down (通过 handleObjectSelected 处理) +// - mouse:up (已在 core.js 中处理) +// - object:scaling, object:rotating, object:rotated, object:added +// - text:editing:entered, text:editing:exited +// - object:modified (已在 core.js 中处理) +// 如果需要 canvas2 特定的处理逻辑,请修改 core.js 中的相应函数 }