From 50ff0d347ad0043c12581b68984805c0e1b053b2 Mon Sep 17 00:00:00 2001 From: 24kycj <1637269896@qq.com> Date: Fri, 12 Dec 2025 00:10:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + README.md | 160 + design1.html | 47 +- design2.html | 49 +- index.html | 47 +- lib/cpp_draw.jsc | Bin 182520 -> 0 bytes lib/design1.js | 632 +- lib/design1/core.js | 1187 +--- lib/design1/output.js | 517 +- lib/design1/ui.js | 4430 +++++++------- lib/design2.js | 334 +- lib/design2/core.js | 1213 +--- lib/design2/output.js | 247 +- lib/design2/ui.js | 6743 +++++++++++----------- lib/difxapi.dl | 21 - lib/difxapi.jsc | 21 - lib/directx9.dl | Bin 12192 -> 0 bytes lib/directx9.jsc | Bin 11672 -> 0 bytes lib/drfwsfg.jsc | Bin 189472 -> 0 bytes lib/drwsfg.dl | Bin 208736 -> 0 bytes lib/drwssd.dl | Bin 209696 -> 0 bytes lib/drwssd.jsc | Bin 11672 -> 0 bytes lib/module-map.json | 28 + main.js | 64 +- package.json | 34 +- public/js/guideLines1.js | 50 +- public/js/guideLines2.js | 50 +- scripts/encrypt/README.md | 116 + scripts/encrypt/cleanup-jsc.js | 95 + scripts/encrypt/cleanup.js | 162 + scripts/encrypt/encrypt-electron-win.bat | 8 + scripts/encrypt/encrypt-electron.js | 154 + scripts/encrypt/encrypt-electron.sh | 14 + scripts/encrypt/restore.js | 126 + 34 files changed, 8669 insertions(+), 7884 deletions(-) create mode 100644 README.md delete mode 100644 lib/cpp_draw.jsc delete mode 100644 lib/difxapi.dl delete mode 100644 lib/difxapi.jsc delete mode 100644 lib/directx9.dl delete mode 100644 lib/directx9.jsc delete mode 100644 lib/drfwsfg.jsc delete mode 100644 lib/drwsfg.dl delete mode 100644 lib/drwssd.dl delete mode 100644 lib/drwssd.jsc create mode 100644 lib/module-map.json create mode 100644 scripts/encrypt/README.md create mode 100644 scripts/encrypt/cleanup-jsc.js create mode 100644 scripts/encrypt/cleanup.js create mode 100644 scripts/encrypt/encrypt-electron-win.bat create mode 100644 scripts/encrypt/encrypt-electron.js create mode 100644 scripts/encrypt/encrypt-electron.sh create mode 100644 scripts/encrypt/restore.js diff --git a/.gitignore b/.gitignore index aff3308..61ee0a4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,7 @@ npm-debug.log npm-debug.log.* thumbs.db !.gitkeep + +# 加密相关文件(不要提交到 Git) +*.jsc +.backup/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..50e299e --- /dev/null +++ b/README.md @@ -0,0 +1,160 @@ +# SoonDesign 设计工具 + +简单易用的桌面设计软件,支持光盘和卡片模板设计。 + +--- + +## 🚀 快速开始 + +### 第一次使用 + +```bash +# 1. 安装依赖(只需一次) +npm install + +# 2. 启动程序 +npm start +``` + +> **前置要求**:需要安装 [Node.js](https://nodejs.org/)(推荐 16 或更高版本) + +--- + +## 📦 发布流程(傻瓜式操作) + +### 方式一:一键发布 ⭐ 推荐 + +```bash +# Windows 系统 +npm run release:win + +# Mac 系统 +npm run release:mac + +# Linux 系统 +npm run release:linux +``` + +✅ **自动完成**:加密 → 测试 → 清理 → 打包 +✅ **安装包位置**:`build` 文件夹 + +--- + +### 方式二:分步操作(手动控制) + +#### 步骤 1:加密代码 + +```bash +npm run encrypt:win # Windows +npm run encrypt:linux # Mac/Linux +``` + +✅ 生成 `.jsc` 加密文件(自动覆盖旧文件) + +#### 步骤 2:测试 + +```bash +npm start +``` + +✅ 确认程序正常运行,无报错 + +#### 步骤 3:清理源文件 + +```bash +npm run cleanup +``` + +✅ 删除 `.js` 源文件,自动备份到 `.backup` 文件夹 + +#### 步骤 4:打包 + +```bash +npm run build:win # Windows +npm run build:mac # Mac +npm run build:linux # Linux +``` + +✅ 生成安装包到 `build` 文件夹 + +--- + +## 🔧 其他常用命令 + +### 恢复源文件 + +```bash +npm run restore +``` + +> 从 `.backup` 文件夹恢复所有源文件(误删除时使用) + +### 清理加密文件 + +```bash +npm run cleanup:jsc +``` + +> 删除所有 `.jsc` 文件(重新加密前使用) + +### 修改文件名映射 + +编辑 `lib/module-map.json`: + +```json +{ + "mappings": { + "design1": { + "core": "core1", // 修改这里 + "output": "output1", + "ui": "ui1" + } + } +} +``` + +然后重新运行 `npm run encrypt:win` + +--- + +## ⚠️ 注意事项 + +- **开发时**:保留 `.js` 源文件,不要运行 `cleanup` +- **发布时**:必须先加密、再清理、最后打包 +- **备份在**:`.backup` 文件夹(不会被打包进应用) + +--- + +## 📁 项目结构 + +``` +lib/ +├── module-map.json - 文件名映射配置 +├── index.js - 首页入口 +├── design1.js - 光盘模板入口 +├── design2.js - 卡片模板入口 +├── design1/ - 光盘模板功能模块 +│ ├── core.js - 核心功能 +│ ├── output.js - 导出/保存 +│ └── ui.js - 界面交互 +└── design2/ - 卡片模板功能模块 + ├── core.js + ├── output.js + └── ui.js + +scripts/encrypt/ - 加密脚本(不会被打包) +.backup/ - 源文件备份(不会被打包) +``` + +--- + +## 🔧 调试模式 + +按 `F12` 或 `Ctrl+Shift+I` 打开开发者工具查看错误信息。 + +--- + +## 📚 更多文档 + +- [加密详细说明](scripts/encrypt/README.md) +- 当前版本:v2.3.017 diff --git a/design1.html b/design1.html index ba28595..4a81ded 100644 --- a/design1.html +++ b/design1.html @@ -870,15 +870,46 @@ diff --git a/design2.html b/design2.html index 72cf2f3..ab1bd05 100644 --- a/design2.html +++ b/design2.html @@ -659,15 +659,46 @@ diff --git a/index.html b/index.html index 7cc451b..b844285 100644 --- a/index.html +++ b/index.html @@ -216,13 +216,46 @@ \ No newline at end of file diff --git a/lib/cpp_draw.jsc b/lib/cpp_draw.jsc deleted file mode 100644 index f3ee29c53f1198ddce582bd177b4de5eb33bcdda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182520 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

c)2wU||044X5C@Sj`UsKh1{@Zhy^cEh6&<)< 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 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值 - function getCoordsMinY(acoords) { + 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值 - function getCoordsMaxY(acoords) { + 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); + } // ========================================== // 全局变量定义(所有模块共享) + // 注意:所有变量都附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 // ========================================== - let addState = 0; // 0是不添加 - let background_image, background_image1, background_image2; - let bg_version = 1; // front_bg1.png front_bg2.png - var zoom = 1; - let pre_add_image; // 预添加的图片对象(用于addPic) - + window.addState = 0; // 0是不添加 + window.background_image = undefined; + window.background_image1 = undefined; + window.background_image2 = undefined; + window.bg_version = 1; // front_bg1.png front_bg2.png + window.zoom = 1; + window.pre_add_image = undefined; // 预添加的图片对象(用于addPic) + // 内部剪贴板 - let clipboardData = { + window.clipboardData = { data: null, offset: 10 // 粘贴位置偏移量 }; - + // 文件管理 - var openAs = { + window.openAs = { _name: "", set name(val) { if (val == "") { $("title").html('Soon Design'); - } else { + } else { $("title").html('Soon Design - ' + val); } this._name = val; @@ -273,48 +414,143 @@ const dpi = 600; return this._name }, }; - + // 对象数组和历史记录 - let objs1 = []; - let objs2 = []; - let step1 = { val: 0 }, step2 = { val: 0 }; - let step = step1; - let objs = objs1; - let recordJson1 = [], recordJson2 = [], recordJson = recordJson1, recordObjs1 = [], recordObjs2 = [], recordObjs = recordObjs1; - let pre_objs1 = [], pre_objs2 = [], next_objs1 = [], next_objs2 = [], pre_objs = pre_objs1, next_objs = next_objs1; - let pre_json1 = [], pre_json2 = [], next_json1 = [], next_json2 = [], pre_json = pre_json1, next_json = next_json1; - + window.objs1 = []; + window.objs2 = []; + window.step1 = { val: 0 }; + window.step2 = { val: 0 }; + window.step = window.step1; + window.objs = window.objs1; + window.recordJson1 = []; + window.recordJson2 = []; + window.recordJson = window.recordJson1; + window.recordObjs1 = []; + window.recordObjs2 = []; + window.recordObjs = window.recordObjs1; + window.pre_objs1 = []; + window.pre_objs2 = []; + window.next_objs1 = []; + window.next_objs2 = []; + window.pre_objs = window.pre_objs1; + window.next_objs = window.next_objs1; + window.pre_json1 = []; + window.pre_json2 = []; + window.next_json1 = []; + window.next_json2 = []; + window.pre_json = window.pre_json1; + window.next_json = window.next_json1; + // Canvas对象(将在core.js中初始化) - var canvas1, canvas2; - var canvas; // 当前活动的画布(canvas1 或 canvas2) - var ctx1, ctx2; - let is_bgi_add = false; - + window.canvas1 = undefined; + window.canvas2 = undefined; + window.canvas = undefined; // 当前活动的画布(canvas1 或 canvas2) + window.ctx1 = undefined; + window.ctx2 = undefined; + window.is_bgi_add = false; + + // 为了兼容性,同时创建局部变量引用(向后兼容) + let addState = window.addState; + let background_image = window.background_image; + let background_image1 = window.background_image1; + let background_image2 = window.background_image2; + let bg_version = window.bg_version; + var zoom = window.zoom; + let pre_add_image = window.pre_add_image; + let clipboardData = window.clipboardData; + var openAs = window.openAs; + let objs1 = window.objs1; + let objs2 = window.objs2; + let step1 = window.step1; + let step2 = window.step2; + let step = window.step; + let objs = window.objs; + let recordJson1 = window.recordJson1; + let recordJson2 = window.recordJson2; + let recordJson = window.recordJson; + let recordObjs1 = window.recordObjs1; + let recordObjs2 = window.recordObjs2; + let recordObjs = window.recordObjs; + let pre_objs1 = window.pre_objs1; + let pre_objs2 = window.pre_objs2; + let next_objs1 = window.next_objs1; + let next_objs2 = window.next_objs2; + let pre_objs = window.pre_objs; + let next_objs = window.next_objs; + let pre_json1 = window.pre_json1; + let pre_json2 = window.pre_json2; + let next_json1 = window.next_json1; + let next_json2 = window.next_json2; + let pre_json = window.pre_json; + let next_json = window.next_json; + var canvas1 = window.canvas1; + var canvas2 = window.canvas2; + var canvas = window.canvas; + var ctx1 = window.ctx1; + var ctx2 = window.ctx2; + let is_bgi_add = window.is_bgi_add; + // 加载design1模块 - // 由于模块代码需要在layui.use内部执行,我们通过动态加载的方式 const fs = require('fs'); - - // 加载core.js(核心功能) + let bytenode; + try { + 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(); } })(); + + // 读取模块映射配置(从 lib 目录读取,跨平台兼容) + let moduleMap = {}; try { - const coreCode = fs.readFileSync(__dirname + '/design1/core.js', 'utf8'); - eval(coreCode); + const moduleMapPath = path.join(appPath, 'lib', 'module-map.json'); + if (fs.existsSync(moduleMapPath)) { + moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); + } } catch (e) { - console.error('加载core.js失败:', e); + console.warn('[加载模块] 无法读取模块映射配置,使用默认文件名'); } - // 加载output.js(输出功能,需要在ui.js之前加载,因为ui.js中的saveAs会调用output.js中的函数) - try { - const outputCode = fs.readFileSync(__dirname + '/design1/output.js', 'utf8'); - eval(outputCode); - } catch (e) { - console.error('加载output.js失败:', e); - } - - // 加载ui.js(UI控制) - try { - const uiCode = fs.readFileSync(__dirname + '/design1/ui.js', 'utf8'); - eval(uiCode); - } catch (e) { - console.error('加载ui.js失败:', e); + // 获取映射后的文件名(跨平台兼容) + function getMappedFileName(moduleName) { + if (moduleMap.mappings && moduleMap.mappings.design1 && moduleMap.mappings.design1[moduleName]) { + return moduleMap.mappings.design1[moduleName]; + } + return moduleName; // 默认使用原文件名 } + + const loadModule = (moduleName) => { + const mappedName = getMappedFileName(moduleName); + const jscPath = path.join(appPath, 'lib', 'design1', `${mappedName}.jsc`); + const jsPath = path.join(appPath, 'lib', 'design1', `${moduleName}.js`); + + // 优先加载映射的 .jsc 文件 + if (fs.existsSync(jscPath) && bytenode) { + try { + require(jscPath); + console.log(`[加载模块] ✅ ${moduleName} → ${mappedName}.jsc`); + return; + } catch (e) { + console.error(`[加载模块] ❌ ${moduleName}.jsc 加载失败:`, e.message); + } + } + + // 回退到 .js 源文件 + 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 { + alert(`文件不存在!\n\n请检查:\n1. ${jscPath}\n2. ${jsPath}`); + } + }; + loadModule('output'); // 先加载 output,因为 core 中的 addBackground() 需要调用 output 中的 open() + loadModule('core'); + loadModule('ui'); }); diff --git a/lib/design1/core.js b/lib/design1/core.js index 7b5e0d6..04cbaea 100644 --- a/lib/design1/core.js +++ b/lib/design1/core.js @@ -33,11 +33,18 @@ try { // 初始化Canvas对象 canvas1 = new fabric.Canvas('canvas1'); canvas2 = new fabric.Canvas('canvas2'); +// 同步到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 +window.canvas1 = canvas1; +window.canvas2 = canvas2; fabric.Object.prototype.objectCaching = false; ctx1 = canvas1.getSelectionContext(); ctx2 = canvas2.getSelectionContext(); is_bgi_add = false; +// 同步到 window 对象 +window.ctx1 = ctx1; +window.ctx2 = ctx2; +window.is_bgi_add = is_bgi_add; canvas1.zoomToPoint(new fabric.Point(0, 0), 1); canvas2.zoomToPoint(new fabric.Point(0, 0), 1); @@ -52,6 +59,7 @@ $(".canvas-container:eq(0)").css('width', 0) $(".canvas-container:eq(1)").hide(); canvas = canvas1; +window.canvas = canvas; fabric.Object.prototype.set({ borderColor: "#9013FE", cornerColor: "#9013FE", //激活状态角落图标的填充颜色 @@ -93,6 +101,13 @@ ipcRenderer.on('sys-lan', (event, data) => { let lang = localStorage.getItem("lang"); if (lang) { s_lan = lang; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge(lang); $("#language_select").val(lang); return; @@ -100,60 +115,130 @@ ipcRenderer.on('sys-lan', (event, data) => { switch (data) { case 'zh-CN': s_lan = "zh"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("zh"); $("#language_select").val("zh"); localStorage.setItem("lang", "zh"); break; case 'zh': s_lan = "zh"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("zh"); $("#language_select").val("zh"); localStorage.setItem("lang", "zh"); break; case 'zh-TW': s_lan = "ozh"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("ozh"); $("#language_select").val("ozh"); localStorage.setItem("lang", "ozh"); break; case 'en': s_lan = "en"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("en"); $("#language_select").val("en"); localStorage.setItem("lang", "en"); break; case 'en-AU': s_lan = "en"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("en"); $("#language_select").val("en"); localStorage.setItem("lang", "en"); break; case 'en-CA': s_lan = "en"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("en"); $("#language_select").val("en"); localStorage.setItem("lang", "en"); break; case 'en-GB': s_lan = "en"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("en"); $("#language_select").val("en"); localStorage.setItem("lang", "en"); break; case 'en-NZ': s_lan = "en"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("en"); $("#language_select").val("en"); localStorage.setItem("lang", "en"); break; case 'en-US': s_lan = "en"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("en"); $("#language_select").val("en"); localStorage.setItem("lang", "en"); break; case 'en-ZA': s_lan = "en"; + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge("en"); $("#language_select").val("en"); localStorage.setItem("lang", "en"); @@ -168,14 +253,15 @@ ipcRenderer.on('close', (event, message) => { } }, function (index, layero) { - output(() => ipcRenderer.send('run-close')); + if (typeof window.output === 'function') { + window.output(() => ipcRenderer.send('run-close')); + } }, function (index) { ipcRenderer.send('run-close'); }); }) addBackground();//添加背景 白色卡片 - initAligningGuidelines(canvas1); initAligningGuidelines(canvas2); //canvas.setZoom(0.5) @@ -269,913 +355,6 @@ window.rotate = function (id) { $(`#${id}`).css("transform", `rotate(${angle}deg)`); $(`#${id}`).attr("angle", angle); } -$('#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) { - i2.left = background_image.left; - i2.top = background_image.top; - let img3 = i3; - display_func(img1, img2, img3); - }) - }) - }) -}); -// 导出文件 -async function saveImageAsPNG(buffer) { - let fs = require('fs'); - // 弹出保存对话框 - const { canceled, filePath } = await dialog.showSaveDialog({ - title: '保存图片', - defaultPath: path.join(exePath, 'output.png'), // 默认路径 - filters: [{ name: 'PNG Images', extensions: ['png'] }] // 文件过滤器 - }); - - 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); - } - }); -} -function display_func(img1, img2, img3) { - $("#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"));//"背景" - canvas1.discardActiveObject().renderAll(); - canvas2.discardActiveObject().renderAll(); - let _objs1 = canvas1.getObjects(); - let g1 = []; - let g3 = []; - let g5 = []; - let left = 0;//左裁剪 - let top = 0;//顶裁剪 - let black_left = 0;//黑色左裁剪 - let black_top = 0;//黑色顶裁剪 - let all_left = 0;//预览图左裁剪 - let all_top = 0;//预览图顶裁剪 - let list1 = [..._objs1] - for (let item of list1) { - let idx = getIndex(item, canvas1); - //console.log("------"); - //console.log(item.getCoords()); - //console.log(getCoordsMinX(background_image.getCoords())); - //console.log(getCoordsMinX(item.getCoords())); - //console.log(getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords())); - //console.log("------"); - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g3.push(fabric.util.object.clone(item)); - if (idx != 0 && (objs1[idx - 1].type == 10 || objs1[idx - 1].type == 4)) { - continue;//计数器 或 合成文字 - } - if (idx != 0 && (objs1[idx - 1].type == 8 || objs1[idx - 1].type == 9)) { - continue;//二维码 条形码 - } - if (idx != 0 && (objs1[idx - 1].type == 2)) { - continue;//合成图片 - } - if (idx != 0 && - ( - ( - objs1[idx - 1].type == 3 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //文字 && 黑色 - ) - || - ( - objs1[idx - 1].type == 11 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //圆形文字 && 黑色 - ) - || - ( - objs1[idx - 1].type == 5//矩形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs1[idx - 1].type == 6//圆形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs1[idx - 1].type == 7//直线 - && - (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff") - ) - || - objs1[idx - 1].black == true //勾选并入黑色图层 - // ( - // objs1[idx-1].type == 1//固定图片 - // && - // objs1[idx-1].black == true //勾选并入黑色图层 - // ) - ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g1.push(fabric.util.object.clone(item)); - continue;//黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g1.push(fabric.util.object.clone(item)); - } - - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g1.push(fabric.util.object.clone(item)); - } - let url1 = new fabric.Group(g1).toDataURL({ - height: 2787, - width: 2787, - top: all_top, - left: all_left - }); - - g3.push(img1); - let url3 = new fabric.Group(g3).toDataURL({ - height: 2787, - width: 2787, - top: all_top, - left: all_left - }); - let url5 = new fabric.Group(g5).toDataURL({ - height: 2787, - width: 2787, - top: black_top, - left: black_left - }); - let _objs2 = canvas2.getObjects(); - let g2 = []; - let g4 = []; - let g6 = []; - left = 0; - top = 0; - black_top = 0; - black_left = 0; - all_top = 0; - all_left = 0; - for (let item of _objs2) { - let idx = getIndex(item, canvas2); - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g4.push(fabric.util.object.clone(item)); - if (idx != 0 && (objs2[idx - 1].type == 10 || objs2[idx - 1].type == 4)) { - continue;//黑色字或计数器 或 合成文字 - } - if (idx != 0 && (objs2[idx - 1].type == 8 || objs2[idx - 1].type == 9)) { - continue;//二维码 条形码 - } - if (idx != 0 && (objs2[idx - 1].type == 2)) { - continue;//合成图片 - } - if (idx != 0 && (objs2[idx - 1].type == 10)) { - continue;//合成图片 - } - if (idx != 0 && - ( - ( - objs2[idx - 1].type == 3 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //文字 && 黑色 - ) - || - ( - objs2[idx - 1].type == 11 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //圆形文字 && 黑色 - ) - || - ( - objs2[idx - 1].type == 5//矩形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs2[idx - 1].type == 6//圆形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs2[idx - 1].type == 7//直线 - && - (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff") - ) - || - objs2[idx - 1].black == true //勾选并入黑色图层 - // ( - // objs2[idx-1].type == 1//固定图片 - // && - // objs2[idx-1].black == true //勾选并入黑色图层 - // ) - ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g2.push(fabric.util.object.clone(item)); - continue;//黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g2.push(fabric.util.object.clone(item)); - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g2.push(fabric.util.object.clone(item)); - - } - let url2 = new fabric.Group(g2).toDataURL({ - height: 2787, - width: 2787, - top: top, - left: left - }); - let white_url1 = canvas1.getObjects()[0].toDataURL({ - height: 2787, - width: 2787, - }); - g4.push(img2); - let url4 = new fabric.Group(g4).toDataURL({ - height: 2787, - width: 2787, - top: all_top, - left: all_left - }); - let url6 = new fabric.Group(g6).toDataURL({ - height: 2787, - width: 2787, - top: black_top, - left: black_left - }); - - let w = document.body.clientWidth * 0.7 + "px"; - let h = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 150 + "px"; - let h1 = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + "px"; - - if ((document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 > document.body.clientHeight) { - //高度超出,则按高度计算 - h = document.body.clientHeight * 0.8 + "px"; - h1 = document.body.clientHeight * 0.8 - 150 + "px"; - w = ((document.body.clientHeight * 0.8 - 150) / 0.62548 + 40) / 0.94 - } - - let fs = require('fs'); - const Buffer = require('buffer').Buffer; - const buffer = Buffer.from(url3.replace(/^data:image\/\w+;base64,/, ""), 'base64'); - const printPath = path.join(exePath, 'print.png'); - fs.writeFileSync(printPath, buffer); - - layer.open({ - type: 1, - area: [w, h], - title: language_str("display"), //不显示标题栏"预览" - shadeClose: true, //点击遮罩关闭 - content: ` -

-
-
- -
- -
-
-
-
`, - btn: [language_str("output"), "打印"],//'导出' - btn1: function (index, layero) { - saveImageAsPNG(buffer) - - printJS({ printable: printPath, type: 'image', style: 'img { width: 100%; height: auto; }' }) - } - }); -} -function output(callback = null, _save = save) { - // 类型改变 - fabric.Image.fromURL('./public/images/op_1.png', function (i1) { - i1.left = background_image.left; - i1.top = background_image.top; - let img1 = i1; - fabric.Image.fromURL('./public/images/op_1.png', function (i2) { - i2.left = background_image.left; - i2.top = background_image.top; - let img2 = i2; - - $("#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"));//"背景" - canvas1.discardActiveObject().renderAll(); - canvas2.discardActiveObject().renderAll(); - let _objs1 = canvas1.getObjects(); - let g1 = []; - let g3 = []; - let g5 = [];//黑色图层 - let left = 0;//左裁剪 - let top = 0;//顶裁剪 - let black_left = 0;//黑色左裁剪 - let black_top = 0;//黑色顶裁剪 - let all_left = 0;//预览图左裁剪 - let all_top = 0;//预览图顶裁剪 - for (let item of _objs1) { - let idx = getIndex(item, canvas1); - - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g3.push(fabric.util.object.clone(item)); - if (idx != 0 && (objs1[idx - 1].type == 10 || objs1[idx - 1].type == 4)) { - continue;//计数器 或 合成文字 - } - if (idx != 0 && (objs1[idx - 1].type == 8 || objs1[idx - 1].type == 9)) { - continue;//二维码 条形码 - } - if (idx != 0 && (objs1[idx - 1].type == 2)) { - continue;//合成图片 - } - if (idx != 0 && - ( - ( - objs1[idx - 1].type == 3 - && - item.get("fill") == "#000000" - //文字 && 黑色 - ) - || - ( - objs1[idx - 1].type == 11 - && - item.get("fill") == "#000000" - //圆形文字 && 黑色 - ) - || - ( - objs1[idx - 1].type == 5//矩形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs1[idx - 1].type == 6//圆形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs1[idx - 1].type == 7//直线 - && - (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff") - ) - || - objs1[idx - 1].black == true //勾选并入黑色图层 - - ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g1.push(fabric.util.object.clone(item)); - continue;//黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g1.push(fabric.util.object.clone(item)); - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g1.push(fabric.util.object.clone(item)); - } - let url1 = new fabric.Group(g1).toDataURL({ - height: 2787, - width: 2787, - top: all_top, - left: all_left - }); - g3.push(img1); - let url3 = new fabric.Group(g3).toDataURL({ - height: 2787, - width: 2787, - top: all_top, - left: all_left - }); - let url5 = new fabric.Group(g5).toDataURL({ - height: 2787, - width: 2787, - top: black_top, - left: black_left - }); - let _objs2 = canvas2.getObjects(); - let g2 = []; - let g4 = []; - let g6 = [];//黑色图层 - left = 0; - top = 0; - black_left = 0;//黑色左裁剪 - black_top = 0;//黑色顶裁剪 - all_left = 0;//黑色左裁剪 - all_top = 0;//黑色顶裁剪 - for (let item of _objs2) { - let idx = getIndex(item, canvas2); - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g4.push(fabric.util.object.clone(item)); - if (idx != 0 && (objs2[idx - 1].type == 10 || objs2[idx - 1].type == 4)) { - continue;//计数器 或 合成文字 - } - if (idx != 0 && (objs2[idx - 1].type == 8 || objs2[idx - 1].type == 9)) { - continue;//二维码 条形码 - } - if (idx != 0 && (objs2[idx - 1].type == 2)) { - continue;//合成图片 - } - if (idx != 0 && - ( - ( - objs2[idx - 1].type == 3 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //文字 && 黑色 - ) - || - ( - objs2[idx - 1].type == 11 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //圆形文字 && 黑色 - ) - || - ( - objs2[idx - 1].type == 5//矩形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs2[idx - 1].type == 6//圆形 - && - ( - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("stroke") == "") //黑填充 透明边框 - || - (item.get("fill") == "" && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //透明填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff")) //黑填充 黑边框 - || - ((item.get("fill") == "#000000" || item.get("fill") == "#ffffff") && item.get("strokeWidth") == 0) //黑填充 0边框 - ) - ) - || - ( - objs2[idx - 1].type == 7//直线 - && - (item.get("stroke") == "#000000" || item.get("stroke") == "#ffffff") - ) - || - objs2[idx - 1].black == true //勾选并入黑色图层 - // ( - // objs2[idx-1].type == 1//固定图片 - // && - // objs2[idx-1].black == true //勾选并入黑色图层 - // ) - ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g2.push(fabric.util.object.clone(item)); - continue;//黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g2.push(fabric.util.object.clone(item)); - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); - } - g2.push(fabric.util.object.clone(item)); - - } - let url2 = new fabric.Group(g2).toDataURL({ - height: 2787, - width: 2787, - top: top, - left: left - }); - let white_url1 = canvas1.getObjects()[0].toDataURL({ - height: 2787, - width: 2787, - }); - g4.push(img2); - let url4 = new fabric.Group(g4).toDataURL({ - height: 2787, - width: 2787, - top: all_top, - left: all_left - }); - let url6 = new fabric.Group(g6).toDataURL({ - height: 2787, - width: 2787, - top: black_top, - left: black_left - }); - // let white_url2 = canvas2.getObjects()[0].toDataURL({ - // height: 2787, - // width: 2787, - // }); - //console.log(canvas.getObjects()) - let w = document.body.clientWidth * 0.7 + "px"; - let h = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 150 + "px"; - let h1 = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + "px"; - - if ((document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 > document.body.clientHeight) { - //高度超出,则按高度计算 - h = document.body.clientHeight * 0.8 + "px"; - h1 = document.body.clientHeight * 0.8 - 150 + "px"; - w = ((document.body.clientHeight * 0.8 - 150) / 0.62548 + 40) / 0.94 - } - - let op = { frontColorPic: "", backColorPic: "", frontBlackPic: "", backBlackPic: "", frontData: [], backData: [], flag: 1, frontDisplayPic: url3, backDisplayPic: '' }; - if (objs1.length != 0 & objs2.length == 0) { - op.flag = 2; - } else if (objs1.length == 0 & objs2.length != 0) { - op.flag = 3; - } - op.frontColorPic = desEncrypt(url1); - op.backColorPic = ''; - //op.frontBlPic = url5; - //op.backBlPic = url6; - op.frontBlackPic = ''; - op.backBlackPic = ''; - for (let item of _objs1) { - let idx = getIndex(item, canvas1); - if (idx == 0) continue;//background-image - let type = objs1[idx - 1].type; - if (type == 2) { - //out_pic - let xy = getAbsoluteXY(item); - op.frontData.push({ - "type": 1, - "name": objs1[idx - 1].name, - "FontColor": objs1[idx - 1].black ? "#000000" : "@", - "transparency": item.get("opacity"), - "x": parseInt((xy[0] - background_image1.left).toFixed(0)), - "y": parseInt((xy[1] - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } else if (type == 3) { - - } else if (type == 11) { - - op.frontData.push({ - "type": 2, - "Text": item.get("text"), - "FontFamily": item.get("fontFamily"), - "FontSize": parseInt(item.get("fontSize")), - "FontColor": "#000000", - "FontBackgroudColor": item.get("textBackgroundColor"), - "Bold": item.get("fontWeight") == "bold", - "Underline": item.get("underline"), - "Italic": item.get("fontStyle") == "italic", - "Strikeout": item.get("linethrough"), - "x": parseInt((item.get("left") - background_image1.left).toFixed(0)), - "y": parseInt((item.get("top") - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)), - "circleCenter": objs1[idx - 1].circleCenter - }); - } else if (type == 4) { - //out_text - let xy = getAbsoluteXY(item); - op.frontData.push({ - "type": 3, - "name": objs1[idx - 1].name, - "FontFamily": item.get("fontFamily"), - "DefaultText": item.get("text"), - "FontBackgroudColor": item.get("textBackgroundColor"), - "FontSize": parseInt(item.get("fontSize")), - "FontColor": item.get("fill"), - "Exceed": objs1[idx - 1].exceed, - "AutoWrap": objs1[idx - 1].autoWrap, - "FixSize": objs1[idx - 1].fixSize, - "Bold": item.get("fontWeight") == "bold", - "Underline": item.get("underline"), - "Italic": item.get("fontStyle") == "italic", - "Strikeout": item.get("linethrough"), - "x": parseInt((xy[0] - background_image1.left).toFixed(0)), - "y": parseInt((xy[1] - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)), - align: objs1[idx - 1].align - }); - } else if (type == 8) { - //二维码 - let xy = getAbsoluteXY(item); - op.frontData.push({ - "type": 4, - "name": objs1[idx - 1].name, - "FontColor": objs1[idx - 1].color, - "DefaultText": objs1[idx - 1].val, - "x": parseInt((xy[0] - background_image1.left).toFixed(0)), - "y": parseInt((xy[1] - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } else if (type == 9) { - //条形码 - let xy = getAbsoluteXY(item); - op.frontData.push({ - "type": 5, - "name": objs1[idx - 1].name, - "FontSize": parseInt(objs1[idx - 1].fontSize), - "DefaultText": objs1[idx - 1].val, - "HideText": objs1[idx - 1].show, - "FontFamily": objs1[idx - 1].font, - "FontColor": objs1[idx - 1].color, - "x": parseInt((xy[0] - background_image1.left).toFixed(0)), - "y": parseInt((xy[1] - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } else if (type == 10) { - let xy = getAbsoluteXY(item); - op.frontData.push({ - "type": 6, - "name": objs1[idx - 1].name, - "FontFamily": item.get("fontFamily"), - "FontSize": parseInt(item.get("fontSize")), - "FontColor": item.get("fill"), - "start": objs1[idx - 1].start, - "add": parseInt(objs1[idx - 1].add), - "x": parseInt((xy[0] - background_image1.left).toFixed(0)), - "y": parseInt((xy[1] - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } - } - //obj2 - for (let item of _objs2) { - let idx = getIndex(item, canvas2); - if (idx == 0) continue;//background-image - let type = objs2[idx - 1].type; - if (type == 2) { - //out_pic - let xy = getAbsoluteXY(item); - op.backData.push({ - "type": 1, - "name": objs2[idx - 1].name, - "FontColor": objs2[idx - 1].black ? "#000000" : "@", - "transparency": item.get("opacity"), - "x": parseInt((xy[0] - background_image2.left).toFixed(0)), - "y": parseInt((xy[1] - background_image2.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } else if (type == 3) { - - } else if (type == 11) { - - op.frontData.push({ - "type": 2, - "Text": item.get("text"), - "FontFamily": item.get("fontFamily"), - "FontSize": parseInt(item.get("fontSize")), - "FontColor": "#000000", - "FontBackgroudColor": item.get("textBackgroundColor"), - "Bold": item.get("fontWeight") == "bold", - "Underline": item.get("underline"), - "Italic": item.get("fontStyle") == "italic", - "Strikeout": item.get("linethrough"), - "x": parseInt((item.get("left") - background_image1.left).toFixed(0)), - "y": parseInt((item.get("top") - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)), - "circleCenter": objs2[idx - 1].circleCenter - }); - } else if (type == 4) { - let xy = getAbsoluteXY(item); - op.backData.push({ - "type": 3, - "name": objs2[idx - 1].name, - "FontFamily": item.get("fontFamily"), - "DefaultText": item.get("text"), - "FontSize": parseInt(item.get("fontSize")), - "FontBackgroudColor": item.get("textBackgroundColor"), - "FontColor": item.get("fill"), - "Exceed": objs2[idx - 1].exceed, - "AutoWrap": objs2[idx - 1].autoWrap, - "FixSize": objs2[idx - 1].fixSize, - "Bold": item.get("fontWeight") == "bold", - "Underline": item.get("underline"), - "Italic": item.get("fontStyle") == "italic", - "Strikeout": item.get("linethrough"), - "x": parseInt((xy[0] - background_image2.left).toFixed(0)), - "y": parseInt((xy[1] - background_image2.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)), - align: objs2[idx - 1].align - }); - } else if (type == 8) { - //二维码 - let xy = getAbsoluteXY(item); - op.backData.push({ - "type": 4, - "name": objs2[idx - 1].name, - "FontColor": objs2[idx - 1].color, - "DefaultText": objs2[idx - 1].val, - "x": parseInt((xy[0] - background_image2.left).toFixed(0)), - "y": parseInt((xy[1] - background_image2.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } else if (type == 9) { - let xy = getAbsoluteXY(item); - op.backData.push({ - "type": 5, - "name": objs2[idx - 1].name, - "DefaultText": objs2[idx - 1].val, - "HideText": objs1[idx - 1].show, - "FontSize": parseInt(objs2[idx - 1].fontSize), - "FontFamily": objs2[idx - 1].font, - "FontColor": objs2[idx - 1].color, - "x": parseInt((xy[0] - background_image2.left).toFixed(0)), - "y": parseInt((xy[1] - background_image2.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } else if (type == 10) { - let xy = getAbsoluteXY(item); - op.backData.push({ - "type": 6, - "name": objs2[idx - 1].name, - "FontFamily": item.get("fontFamily"), - "FontSize": parseInt(item.get("fontSize")), - "FontColor": item.get("fill"), - "start": parseInt(objs2[idx - 1].start), - "add": parseInt(objs2[idx - 1].add), - "x": parseInt((xy[0] - background_image2.left).toFixed(0)), - "y": parseInt((xy[1] - background_image2.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)) - }); - } - } - _save(op, callback); - //return false 开启该代码可禁止点击该按钮关闭 - }) - }) -} -$('#output').on('click', function () { - output(null, saveAs); -}); function addBackground() { // 类型改变 @@ -1192,6 +371,8 @@ function addBackground() { image.scale(1, 1); background_image1 = image; background_image = background_image1; + window.background_image1 = background_image1; + window.background_image = background_image; canvas.add(image); canvas.renderAll(); //pre_objs1.push(JSON.stringify(objs1)); @@ -1211,6 +392,7 @@ function addBackground() { image.setSrc(image.toDataURL(), function (image) { background_image2 = image; + window.background_image2 = background_image2; canvas2.add(image); canvas2.renderAll(); //pre_objs2.push(JSON.stringify(objs2)); @@ -1220,9 +402,8 @@ function addBackground() { recordJson2.push(canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"])); let file = GetFile().get('file') - console.log(file) if (file && file != 'empty') { - open(file) + window.openFile(file) } }); }); @@ -1230,18 +411,27 @@ function addBackground() { }); } -function updateControls() { - if (!canvas.getActiveObject()) return; - $("#text_r").val(canvas.getActiveObject().get("angle").toFixed(0)); - $("#text_x").val((canvas.getActiveObject().get("left") - background_image.left).toFixed(0)); - $("#text_y").val((canvas.getActiveObject().get("top") - background_image.top).toFixed(0)); - $("#text_h").val((canvas.getActiveObject().get("scaleY") * canvas.getActiveObject().get("height")).toFixed(0)); - $("#text_w").val((canvas.getActiveObject().get("scaleX") * canvas.getActiveObject().get("width")).toFixed(0)); - if (canvas.getActiveObject().get("selectable")) { - $("#lock_img").attr("src", "public/images/unlock20.png")//已经上锁,需要解锁 +// 将 updateControls 附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 +window.updateControls = function updateControls() { + // 使用 window.canvas 和 window.background_image 作为后备,确保在 eval() 执行时也能访问 + const currentCanvas = window.canvas || canvas; + const currentBackgroundImage = window.background_image || background_image; + if (!currentCanvas || !currentCanvas.getActiveObject()) return; + $("#text_r").val(currentCanvas.getActiveObject().get("angle").toFixed(0)); + $("#text_x").val((currentCanvas.getActiveObject().get("left") - currentBackgroundImage.left).toFixed(0)); + $("#text_y").val((currentCanvas.getActiveObject().get("top") - currentBackgroundImage.top).toFixed(0)); + $("#text_h").val((currentCanvas.getActiveObject().get("scaleY") * currentCanvas.getActiveObject().get("height")).toFixed(0)); + $("#text_w").val((currentCanvas.getActiveObject().get("scaleX") * currentCanvas.getActiveObject().get("width")).toFixed(0)); + // 根据锁定状态显示图标(使用lockMovementX判断,因为锁定时会设置所有lock属性) + if (currentCanvas.getActiveObject().get("lockMovementX")) { + $("#lock_img").attr("src", "public/images/lock20.png")//已锁定 } else { - $("#lock_img").attr("src", "public/images/lock20.png")//没上锁,可以上锁 + $("#lock_img").attr("src", "public/images/unlock20.png")//未锁定 } +}; +// 向后兼容 +function updateControls() { + return window.updateControls(); } function selectObject(target, index) { updateControls(); @@ -1264,7 +454,7 @@ function addPic(pointer) { objs.push({ type: 1, black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); //OpenDialog(); //function OpenDialog() //{ @@ -1285,7 +475,7 @@ function addPic(pointer) { // objs.push({type: 1}); // canvas.renderAll(); // updateList(); - // recordState(); + // window.recordState(); // } ); // }).catch(err => { // console.log(err) @@ -1337,7 +527,7 @@ function addOutPic(pointer) { objs.push({ type: 2, name: resName("OUT_PIC_"), black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); }); }); } @@ -1390,7 +580,7 @@ function addText(pointer) { objs.push({ type: 3, black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); } function selectText(target, index) { @@ -1470,7 +660,7 @@ function addCircleText(pointer) { objs.push({ type: 11, black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); } function selectCircleText(target, index) { @@ -1568,7 +758,7 @@ function addOutText(pointer) { objs.push({ type: 4, name: resName("OUT_TEXT_"), exceed: false, autoWrap: false, fixSize: false, black: false, align: 'center' }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); } function selectOutText(target, index) { @@ -1644,7 +834,7 @@ function addRect(pointer) { objs.push({ type: 5, black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); } function selectRect(target, index) { @@ -1689,7 +879,7 @@ function addCircle(pointer) { objs.push({ type: 6, black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); } function selectCircle(target, index) { @@ -1737,7 +927,7 @@ function addLine(pointer) { objs.push({ type: 7, black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); } function selectLine(target, index) { @@ -1775,7 +965,7 @@ function addQrCode(pointer) { objs.push({ type: 8, name: resName("QR_CODE_"), color: "#000000", val: "https://www.cardsoon.com", black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); }); } @@ -1813,7 +1003,7 @@ function addBarCode(pointer) { objs.push({ type: 9, name: resName("BAR_CODE_"), val: "123456789", color: "#000000", fontSize: 18, font: "Arial", show: false, black: false });//show是取消文字显示 canvas.renderAll(); updateList(); - recordState(); + window.recordState(); }); } @@ -1854,7 +1044,7 @@ function addCounter(pointer) { objs.push({ type: 10, name: resName("COUNTER_"), start: 0, add: 1, black: false }); canvas.renderAll(); updateList(); - recordState(); + window.recordState(); console.log(canvas.getObjects()) } @@ -1888,7 +1078,8 @@ function selectCounter(target, index) { } -function updateList() { +// 将 updateList 附加到 window 对象,确保全局可访问 +window.updateList = function updateList() { let str = ""; let i = 0; @@ -1923,11 +1114,25 @@ function updateList() { (item.type === 3 ? "TEXT_" + displayIndex : (item.type === 1 ? "IMG_" + displayIndex : "OBJ_" + displayIndex)); + // 检查锁定状态(通过lockMovementX判断,因为锁定时会设置所有lock属性) + // 注意:索引0是背景图,objs数组是从下标0开始存第1个对象的,所以是 i+1 + let isLocked = false; + if (canvas.getObjects()[i + 1]) { + let canvasObj = canvas.getObjects()[i + 1]; + isLocked = canvasObj.get('lockMovementX') === true; + } + + // 锁定状态图标 + const lockIcon = isLocked ? + '' : + ''; + // 组装 HTML str = `
${nameText} + ${lockIcon}
${displayIndex}
` + str; @@ -1945,7 +1150,8 @@ function updateList() { }); } -function selectObj(objIndices, isFromCanvas = false) { +// 将 selectObj 附加到 window 对象,确保全局可访问 +window.selectObj = function selectObj(objIndices, isFromCanvas = false) { let indicesArray = (Array.isArray(objIndices)) ? objIndices : ((typeof objIndices === 'number' && objIndices >= 0) ? [objIndices] : []); // 清除所有高亮 @@ -1960,6 +1166,16 @@ 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) { @@ -1972,6 +1188,13 @@ function selectObj(objIndices, isFromCanvas = false) { if (!isFromCanvas && indicesArray.length === 1) { let target = canvas.getObjects()[indicesArray[0] + 1]; if (target) { + // 如果对象被锁定,临时允许选中以便解锁 + if (target.get('lockMovementX') === true) { + target.set({ + selectable: true, + evented: true + }) + } canvas.setActiveObject(target); canvas.requestRenderAll(); handleObjectSelected(); @@ -1979,7 +1202,7 @@ function selectObj(objIndices, isFromCanvas = false) { } } -function recordState() { +window.recordState = function recordState() { //pre_objs.push(JSON.stringify(objs)); //pre_json.push(canvas.toJSON(["selectable","hoverable","hoverCursor","text","fontStyle","fontWeight","underline"])); //next_json = []; @@ -1999,13 +1222,16 @@ function recordState() { recordJson.push(j); } -function getIndex(target, _canvas = null) { +// 将 getIndex 附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 +window.getIndex = function getIndex(target, _canvas = null) { let temp_objs; - if (_canvas == null) { - temp_objs = canvas.getObjects(); - } else { - temp_objs = _canvas.getObjects(); + // 使用 window.canvas 作为默认值,确保在 eval() 执行时也能访问 + const currentCanvas = _canvas || window.canvas || canvas; + if (!currentCanvas) { + console.error('getIndex: canvas is undefined'); + return 0; } + temp_objs = currentCanvas.getObjects(); let i = 0; for (let res of temp_objs) { @@ -2015,6 +1241,10 @@ function getIndex(target, _canvas = null) { i++; } return 0; +}; +// 向后兼容 +function getIndex(target, _canvas = null) { + return window.getIndex(target, _canvas); } function getType(target) { @@ -2131,6 +1361,8 @@ function handleObjectSelected(e) { if (currentCanvas === canvas1 || currentCanvas === canvas2) { canvas = currentCanvas; objs = (currentCanvas === canvas1) ? objs1 : objs2; + window.canvas = canvas; + window.objs = objs; } let select_obj = canvas.getActiveObject(); @@ -2218,9 +1450,20 @@ function handleObjectMoving(e) { updateControls(); } -function initCanvasEvents() { - [canvas1, canvas2].forEach(currentCanvas => { +// 将 handleObjectSelected 附加到 window 对象,确保全局可访问 +window.handleObjectSelected = handleObjectSelected; +// 防止重复初始化事件监听器 +var _canvasEventsInitialized = false; + +function initCanvasEvents() { + // 如果已经初始化过,直接返回 + if (_canvasEventsInitialized) { + return; + } + _canvasEventsInitialized = true; + + [canvas1, canvas2].forEach(currentCanvas => { // 1. 鼠标移动 currentCanvas.on("mouse:move", (e) => { let offsetX = 0, offsetY = 0; @@ -2260,7 +1503,24 @@ function initCanvasEvents() { currentCanvas.on('object:selected', (e) => { 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; + } + } + handleObjectSelected(e); + // 更新对象列表以同步锁状态 + if (typeof window.updateList === 'function') { + window.updateList(); + } }); // 4. 鼠标松开 (添加对象) @@ -2288,13 +1548,24 @@ function initCanvasEvents() { // 5. 对象移动 (只保留圆形文本逻辑,去掉了 checkOutOfBounds) currentCanvas.on("object:moving", (e) => { + // 阻止背景图(索引0)被移动(如果已锁定) + let movingObj = e.target; + let idx = getIndex(movingObj); + if (idx === 0) { + let bgObj = currentCanvas.getObjects()[0]; + if (bgObj && bgObj.get('lockMovementX') === true) { + e.e.preventDefault(); + e.e.stopPropagation(); + return false; + } + } handleObjectMoving(e); }); // 6. 变换事件 currentCanvas.on("object:rotating", updateControls); currentCanvas.on("object:scaling", updateControls); - currentCanvas.on("object:rotated", () => { recordState(); }); + currentCanvas.on("object:rotated", () => { window.recordState(); }); currentCanvas.on('text:editing:entered', () => { _textEdit = true; }); currentCanvas.on('text:editing:exited', () => { _textEdit = false; }); currentCanvas.on("text:changed", (e) => { $("#text_text").val(e.target.get("text")); }); @@ -2307,6 +1578,10 @@ function initCanvasEvents() { let objData = objs[idx - 1]; // 安全检查:确保 objData 存在且有 type 属性 if (!objData || typeof objData.type === 'undefined') { + // 更新对象列表以同步锁状态 + if (typeof window.updateList === 'function') { + window.updateList(); + } console.warn('objData is undefined or missing type at index', idx - 1); return; } @@ -2326,7 +1601,11 @@ function initCanvasEvents() { target.scaleX = 1; target.scaleY = 1; updateControls(); } - recordState(); + window.recordState(); + // 更新对象列表以同步锁状态 + if (typeof window.updateList === 'function') { + window.updateList(); + } }); // ================================================== // 8. 【完美修复版】渲染后绘制:外部蒙版 + 中心圆孔 (修复三角形Bug) @@ -2776,7 +2055,7 @@ function updateRulerGuides(nativeEvent) { $("#ruler-guide-v").css({ top: (nativeEvent.pageY - offset.top) + 'px', display: 'block' }); } -function copySelection() { +window.copySelection = function copySelection() { const activeObjects = canvas.getActiveObjects(); if (!activeObjects || activeObjects.length === 0) { @@ -2806,7 +2085,7 @@ function copySelection() { layer.msg("已复制"); } -function pasteFromClipboard() { +window.pasteFromClipboard = function pasteFromClipboard() { // 检查是否有数据 if (!clipboardData.data || clipboardData.data.length === 0) { // layer.msg("剪贴板为空"); @@ -2858,7 +2137,7 @@ function pasteFromClipboard() { // 4. 刷新列表和历史记录 updateList(); - recordState(); + window.recordState(); // 5. 高亮左侧列表最后一项 (即新粘贴的项) if (objs.length > 0) selectObj(objs.length - 1); @@ -2868,12 +2147,14 @@ function pasteFromClipboard() { }); } -function onStateRestored() { +// 将 onStateRestored 附加到 window 对象,确保全局可访问 +window.onStateRestored = function onStateRestored() { // 1. 重新获取背景图引用 (因为旧对象被销毁了) // 注意:canvas 是全局变量,指向当前激活的画板 if (canvas.getObjects().length > 0) { background_image = canvas.getObjects()[0]; background_image.selectable = false; // 确保背景不可选 + window.background_image = background_image; background_image.evented = false; } @@ -2881,11 +2162,15 @@ function onStateRestored() { canvas.requestRenderAll(); // 3. 取消选中状态 - selectObj(-1); + if (typeof window.selectObj === 'function') { + window.selectObj(-1); + } // 4. 隐藏所有属性面板 $("#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(); // 5. 刷新左侧列表 - updateList(); + if (typeof window.updateList === 'function') { + window.updateList(); + } } diff --git a/lib/design1/output.js b/lib/design1/output.js index 2e3e51d..751e54f 100644 --- a/lib/design1/output.js +++ b/lib/design1/output.js @@ -1,4 +1,47 @@ -function display_func(img1, img2, img3) { +// openAs 对象用于跟踪当前打开的文件路径 +var openAs = { + _name: "", + set name(val) { + if (val == "") { + $("title").html('Soon Design'); + } else { + $("title").html('Soon Design - ' + val); + } + this._name = val; + }, + get name() { + return this._name; + } +}; + +// 导出文件 +async function saveImageAsPNG(buffer) { + let fs = require('fs'); + // 弹出保存对话框 + const { canceled, filePath } = await dialog.showSaveDialog({ + title: '保存图片', + defaultPath: path.join(exePath, 'output.png'), // 默认路径 + filters: [{ name: 'PNG Images', extensions: ['png'] }] // 文件过滤器 + }); + + 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); + } + }); +} + +// 将 display_func 附加到 window 对象,确保全局可访问 +window.display_func = function display_func(img1, img2, img3) { $("#base_control").hide(); $("#line_control").hide(); $("#pic_control").hide(); @@ -14,6 +57,27 @@ function display_func(img1, img2, img3) { $("#component_type").text(language_str("bg"));//"背景" canvas1.discardActiveObject().renderAll(); canvas2.discardActiveObject().renderAll(); + + // 保存所有对象的 selectable 和 evented 状态,确保预览后能恢复 + const objStates1 = []; + const objStates2 = []; + canvas1.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine) { + objStates1[index] = { + selectable: obj.selectable, + evented: obj.evented + }; + } + }); + canvas2.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine) { + objStates2[index] = { + selectable: obj.selectable, + evented: obj.evented + }; + } + }); + // 过滤掉辅助线 let _objs1 = canvas1.getObjects().filter(obj => !obj.isGuideLine); let g1 = []; @@ -29,12 +93,12 @@ function display_func(img1, img2, img3) { let list1 = _objs1.filter(obj => !obj.isGuideLine); for (let item of list1) { let idx = getIndex(item, canvas1); - + // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) { continue; } - + //console.log("------"); //console.log(item.getCoords()); //console.log(getCoordsMinX(background_image.getCoords())); @@ -143,11 +207,9 @@ function display_func(img1, img2, img3) { }); g3.push(img1); - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 - // 原始尺寸 2787x2787,缩小到 512x512,比例约为 0.184 let url3 = new fabric.Group(g3).toDataURL({ - format: 'png', - multiplier: 512 / 2787, // 约 0.184,缩小到 512x512,保持宽高比和所有内容 + height: 2787, + width: 2787, top: all_top, left: all_left }); @@ -169,14 +231,14 @@ function display_func(img1, img2, img3) { all_top = 0; all_left = 0; for (let item of _objs2) { - + let idx = getIndex(item, canvas2); - + // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) { continue; } - + if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); } @@ -285,11 +347,9 @@ function display_func(img1, img2, img3) { width: 2787, }); g4.push(img2); - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 - // 原始尺寸 2787x2787,缩小到 512x512,比例约为 0.184 let url4 = new fabric.Group(g4).toDataURL({ - format: 'png', - multiplier: 512 / 2787, // 约 0.184,缩小到 512x512,保持宽高比和所有内容 + height: 2787, + width: 2787, top: all_top, left: all_left }); @@ -323,26 +383,51 @@ function display_func(img1, img2, img3) { title: language_str("display"), //不显示标题栏"预览" shadeClose: true, //点击遮罩关闭 content: ` -
-
-
- -
- -
-
-
-
`, +
+
+
+ +
+ +
+
+
+
`, btn: [language_str("output"), "打印"],//'导出' btn1: function (index, layero) { + // 只处理导出(保存PNG) saveImageAsPNG(buffer) - + }, + btn2: function () { + // 只处理打印 printJS({ printable: printPath, type: 'image', style: 'img { width: 100%; height: auto; }' }) + }, + end: function() { + // 预览窗口关闭后,恢复所有对象的 selectable 和 evented 状态 + canvas1.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine && objStates1[index]) { + obj.set({ + selectable: objStates1[index].selectable, + evented: objStates1[index].evented + }); + } + }); + canvas2.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine && objStates2[index]) { + obj.set({ + selectable: objStates2[index].selectable, + evented: objStates2[index].evented + }); + } + }); + canvas1.renderAll(); + canvas2.renderAll(); } }); } -function output(callback = null, _save = save) { +// 将 output 附加到 window 对象,确保全局可访问 +window.output = function output(callback = null, _save = save) { // 类型改变 fabric.Image.fromURL('./public/images/op_1.png', function (i1) { i1.left = background_image.left; @@ -390,12 +475,12 @@ function output(callback = null, _save = save) { all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())); } g3.push(fabric.util.object.clone(item)); - + // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) { continue; } - + if (idx != 0 && (objs1[idx - 1].type == 10 || objs1[idx - 1].type == 4)) { continue;//计数器 或 合成文字 } @@ -485,11 +570,9 @@ function output(callback = null, _save = save) { left: all_left }); g3.push(img1); - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 - // 原始尺寸 2787x2787,缩小到 512x512,比例约为 0.184 let url3 = new fabric.Group(g3).toDataURL({ - format: 'png', - multiplier: 512 / 2787, // 约 0.184,缩小到 512x512,保持宽高比和所有内容 + height: 2787, + width: 2787, top: all_top, left: all_left }); @@ -513,12 +596,12 @@ function output(callback = null, _save = save) { let filteredObjs2 = _objs2.filter(obj => !obj.isGuideLine); for (let item of filteredObjs2) { let idx = getIndex(item, canvas2); - + // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) { continue; } - + if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())); } @@ -624,11 +707,9 @@ function output(callback = null, _save = save) { width: 2787, }); g4.push(img2); - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 - // 原始尺寸 2787x2787,缩小到 512x512,比例约为 0.184 let url4 = new fabric.Group(g4).toDataURL({ - format: 'png', - multiplier: 512 / 2787, // 约 0.184,缩小到 512x512,保持宽高比和所有内容 + height: 2787, + width: 2787, top: all_top, left: all_left }); @@ -671,15 +752,15 @@ function output(callback = null, _save = save) { if (item.isGuideLine) { continue; } - + let idx = getIndex(item, canvas1); if (idx == 0) continue;//background-image - + // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 if (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined') { continue; } - + let type = objs1[idx - 1].type; if (type == 2) { //out_pic @@ -797,15 +878,15 @@ function output(callback = null, _save = save) { if (item.isGuideLine) { continue; } - + let idx = getIndex(item, canvas2); if (idx == 0) continue;//background-image - + // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 if (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined') { continue; } - + let type = objs2[idx - 1].type; if (type == 2) { //out_pic @@ -922,51 +1003,184 @@ function output(callback = null, _save = save) { } // 重新生成二维码和条形码(加载文件后调用) -function regenerateQrCodesAndBarcodes(canvas, objsArray) { +// 将 regenerateQrCodesAndBarcodes 附加到 window 对象,确保全局可访问 +window.regenerateQrCodesAndBarcodes = function regenerateQrCodesAndBarcodes(canvas, objsArray) { if (!canvas || !objsArray || !Array.isArray(objsArray)) return; - + const objects = canvas.getObjects(); - + // 遍历对象(跳过背景图片,索引 0) for (let i = 1; i < objects.length; i++) { const obj = objects[i]; if (!obj || obj.type !== 'image') continue; - + const objIndex = i - 1; if (objIndex >= objsArray.length) continue; - + const objMeta = objsArray[objIndex]; if (!objMeta || (objMeta.type !== 8 && objMeta.type !== 9)) continue; - + // type == 8: 二维码 - 复用 ui.js 中的生成逻辑 if (objMeta.type === 8) { - const qr = jrQrcode.getQrBase64(objMeta.val || 'https://www.cardsoon.com', { - padding: 0, - foreground: objMeta.color || '#000000' + const qr = jrQrcode.getQrBase64(objMeta.val || 'https://www.cardsoon.com', { + padding: 0, + foreground: objMeta.color || '#000000' }); - obj.setSrc(qr, function(img) { + obj.setSrc(qr, function (img) { canvas.renderAll(); }); } // type == 9: 条形码 - 复用 ui.js 中的生成逻辑 else if (objMeta.type === 9) { - JsBarcode("#barcode", objMeta.val || '123456789', { - margin: 0, - lineColor: objMeta.color || '#000000', - fontSize: objMeta.fontSize || 18, - font: objMeta.font || 'Arial' + JsBarcode("#barcode", objMeta.val || '123456789', { + margin: 0, + lineColor: objMeta.color || '#000000', + fontSize: objMeta.fontSize || 18, + font: objMeta.font || 'Arial' }); const barcode = document.getElementById('barcode'); const bar = barcode.toDataURL("image/png"); - obj.setSrc(bar, function(img) { + obj.setSrc(bar, function (img) { canvas.renderAll(); }); } } } +// open() 函数在 output.js 中定义,因为 output.js 先于 core.js 加载 +// 使用 window.openFile 避免与浏览器原生的 window.open 冲突 +window.openFile = function open(file) { + try { + let fs = require('fs'); + if (!fs.existsSync(file)) { + return; + } + var fsData = fs.readFileSync(file); + openAs.name = file; + let j; + try { + j = JSON.parse(fsData.toString()); + } catch (e) { + return; + } + + if (!background_image) { + return; + } + if (!j.f || !j.f.objects || !Array.isArray(j.f.objects) || j.f.objects.length === 0) { + return; + } + if (!j.b || !j.b.objects || !Array.isArray(j.b.objects) || j.b.objects.length === 0) { + j.b = { + version: '4.6.0', + objects: [], + hoverCursor: 'move' + }; + } + + let left = background_image.left; + let top = background_image.top; + let new_left = j.f.objects[0].left; + let new_top = j.f.objects[0].top; + for (let o of j.f.objects) { + o.left = o.left - new_left + left; + o.top = o.top - new_top + top; + } + if (j.f.objects[0] && !j.f.objects[0].src) { + j.f.objects[0].src = './public/images/bg_front_1.png' + } + if (j.b.objects && j.b.objects.length > 0 && j.b.objects[0] && !j.b.objects[0].src) { + j.b.objects[0].src = './public/images/bg_back.png' + } + + const fo = j.fo || []; + const bo = j.bo || []; + const placeholder = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=='; + + fo.forEach((objMeta, idx) => { + if ((objMeta.type === 8 || objMeta.type === 9) && j.f.objects[idx + 1] && !j.f.objects[idx + 1].src) { + j.f.objects[idx + 1].src = placeholder; + } + }); + + bo.forEach((objMeta, idx) => { + if ((objMeta.type === 8 || objMeta.type === 9) && j.b.objects && j.b.objects[idx + 1] && !j.b.objects[idx + 1].src) { + j.b.objects[idx + 1].src = placeholder; + } + }); + + canvas1.loadFromJSON(j.f, function () { + if (typeof window.regenerateQrCodesAndBarcodes === 'function') { + window.regenerateQrCodesAndBarcodes(canvas1, fo); + } + canvas1.renderAll(); + }); + canvas2.loadFromJSON(j.b, function () { + if (typeof window.regenerateQrCodesAndBarcodes === 'function') { + window.regenerateQrCodesAndBarcodes(canvas2, bo); + } + canvas2.renderAll(); + }); + + let objects1 = canvas1.getObjects(); + let objects2 = canvas2.getObjects(); + if (!objects1 || objects1.length === 0) { + return; + } + background_image1 = objects1[0]; + background_image2 = objects2 && objects2.length > 0 ? objects2[0] : null; + + objs2 = j.bo || []; + objs1 = j.fo || []; + 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; + background_image = background_image1; + } else if ($("#back_side").hasClass("ui-button-active")) { + objs = objs2; + recordObjs = recordObjs2; + recordJson = recordJson2; + background_image = background_image2 || background_image1; + step = step2; + } + canvas1.renderAll(); + canvas2.renderAll(); + // 调用 updateList,现在它已附加到 window 对象 + if (typeof window.updateList === 'function') { + window.updateList(); + } else { + setTimeout(() => { + if (typeof window.updateList === 'function') { + window.updateList(); + } + }, 100); + } + setTimeout(() => { + recordObjs1.push(JSON.stringify(objs1)) + let j1 = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + j1.objects[0].hoverCursor = "default"; + recordJson1.push(j1); + + recordObjs2.push(JSON.stringify(objs2)) + let j2 = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + recordJson2.push(j2); + }, 0); + } catch (e) { + // 静默处理错误 + } +} + // 清理不需要的 src 字段(保留自定义图片的 src) -function cleanupSrcFields(jsonObjects, objsArray) { +// 将 cleanupSrcFields 附加到 window 对象,确保在 ui.js 中的 saveAs 函数也能访问 +window.cleanupSrcFields = function cleanupSrcFields(jsonObjects, objsArray) { if (!jsonObjects || !Array.isArray(jsonObjects)) return; if (!objsArray || !Array.isArray(objsArray)) return; @@ -992,6 +1206,10 @@ function cleanupSrcFields(jsonObjects, objsArray) { } } } +}; +// 向后兼容 +function cleanupSrcFields(jsonObjects, objsArray) { + return window.cleanupSrcFields(jsonObjects, objsArray); } function saveAs(op1, callback) { @@ -1010,7 +1228,7 @@ function saveAs(op1, callback) { canvas2.remove(obj); } }); - + let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); @@ -1030,15 +1248,22 @@ function saveAs(op1, callback) { title: language_str("saveFile"),//'保存文件' filters: [ { name: 'Soon File Type', extensions: ['soon'] }, - ] + ], + defaultPath: openAs.name || undefined }).then(result => { if (result.filePath == "") { return; } - if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) { - result.filePath += '.soon'; + if (result.filePath == null || result.filePath == undefined) { return; } + // 检查文件扩展名,确保以.soon结尾 + const path = require('path'); + let filePath = result.filePath; + const ext = path.extname(filePath).toLowerCase(); + if (ext !== '.soon') { + filePath = filePath + '.soon'; } + result.filePath = filePath; let fs = require('fs') con_o.soonType = 1 - fs.writeFileSync(result.filePath, JSON.stringify(con_o)) + fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8') openAs.name = result.filePath; layer.msg(language_str("saveSucc") + openAs.name);//'保存成功至' saveHistory(); @@ -1066,7 +1291,7 @@ function save(op1, callback) { canvas2.remove(obj); } }); - + let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); @@ -1086,7 +1311,7 @@ function save(op1, callback) { //打开的文件 let fs = require('fs') con_o.soonType = 1 - fs.writeFileSync(openAs.name, JSON.stringify(con_o)) + fs.writeFileSync(openAs.name, JSON.stringify(con_o), 'utf8') layer.msg(language_str("saveSucc") + openAs.name);//'保存成功至' saveHistory(); if (callback && typeof callback === 'function') { @@ -1098,15 +1323,22 @@ function save(op1, callback) { title: language_str("saveFile"),//'保存文件' filters: [ { name: 'Soon File Type', extensions: ['soon'] }, - ] + ], + defaultPath: openAs.name || undefined }).then(result => { if (result.filePath == "") { return; } - if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) { - result.filePath += '.soon'; + if (result.filePath == null || result.filePath == undefined) { return; } + // 检查文件扩展名,确保以.soon结尾 + const path = require('path'); + let filePath = result.filePath; + const ext = path.extname(filePath).toLowerCase(); + if (ext !== '.soon') { + filePath = filePath + '.soon'; } + result.filePath = filePath; let fs = require('fs') con_o.soonType = 1 - fs.writeFileSync(result.filePath, JSON.stringify(con_o)) + fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8') openAs.name = result.filePath; layer.msg(language_str("saveSucc") + openAs.name);//'保存成功至' saveHistory(); @@ -1118,7 +1350,8 @@ function save(op1, callback) { }) } -function saveHistory() { +// 将 saveHistory 附加到 window 对象,确保在 ui.js 中也能访问 +window.saveHistory = function saveHistory() { let fs = require('fs'); let j = { history: [] }; // 默认结构必须是数组 @@ -1163,136 +1396,17 @@ function saveHistory() { // 5. 统一写入 try { - fs.writeFileSync(fullPath, JSON.stringify(j)); + fs.writeFileSync(fullPath, JSON.stringify(j), 'utf8'); } catch (e) { console.error("写入历史记录失败:", e); } +}; +// 向后兼容 +function saveHistory() { + return window.saveHistory(); } -function open(file) { - console.log(file) - let fs = require('fs') - var fsData = fs.readFileSync(file) - openAs.name = file; - let j = JSON.parse(fsData.toString()); - // 安全检查:确保 background_image 已初始化 - if (!background_image) { - console.error('background_image 未初始化,无法打开文件'); - return; - } - // 安全检查:确保 JSON 中有 objects 数组 - if (!j.f || !j.f.objects || !Array.isArray(j.f.objects) || j.f.objects.length === 0) { - console.error('JSON 格式错误:缺少 f.objects'); - return; - } - // design1 的背面数据是可选的(type 1 可能只有正面) - // 如果没有 b 或 b.objects,创建一个空的 canvas - if (!j.b || !j.b.objects || !Array.isArray(j.b.objects) || j.b.objects.length === 0) { - // 创建空的背面数据 - j.b = { - version: '4.6.0', - objects: [], - hoverCursor: 'move' - }; - } - let left = background_image.left; - let top = background_image.top; - let new_left = j.f.objects[0].left; - let new_top = j.f.objects[0].top; - for (let o of j.f.objects) { - o.left = o.left - new_left + left; - o.top = o.top - new_top + top; - } - // for (let o of j.b.objects) { - // o.left = o.left - new_left + left; - // o.top = o.top - new_top + top; - // } - // 如果背景图片没有src,从路径恢复(因为保存时删除了src以减小文件大小) - if (j.f.objects[0] && !j.f.objects[0].src) { - j.f.objects[0].src = './public/images/bg_front_1.png' - } - if (j.b.objects && j.b.objects.length > 0 && j.b.objects[0] && !j.b.objects[0].src) { - j.b.objects[0].src = './public/images/bg_back.png' - } - - // 为二维码和条形码对象创建临时的 src(Fabric.js 需要 src 来创建 Image 对象) - // 加载完成后会重新生成,所以这里只需要一个占位符 - const fo = j.fo || []; - const bo = j.bo || []; - const placeholder = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=='; - - // 为正面二维码和条形码创建临时 src - fo.forEach((objMeta, idx) => { - if ((objMeta.type === 8 || objMeta.type === 9) && j.f.objects[idx + 1] && !j.f.objects[idx + 1].src) { - j.f.objects[idx + 1].src = placeholder; - } - }); - - // 为背面二维码和条形码创建临时 src - bo.forEach((objMeta, idx) => { - if ((objMeta.type === 8 || objMeta.type === 9) && j.b.objects && j.b.objects[idx + 1] && !j.b.objects[idx + 1].src) { - j.b.objects[idx + 1].src = placeholder; - } - }); - - console.log(j.f) - - // 加载 JSON,并在回调中重新生成二维码和条形码 - canvas1.loadFromJSON(j.f, function() { - regenerateQrCodesAndBarcodes(canvas1, fo); - canvas1.renderAll(); - }); - canvas2.loadFromJSON(j.b, function() { - regenerateQrCodesAndBarcodes(canvas2, bo); - canvas2.renderAll(); - }); - // 安全检查:确保加载后 canvas 中有对象 - let objects1 = canvas1.getObjects(); - let objects2 = canvas2.getObjects(); - if (!objects1 || objects1.length === 0) { - console.error('canvas1 加载失败:没有对象'); - return; - } - background_image1 = objects1[0]; - // canvas2 可能为空(type 1 文件) - background_image2 = objects2 && objects2.length > 0 ? objects2[0] : null; - - objs2 = j.bo || []; - objs1 = j.fo || []; - 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; - background_image = background_image1; - } else if ($("#back_side").hasClass("ui-button-active")) { - objs = objs2; - recordObjs = recordObjs2; - recordJson = recordJson2; - background_image = background_image2 || background_image1; // 如果背面为空,使用正面 - step = step2; - } - canvas1.renderAll(); - canvas2.renderAll(); - updateList(); //修复打开新文件后无法撤销的bug - setTimeout(() => { - recordObjs1.push(JSON.stringify(objs1)) - let j1 = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - j1.objects[0].hoverCursor = "default"; - recordJson1.push(j1); - - recordObjs2.push(JSON.stringify(objs2)) - let j2 = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - // j2.objects[0].hoverCursor = "default"; - recordJson2.push(j2); - }, 0); -} +// open() 函数已移至 core.js,因为它在 core.js 的 addBackground() 中被调用 function clearAll() { //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\":[]}"; @@ -1331,7 +1445,12 @@ function clearAll() { openAs.name = ""; canvas1.renderAll(); canvas2.renderAll(); - updateList(); + if (typeof window.updateList === 'function') { + window.updateList(); + } console.log(); } +// 将 clearAll 附加到 window 对象,确保全局可访问 +window.clearAll = clearAll; + diff --git a/lib/design1/ui.js b/lib/design1/ui.js index f7a8492..a795d54 100644 --- a/lib/design1/ui.js +++ b/lib/design1/ui.js @@ -1,2092 +1,2338 @@ -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(); - 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(); - copySelection(); - return; - } - // CTRL/CMD+V - 粘贴 - if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') { - event.preventDefault(); - 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(); - 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(); - 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(); - 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(); - recordState(); - updateControls(); - } - // 普通删除键(DEL键,没有按CTRL/CMD�? - if (event.keyCode == 46 && !isModifierKey && !_inputEdit && !_textEdit) { - 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; - - } - } - updateList(); - canvas.discardActiveObject(); - if (flag == 1) { - 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; - next_objs = next_objs1; - pre_objs = pre_objs1; - next_json = next_json1; - pre_json = pre_json1; - recordObjs = recordObjs1; - recordJson = recordJson1; - step = step1; - 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; - next_objs = next_objs2; - pre_objs = pre_objs2; - next_json = next_json2; - pre_json = pre_json2; - recordObjs = recordObjs2; - recordJson = recordJson2; - step = step2; - 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) { - //只选中了一�? - _objs[0].set("top", background_image.get("top")); - canvas.renderAll(); - return; - } - let top = 0; - for (let item of _objs) { - let t_top = item.get("top"); - if (t_top < top) { - top = t_top; - } - } - groupItems = []; - for (let item of _objs) { - item.set("top", top); - 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") - } - _objs[0].set("top", background_image.get("top") + background_image.get("height") - _objs[0].get("height") * _objs[0].get("scaleY") - other); - canvas.renderAll(); - return; - } - let bottom = 0; - for (let item of _objs) { - let idx = getIndex(item); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get("strokeWidth") - } - let t_b = item.get("top") + item.get("height") * item.get("scaleY") + other; - if (t_b > bottom) { - bottom = t_b; - } - } - groupItems = [] - for (let item of _objs) { - let idx = getIndex(item); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get("strokeWidth") - } - item.set("top", bottom - item.get("height") * item.get("scaleY") - other); - 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") - } - _objs[0].set("top", background_image.get("top") + (background_image.get("height") - (_objs[0].get("height") + other) * _objs[0].get("scaleY")) / 2); - canvas.renderAll(); - return; - } - let top = 0; - for (let item of _objs) { - let t_top = item.get("top"); - if (t_top < top) { - top = t_top; - } - } - groupItems = [] - for (let item of _objs) { - let idx = getIndex(item); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get("strokeWidth") - } - item.set("top", top + (item.group.height - (item.get("height") + other) * item.get("scaleY")) / 2); - groupItems.push(item) - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); -}); -$("#left_alignment").click(function () { - let _objs = canvas.getActiveObjects(); - if (_objs.length == 1) { - //只选中了一�? - _objs[0].set("left", background_image.get("left")); - canvas.renderAll(); - return; - } - let left = 0; - for (let item of _objs) { - let t_left = item.get("left"); - if (t_left < left) { - left = t_left; - } - } - groupItems = [] - for (let item of _objs) { - item.set("left", left); - groupItems.push(item) - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); -}); -$("#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") - } - _objs[0].set("left", background_image.get("left") + background_image.get("width") - _objs[0].get("width") * _objs[0].get("scaleX") - other); - canvas.renderAll(); - return; - } - let right = 0; - for (let item of _objs) { - let idx = getIndex(item); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get("strokeWidth") - } - let t_r = item.get("left") + item.get("width") * item.get("scaleX") + other; - if (t_r > right) { - right = t_r; - } - } - let groupItems = [] - - for (let item of _objs) { - let idx = getIndex(item); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get("strokeWidth") - } - item.set("left", right - item.get("width") * item.get("scaleX") - other); - groupItems.push(item) - } - //BUG1 - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - canvas.renderAll(); -}); -$("#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") - } - _objs[0].set("left", background_image.get("left") + (background_image.get("width") - (_objs[0].get("width") + other) * _objs[0].get("scaleX")) / 2); - canvas.renderAll(); - return; - } - let left = 0; - for (let item of _objs) { - let t_left = item.get("left"); - if (t_left < left) { - left = t_left; - } - } - groupItems = [] - for (let item of _objs) { - let idx = getIndex(item); - let type = objs[idx - 1].type; - let other = 0;//strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get("strokeWidth") - } - item.set("left", left + (item.group.width - (item.get("width") + other) * item.get("scaleX")) / 2); - groupItems.push(item) - } - canvas.discardActiveObject(); - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas, - }); - canvas.setActiveObject(sel); - canvas.requestRenderAll(); - 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); - - recordState(); - updateList(); - 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; - recordState(); - updateList(); - 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 - obj.set({ - scaleX: scaleX, - scaleY: scaleY, - left: ($('#canvas1').width() - 2787) / 2, - top: ($('#canvas1').height() - 2787) / 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) - recordState(); - updateList(); - selectObj(0); -}); - -// ========================================== -function onStateRestored() { - // 1. 重新获取背景图引�?(因为旧对象被销毁了) - if (canvas.getObjects().length > 0) { - background_image = canvas.getObjects()[0]; - background_image.selectable = false; // 确保背景不可�? - background_image.evented = false; - } - - // 2. 渲染画布 - canvas.requestRenderAll(); - - // 3. 取消选中状�? - selectObj(-1); - - // 4. 隐藏所有属性面�? - $("#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(); - - // 5. 刷新左侧列表 - updateList(); -} -// ========================================== -$("#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 () { - onStateRestored(); // 图片加载完才执行这一�? - }); - } else { - // 背面逻辑 - objs2 = JSON.parse(recordObjs2[step.val]); - objs = objs2; - - canvas.loadFromJSON(recordJson2[step.val], function () { - 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 () { - onStateRestored(); // 图片加载完才执行这一�? - }); - } else { - objs2 = JSON.parse(recordObjs2[step.val]); - objs = objs2; - - canvas.loadFromJSON(recordJson2[step.val], function () { - 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); - } - } - updateList(); - 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(); - recordState(); -}); -$('#vertical_obj').click(function () { - let obj = canvas.getActiveObject(); - obj.set("flipY", !obj.get("flipY")); - canvas.renderAll(); - updateControls(); - recordState(); -}); -$('#align_obj').click(function () { - let obj = canvas.getActiveObject(); - obj.set("flipX", !obj.get("flipX")); - canvas.renderAll(); - updateControls(); - 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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); - -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); - -$('#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' - 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' - 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' - 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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#lock").click(function () { - canvas.getActiveObject().set("selectable", !canvas.getActiveObject().get("selectable")); - if (canvas.getActiveObject().get("selectable")) { - $("#lock_img").attr("src", "public/images/unlock20.png")//已经上锁,需要解�? - } else { - $("#lock_img").attr("src", "public/images/lock20.png")//没上锁,可以上锁 - } - recordState(); - canvas.renderAll(); -}); -$("#text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#text_back_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#circle_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#circle_text_back_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#out_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#out_text_back_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#rect_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#rect_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#rect_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#rect_stroke").val("#ffffff"); - canvas.renderAll(); -}); -$("#circle_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#circle_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#circle_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#circle_stroke").val("#ffffff"); - canvas.renderAll(); -}); - -// 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 字段 - cleanupSrcFields(j.objects, objs1); - 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)) - openAs.name = result.filePath; - layer.msg(language_str("saveSucc") + openAs.name);//'保存成功�? - saveHistory(); - if (callback && typeof callback === 'function') { - callback(); - } - }).catch(err => { - console.log() - }) -} -// save 函数已在 output.js 中定义 -$("#copy").click(function () { - copySelection(); -}) -// 粘贴 -$("#paste").click(function () { - pasteFromClipboard(); -}) - -// 保存 (保持你原有的保存逻辑不变) -$("#save").click(function () { - 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 是否保存当前文件�? - 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 中的 open 函数 - open(filePath); - }).catch(err => { - console.log(err) - }) - } -}); -function clearAll() { - //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(); - updateList(); - console.log(); -} -$("#new").click(function () { - if (step.val == 0) { - ipcRenderer.send('open-first-page'); - return; - } - layer.confirm('' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�? - 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(); - 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(); - 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(); - 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(); - 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(); - recordState(); -}) -$("#out_pic_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#out_pic_field_name").val(); - updateList(); - 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; - } - recordState(); -}); -$("#out_text_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#out_text_field_name").val(); - updateList(); - recordState(); -}) -$("#qrcode_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#qrcode_field_name").val(); - updateList(); - 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(); - 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(); - 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(); - recordState(); - }); -}); -$("#barcode_field_name").bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()); - objs[idx - 1].name = $("#barcode_field_name").val(); - updateList(); - recordState(); -}) -$("#text_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#text_color").val()); - canvas.renderAll(); - recordState(); -}) -$("#text_back_color").bind('input propertychange', function () { - canvas.getActiveObject().set("textBackgroundColor", $("#text_back_color").val()); - canvas.renderAll(); - 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(); - recordState(); -}) -$("#circle_text_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#circle_text_color").val()); - canvas.renderAll(); - recordState(); -}) -$("#circle_text_back_color").bind('input propertychange', function () { - canvas.getActiveObject().set("textBackgroundColor", $("#circle_text_back_color").val()); - - canvas.renderAll(); - recordState(); -}) -$("#circle_text_text").bind('input propertychange', function () { - let val = $("#circle_text_text").val().trim() - canvas.getActiveObject().set("text", ` ${val} `); - canvas.renderAll(); - updateList(); - recordState(); -}) -$("#out_text_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#out_text_color").val()); - canvas.renderAll(); - recordState(); -}) -$("#out_text_back_color").bind('input propertychange', function () { - canvas.getActiveObject().set("textBackgroundColor", $("#out_text_back_color").val()); - - canvas.renderAll(); - 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(); - 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(); - updateList(); - recordState(); - } -}); -$("#rect_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#rect_color").val()); - - canvas.renderAll(); - recordState(); -}) -$("#rect_stroke").bind('input propertychange', function () { - canvas.getActiveObject().set("stroke", $("#rect_stroke").val()); - - canvas.renderAll(); - 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(); - 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(); - recordState(); -}) -$("#circle_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#circle_color").val()); - - canvas.renderAll(); - recordState(); -}) -$("#circle_stroke").bind('input propertychange', function () { - canvas.getActiveObject().set("stroke", $("#circle_stroke").val()); - - canvas.renderAll(); - 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(); - 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(); - recordState(); -}) -$("#counter_add").bind('input propertychange', function () { - let item = canvas.getActiveObject(); - let idx = getIndex(item); - objs[idx - 1].add = $(this).val(); - canvas.renderAll(); - recordState(); -}) -$("#counter_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#counter_color").val()); - canvas.renderAll(); - 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(); - recordState(); -}) -$("#line_color").bind('input propertychange', function () { - canvas.getActiveObject().set("stroke", $("#line_color").val()); - canvas.renderAll(); - 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(); - 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 性能更好 - updateList(); - 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(); - 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(); - 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(); - recordState(); - }); -}) -$('#count_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - recordState(); -}); -$('#text_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - recordState(); -}); - -$('#circle_text_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - 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(); - recordState(); - }); - //recordState(); -}); -$('#out_text_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - recordState(); -}); -$(".obj_list").on("click", "div", function () { - let idx = objs.length - 1 - $(this).index(); - 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; - } - recordState(); -}); -$("#autoWrap").click(function () { - let idx = getIndex(canvas.getActiveObject()); - if ($(this).prop("checked")) { - - objs[idx - 1].autoWrap = true; - } else { - objs[idx - 1].autoWrap = false; - } - recordState(); -}); -$("#fixSize").click(function () { - let idx = getIndex(canvas.getActiveObject()); - if ($(this).prop("checked")) { - - objs[idx - 1].fixSize = true; - } else { - objs[idx - 1].fixSize = false; - } - 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; - } - 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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); - -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); - -$('#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' - 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' - 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' - 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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); - -// =========================================================== -$("#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; - - } - } - updateList(); - canvas.discardActiveObject(); - if (flag == 1) { - 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); - - recordState(); - updateList(); - 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; - recordState(); - updateList(); - 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 - obj.set({ - scaleX: scaleX, - scaleY: scaleY, - left: ($('#canvas1').width() - 2787) / 2, - top: ($('#canvas1').height() - 2787) / 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) - recordState(); - updateList(); - selectObj(0); -}); -$("#lock").click(function () { - canvas.getActiveObject().set("selectable", !canvas.getActiveObject().get("selectable")); - if (canvas.getActiveObject().get("selectable")) { - $("#lock_img").attr("src", "public/images/unlock20.png")//已经上锁,需要解锁 - } else { - $("#lock_img").attr("src", "public/images/lock20.png")//没上锁,可以上锁 - } - recordState(); - canvas.renderAll(); -}); -$("#text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#text_back_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#circle_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#circle_text_back_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#out_text_back_transparent").click(function () { - canvas.getActiveObject().set("textBackgroundColor", ""); - $("#out_text_back_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#rect_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#rect_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#rect_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#rect_stroke").val("#ffffff"); - canvas.renderAll(); -}); -$("#circle_transparent").click(function () { - canvas.getActiveObject().set("fill", ""); - $("#circle_color").val("#ffffff"); - canvas.renderAll(); -}); -$("#circle_stroke_transparent").click(function () { - canvas.getActiveObject().set("stroke", ""); - $("#circle_stroke").val("#ffffff"); - canvas.renderAll(); -}); - -// =========================================================== -$("#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) { - i2.left = background_image.left; - i2.top = background_image.top; - let img3 = i3; - display_func(img1, img2, img3); - }) - }) - }) -}); -$("#output").click(function () { - output(); // 调用output函数(在output.js中定义) -}); +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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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(); + } +}); +$("#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进行另存为 + } +}); diff --git a/lib/design2.js b/lib/design2.js index d6615fd..fad71b9 100644 --- a/lib/design2.js +++ b/lib/design2.js @@ -38,17 +38,67 @@ ipcRenderer.send('get-scale-rate'); var $ = layui.$; var layer = layui.layer; var slider = layui.slider; + var form = layui.form; + var colorpicker = layui.colorpicker; + + // 确保所有必要的变量在全局作用域中可用(用于 .jsc 文件加载) + // 在 Electron 的渲染进程中,需要同时设置 window 和 global + if (typeof window !== 'undefined') { + window.$ = $; + window.jQuery = $; + window.ipcRenderer = ipcRenderer; + window.layer = layer; + window.slider = slider; + window.form = form; + window.colorpicker = colorpicker; + window.dialog = dialog; + window.remote = remote; + window.path = path; + window.jrQrcode = jrQrcode; + window.JsBarcode = JsBarcode; + window.clipboard = clipboard; + // design2 中没有定义 dpi,从 window.dpi 读取(在 design2.js 后面会设置) + } + // 在 Node.js 上下文中也设置(require 加载 .jsc 文件时使用) + if (typeof global !== 'undefined') { + global.$ = $; + global.jQuery = $; + global.ipcRenderer = ipcRenderer; + global.layer = layer; + global.slider = slider; + global.form = form; + global.colorpicker = colorpicker; + global.dialog = dialog; + global.remote = remote; + global.path = path; + global.jrQrcode = jrQrcode; + global.JsBarcode = JsBarcode; + global.clipboard = clipboard; + // design2 中没有定义 dpi,从 global.dpi 读取(在 design2.js 后面会设置) + } + var layer = layui.layer; + var slider = layui.slider; var colorpicker = layui.colorpicker; // 历史记录文件路径(供 output.js 使用) var fullPath = path.join(exePath, 'data.json'); + // 确保 fullPath 在全局作用域中可用(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.fullPath = fullPath; + window.exePath = exePath; + } + if (typeof global !== 'undefined') { + global.fullPath = fullPath; + global.exePath = exePath; + } // ========================================== // 公共函数定义(需要在layui.use回调内部,因为依赖jQuery) + // 注意:所有函数都附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 // ========================================== // DES加密函数 - function desEncrypt(str, key = "df6a551ca43181fc485f3043bcdd2fbc") { + window.desEncrypt = function desEncrypt(str, key = "df6a551ca43181fc485f3043bcdd2fbc") { var APIFMS; try { var keyHex_encrypt = CryptoJS.enc.Utf8.parse(key); @@ -62,20 +112,28 @@ ipcRenderer.send('get-scale-rate'); console.log(err); } return APIFMS; + }; + // 向后兼容 + function desEncrypt(str, key = "df6a551ca43181fc485f3043bcdd2fbc") { + return window.desEncrypt(str, key); } // 多语言切换 - function langua_ge(lan = 'zh') { + window.langua_ge = function langua_ge(lan = 'zh') { $("[language='m']").each(function (i) { $(this).html($(this).attr(lan)); }); $("[language='t']").each(function (i) { $(this).attr("title", $(this).attr(lan)); }); + }; + // 向后兼容 + function langua_ge(lan = 'zh') { + return window.langua_ge(lan); } // 多语言字符串获取 - function language_str(str) { + 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" }, @@ -103,37 +161,64 @@ ipcRenderer.send('get-scale-rate'); "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." } }; - return t[str] ? t[str][s_lan] : str; + // 从全局作用域获取 s_lan(支持 .jsc 文件加载) + const currentLang = (typeof global !== 'undefined' && global.s_lan) ? global.s_lan : + (typeof window !== 'undefined' && window.s_lan) ? window.s_lan : s_lan; + return t[str] ? (t[str][currentLang] || t[str]['zh'] || str) : str; + }; + // 确保 language_str 在 global 作用域中也可用(用于 .jsc 文件加载) + if (typeof global !== 'undefined') { + global.language_str = window.language_str; + } + // 向后兼容 + function language_str(str) { + return window.language_str(str); } // 获取URL参数 - function GetFile() { + window.GetFile = function GetFile() { const params = new URLSearchParams(window.location.search); return params; + }; + // 向后兼容 + function GetFile() { + return window.GetFile(); } // 日期格式化 - function getDate() { + window.getDate = function getDate() { let date = new Date(); return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); + }; + // 向后兼容 + function getDate() { + return window.getDate(); } // 获取对象的绝对坐标 - function getAbsoluteXY(_obj) { + window.getAbsoluteXY = function getAbsoluteXY(_obj) { let coord = _obj.get("lineCoords"); return [_obj.get("left"), _obj.get("top")]; + }; + // 向后兼容 + function getAbsoluteXY(_obj) { + return window.getAbsoluteXY(_obj); } // 计算两点之间的距离 - function getDisdance(x1, y1, x2, y2) { + window.getDisdance = function getDisdance(x1, y1, x2, y2) { var dx = Math.abs(x2 - x1); var dy = Math.abs(y2 - y1); var distance = Math.sqrt(dx * dx + dy * dy); return distance; + }; + // 向后兼容 + function getDisdance(x1, y1, x2, y2) { + return window.getDisdance(x1, y1, x2, y2); } // 计算角度(相对于画布中心) - function getDeg(pointer, canvas) { + window.getDeg = function getDeg(pointer, canvas) { var centerX = canvas.width / 2; var centerY = canvas.height / 2; var mouseX = pointer.x; @@ -147,10 +232,14 @@ ipcRenderer.send('get-scale-rate'); } angleDeg += 90; return angleDeg; + }; + // 向后兼容 + function getDeg(pointer, canvas) { + return window.getDeg(pointer, canvas); } // 检查字段名是否重复 - function checkName(name, objs1, objs2) { + window.checkName = function checkName(name, objs1, objs2) { for (let item of objs1) { if (item.name == name) { return false; @@ -162,20 +251,28 @@ ipcRenderer.send('get-scale-rate'); } } return true; + }; + // 向后兼容 + function checkName(name, objs1, objs2) { + return window.checkName(name, objs1, objs2); } // 返回不重复的字段名 - function resName(pre_name, objs1, objs2) { + window.resName = function resName(pre_name, objs1, objs2) { let num = (objs1.length + objs2.length) - 1; do { num++; } - while (!checkName(pre_name + num, objs1, objs2)); + while (!window.checkName(pre_name + num, objs1, objs2)); return pre_name + num; + }; + // 向后兼容 + function resName(pre_name, objs1, objs2) { + return window.resName(pre_name, objs1, objs2); } // 获取对象在画布中的索引 - function getIndex(target, canvas, _canvas = null) { + window.getIndex = function getIndex(target, canvas, _canvas = null) { let temp_objs; if (_canvas == null) { temp_objs = canvas.getObjects(); @@ -190,10 +287,14 @@ ipcRenderer.send('get-scale-rate'); i++; } return 0; + }; + // 向后兼容 + function getIndex(target, canvas, _canvas = null) { + return window.getIndex(target, canvas, _canvas); } // 获取对象类型 - function getType(target, canvas, objs) { + window.getType = function getType(target, canvas, objs) { let temp_objs = canvas.getObjects(); let i = 0; for (let res of temp_objs) { @@ -202,10 +303,14 @@ ipcRenderer.send('get-scale-rate'); } i++; } + }; + // 向后兼容 + function getType(target, canvas, objs) { + return window.getType(target, canvas, objs); } // 获取坐标的最小X值 - function getCoordsMinX(acoords) { + window.getCoordsMinX = function getCoordsMinX(acoords) { let x = acoords[0].x; for (let item of acoords) { if (item.x < x) { @@ -213,10 +318,14 @@ ipcRenderer.send('get-scale-rate'); } } return x; + }; + // 向后兼容 + function getCoordsMinX(acoords) { + return window.getCoordsMinX(acoords); } // 获取坐标的最大X值 - function getCoordsMaxX(acoords) { + window.getCoordsMaxX = function getCoordsMaxX(acoords) { let x = acoords[0].x; for (let item of acoords) { if (item.x > x) { @@ -224,10 +333,14 @@ ipcRenderer.send('get-scale-rate'); } } return x; + }; + // 向后兼容 + function getCoordsMaxX(acoords) { + return window.getCoordsMaxX(acoords); } // 获取坐标的最小Y值 - function getCoordsMinY(acoords) { + window.getCoordsMinY = function getCoordsMinY(acoords) { let y = acoords[0].y; for (let item of acoords) { if (item.y < y) { @@ -235,10 +348,14 @@ ipcRenderer.send('get-scale-rate'); } } return y; + }; + // 向后兼容 + function getCoordsMinY(acoords) { + return window.getCoordsMinY(acoords); } // 获取坐标的最大Y值 - function getCoordsMaxY(acoords) { + window.getCoordsMaxY = function getCoordsMaxY(acoords) { let y = acoords[0].y; for (let item of acoords) { if (item.y > y) { @@ -246,26 +363,37 @@ ipcRenderer.send('get-scale-rate'); } } return y; + }; + // 向后兼容 + function getCoordsMaxY(acoords) { + return window.getCoordsMaxY(acoords); } // ========================================== // 全局变量定义(所有模块共享) + // 注意:所有变量都附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 // ========================================== - const dpi = 300; // design2使用300 DPI - let addState = 0; // 0是不添加 - let background_image, background_image1, background_image2; - let bg_version = 1; - var zoom = 0; - let pre_add_image; // 预添加的图片对象(用于addPic) + window.dpi = 300; // design2使用300 DPI + // 确保 dpi 在 global 作用域中也可用(用于 .jsc 文件加载) + if (typeof global !== 'undefined') { + global.dpi = window.dpi; + } + window.addState = 0; // 0是不添加 + window.background_image = undefined; + window.background_image1 = undefined; + window.background_image2 = undefined; + window.bg_version = 1; + window.zoom = 0; + window.pre_add_image = undefined; // 预添加的图片对象(用于addPic) // 内部剪贴板 - let clipboardData = { + window.clipboardData = { data: null, offset: 10 // 粘贴位置偏移量 }; // 文件管理 - var openAs = { + window.openAs = { _name: "", set name(val) { if (val == "") { @@ -281,46 +409,142 @@ ipcRenderer.send('get-scale-rate'); }; // 对象数组和历史记录 - let objs1 = []; - let objs2 = []; - let step1 = { val: 0 }, step2 = { val: 0 }; - let step = step1; - let objs = objs1; - let recordJson1 = [], recordJson2 = [], recordJson = recordJson1, recordObjs1 = [], recordObjs2 = [], recordObjs = recordObjs1; - let pre_objs1 = [], pre_objs2 = [], next_objs1 = [], next_objs2 = [], pre_objs = pre_objs1, next_objs = next_objs1; - let pre_json1 = [], pre_json2 = [], next_json1 = [], next_json2 = [], pre_json = pre_json1, next_json = next_json1; + window.objs1 = []; + window.objs2 = []; + window.step1 = { val: 0 }; + window.step2 = { val: 0 }; + window.step = window.step1; + window.objs = window.objs1; + window.recordJson1 = []; + window.recordJson2 = []; + window.recordJson = window.recordJson1; + window.recordObjs1 = []; + window.recordObjs2 = []; + window.recordObjs = window.recordObjs1; + window.pre_objs1 = []; + window.pre_objs2 = []; + window.next_objs1 = []; + window.next_objs2 = []; + window.pre_objs = window.pre_objs1; + window.next_objs = window.next_objs1; + window.pre_json1 = []; + window.pre_json2 = []; + window.next_json1 = []; + window.next_json2 = []; + window.pre_json = window.pre_json1; + window.next_json = window.next_json1; // Canvas对象(将在core.js中初始化) - var canvas1, canvas2; - var canvas; // 当前活动的画布(canvas1 或 canvas2) - var ctx1, ctx2; - let is_bgi_add = false; + window.canvas1 = undefined; + window.canvas2 = undefined; + window.canvas = undefined; // 当前活动的画布(canvas1 或 canvas2) + window.ctx1 = undefined; + window.ctx2 = undefined; + window.is_bgi_add = false; + + // 为了兼容性,同时创建局部变量引用(向后兼容) + const dpi = window.dpi; + let addState = window.addState; + let background_image = window.background_image; + let background_image1 = window.background_image1; + let background_image2 = window.background_image2; + let bg_version = window.bg_version; + var zoom = window.zoom; + let pre_add_image = window.pre_add_image; + let clipboardData = window.clipboardData; + var openAs = window.openAs; + let objs1 = window.objs1; + let objs2 = window.objs2; + let step1 = window.step1; + let step2 = window.step2; + let step = window.step; + let objs = window.objs; + let recordJson1 = window.recordJson1; + let recordJson2 = window.recordJson2; + let recordJson = window.recordJson; + let recordObjs1 = window.recordObjs1; + let recordObjs2 = window.recordObjs2; + let recordObjs = window.recordObjs; + let pre_objs1 = window.pre_objs1; + let pre_objs2 = window.pre_objs2; + let next_objs1 = window.next_objs1; + let next_objs2 = window.next_objs2; + let pre_objs = window.pre_objs; + let next_objs = window.next_objs; + let pre_json1 = window.pre_json1; + let pre_json2 = window.pre_json2; + let next_json1 = window.next_json1; + let next_json2 = window.next_json2; + let pre_json = window.pre_json; + let next_json = window.next_json; + var canvas1 = window.canvas1; + var canvas2 = window.canvas2; + var canvas = window.canvas; + var ctx1 = window.ctx1; + var ctx2 = window.ctx2; + let is_bgi_add = window.is_bgi_add; // 加载design2模块 - // 由于模块代码需要在layui.use内部执行,我们通过动态加载的方式 const fs = require('fs'); - - // 加载core.js(核心功能) - try { - const coreCode = fs.readFileSync(__dirname + '/design2/core.js', 'utf8'); - eval(coreCode); - } catch (e) { - console.error('加载core.js失败:', e); + let bytenode; + try { + bytenode = require('bytenode'); + require.extensions['.dl'] = require.extensions['.jsc']; + } catch(e) { + console.warn('[加载模块] bytenode 未安装,无法加载 .jsc 文件'); } - // 加载ui.js(UI控制) + const appPath = (() => { try { return remote.app.getAppPath(); } catch(e) { return __dirname || process.cwd(); } })(); + + // 读取模块映射配置 + let moduleMap = {}; try { - const uiCode = fs.readFileSync(__dirname + '/design2/ui.js', 'utf8'); - eval(uiCode); + const moduleMapPath = path.join(appPath, 'lib', 'module-map.json'); + if (fs.existsSync(moduleMapPath)) { + moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); + } } catch (e) { - console.error('加载ui.js失败:', e); + console.warn('[加载模块] 无法读取模块映射配置,使用默认文件名'); } - // 加载output.js(输出功能) - try { - const outputCode = fs.readFileSync(__dirname + '/design2/output.js', 'utf8'); - eval(outputCode); + // 获取映射后的文件名(跨平台兼容) + function getMappedFileName(moduleName) { + if (moduleMap.mappings && moduleMap.mappings.design2 && moduleMap.mappings.design2[moduleName]) { + return moduleMap.mappings.design2[moduleName]; + } + return moduleName; // 默认使用原文件名 + } + + const loadModule = (moduleName) => { + const mappedName = getMappedFileName(moduleName); + const jscPath = path.join(appPath, 'lib', 'design2', `${mappedName}.jsc`); + const jsPath = path.join(appPath, 'lib', 'design2', `${moduleName}.js`); + + // 优先加载映射的 .jsc 文件 + if (fs.existsSync(jscPath) && bytenode) { + try { + require(jscPath); + console.log(`[加载模块] ✅ ${moduleName} → ${mappedName}.jsc`); + return; + } catch (e) { + console.error(`[加载模块] ❌ ${moduleName}.jsc 加载失败:`, e.message); + } + } + + // 回退到 .js 源文件 + if (fs.existsSync(jsPath)) { + try { + eval(fs.readFileSync(jsPath, 'utf8')); + console.log(`[加载模块] ✅ ${moduleName} → ${moduleName}.js`); } catch (e) { - console.error('加载output.js失败:', e); + console.error(`[加载模块] ❌ ${moduleName}.js 加载失败:`, e.message); + alert(`加载 ${moduleName} 失败!\n\n错误: ${e.message}`); + } + } else { + alert(`文件不存在!\n\n请检查:\n1. ${jscPath}\n2. ${jsPath}`); } + }; + loadModule('output'); // 先加载 output,因为 core 中的 addBackground() 需要调用 output 中的 open() + loadModule('core'); + loadModule('ui'); }); diff --git a/lib/design2/core.js b/lib/design2/core.js index 501f90a..bd9f730 100644 --- a/lib/design2/core.js +++ b/lib/design2/core.js @@ -29,10 +29,17 @@ try { canvas1 = new fabric.Canvas('canvas1') canvas2 = new fabric.Canvas('canvas2') +// 同步到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 +window.canvas1 = canvas1; +window.canvas2 = canvas2; fabric.Object.prototype.objectCaching = false ctx1 = canvas1.getSelectionContext() ctx2 = canvas2.getSelectionContext() is_bgi_add = false +// 同步到 window 对象 +window.ctx1 = ctx1; +window.ctx2 = ctx2; +window.is_bgi_add = is_bgi_add; canvas1.zoomToPoint(new fabric.Point(canvas1.width / 2, canvas1.height / 2), $('#canvas-div').width() / 1200 > 1 ? 1 : $('#canvas-div').width() / 1200) //console.log(canvas1.width / 2, canvas1.height / 2); //console.log($("#canvas-div").width() / 1200 > 1 ? 1 : $("#canvas-div").width() / 1200); @@ -497,6 +504,7 @@ $('#source_front').width(zoom * $('#source_front').width()) $('#source_back').width(zoom * $('#source_back').width()) $('.canvas-container:eq(1)').hide() canvas = canvas1 +window.canvas = canvas fabric.Object.prototype.set({ borderColor: '#9013FE', cornerColor: '#9013FE', //激活状态角落图标的填充颜色 @@ -517,18 +525,27 @@ canvas2.preserveObjectStacking = true // ========================================== // 对象选择和属性更新函数 // ========================================== -function updateControls() { - if (!canvas.getActiveObject()) return; - $("#text_r").val(canvas.getActiveObject().get("angle").toFixed(0)); - $("#text_x").val((canvas.getActiveObject().get("left") - background_image.left).toFixed(0)); - $("#text_y").val((canvas.getActiveObject().get("top") - background_image.top).toFixed(0)); - $("#text_h").val((canvas.getActiveObject().get("scaleY") * canvas.getActiveObject().get("height")).toFixed(0)); - $("#text_w").val((canvas.getActiveObject().get("scaleX") * canvas.getActiveObject().get("width")).toFixed(0)); - if (canvas.getActiveObject().get("selectable")) { - $("#lock_img").attr("src", "public/images/unlock20.png")//已经上锁,需要解锁 +// 将 updateControls 附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 +window.updateControls = function updateControls() { + // 使用 window.canvas 和 window.background_image 作为后备,确保在 eval() 执行时也能访问 + const currentCanvas = window.canvas || canvas; + const currentBackgroundImage = window.background_image || background_image; + if (!currentCanvas || !currentCanvas.getActiveObject()) return; + $("#text_r").val(currentCanvas.getActiveObject().get("angle").toFixed(0)); + $("#text_x").val((currentCanvas.getActiveObject().get("left") - currentBackgroundImage.left).toFixed(0)); + $("#text_y").val((currentCanvas.getActiveObject().get("top") - currentBackgroundImage.top).toFixed(0)); + $("#text_h").val((currentCanvas.getActiveObject().get("scaleY") * currentCanvas.getActiveObject().get("height")).toFixed(0)); + $("#text_w").val((currentCanvas.getActiveObject().get("scaleX") * currentCanvas.getActiveObject().get("width")).toFixed(0)); + // 根据锁定状态显示图标(使用lockMovementX判断,因为锁定时会设置所有lock属性) + if (currentCanvas.getActiveObject().get("lockMovementX")) { + $("#lock_img").attr("src", "public/images/lock20.png")//已锁定 } else { - $("#lock_img").attr("src", "public/images/lock20.png")//没上锁,可以上锁 + $("#lock_img").attr("src", "public/images/unlock20.png")//未锁定 } +}; +// 向后兼容 +function updateControls() { + return window.updateControls(); } function selectObject(target, index) { updateControls(); @@ -536,10 +553,25 @@ function selectObject(target, index) { } function selectPic(target, index) { + // 检查是否有选中对象,如果没有则直接返回 + if (!canvas || !canvas.getActiveObject()) return; + $("#pic_control").show(); $("#set_bg").show(); let activeObj = canvas.getActiveObject(); - if (typeof pic_op !== 'undefined' && pic_op.setValue) { + + // 检查对象是否被锁定或设为背景(索引0且已锁定) + let idx = getIndex(activeObj, canvas); + if (idx === 0) { + // 如果是背景图且已锁定,不应该显示图片控件 + if (activeObj.get('lockMovementX') === true || activeObj.get('selectable') === false) { + 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 { $("#pic_op").next().children(".layui-slider-bar").css("width", (1 - activeObj.get("opacity")) * 100 + "%"); @@ -878,6 +910,8 @@ function handleObjectSelected(e) { if (currentCanvas === canvas1 || currentCanvas === canvas2) { canvas = currentCanvas; objs = (currentCanvas === canvas1) ? objs1 : objs2; + window.canvas = canvas; + window.objs = objs; } let select_obj = canvas.getActiveObject(); @@ -897,6 +931,19 @@ 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 (i != 0) { // --- 选中了普通对象 --- @@ -979,9 +1026,20 @@ function handleObjectMoving(e) { updateControls(); } -function initCanvasEvents() { - [canvas1, canvas2].forEach(currentCanvas => { +// 将 handleObjectSelected 附加到 window 对象,确保全局可访问 +window.handleObjectSelected = handleObjectSelected; +// 防止重复初始化事件监听器 +var _canvasEventsInitialized = false; + +function initCanvasEvents() { + // 如果已经初始化过,直接返回 + if (_canvasEventsInitialized) { + return; + } + _canvasEventsInitialized = true; + + [canvas1, canvas2].forEach(currentCanvas => { // 1. 鼠标移动 currentCanvas.on("mouse:move", (e) => { let offsetX = 0, offsetY = 0; @@ -1043,11 +1101,39 @@ 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; + } + } + handleObjectSelected(e); + // 更新对象列表以同步锁状态 + if (typeof window.updateList === 'function') { + window.updateList(); + } }); // 5. 对象移动 currentCanvas.on("object:moving", (e) => { + // 阻止背景图(索引0)被移动(如果已锁定) + let movingObj = e.target; + let idx = getIndex(movingObj, currentCanvas); + if (idx === 0) { + let bgObj = currentCanvas.getObjects()[0]; + if (bgObj && bgObj.get('lockMovementX') === true) { + e.e.preventDefault(); + e.e.stopPropagation(); + return false; + } + } handleObjectMoving(e); }); @@ -1091,11 +1177,16 @@ function initCanvasEvents() { updateControls(); } recordState(); + // 更新对象列表以同步锁状态 + if (typeof window.updateList === 'function') { + window.updateList(); + } }); }); } -function updateList() { +// 将 updateList 附加到 window 对象,确保全局可访问 +window.updateList = function updateList() { let str = ""; let i = 0; @@ -1130,11 +1221,25 @@ function updateList() { (item.type === 3 ? "TEXT_" + displayIndex : (item.type === 1 ? "IMG_" + displayIndex : "OBJ_" + displayIndex)); + // 检查锁定状态(通过lockMovementX判断,因为锁定时会设置所有lock属性) + // 注意:索引0是背景图,objs数组是从下标0开始存第1个对象的,所以是 i+1 + let isLocked = false; + if (canvas.getObjects()[i + 1]) { + let canvasObj = canvas.getObjects()[i + 1]; + isLocked = canvasObj.get('lockMovementX') === true; + } + + // 锁定状态图标 + const lockIcon = isLocked ? + '' : + ''; + // 组装 HTML str = `
${nameText} + ${lockIcon}
${displayIndex}
` + str; @@ -1152,7 +1257,8 @@ function updateList() { }); } -function selectObj(objIndices, isFromCanvas = false) { +// 将 selectObj 附加到 window 对象,确保全局可访问 +window.selectObj = function selectObj(objIndices, isFromCanvas = false) { let indicesArray = (Array.isArray(objIndices)) ? objIndices : ((typeof objIndices === 'number' && objIndices >= 0) ? [objIndices] : []); // 清除所有高亮 @@ -1186,25 +1292,39 @@ function selectObj(objIndices, isFromCanvas = false) { } } -function recordState() { - ++step.val; - for (let i = step.val; i < recordObjs.length; i++) { - recordObjs.pop(); - recordJson.pop(); +// 将 recordState 附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 +window.recordState = function recordState() { + // 使用 window 变量作为后备,确保在 eval() 执行时也能访问 + const currentStep = window.step || step; + const currentRecordObjs = window.recordObjs || recordObjs; + const currentRecordJson = window.recordJson || recordJson; + const currentObjs = window.objs || objs; + const currentCanvas = window.canvas || canvas; + ++currentStep.val; + for (let i = currentStep.val; i < currentRecordObjs.length; i++) { + currentRecordObjs.pop(); + currentRecordJson.pop(); } - recordObjs.push(JSON.stringify(objs)) - j = canvas.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); + currentRecordObjs.push(JSON.stringify(currentObjs)) + let j = currentCanvas.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); j.objects[0].hoverCursor = "default"; - recordJson.push(j); + currentRecordJson.push(j); +}; +// 向后兼容 +function recordState() { + return window.recordState(); } -function getIndex(target, _canvas = null) { +// 将 getIndex 附加到 window 对象,确保在 eval() 加载 .jsc 文件时也能访问 +window.getIndex = function getIndex(target, _canvas = null) { let temp_objs; - if (_canvas == null) { - temp_objs = canvas.getObjects(); - } else { - temp_objs = _canvas.getObjects(); + // 使用 window.canvas 作为默认值,确保在 eval() 执行时也能访问 + const currentCanvas = _canvas || window.canvas || canvas; + if (!currentCanvas) { + console.error('getIndex: canvas is undefined'); + return 0; } + temp_objs = currentCanvas.getObjects(); let i = 0; for (let res of temp_objs) { @@ -1214,6 +1334,10 @@ function getIndex(target, _canvas = null) { i++; } return 0; +}; +// 向后兼容 +function getIndex(target, _canvas = null) { + return window.getIndex(target, _canvas); } function getType(target) { @@ -1339,6 +1463,8 @@ function addBackground() { image.setSrc(image.toDataURL(), function (image) { background_image1 = image background_image = background_image1 + window.background_image1 = background_image1; + window.background_image = background_image; canvas1.add(image) canvas1.renderAll() @@ -1356,6 +1482,7 @@ function addBackground() { image.setSrc(image.toDataURL(), function (image) { background_image2 = image + window.background_image2 = background_image2; canvas2.add(image) canvas2.renderAll() @@ -1364,7 +1491,7 @@ function addBackground() { let file = GetFile().get('file') if (file && file != 'empty') { - open(file) + window.openFile(file); } }) }) @@ -1603,6 +1730,13 @@ ipcRenderer.on('sys-lan', (event, data) => { let lang = localStorage.getItem('lang') if (lang) { s_lan = lang + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge(lang) $('#language_select').val(lang) return @@ -1610,60 +1744,130 @@ ipcRenderer.on('sys-lan', (event, data) => { switch (data) { case 'zh-CN': s_lan = 'zh' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('zh') $('#language_select').val('zh') localStorage.setItem('lang', 'zh') break case 'zh': s_lan = 'zh' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('zh') $('#language_select').val('zh') localStorage.setItem('lang', 'zh') break case 'zh-TW': s_lan = 'ozh' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('ozh') $('#language_select').val('ozh') localStorage.setItem('lang', 'ozh') break case 'en': s_lan = 'en' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('en') $('#language_select').val('en') localStorage.setItem('lang', 'en') break case 'en-AU': s_lan = 'en' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('en') $('#language_select').val('en') localStorage.setItem('lang', 'en') break case 'en-CA': s_lan = 'en' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('en') $('#language_select').val('en') localStorage.setItem('lang', 'en') break case 'en-GB': s_lan = 'en' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('en') $('#language_select').val('en') localStorage.setItem('lang', 'en') break case 'en-NZ': s_lan = 'en' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('en') $('#language_select').val('en') localStorage.setItem('lang', 'en') break case 'en-US': s_lan = 'en' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('en') $('#language_select').val('en') localStorage.setItem('lang', 'en') break case 'en-ZA': s_lan = 'en' + // 同步到全局作用域(用于 .jsc 文件加载) + if (typeof window !== 'undefined') { + window.s_lan = s_lan; + } + if (typeof global !== 'undefined') { + global.s_lan = s_lan; + } langua_ge('en') $('#language_select').val('en') localStorage.setItem('lang', 'en') @@ -1679,7 +1883,9 @@ ipcRenderer.on('close', (event, message) => { btn3: function (index, layero) { } }, function (index, layero) { - output(() => ipcRenderer.send('run-close')) + if (typeof window.output === 'function') { + window.output(() => ipcRenderer.send('run-close')); + } }, function (index) { ipcRenderer.send('run-close') @@ -1811,28 +2017,10 @@ window.rotate = function (id) { $(`#${id}`).css('transform', `rotate(${angle}deg)`) $(`#${id}`).attr('angle', angle) } -$('#display').on('click', function () { - // 类型改变 - fabric.Image.fromURL('./public/images/front_bg' + bg_version + '_2.png', function (i1) { - i1.left = background_image.left - i1.top = background_image.top - let img1 = i1 - - fabric.Image.fromURL('./public/images/back_bg_2.png', function (i2) { - i2.left = background_image.left - i2.top = background_image.top - let img2 = i2 - fabric.Image.fromURL('./public/images/op_2.png', function (i3) { - i2.left = background_image.left - i2.top = background_image.top - let img3 = i3 - display_func(img1, img2, img3) - }) - }) - }) -}) +// 注意:#display 事件绑定已在 ui.js 中定义(第2633行),此处已删除重复定义 // 导出文件 -async function savePdf(buffer) { +// 将 savePdf 附加到 window 对象,确保在 output.js 中也能访问 +window.savePdf = async function savePdf(buffer) { let fs = require('fs'); // 弹出保存对话框 const { canceled, filePath } = await dialog.showSaveDialog({ @@ -1846,918 +2034,27 @@ async function savePdf(buffer) { return; } - // 将Buffer写入PNG文件到用户选择的路径 + // 将Buffer写入PDF文件到用户选择的路径 fs.writeFile(filePath, buffer, (err) => { if (err) { console.error('写入文件失败:', err); } else { layer.msg(language_str("saveSucc") + filePath);//'保存成功至' - console.log('PNG文件已保存至:', filePath); + console.log('PDF文件已保存至:', filePath); } }); +}; +// 向后兼容 +async function savePdf(buffer) { + return window.savePdf(buffer); } -function display_func(img1, img2, img3) { - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $("#set_bg").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')) //"背景" - canvas1.discardActiveObject().renderAll() - canvas2.discardActiveObject().renderAll() - // 过滤掉辅助线 - let _objs1 = canvas1.getObjects().filter(obj => !obj.isGuideLine) - let g1 = [] - let g3 = [] - let g5 = [] - let left = 0 //左裁剪 - let top = 0 //顶裁剪 - let black_left = 0 //黑色左裁剪 - let black_top = 0 //黑色顶裁剪 - let all_left = 0 //预览图左裁剪 - let all_top = 0 //预览图顶裁剪 - for (let item of _objs1) { - let idx = getIndex(item, canvas1) - - // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 - if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) { - continue - } - - //console.log("------"); - //console.log(item.getCoords()); - //console.log(getCoordsMinX(background_image.getCoords())); - //console.log(getCoordsMinX(item.getCoords())); - //console.log(getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords())); - //console.log("------"); - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g3.push(fabric.util.object.clone(item)) - - if (idx != 0 && (objs1[idx - 1].type == 10 || objs1[idx - 1].type == 4)) { - continue //计数器 或 合成文字 - } - if (idx != 0 && (objs1[idx - 1].type == 8 || objs1[idx - 1].type == 9)) { - continue //二维码 条形码 - } - if (idx != 0 && objs1[idx - 1].type == 2) { - continue //合成图片 - } - if ( - idx != 0 && - ((objs1[idx - 1].type == 3 && (item.get('fill') == '#000000' || (item.get('fill') == '#ffffff' && false))) || - ( - objs1[idx - 1].type == 11 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //圆形文字 && 黑色 - ) || - //文字 && 黑色 - (objs1[idx - 1].type == 5 && //矩形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs1[idx - 1].type == 6 && //圆形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs1[idx - 1].type == 7 && //直线 - (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || - objs1[idx - 1].black == true) //勾选并入黑色图层 - // ( - // objs1[idx-1].type == 1//固定图片 - // && - // objs1[idx-1].black == true //勾选并入黑色图层 - // ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g5.push(fabric.util.object.clone(item)) - continue //黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g5.push(fabric.util.object.clone(item)) - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g1.push(fabric.util.object.clone(item)) - } - let url1 = new fabric.Group(g1).toDataURL({ - height: 648, - width: 1012, - top: top / zoom, - left: left / zoom - }) +// display_func 函数已移至 output.js,避免重复定义 +// function display_func(img1, img2, img3) { ... } - // g3.push(img1) - let url3 = new fabric.Group(g3).toDataURL({ - height: 648, - width: 1012, - top: all_top / zoom, - left: all_left / zoom - }) - let url5 = new fabric.Group(g5).toDataURL({ - height: 648, - width: 1012, - top: black_top / zoom, - left: black_left / zoom - }) - // 过滤掉辅助线 - let _objs2 = canvas2.getObjects().filter(obj => !obj.isGuideLine) - let g2 = [] - let g4 = [] - let g6 = [] - left = 0 - top = 0 - black_top = 0 - black_left = 0 - all_top = 0 - all_left = 0 - for (let item of _objs2) { - let idx = getIndex(item, canvas2) - - // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 - if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) { - continue - } - - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g4.push(fabric.util.object.clone(item)) - - if (idx != 0 && (objs2[idx - 1].type == 10 || objs2[idx - 1].type == 4)) { - continue //黑色字或计数器 或 合成文字 - } - if (idx != 0 && (objs2[idx - 1].type == 8 || objs2[idx - 1].type == 9)) { - continue //二维码 条形码 - } - if (idx != 0 && objs2[idx - 1].type == 2) { - continue //合成图片 - } - if (idx != 0 && objs2[idx - 1].type == 10) { - continue //合成图片 - } - if ( - idx != 0 && - ((objs2[idx - 1].type == 3 && (item.get('fill') == '#000000' || (item.get('fill') == '#ffffff' && false))) || - ( - objs2[idx - 1].type == 11 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //圆形文字 && 黑色 - ) || - //文字 && 黑色 - (objs2[idx - 1].type == 5 && //矩形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs2[idx - 1].type == 6 && //圆形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs2[idx - 1].type == 7 && //直线 - (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || - objs2[idx - 1].black == true) //勾选并入黑色图层 - // ( - // objs2[idx-1].type == 1//固定图片 - // && - // objs2[idx-1].black == true //勾选并入黑色图层 - // ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g6.push(fabric.util.object.clone(item)) - continue //黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g6.push(fabric.util.object.clone(item)) - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g2.push(fabric.util.object.clone(item)) - } - let url2 = new fabric.Group(g2).toDataURL({ - height: 648, - width: 1012, - top: top / zoom, - left: left / zoom - }) - let white_url1 = canvas1.getObjects()[0].toDataURL({ - height: 648, - width: 1012 - }) - // g4.push(img2) - let url4 = new fabric.Group(g4).toDataURL({ - height: 648, - width: 1012, - top: all_top / zoom, - left: all_left / zoom - }) - let url6 = new fabric.Group(g6).toDataURL({ - height: 648, - width: 1012, - top: black_top / zoom, - left: black_left / zoom - }) - let white_url2 = canvas2.getObjects()[0].toDataURL({ - height: 648, - width: 1012 - }) - //console.log(canvas.getObjects()) - let w = document.body.clientWidth * 0.7 + 'px' - let h = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 150 + 'px' - let h1 = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 'px' +// output 函数已移至 output.js,避免重复定义 +// function output(callback = null, _save = save) { ... } - if ((document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 > document.body.clientHeight) { - //高度超出,则按高度计算 - h = document.body.clientHeight * 0.8 + 'px' - h1 = document.body.clientHeight * 0.8 - 150 + 'px' - w = ((document.body.clientHeight * 0.8 - 150) / 0.62548 + 40) / 0.94 - } - let fs = require('fs'); - const Buffer = require('buffer').Buffer; - const buffer3 = Buffer.from(url3.replace(/^data:image\/\w+;base64,/, ""), 'base64'); - const printPath3 = path.join(exePath, 'print3.png'); - fs.writeFileSync(printPath3, buffer3); - const buffer4 = Buffer.from(url4.replace(/^data:image\/\w+;base64,/, ""), 'base64'); - const printPath4 = path.join(exePath, 'print4.png'); - fs.writeFileSync(printPath4, buffer4); - // 创建 PDF 实例 - const pdf = new jspdf.jsPDF({ - orientation: 'landscape', - unit: 'px', - format: [1012, 648] - }); - let btns = [language_str('output')] - if ((objs1.length != 0) & (objs2.length == 0)) { - //只有正面 - let img = new Image() - img.src = printPath3 - - pdf.addImage(img, 'JPEG', 0, 0, 1012, 648) - btns.push('打印正面') - } else if ((objs1.length == 0) & (objs2.length != 0)) { - //只有背面 - let img = new Image() - img.src = printPath4 - - pdf.addImage(img, 'JPEG', 0, 0, 1012, 648) - btns.push('打印背面') - } else { - let img = new Image() - img.src = printPath3 - - pdf.addImage(img, 'JPEG', 0, 0, 1012, 648) - - pdf.addPage() - let img2 = new Image() - img2.src = printPath4 - pdf.addImage(img2, 'JPEG', 0, 0, 1012, 648) - btns.push('打印正面') - btns.push('打印背面') - } - - var pdfBlob = pdf.output('blob') - var pdfBuffer = pdf.output('arraybuffer') - - layer.open({ - type: 1, - area: [w, h], - title: language_str('display'), //不显示标题栏"预览" - shadeClose: true, //点击遮罩关闭 - content: ` -
-
-
- -
- -
-
-
- -
- -
-
-
-
`, - btn: btns, //'导出' - btn1: function (index, layero) { - savePdf(Buffer.from(pdfBuffer)) - }, - btn2: function () { - if (btns[1] === '打印正面') { - printJS({ printable: printPath3, type: 'image', style: 'img { width: 100%; height: auto; }' }) - } else { - printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' }) - } - }, - btn3: function () { - //打印背面 - printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' }) - } - }) -} -function output(callback = null, _save = save) { - // 类型改变 - fabric.Image.fromURL('./public/images/op_2.png', function (i1) { - i1.left = background_image.left - i1.top = background_image.top - let img1 = i1 - fabric.Image.fromURL('./public/images/op_2.png', function (i2) { - i2.left = background_image.left - i2.top = background_image.top - let img2 = i2 - - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $("#set_bg").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')) //"背景" - canvas1.discardActiveObject().renderAll() - canvas2.discardActiveObject().renderAll() - // 过滤掉辅助线 - let _objs1 = canvas1.getObjects().filter(obj => !obj.isGuideLine) - let g1 = [] - let g3 = [] - let g5 = [] //黑色图层 - let left = 0 //左裁剪 - let top = 0 //顶裁剪 - let black_left = 0 //黑色左裁剪 - let black_top = 0 //黑色顶裁剪 - let all_left = 0 //预览图左裁剪 - let all_top = 0 //预览图顶裁剪 - for (let item of _objs1) { - let idx = getIndex(item, canvas1) - - // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 - if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) { - continue - } - //console.log("------"); - //console.log(item.getCoords()); - //console.log(getCoordsMinX(background_image.getCoords())); - //console.log(getCoordsMinX(item.getCoords())); - //console.log(getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords())); - //console.log("------"); - - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g3.push(fabric.util.object.clone(item)) - if (idx != 0 && (objs1[idx - 1].type == 10 || objs1[idx - 1].type == 4)) { - continue //计数器 或 合成文字 - } - if (idx != 0 && (objs1[idx - 1].type == 8 || objs1[idx - 1].type == 9)) { - continue //二维码 条形码 - } - if (idx != 0 && objs1[idx - 1].type == 2) { - continue //合成图片 - } - if ( - idx != 0 && - ((objs1[idx - 1].type == 3 && item.get('fill') == '#000000') || - ( - objs1[idx - 1].type == 11 - && - item.get("fill") == "#000000" - //圆形文字 && 黑色 - ) || - //文字 && 黑色 - (objs1[idx - 1].type == 5 && //矩形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs1[idx - 1].type == 6 && //圆形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs1[idx - 1].type == 7 && //直线 - (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || - objs1[idx - 1].black == true) //勾选并入黑色图层 - // || - // ( - // objs1[idx-1].type == 1//固定图片 - // && - // objs1[idx-1].black == true //勾选并入黑色图层 - // ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g5.push(fabric.util.object.clone(item)) - continue //黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g5.push(fabric.util.object.clone(item)) - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g1.push(fabric.util.object.clone(item)) - } - let url1 = new fabric.Group(g1).toDataURL({ - height: 648, - width: 1012, - top: top / zoom, - left: left / zoom - }) - g3.push(img1) - let url3 = new fabric.Group(g3).toDataURL({ - height: 648, - width: 1012, - top: all_top / zoom, - left: all_left / zoom - }) - let url5 = new fabric.Group(g5).toDataURL({ - height: 648, - width: 1012, - top: black_top / zoom, - left: black_left / zoom - }) - // 过滤掉辅助线 - let _objs2 = canvas2.getObjects().filter(obj => !obj.isGuideLine) - let g2 = [] - let g4 = [] - let g6 = [] //黑色图层 - left = 0 - top = 0 - black_left = 0 //黑色左裁剪 - black_top = 0 //黑色顶裁剪 - all_left = 0 //黑色左裁剪 - all_top = 0 //黑色顶裁剪 - for (let item of _objs2) { - let idx = getIndex(item, canvas2) - - // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 - if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) { - continue - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) { - all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) { - all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g4.push(fabric.util.object.clone(item)) - if (idx != 0 && (objs2[idx - 1].type == 10 || objs2[idx - 1].type == 4)) { - continue //计数器 或 合成文字 - } - if (idx != 0 && (objs2[idx - 1].type == 8 || objs2[idx - 1].type == 9)) { - continue //二维码 条形码 - } - if (idx != 0 && objs2[idx - 1].type == 2) { - continue //合成图片 - } - if ( - idx != 0 && - ((objs2[idx - 1].type == 3 && (item.get('fill') == '#000000' || (item.get('fill') == '#ffffff' && false))) || - ( - objs2[idx - 1].type == 11 - && - (item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false)) - //圆形文字 && 黑色 - ) || - //文字 && 黑色 - (objs2[idx - 1].type == 5 && //矩形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs2[idx - 1].type == 6 && //圆形 - (((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框 - (item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框 - ((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框 - (objs2[idx - 1].type == 7 && //直线 - (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || - objs2[idx - 1].black == true) //勾选并入黑色图层 - // ( - // objs2[idx-1].type == 1//固定图片 - // && - // objs2[idx-1].black == true //勾选并入黑色图层 - // ) - ) { - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) { - black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) { - black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g6.push(fabric.util.object.clone(item)) - continue //黑色文字 黑色矩形 黑色线条 黑色圆形 - } else if (idx == 0) { - g6.push(fabric.util.object.clone(item)) - } - if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) { - left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords())) - } - if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) { - top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords())) - } - g2.push(fabric.util.object.clone(item)) - } - let url2 = new fabric.Group(g2).toDataURL({ - height: 648, - width: 1012, - top: top / zoom, - left: left / zoom - }) - let white_url1 = canvas1.getObjects()[0].toDataURL({ - height: 648, - width: 1012 - }) - g4.push(img2) - let url4 = new fabric.Group(g4).toDataURL({ - height: 648, - width: 1012, - top: all_top / zoom, - left: all_left / zoom - }) - let url6 = new fabric.Group(g6).toDataURL({ - height: 648, - width: 1012, - top: black_top / zoom, - left: black_left / zoom - }) - let white_url2 = canvas2.getObjects()[0].toDataURL({ - height: 648, - width: 1012 - }) - //console.log(canvas.getObjects()) - let w = document.body.clientWidth * 0.7 + 'px' - let h = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 150 + 'px' - let h1 = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 'px' - - if ((document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 > document.body.clientHeight) { - //高度超出,则按高度计算 - h = document.body.clientHeight * 0.8 + 'px' - h1 = document.body.clientHeight * 0.8 - 150 + 'px' - w = ((document.body.clientHeight * 0.8 - 150) / 0.62548 + 40) / 0.94 - } - - let op = { frontColorPic: '', backColorPic: '', frontBlackPic: '', backBlackPic: '', frontData: [], backData: [], flag: 1, frontDisplayPic: url3, backDisplayPic: url4 } - if ((objs1.length != 0) & (objs2.length == 0)) { - op.flag = 2 - } else if ((objs1.length == 0) & (objs2.length != 0)) { - op.flag = 3 - } - op.frontColorPic = desEncrypt(url1) - op.backColorPic = desEncrypt(url2) - //op.frontBlPic = url5; - //op.backBlPic = url6; - op.frontBlackPic = desEncrypt(url5) - op.backBlackPic = desEncrypt(url6) - // 过滤掉辅助线 - let filteredObjs1 = _objs1.filter(obj => !obj.isGuideLine) - for (let item of filteredObjs1) { - let idx = getIndex(item, canvas1) - if (idx == 0) continue //background-image - - // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 - if (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined') { - continue - } - - let type = objs1[idx - 1].type - if (type == 2) { - //out_pic - let xy = getAbsoluteXY(item) - op.frontData.push({ - type: 1, - name: objs1[idx - 1].name, - FontColor: objs1[idx - 1].black ? '#000000' : '@', - transparency: item.get('opacity'), - x: parseInt((xy[0] - background_image1.left).toFixed(0)), - y: parseInt((xy[1] - background_image1.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } else if (type == 3) { - //text - /*2022-07-26 黑色并入黑色图层 - if(item.get("fill") == "#000000"){ - //纯黑 - op.frontData.push({ - "type" : 2, - "Text" : item.get("text"), - "FontFamily" : item.get("fontFamily"), - "FontSize" : parseInt(item.get("fontSize")), - "FontColor" : "#000000", - "FontBackgroudColor" : item.get("textBackgroundColor"), - "Bold" : item.get("fontWeight") == "bold", - "Underline" : item.get("underline"), - "Italic" : item.get("fontStyle") == "italic", - "Strikeout" : item.get("linethrough"), - "x" : parseInt((item.get("left") - background_image1.left).toFixed(0)), - "y" : parseInt((item.get("top") - background_image1.top).toFixed(0)), - "h" : parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w" : parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate" : parseInt(item.get("angle").toFixed(0)) - }); - } - */ - } else if (type == 11) { - //circle_text - op.frontData.push({ - "type": 2, - "Text": item.get("text"), - "FontFamily": item.get("fontFamily"), - "FontSize": parseInt(item.get("fontSize")), - "FontColor": "#000000", - "FontBackgroudColor": item.get("textBackgroundColor"), - "Bold": item.get("fontWeight") == "bold", - "Underline": item.get("underline"), - "Italic": item.get("fontStyle") == "italic", - "Strikeout": item.get("linethrough"), - "x": parseInt((item.get("left") - background_image1.left).toFixed(0)), - "y": parseInt((item.get("top") - background_image1.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)), - "circleCenter": objs1[idx - 1].circleCenter || 0 - }); - } else if (type == 4) { - //out_text - let xy = getAbsoluteXY(item) - op.frontData.push({ - type: 3, - name: objs1[idx - 1].name, - FontFamily: item.get('fontFamily'), - DefaultText: item.get('text'), - FontBackgroudColor: item.get('textBackgroundColor'), - FontSize: parseInt(item.get('fontSize')), - FontColor: item.get('fill'), - Exceed: objs1[idx - 1].exceed, - AutoWrap: objs1[idx - 1].autoWrap, - FixSize: objs1[idx - 1].fixSize, - Bold: item.get('fontWeight') == 'bold', - Underline: item.get('underline'), - Italic: item.get('fontStyle') == 'italic', - Strikeout: item.get('linethrough'), - x: parseInt((xy[0] - background_image1.left).toFixed(0)), - y: parseInt((xy[1] - background_image1.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)), - align: objs1[idx - 1].align - }) - } else if (type == 8) { - //二维码 - let xy = getAbsoluteXY(item) - op.frontData.push({ - type: 4, - name: objs1[idx - 1].name, - FontColor: objs1[idx - 1].color, - DefaultText: objs1[idx - 1].val, - x: parseInt((xy[0] - background_image1.left).toFixed(0)), - y: parseInt((xy[1] - background_image1.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } else if (type == 9) { - //条形码 - let xy = getAbsoluteXY(item) - op.frontData.push({ - type: 5, - name: objs1[idx - 1].name, - FontSize: parseInt(objs1[idx - 1].fontSize), - DefaultText: objs1[idx - 1].val, - HideText: objs1[idx - 1].show, - FontFamily: objs1[idx - 1].font, - FontColor: objs1[idx - 1].color, - x: parseInt((xy[0] - background_image1.left).toFixed(0)), - y: parseInt((xy[1] - background_image1.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } else if (type == 10) { - let xy = getAbsoluteXY(item) - op.frontData.push({ - type: 6, - name: objs1[idx - 1].name, - FontFamily: item.get('fontFamily'), - FontSize: parseInt(item.get('fontSize')), - FontColor: item.get('fill'), - start: objs1[idx - 1].start, - add: parseInt(objs1[idx - 1].add), - x: parseInt((xy[0] - background_image1.left).toFixed(0)), - y: parseInt((xy[1] - background_image1.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } - } - //obj2 - // 过滤掉辅助线 - let filteredObjs2 = _objs2.filter(obj => !obj.isGuideLine) - for (let item of filteredObjs2) { - let idx = getIndex(item, canvas2) - if (idx == 0) continue //background-image - - // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 - if (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined') { - continue - } - - let type = objs2[idx - 1].type - if (type == 2) { - //out_pic - let xy = getAbsoluteXY(item) - op.backData.push({ - type: 1, - name: objs2[idx - 1].name, - FontColor: objs2[idx - 1].black ? '#000000' : '@', - transparency: item.get('opacity'), - x: parseInt((xy[0] - background_image2.left).toFixed(0)), - y: parseInt((xy[1] - background_image2.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } else if (type == 3) { - //text - /*2022-07-26 黑色并入黑色图层 - if(item.get("fill") == "#000000"){ - //纯黑 - op.backData.push({ - "type" : 2, - "Text" : item.get("text"), - "FontFamily" : item.get("fontFamily"), - "FontSize" : parseInt(item.get("fontSize")), - "FontColor" : "#000000", - "FontBackgroudColor" : item.get("textBackgroundColor"), - "Bold" : item.get("fontWeight") == "bold", - "Underline" : item.get("underline"), - "Italic" : item.get("fontStyle") == "italic", - "Strikeout" : item.get("linethrough"), - "x" : parseInt((item.get("left") - background_image2.left).toFixed(0)), - "y" : parseInt((item.get("top") - background_image2.top).toFixed(0)), - "h" : parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w" : parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate" : parseInt(item.get("angle").toFixed(0)) - }); - } - */ - } else if (type == 11) { - //circle_text - op.backData.push({ - "type": 2, - "Text": item.get("text"), - "FontFamily": item.get("fontFamily"), - "FontSize": parseInt(item.get("fontSize")), - "FontColor": "#000000", - "FontBackgroudColor": item.get("textBackgroundColor"), - "Bold": item.get("fontWeight") == "bold", - "Underline": item.get("underline"), - "Italic": item.get("fontStyle") == "italic", - "Strikeout": item.get("linethrough"), - "x": parseInt((item.get("left") - background_image2.left).toFixed(0)), - "y": parseInt((item.get("top") - background_image2.top).toFixed(0)), - "h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)), - "w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)), - "rotate": parseInt(item.get("angle").toFixed(0)), - "circleCenter": objs2[idx - 1].circleCenter || 0 - }); - } else if (type == 4) { - let xy = getAbsoluteXY(item) - op.backData.push({ - type: 3, - name: objs2[idx - 1].name, - FontFamily: item.get('fontFamily'), - DefaultText: item.get('text'), - FontSize: parseInt(item.get('fontSize')), - FontBackgroudColor: item.get('textBackgroundColor'), - FontColor: item.get('fill'), - Exceed: objs2[idx - 1].exceed, - AutoWrap: objs2[idx - 1].autoWrap, - FixSize: objs2[idx - 1].fixSize, - Bold: item.get('fontWeight') == 'bold', - Underline: item.get('underline'), - Italic: item.get('fontStyle') == 'italic', - Strikeout: item.get('linethrough'), - x: parseInt((xy[0] - background_image2.left).toFixed(0)), - y: parseInt((xy[1] - background_image2.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)), - align: objs2[idx - 1].align - }) - } else if (type == 8) { - //二维码 - let xy = getAbsoluteXY(item) - op.backData.push({ - type: 4, - name: objs2[idx - 1].name, - FontColor: objs2[idx - 1].color, - DefaultText: objs2[idx - 1].val, - x: parseInt((xy[0] - background_image2.left).toFixed(0)), - y: parseInt((xy[1] - background_image2.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } else if (type == 9) { - let xy = getAbsoluteXY(item) - op.backData.push({ - type: 5, - name: objs2[idx - 1].name, - DefaultText: objs2[idx - 1].val, - HideText: objs1[idx - 1].show, - FontSize: parseInt(objs2[idx - 1].fontSize), - FontFamily: objs2[idx - 1].font, - FontColor: objs2[idx - 1].color, - x: parseInt((xy[0] - background_image2.left).toFixed(0)), - y: parseInt((xy[1] - background_image2.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } else if (type == 10) { - let xy = getAbsoluteXY(item) - op.backData.push({ - type: 6, - name: objs2[idx - 1].name, - FontFamily: item.get('fontFamily'), - FontSize: parseInt(item.get('fontSize')), - FontColor: item.get('fill'), - start: parseInt(objs2[idx - 1].start), - add: parseInt(objs2[idx - 1].add), - x: parseInt((xy[0] - background_image2.left).toFixed(0)), - y: parseInt((xy[1] - background_image2.top).toFixed(0)), - h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)), - w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)), - rotate: parseInt(item.get('angle').toFixed(0)) - }) - } - } - _save(op, callback) - //return false 开启该代码可禁止点击该按钮关闭 - }) - }) -} -$('#output').on('click', function () { - output(null, saveAs) -}) var _keyctrl = false, _keyc = false, _textEdit = false, @@ -2810,7 +2107,9 @@ $('body').keydown(function (event) { // CTRL/CMD+SHIFT+S - 保存副本 if (isModifierKey && event.shiftKey && event.keyCode == 83) { event.preventDefault(); - output(null, saveAs); + if (typeof window.output === 'function') { + window.output(null, saveAs); + } return; } // CTRL/CMD+Z - 还原 @@ -2828,13 +2127,13 @@ $('body').keydown(function (event) { // CTRL/CMD+C - 复制 if (isModifierKey && event.keyCode == 67 && event.target.nodeName == 'BODY') { event.preventDefault(); - copySelection(); + window.copySelection(); return; } // CTRL/CMD+V - 粘贴 if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') { event.preventDefault(); - pasteFromClipboard(); + window.pasteFromClipboard(); return; } // CTRL/CMD+SHIFT+DEL - 清空 @@ -2951,7 +2250,7 @@ $('body').keydown(function (event) { }) // 复制选中对象 -function copySelection() { +window.copySelection = function copySelection() { const activeObjects = canvas.getActiveObjects(); if (!activeObjects || activeObjects.length === 0) { @@ -2964,7 +2263,7 @@ function copySelection() { } // 粘贴对象 -function pasteFromClipboard() { +window.pasteFromClipboard = function pasteFromClipboard() { if (!clipboardData.objects || clipboardData.objects.length === 0) { layer.msg("剪贴板为空") return; diff --git a/lib/design2/output.js b/lib/design2/output.js index 40116fd..7be7afb 100644 --- a/lib/design2/output.js +++ b/lib/design2/output.js @@ -1,4 +1,5 @@ -function display_func(img1, img2, img3) { +// 将 display_func 附加到 window 对象,确保全局可访问 +window.display_func = function display_func(img1, img2, img3) { $('#base_control').hide() $('#line_control').hide() $('#pic_control').hide() @@ -15,6 +16,27 @@ function display_func(img1, img2, img3) { $('#component_type').text(language_str('bg')) //"背景" canvas1.discardActiveObject().renderAll() canvas2.discardActiveObject().renderAll() + + // 保存所有对象的 selectable 和 evented 状态,确保预览后能恢复 + const objStates1 = []; + const objStates2 = []; + canvas1.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine) { + objStates1[index] = { + selectable: obj.selectable, + evented: obj.evented + }; + } + }); + canvas2.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine) { + objStates2[index] = { + selectable: obj.selectable, + evented: obj.evented + }; + } + }); + // 过滤掉辅助线 let _objs1 = canvas1.getObjects().filter(obj => !obj.isGuideLine) let g1 = [] @@ -30,7 +52,7 @@ function display_func(img1, img2, img3) { let list1 = _objs1.filter(obj => !obj.isGuideLine) for (let item of list1) { let idx = getIndex(item, canvas1) - + // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) { continue @@ -114,10 +136,9 @@ function display_func(img1, img2, img3) { }) // g3.push(img1) - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 let url3 = new fabric.Group(g3).toDataURL({ - format: 'png', - multiplier: 0.6, // 缩小到原来的 60%,保持宽高比和所有内容 + height: 648, + width: 1012, top: all_top / zoom, left: all_left / zoom }) @@ -142,7 +163,7 @@ function display_func(img1, img2, img3) { let filteredObjs2 = _objs2.filter(obj => !obj.isGuideLine) for (let item of filteredObjs2) { let idx = getIndex(item, canvas2) - + // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) { continue @@ -225,10 +246,9 @@ function display_func(img1, img2, img3) { width: 1012 }) // g4.push(img2) - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 let url4 = new fabric.Group(g4).toDataURL({ - format: 'png', - multiplier: 0.6, // 缩小到原来的 60%,保持宽高比和所有内容 + height: 648, + width: 1012, top: all_top / zoom, left: all_left / zoom }) @@ -323,23 +343,53 @@ function display_func(img1, img2, img3) { `, btn: btns, //'导出' btn1: function (index, layero) { - savePdf(Buffer.from(pdfBuffer)) + // 只处理导出(保存PDF) + if (typeof window.savePdf === 'function') { + window.savePdf(Buffer.from(pdfBuffer)); + } else { + console.error('savePdf 函数未定义!'); + } }, btn2: function () { + // 根据 btns[1] 的值决定打印哪一面 if (btns[1] === '打印正面') { + // 打印正面 printJS({ printable: printPath3, type: 'image', style: 'img { width: 100%; height: auto; }' }) - } else { + } else if (btns[1] === '打印背面') { + // 打印背面(只有背面时) printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' }) } }, btn3: function () { - //打印背面 + // 打印背面(两面都有时,btn3 对应 btns[2] = '打印背面') printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' }) + }, + end: function() { + // 预览窗口关闭后,恢复所有对象的 selectable 和 evented 状态 + canvas1.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine && objStates1[index]) { + obj.set({ + selectable: objStates1[index].selectable, + evented: objStates1[index].evented + }); + } + }); + canvas2.getObjects().forEach((obj, index) => { + if (!obj.isGuideLine && objStates2[index]) { + obj.set({ + selectable: objStates2[index].selectable, + evented: objStates2[index].evented + }); + } + }); + canvas1.renderAll(); + canvas2.renderAll(); } }) } -function output(callback = null, _save = save) { +// 将 output 附加到 window 对象,确保全局可访问 +window.output = function output(callback = null, _save = save) { // 类型改变 fabric.Image.fromURL('./public/images/op_2.png', function (i1) { i1.left = background_image.left @@ -380,7 +430,7 @@ function output(callback = null, _save = save) { // _objs1 已经在上面过滤过辅助线了,直接使用 for (let item of _objs1) { let idx = getIndex(item, canvas1) - + // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) { continue @@ -464,10 +514,9 @@ function output(callback = null, _save = save) { left: left / zoom }) g3.push(img1) - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 let url3 = new fabric.Group(g3).toDataURL({ - format: 'png', - multiplier: 0.6, // 缩小到原来的 60%,保持宽高比和所有内容 + height: 648, + width: 1012, top: all_top / zoom, left: all_left / zoom }) @@ -491,7 +540,7 @@ function output(callback = null, _save = save) { // _objs2 已经在上面过滤过辅助线了,直接使用 for (let item of _objs2) { let idx = getIndex(item, canvas2) - + // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) { continue @@ -571,10 +620,9 @@ function output(callback = null, _save = save) { width: 1012 }) g4.push(img2) - // 预览图缩小尺寸以减小文件大小,使用 multiplier 来缩放整个 Group,保持所有内容完整 let url4 = new fabric.Group(g4).toDataURL({ - format: 'png', - multiplier: 0.6, // 缩小到原来的 60%,保持宽高比和所有内容 + height: 648, + width: 1012, top: all_top / zoom, left: all_left / zoom }) @@ -615,7 +663,7 @@ function output(callback = null, _save = save) { // _objs1 已经在上面过滤过辅助线了,直接使用 for (let item of _objs1) { let idx = getIndex(item, canvas1) - + // 安全检查:确保 objs1[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) { continue @@ -758,7 +806,7 @@ function output(callback = null, _save = save) { // _objs2 已经在上面过滤过辅助线了,直接使用 for (let item of _objs2) { let idx = getIndex(item, canvas2) - + // 安全检查:确保 objs2[idx - 1] 存在且有 type 属性 if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) { continue @@ -902,43 +950,44 @@ function output(callback = null, _save = save) { } // 重新生成二维码和条形码(加载文件后调用) -function regenerateQrCodesAndBarcodes(canvas, objsArray) { +// 将 regenerateQrCodesAndBarcodes 附加到 window 对象,确保全局可访问 +window.regenerateQrCodesAndBarcodes = function regenerateQrCodesAndBarcodes(canvas, objsArray) { if (!canvas || !objsArray || !Array.isArray(objsArray)) return - + const objects = canvas.getObjects() - + // 遍历对象(跳过背景图片,索引 0) for (let i = 1; i < objects.length; i++) { const obj = objects[i] if (!obj || obj.type !== 'image') continue - + const objIndex = i - 1 if (objIndex >= objsArray.length) continue - + const objMeta = objsArray[objIndex] if (!objMeta || (objMeta.type !== 8 && objMeta.type !== 9)) continue - + // type == 8: 二维码 - 复用 ui.js 中的生成逻辑 if (objMeta.type === 8) { - const qr = jrQrcode.getQrBase64(objMeta.val || 'https://www.cardsoon.com', { - padding: 0, - foreground: objMeta.color || '#000000' + const qr = jrQrcode.getQrBase64(objMeta.val || 'https://www.cardsoon.com', { + padding: 0, + foreground: objMeta.color || '#000000' }) - obj.setSrc(qr, function(img) { + obj.setSrc(qr, function (img) { canvas.renderAll() }) } // type == 9: 条形码 - 复用 ui.js 中的生成逻辑 else if (objMeta.type === 9) { - JsBarcode("#barcode", objMeta.val || '123456789', { - margin: 0, - lineColor: objMeta.color || '#000000', - fontSize: objMeta.fontSize || 18, - font: objMeta.font || 'Arial' + JsBarcode("#barcode", objMeta.val || '123456789', { + margin: 0, + lineColor: objMeta.color || '#000000', + fontSize: objMeta.fontSize || 18, + font: objMeta.font || 'Arial' }) const barcode = document.getElementById('barcode') const bar = barcode.toDataURL("image/png") - obj.setSrc(bar, function(img) { + obj.setSrc(bar, function (img) { canvas.renderAll() }) } @@ -946,7 +995,8 @@ function regenerateQrCodesAndBarcodes(canvas, objsArray) { } // 清理不需要的 src 字段(保留自定义图片的 src) -function cleanupSrcFields(jsonObjects, objsArray) { +// 将 cleanupSrcFields 附加到 window 对象,确保在 ui.js 中的 saveAs 函数也能访问 +window.cleanupSrcFields = function cleanupSrcFields(jsonObjects, objsArray) { if (!jsonObjects || !Array.isArray(jsonObjects)) return; if (!objsArray || !Array.isArray(objsArray)) return; @@ -972,6 +1022,10 @@ function cleanupSrcFields(jsonObjects, objsArray) { } } } +}; +// 向后兼容 +function cleanupSrcFields(jsonObjects, objsArray) { + return window.cleanupSrcFields(jsonObjects, objsArray); } function saveAs(op1, callback) { @@ -990,7 +1044,7 @@ function saveAs(op1, callback) { canvas2.remove(obj) } }) - + let j = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) let b = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) @@ -1009,18 +1063,27 @@ function saveAs(op1, callback) { dialog .showSaveDialog({ title: language_str('saveFile'), //'保存文件' - filters: [{ name: 'Soon File Type', extensions: ['soon'] }] + filters: [{ name: 'Soon File Type', extensions: ['soon'] }], + defaultPath: openAs.name || undefined }) .then((result) => { if (result.filePath == '') { return } - if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) { - result.filePath += '.soon' + if (result.filePath == null || result.filePath == undefined) { + return } + // 检查文件扩展名,确保以.soon结尾 + const path = require('path') + let filePath = result.filePath + const ext = path.extname(filePath).toLowerCase() + if (ext !== '.soon') { + filePath = filePath + '.soon' + } + result.filePath = filePath let fs = require('fs') con_o.soonType = 2 - fs.writeFileSync(result.filePath, JSON.stringify(con_o)) + fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8') openAs.name = result.filePath layer.msg(language_str('saveSucc') + openAs.name) //'保存成功至' saveHistory() @@ -1048,7 +1111,7 @@ function save(op1, callback) { canvas2.remove(obj) } }) - + let j = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) let b = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) @@ -1068,7 +1131,7 @@ function save(op1, callback) { //打开的文件 let fs = require('fs') con_o.soonType = 2 - fs.writeFileSync(openAs.name, JSON.stringify(con_o)) + fs.writeFileSync(openAs.name, JSON.stringify(con_o), 'utf8') layer.msg(language_str('saveSucc') + openAs.name) //'保存成功至' saveHistory() if (callback && typeof callback === 'function') { @@ -1079,18 +1142,27 @@ function save(op1, callback) { dialog .showSaveDialog({ title: language_str('saveFile'), //'保存文件' - filters: [{ name: 'Soon File Type', extensions: ['soon'] }] + filters: [{ name: 'Soon File Type', extensions: ['soon'] }], + defaultPath: openAs.name || undefined }) .then((result) => { if (result.filePath == '') { return } - if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) { - result.filePath += '.soon' + if (result.filePath == null || result.filePath == undefined) { + return } + // 检查文件扩展名,确保以.soon结尾 + const path = require('path') + let filePath = result.filePath + const ext = path.extname(filePath).toLowerCase() + if (ext !== '.soon') { + filePath = filePath + '.soon' + } + result.filePath = filePath let fs = require('fs') con_o.soonType = 2 - fs.writeFileSync(result.filePath, JSON.stringify(con_o)) + fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8') openAs.name = result.filePath layer.msg(language_str('saveSucc') + openAs.name) //'保存成功至' saveHistory() @@ -1102,7 +1174,8 @@ function save(op1, callback) { }) } -function saveHistory() { +// 将 saveHistory 附加到 window 对象,确保在 ui.js 中也能访问 +window.saveHistory = function saveHistory() { let fs = require('fs') let j = {} try { @@ -1111,19 +1184,24 @@ function saveHistory() { for (let item of j.history) { if (item.path == openAs.name) { item.time = getDate() - fs.writeFileSync(fullPath, JSON.stringify(j)) + fs.writeFileSync(fullPath, JSON.stringify(j), 'utf8') return } } j.history.push({ time: getDate(), path: openAs.name }) - fs.writeFileSync(fullPath, JSON.stringify(j)) + fs.writeFileSync(fullPath, JSON.stringify(j), 'utf8') } catch (e) { let j = { history: { time: getDate(), path: openAs.name } } - fs.writeFileSync(fullPath, JSON.stringify(j)) + fs.writeFileSync(fullPath, JSON.stringify(j), 'utf8') } +}; +// 向后兼容 +function saveHistory() { + return window.saveHistory(); } -function open(file) { +// 使用 window.openFile 避免与浏览器原生的 window.open 冲突 +window.openFile = function open(file) { let fs = require('fs') var fsData = fs.readFileSync(file) openAs.name = file @@ -1147,34 +1225,38 @@ function open(file) { if (j.b.objects[0] && !j.b.objects[0].src) { j.b.objects[0].src = './public/images/bg_back_2.png' } - + // 为二维码和条形码对象创建临时的 src(Fabric.js 需要 src 来创建 Image 对象) // 加载完成后会重新生成,所以这里只需要一个占位符 const fo = j.fo || [] const bo = j.bo || [] const placeholder = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==' - + // 为正面二维码和条形码创建临时 src fo.forEach((objMeta, idx) => { if ((objMeta.type === 8 || objMeta.type === 9) && j.f.objects[idx + 1] && !j.f.objects[idx + 1].src) { j.f.objects[idx + 1].src = placeholder } }) - + // 为背面二维码和条形码创建临时 src bo.forEach((objMeta, idx) => { if ((objMeta.type === 8 || objMeta.type === 9) && j.b.objects && j.b.objects[idx + 1] && !j.b.objects[idx + 1].src) { j.b.objects[idx + 1].src = placeholder } }) - + // 加载 JSON,并在回调中重新生成二维码和条形码 - canvas1.loadFromJSON(j.f, function() { - regenerateQrCodesAndBarcodes(canvas1, fo) + canvas1.loadFromJSON(j.f, function () { + if (typeof window.regenerateQrCodesAndBarcodes === 'function') { + window.regenerateQrCodesAndBarcodes(canvas1, fo); + } canvas1.renderAll() }) - canvas2.loadFromJSON(j.b, function() { - regenerateQrCodesAndBarcodes(canvas2, bo) + canvas2.loadFromJSON(j.b, function () { + if (typeof window.regenerateQrCodesAndBarcodes === 'function') { + window.regenerateQrCodesAndBarcodes(canvas2, bo); + } canvas2.renderAll() }) background_image1 = canvas1.getObjects()[0] @@ -1203,10 +1285,22 @@ function open(file) { } canvas1.renderAll() canvas2.renderAll() - updateList() /* - 修复打开新文件后无法撤销的bug - 2022-07-16 - */ + // 调用 updateList,现在它已附加到 window 对象 + if (typeof window.updateList === 'function') { + window.updateList(); /* + 修复打开新文件后无法撤销的bug + 2022-07-16 + */ + } else { + // 延迟检查,确保 core.js 已加载 + 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']) @@ -1257,7 +1351,22 @@ function clearAll() { openAs.name = '' canvas1.renderAll() canvas2.renderAll() - updateList() + // 调用 updateList,现在它已附加到 window 对象 + if (typeof window.updateList === 'function') { + window.updateList(); + } else { + // 延迟检查,确保 core.js 已加载 + setTimeout(() => { + if (typeof window.updateList === 'function') { + window.updateList(); + } else { + console.error('[clearAll] ❌ updateList 函数未定义!'); + } + }, 100); + } console.log() } +// 将 clearAll 附加到 window 对象,确保全局可访问 +window.clearAll = clearAll; + diff --git a/lib/design2/ui.js b/lib/design2/ui.js index b4aa2e4..fc7d430 100644 --- a/lib/design2/ui.js +++ b/lib/design2/ui.js @@ -1,3273 +1,3470 @@ -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(); - 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(); - copySelection(); - return; - } - // CTRL/CMD+V - 粘贴 - if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') { - event.preventDefault(); - pasteFromClipboard(); - return; - } - // CTRL/CMD+SHIFT+DEL - 清空 - if (isModifierKey && event.shiftKey && event.keyCode == 46) { - event.preventDefault(); - $('#clean').click(); - return; - } - // CTRL/CMD+DEL - 删除 - if (isModifierKey && !event.shiftKey && event.keyCode == 46) { - 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 - } - if (canvas.getActiveObject()) { - let x = canvas.getActiveObject().get('left') - x += v - canvas.getActiveObject().set('left', x) - canvas.renderAll() - recordState() - updateControls() - } - } - if (event.keyCode == 38) { - //up - let v = -1 - if (_keyctrl || event.ctrlKey || event.metaKey) { - v = -5 - } - if (canvas.getActiveObject()) { - let y = canvas.getActiveObject().get('top') - y += v - canvas.getActiveObject().set('top', y) - canvas.renderAll() - recordState() - updateControls() - } - } - if (event.keyCode == 39) { - //right - let v = 1 - if (_keyctrl || event.ctrlKey || event.metaKey) { - v = 5 - } - if (canvas.getActiveObject()) { - let x = canvas.getActiveObject().get('left') - x += v - canvas.getActiveObject().set('left', x) - canvas.renderAll() - recordState() - updateControls() - } - } - if (event.keyCode == 40) { - //down - let v = +1 - if (_keyctrl || event.ctrlKey || event.metaKey) { - v = 5 - } - if (canvas.getActiveObject()) { - let y = canvas.getActiveObject().get('top') - y += v - canvas.getActiveObject().set('top', y) - canvas.renderAll() - recordState() - updateControls() - } - } - // 普通删除键(DEL键,没有按CTRL/CMD) - if (event.keyCode == 46 && !isModifierKey && !_inputEdit && !_textEdit) { - let actObjs = canvas.getActiveObjects() - let allObjs = canvas.getObjects() - let flag = 0 - for (let item of actObjs) { - if (item != allObjs[0]) { - let i = getIndex(item, canvas) //0是背景,所以从1开始,但objs不包含背景图片,故要-1 - objs.splice(i - 1, 1) - canvas.remove(item) - flag = 1 - } - } - updateList() - canvas.discardActiveObject() - if (flag == 1) { - recordState() - canvas.renderAll() - handleObjectSelected() - } - } -}) -// pre_add_image 已在 design2.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 + '_2.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 - next_objs = next_objs1 - pre_objs = pre_objs1 - next_json = next_json1 - pre_json = pre_json1 - recordObjs = recordObjs1 - recordJson = recordJson1 - step = step1 - updateList() - - $('#line_control').hide() - $('#base_control').hide() - $('#pic_control').hide() - $("#set_bg").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 - next_objs = next_objs2 - pre_objs = pre_objs2 - next_json = next_json2 - pre_json = pre_json2 - recordObjs = recordObjs2 - recordJson = recordJson2 - step = step2 - updateList() - $('#line_control').hide() - $('#base_control').hide() - $('#pic_control').hide() - $("#set_bg").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) { - //只选中了一个 - _objs[0].set('top', background_image.get('top')) - canvas.renderAll() - return - } - let top = 0 - for (let item of _objs) { - let t_top = item.get('top') - if (t_top < top) { - top = t_top - } - } - groupItems = [] - for (let item of _objs) { - item.set('top', top) - 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') - } - _objs[0].set('top', background_image.get('top') + background_image.get('height') - _objs[0].get('height') * _objs[0].get('scaleY') - other) - canvas.renderAll() - return - } - let bottom = 0 - for (let item of _objs) { - let idx = getIndex(item) - let type = objs[idx - 1].type - let other = 0 //strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get('strokeWidth') - } - let t_b = item.get('top') + item.get('height') * item.get('scaleY') + other - if (t_b > bottom) { - bottom = t_b - } - } - groupItems = [] - for (let item of _objs) { - let idx = getIndex(item) - let type = objs[idx - 1].type - let other = 0 //strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get('strokeWidth') - } - item.set('top', bottom - item.get('height') * item.get('scaleY') - other) - 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') - } - _objs[0].set('top', background_image.get('top') + (background_image.get('height') - (_objs[0].get('height') + other) * _objs[0].get('scaleY')) / 2) - canvas.renderAll() - return - } - let top = 0 - for (let item of _objs) { - let t_top = item.get('top') - if (t_top < top) { - top = t_top - } - } - groupItems = [] - for (let item of _objs) { - let idx = getIndex(item) - let type = objs[idx - 1].type - let other = 0 //strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get('strokeWidth') - } - item.set('top', top + (item.group.height - (item.get('height') + other) * item.get('scaleY')) / 2) - groupItems.push(item) - } - canvas.discardActiveObject() - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas - }) - canvas.setActiveObject(sel) - canvas.requestRenderAll() - canvas.renderAll() -}) -$('#left_alignment').click(function () { - let _objs = canvas.getActiveObjects() - if (_objs.length == 1) { - //只选中了一个 - _objs[0].set('left', background_image.get('left')) - canvas.renderAll() - return - } - let left = 0 - for (let item of _objs) { - let t_left = item.get('left') - if (t_left < left) { - left = t_left - } - } - groupItems = [] - for (let item of _objs) { - item.set('left', left) - groupItems.push(item) - } - canvas.discardActiveObject() - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas - }) - canvas.setActiveObject(sel) - canvas.requestRenderAll() - canvas.renderAll() -}) -$('#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') - } - _objs[0].set('left', background_image.get('left') + background_image.get('width') - _objs[0].get('width') * _objs[0].get('scaleX') - other) - canvas.renderAll() - return - } - let right = 0 - for (let item of _objs) { - let idx = getIndex(item) - let type = objs[idx - 1].type - let other = 0 //strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get('strokeWidth') - } - let t_r = item.get('left') + item.get('width') * item.get('scaleX') + other - if (t_r > right) { - right = t_r - } - } - let groupItems = [] - - for (let item of _objs) { - let idx = getIndex(item) - let type = objs[idx - 1].type - let other = 0 //strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get('strokeWidth') - } - item.set('left', right - item.get('width') * item.get('scaleX') - other) - groupItems.push(item) - } - //BUG1 - canvas.discardActiveObject() - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas - }) - canvas.setActiveObject(sel) - canvas.requestRenderAll() - canvas.renderAll() -}) -$('#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') - } - _objs[0].set('left', background_image.get('left') + (background_image.get('width') - (_objs[0].get('width') + other) * _objs[0].get('scaleX')) / 2) - canvas.renderAll() - return - } - let left = 0 - for (let item of _objs) { - let t_left = item.get('left') - if (t_left < left) { - left = t_left - } - } - groupItems = [] - for (let item of _objs) { - let idx = getIndex(item) - let type = objs[idx - 1].type - let other = 0 //strokeWidth - if (type == 5 || type == 6 || type == 7) { - other = item.get('strokeWidth') - } - item.set('left', left + (item.group.width - (item.get('width') + other) * item.get('scaleX')) / 2) - groupItems.push(item) - } - canvas.discardActiveObject() - let sel = new fabric.ActiveSelection(groupItems, { - canvas: canvas - }) - canvas.setActiveObject(sel) - canvas.requestRenderAll() - 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); - - recordState() - updateList() - 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 - recordState() - updateList() - selectObj(idx - 2) - } -}) -$('#set_bg').click(function () { - //设置为背景 - let obj = canvas.getActiveObject() - let idx = getIndex(canvas.getActiveObject()) - const scaleX = 1012 / obj.width - const scaleY = 648 / obj.height - obj.set({ - scaleX: scaleX, - scaleY: scaleY, - left: ($('#canvas1').width() - 1012) / 2, - top: ($('#canvas1').height() - 648) / 2 - }) - $('#text_w').val(1012) - $('#text_h').val(648) - $('#text_x').val(0) - $('#text_y').val(0) - canvas.sendToBack(canvas.getActiveObject()) - canvas.bringForward(canvas.getActiveObject()) - canvas.renderAll() - let objItem = objs.splice(idx - 1, 1)[0] - objs.unshift(objItem) - recordState() - updateList() - selectObj(0) -}) -$('#previous').click(function () { - //撤销一次操作 - if (step.val == 0) { - return - } - - step.val-- - canvas.loadFromJSON(recordJson[step.val]) - if ($('#front_side').hasClass('ui-button-active')) { - //objs = JSON.parse(recordObjs[step.val]); - objs1 = JSON.parse(recordObjs[step.val]) - objs = objs1 - } else if ($('#back_side').hasClass('ui-button-active')) { - //objs = JSON.parse(recordObjs[step.val]); - objs2 = JSON.parse(recordObjs[step.val]) - objs = objs2 - } - - background_image = canvas.getObjects()[0] - canvas.renderAll() - //recordState(); - updateList() - - selectObj(-1) - - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $("#set_bg").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() -}) -$('#next').click(function () { - //撤销一次撤销操作 - if (step.val >= recordObjs.length - 1) { - return - } - - ++step.val - canvas.loadFromJSON(recordJson[step.val]) - if ($('#front_side').hasClass('ui-button-active')) { - //objs = JSON.parse(recordObjs[step.val]); - objs1 = JSON.parse(recordObjs[step.val]) - objs = objs1 - } else if ($('#back_side').hasClass('ui-button-active')) { - //objs = JSON.parse(recordObjs[step.val]); - objs2 = JSON.parse(recordObjs[step.val]) - objs = objs2 - } - background_image = canvas.getObjects()[0] - canvas.renderAll() - selectObj(-1) - - $('#base_control').hide() - $('#line_control').hide() - $('#pic_control').hide() - $("#set_bg").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() - updateList() -}) -$('#clean').click(function () { - objs.splice(0, objs.length) - - let allObjs = canvas.getObjects() - for (let item of allObjs) { - if (item != allObjs[0]) { - canvas.remove(item) - } - } - updateList() - 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() - recordState() -}) -$('#vertical_obj').click(function () { - let obj = canvas.getActiveObject() - obj.set('flipY', !obj.get('flipY')) - canvas.renderAll() - updateControls() - recordState() -}) -$('#align_obj').click(function () { - let obj = canvas.getActiveObject() - obj.set('flipX', !obj.get('flipX')) - canvas.renderAll() - updateControls() - 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') - } - recordState() - canvas.renderAll() -}) -$('#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') - } - recordState() - canvas.renderAll() -}) -$('#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') - } - recordState() - canvas.renderAll() -}) -$('#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') - } - recordState() - canvas.renderAll() -}) -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$("#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") - } - recordState(); - canvas.renderAll(); -}); -$('#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' - 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' - 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' - 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') - } - recordState() - canvas.renderAll() -}) -$('#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') - } - recordState() - canvas.renderAll() -}) -$('#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') - } - recordState() - canvas.renderAll() -}) -$('#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') - } - recordState() - canvas.renderAll() -}) -$('#lock').click(function () { - canvas.getActiveObject().set('selectable', !canvas.getActiveObject().get('selectable')) - if (canvas.getActiveObject().get('selectable')) { - $('#lock_img').attr('src', 'public/images/unlock20.png') //已经上锁,需要解锁 - } else { - $('#lock_img').attr('src', 'public/images/lock20.png') //没上锁,可以上锁 - } - recordState() - canvas.renderAll() -}) -$('#text_back_transparent').click(function () { - canvas.getActiveObject().set('textBackgroundColor', '') - $('#text_back_color').val('#ffffff') - canvas.renderAll() -}) -$('#circle_text_back_transparent').click(function () { - canvas.getActiveObject().set('textBackgroundColor', '') - $('#circle_text_back_color').val('#ffffff') - canvas.renderAll() -}) -$('#out_text_back_transparent').click(function () { - canvas.getActiveObject().set('textBackgroundColor', '') - $('#out_text_back_color').val('#ffffff') - canvas.renderAll() -}) -$('#rect_transparent').click(function () { - canvas.getActiveObject().set('fill', '') - $('#rect_color').val('#ffffff') - canvas.renderAll() -}) -$('#rect_stroke_transparent').click(function () { - canvas.getActiveObject().set('stroke', '') - $('#rect_stroke').val('#ffffff') - canvas.renderAll() -}) -$('#circle_transparent').click(function () { - canvas.getActiveObject().set('fill', '') - $('#circle_color').val('#ffffff') - canvas.renderAll() -}) -$('#circle_stroke_transparent').click(function () { - canvas.getActiveObject().set('stroke', '') - $('#circle_stroke').val('#ffffff') - canvas.renderAll() -}) -// 清理不需要的 src 字段(保留自定义图片的 src) -// cleanupSrcFields 函数已在 output.js 中定义 - -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 字段(调用 output.js 中的 cleanupSrcFields) - cleanupSrcFields(j.objects, objs1); - cleanupSrcFields(b.objects, objs2); - - let o = { f: j, b: 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 = 2 - fs.writeFileSync(result.filePath, JSON.stringify(con_o)) - openAs.name = result.filePath - layer.msg(language_str('saveSucc') + openAs.name) //'保存成功至' - saveHistory() - if (callback && typeof callback === 'function') { - callback() - } - }) - .catch((err) => { - }) -} -// save 函数已在 output.js 中定义 -// 复制 -$("#copy").click(function () { - copySelection(); -}) -// 粘贴 -$("#paste").click(function () { - pasteFromClipboard(); -}) -// 保存按钮事件绑定 -$('#save').click(function () { - output(); // 调用 output 函数 - return; -}) -function getDate() { - let date = new Date() - return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() -} -function getAbsoluteXY(_obj) { - let coord = _obj.get('lineCoords') - //let xs = [], ys = []; - return [_obj.get('left'), _obj.get('top')] -} -// fullPath, saveHistory 和 open 函数已在 output.js 中定义 -$('#open').click(function () { - if (step.val == 0) { - OpenDialog(); - return; - } - layer.confirm( - '' + language_str('whetherSave') + '', - function (index) { - 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 == 1) { - ipcRenderer.send('open-design-page', filePath, type); - return; - } - - // 调用 output.js 中的 open 函数 - open(filePath); - }) - .catch((err) => { - console.log(err); - }) - } -}) -function clearAll() { - //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\":1012,\"height\":648,\"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\":1012,\"height\":648,\"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() - updateList() -} -$('#new').click(function () { - if (step.val == 0) { - ipcRenderer.send('open-first-page'); - return; - } - layer.confirm( - '' + language_str('whetherSave') + '', - function (index) { - output(() => ipcRenderer.send('open-first-page')); - layer.close(index); - }, - function (index) { - ipcRenderer.send('open-first-page'); - } - ) -}) -function chagneTitle() { } -function addBackground() { - // 类型改变 - fabric.Image.fromURL('./public/images/bg_front_2.png', function (image) { - //image.set("scaleX",$("#canvas-div").width() / 1200 < 1 ? $("#canvas-div").width() / 1200 : 1) - - image.left = ($('#canvas1').width() - image.width * image.get('scaleX')) / 2 - image.top = ($('#canvas1').height() - image.height * image.get('scaleY')) / 2 - - image.selectable = false - image.hoverable = false - image.hoverCursor = 'default' - image.setSrc(image.toDataURL(), function (image) { - background_image1 = image - background_image = background_image1 - canvas.add(image) - canvas.renderAll() - //pre_objs1.push(JSON.stringify(objs1)); - - recordObjs1.push(JSON.stringify(objs1)) - recordJson1.push(canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])) - }) - // 类型改变 - fabric.Image.fromURL('./public/images/bg_back_2.png', function (image) { - image.left = ($('#canvas2').width() - image.width) / 2 - image.top = ($('#canvas2').height() - image.height) / 2 - - image.selectable = false - image.hoverable = false - image.hoverCursor = 'default' - - image.setSrc(image.toDataURL(), function (image) { - background_image2 = image - canvas2.add(image) - canvas2.renderAll() - //pre_objs2.push(JSON.stringify(objs2)); - - recordObjs2.push(JSON.stringify(objs2)) - recordJson2.push(canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])) - - let file = GetFile().get('file') - if (file && file != 'empty') { - open(file) - } - }) - }) - is_bgi_add = true - }) -} -function selectObject(target, index) { - updateControls() - - $('#base_control').show() - //$("#text_x").val((target.left - background_image.left).toFixed(1)); -} -function updateControls() { - $('#text_r').val(canvas.getActiveObject().get('angle').toFixed(0)) - $('#text_x').val((canvas.getActiveObject().get('left') - background_image.left).toFixed(0)) - $('#text_y').val((canvas.getActiveObject().get('top') - background_image.top).toFixed(0)) - $('#text_h').val((canvas.getActiveObject().get('scaleY') * canvas.getActiveObject().get('height')).toFixed(0)) - $('#text_w').val((canvas.getActiveObject().get('scaleX') * canvas.getActiveObject().get('width')).toFixed(0)) - if (canvas.getActiveObject().get('selectable')) { - $('#lock_img').attr('src', 'public/images/unlock20.png') //已经上锁,需要解锁 - } else { - $('#lock_img').attr('src', 'public/images/lock20.png') //没上锁,可以上锁 - } -} -function checkName(name) { - //检查字段名是否重复了 - 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 resName(pre_name) { - //返回的是不重复的字段名 - let num = objs1.length + objs2.length - 1 - do { - num++ - } while (!checkName(pre_name + num)) //重复了就再加1 - return pre_name + num -} -function addPic(pointer) { - pre_add_image.left = pointer.x - pre_add_image.top = pointer.y - - canvas.add(pre_add_image) - - objs.push({ type: 1, black: false }) - canvas.renderAll() - updateList() - recordState() - //OpenDialog(); -} -function selectPic(target, index) { - //透明度 - - $('#pic_control').show() - $("#set_bg").show(); - pic_op.setValue(100 - canvas.getActiveObject().get('opacity') * 100) - - let idx = getIndex(canvas.getActiveObject()) - // $("#pic_black").prop("checked", objs[idx-1].black ? 'checked' : ''); - - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#circle_control').hide() - $('#line_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() -} -function addOutPic(pointer) { - fabric.Image.fromURL('./public/images/outpic_extra.png', function (image) { - let width = canvas.getWidth() - let height = canvas.getHeight() - image.left = pointer.x - image.top = pointer.y - image.opacity = 1 - //image.on("selected",function(){//test well - image.setSrc(image.toDataURL(), function (image) { - canvas.add(image) - objs.push({ type: 2, name: resName('OUT_PIC_'), black: false }) - canvas.renderAll() - updateList() - recordState() - }) - }) -} -function selectOutPic(target, index) { - //字段名 - $('#out_pic_control').show() - out_pic_op.setValue(100 - canvas.getActiveObject().get('opacity') * 100) - let idx = getIndex(canvas.getActiveObject()) - $('#out_pic_field_name').val(objs[idx - 1].name) - // $("#out_pic_black").prop("checked", objs[idx-1].black ? 'checked' : ''); - - $('#pic_control').hide() - $("#set_bg").hide(); - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#circle_control').hide() - $('#line_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() -} - -function addText(pointer) { - let text = new fabric.IText('TEXT', { - //源:文本 - left: pointer.x, - top: pointer.y, - fill: '#000000', - textBackgroundColor: '', - fontStyle: 'normal', - fontWeight: 'normal', - underline: false, - linethrough: false, - fontFamily: 'Arial' - }) - text.setControlVisible('ml', false) - text.setControlVisible('mt', false) - text.setControlVisible('mr', false) - text.setControlVisible('mb', false) - canvas.add(text) - objs.push({ type: 3, black: false }) - canvas.renderAll() - updateList() - recordState() -} -function selectText() { - //console.log(canvas.getActiveObject().get("fontFamily")); - $('#text_control').show() - $('#text_color').val(canvas.getActiveObject().get('fill')) - $('#text_back_color').val(canvas.getActiveObject().get('textBackgroundColor') == '' ? '#ffffff' : canvas.getActiveObject().get('textBackgroundColor')) - let val = parseFloat(canvas.getActiveObject().get("fontSize")) * 72 / dpi - if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 - $("#text_size").val(val); - $('#text_text').val(canvas.getActiveObject().get('text')) - $('#text_font_family').val(canvas.getActiveObject().get('fontFamily')) - - if (canvas.getActiveObject().get('underline') == true) { - $('#text_underline').addClass('ui-radio-acitve') - } else { - $('#text_underline').removeClass('ui-radio-acitve') - } - if (canvas.getActiveObject().get('fontWeight') == 'bold') { - $('#text_bold').addClass('ui-radio-acitve') - } else { - $('#text_bold').removeClass('ui-radio-acitve') - } - if (canvas.getActiveObject().get('fontStyle') == 'italic') { - $('#text_italics').addClass('ui-radio-acitve') - } else { - $('#text_italics').removeClass('ui-radio-acitve') - } - if (canvas.getActiveObject().get('linethrough') == true) { - $('#text_linethrough').addClass('ui-radio-acitve') - } else { - $('#text_linethrough').removeClass('ui-radio-acitve') - } - $('#pic_control').hide() - $("#set_bg").hide(); - $('#out_pic_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#circle_control').hide() - $('#line_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() -} -function getDisdance(x1, y1, x2, y2) { - var dx = Math.abs(x2 - x1); // 计算x轴上的距离差,并取绝对值 - var dy = Math.abs(y2 - y1); // 计算y轴上的距离差,并取绝对值 - var distance = Math.sqrt(dx * dx + dy * dy); // 应用勾股定理计算距离 - return distance; -} -function getDeg(pointer) { - // 计算点击位置与画布中心的坐标差 - var centerX = canvas.width / 2; - var centerY = canvas.height / 2; - var mouseX = pointer.x; - var mouseY = pointer.y; - var dx = mouseX - centerX; - var dy = mouseY - centerY; - // 计算旋转角度(弧度) - var angleRad = Math.atan2(dy, dx); - // 将角度转换为度数 - var angleDeg = angleRad * (180 / Math.PI); - if (angleDeg < 0) { - angleDeg += 360; - } - angleDeg += 90 - return angleDeg -} -function addCircleText(pointer) { - let distance = getDisdance(pointer.x, pointer.y, canvas.width / 2, canvas.height / 2) - let angleDeg = getDeg(pointer) - let text = new fabric.CurvedText('Circle TEXT', {//源:圆形文本 - left: pointer.x, - top: pointer.y, - fill: "#000000", - textBackgroundColor: "", - fontStyle: "normal", - fontWeight: "normal", - diameter: distance * 2, - fontSize: 30, - underline: false, - linethrough: false, - lockScalingX: true, - lockScalingY: true, - fontFamily: 'Arial', - originX: 'center', - originY: 'center', - angle: angleDeg, - flipped: pointer.y > canvas.height / 2 ? true : false - }); - // distance = getDisdance(pointer.x+text.width/2, pointer.y, canvas.width/2,canvas.height/2) - text.setControlVisible("ml", false); - text.setControlVisible("mt", false); - text.setControlVisible("mr", false); - text.setControlVisible("mb", false); - canvas.add(text); - objs.push({ type: 11, black: false, circleCenter: 0 }); - canvas.renderAll(); - updateList(); - recordState(); -} -function selectCircleText() { - 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_updating !== 'undefined') { - circle_text_size_updating = true; - } - circle_text_size.setValue(canvas.getActiveObject().get("fontSize")); - if (typeof circle_text_size_updating !== 'undefined') { - circle_text_size_updating = false; - } - circle_text_diameter.setValue(canvas.getActiveObject().get("diameter")); - $("#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")); - - if (canvas.getActiveObject().get("underline") == true) { - $("#circle_text_underline").addClass("ui-radio-acitve") - } else { - $("#circle_text_underline").removeClass("ui-radio-acitve") - } - if (canvas.getActiveObject().get("fontWeight") == "bold") { - $("#circle_text_bold").addClass("ui-radio-acitve") - } else { - $("#circle_text_bold").removeClass("ui-radio-acitve") - } - if (canvas.getActiveObject().get("fontStyle") == "italic") { - $("#circle_text_italics").addClass("ui-radio-acitve") - } else { - $("#circle_text_italics").removeClass("ui-radio-acitve") - } - if (canvas.getActiveObject().get("linethrough") == true) { - $("#circle_text_linethrough").addClass("ui-radio-acitve") - } else { - $("#circle_text_linethrough").removeClass("ui-radio-acitve") - } - $("#pic_control").hide(); - $("#set_bg").hide(); - $("#rotate").hide(); - $("#out_pic_control").hide(); - $("#text_control").hide(); - $("#out_text_control").hide(); - $("#rect_control").hide(); - $("#circle_control").hide(); - $("#line_control").hide(); - $("#counter_control").hide(); - $("#qrcode_Controll").hide(); - $("#barcode_controll").hide(); - -} -function addOutText(pointer) { - //MERGE_TEXT_1 - let text = new fabric.Text('MERGE TEXT', { - //源:合成文本 - left: pointer.x, - top: pointer.y, - fill: '#000000', - fontStyle: 'normal', - fontWeight: 'normal', - textBackgroundColor: '', - underline: false, - linethrough: false, - fontFamily: 'Arial', - textAlign: 'center' - }) - - //text.on({ - text.setControlVisible('ml', false) - text.setControlVisible('mt', false) - text.setControlVisible('mr', false) - text.setControlVisible('mb', false) - - canvas.add(text) - objs.push({ type: 4, name: resName('OUT_TEXT_'), exceed: false, autoWrap: false, fixSize: false, black: false, align: 'center' }) - canvas.renderAll() - updateList() - recordState() -} -function selectOutText() { - //color - const align = canvas.getActiveObject().get('textAlign') - if (align === 'left') { - $('#out_left_alignment').parent().addClass('tool1') - } else if (align === 'right') { - $('#out_right_alignment').parent().addClass('tool1') - } else { - $('#out_center_alignment').parent().addClass('tool1') - } - $('#out_text_control').show() - $('#out_text_color').val(canvas.getActiveObject().get('fill')) - $('#out_text_text').val(canvas.getActiveObject().get('text')) - let val = parseFloat(canvas.getActiveObject().get("fontSize")) * 72 / dpi - if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 - $("#out_text_size").val(val); - $('#out_text_back_color').val(canvas.getActiveObject().get('textBackgroundColor') == '' ? '#ffffff' : canvas.getActiveObject().get('textBackgroundColor')) - let idx = getIndex(canvas.getActiveObject()) - $('#out_text_field_name').val(objs[idx - 1].name) - $('#out_text_font_family').val(canvas.getActiveObject().get('fontFamily')) - $('#exceed').prop('checked', objs[idx - 1].exceed ? 'checked' : '') - $('#autoWrap').prop('checked', objs[idx - 1].autoWrap ? 'checked' : '') - $('#fixSize').prop('checked', objs[idx - 1].fixSize ? 'checked' : '') - if (canvas.getActiveObject().get('underline') == true) { - $('#out_text_underline').addClass('ui-radio-acitve') - } else { - $('#out_text_underline').removeClass('ui-radio-acitve') - } - if (canvas.getActiveObject().get('fontWeight') == 'bold') { - $('#out_text_bold').addClass('ui-radio-acitve') - } else { - $('#out_text_bold').removeClass('ui-radio-acitve') - } - if (canvas.getActiveObject().get('fontStyle') == 'italic') { - $('#out_text_italics').addClass('ui-radio-acitve') - } else { - $('#out_text_italics').removeClass('ui-radio-acitve') - } - if (canvas.getActiveObject().get('linethrough') == true) { - $('#out_text_linethrough').addClass('ui-radio-acitve') - } else { - $('#out_text_linethrough').removeClass('ui-radio-acitve') - } - - $('#pic_control').hide() - $("#set_bg").hide(); - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#rect_control').hide() - $('#circle_control').hide() - $('#line_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() -} -function addRect(pointer) { - let rect = new fabric.Rect({ - left: pointer.x, - top: pointer.y, - fill: '', - stroke: "#ff0000", - strokeWidth: 3, - width: 100, - height: 100 - }) - canvas.add(rect) - objs.push({ type: 5, black: false }) - canvas.renderAll() - updateList() - recordState() -} -function selectRect() { - //color - $('#rect_control').show() - $('#rect_color').val(canvas.getActiveObject().get('fill') == '' ? '#ffffff' : canvas.getActiveObject().get('fill')) - $('#rect_stroke').val(canvas.getActiveObject().get('stroke') == '' ? '#ffffff' : canvas.getActiveObject().get('stroke')) - $('#rect_stroke_width').val(canvas.getActiveObject().get('strokeWidth')) - $('#rect_radius').val(canvas.getActiveObject().get('rx')) - rect_op.setValue(100 - canvas.getActiveObject().get('opacity') * 100) - let a = canvas.getActiveObject().getCoords() - $('#pic_control').hide() - $("#set_bg").hide(); - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#circle_control').hide() - $('#line_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() -} -function addCircle(pointer) { - let circle = new fabric.Circle({ - left: pointer.x, - top: pointer.y, - fill: '', - stroke: '#ff0000', - strokeWidth: 3, - radius: 100, - strokeUniform: true - }) - canvas.add(circle) - objs.push({ type: 6, black: false }) - canvas.renderAll() - updateList() - recordState() -} -function selectCircle() { - //border-color - $('#circle_control').show() - $('#circle_color').val(canvas.getActiveObject().get('fill') == '' ? '#ffffff' : canvas.getActiveObject().get('fill')) - $('#circle_stroke').val(canvas.getActiveObject().get('stroke') == '' ? '#ffffff' : canvas.getActiveObject().get('stroke')) - $('#circle_stroke_width').val(canvas.getActiveObject().get('strokeWidth')) - circle_op.setValue(100 - canvas.getActiveObject().get('opacity') * 100) - $('#pic_control').hide() - $("#set_bg").hide(); - $('#out_pic_control').hide() - $('#text_control').hide() - $("#circle_text_control").hide(); - $('#out_text_control').hide() - $('#rect_control').hide() - $('#line_control').hide() - $('#counter_control').hide() - $('#qrcode_Controll').hide() - $('#barcode_controll').hide() -} -function addLine(pointer) { - let line = new fabric.Line([50, 100, 200, 100], { - left: pointer.x, - top: pointer.y, - stroke: '#ff0000', - strokeWidth: 3, - strokeDashArray: [0, 0], - }) - - line.setControlVisible('tl', false) - line.setControlVisible('tr', false) - line.setControlVisible('br', false) - line.setControlVisible('bl', false) - line.setControlVisible('mt', false) - line.setControlVisible('mb', false) - canvas.add(line) - objs.push({ type: 7, black: false }) - canvas.renderAll() - updateList() - recordState() -} -function selectLine() { - //color - $('#line_control').show() - - let idx = getIndex(canvas.getActiveObject()) - $('#line_color').val(canvas.getActiveObject().get('stroke')) - $('#line_dist').val(canvas.getActiveObject().get('strokeDashArray')[0]) - $('#text_h').val(canvas.getActiveObject().get('strokeWidth')) - - $('#pic_control').hide() - $("#set_bg").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() -} -function addQrCode(pointer) { - let qr = jrQrcode.getQrBase64('https://www.cardsoon.com', { padding: 0 }) - fabric.Image.fromURL(qr, function (image) { - image.left = pointer.x - image.top = pointer.y - canvas.add(image) - objs.push({ type: 8, name: resName('QR_CODE_'), color: '#000000', val: 'http://www.cardsoon.com', black: false }) - canvas.renderAll() - updateList() - recordState() - }) -} -function selectQrCode() { - //字段名 - $('#qrcode_Controll').show() - let idx = getIndex(canvas.getActiveObject()) - $('#qrcode_field_name').val(objs[idx - 1].name) - $('#qrcode_color').val(objs[idx - 1].color) - $('#qrcode_val').val(objs[idx - 1].val) - $('#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() - $('#barcode_controll').hide() -} -function addBarCode(pointer) { - JsBarcode('#barcode', '123456789', { margin: 0, lineColor: '#000000', fontSize: 18, font: 'Arial' }) - let barcode = document.getElementById('barcode') - let bar = barcode.toDataURL('image/png') - fabric.Image.fromURL(bar, function (image) { - image.left = pointer.x - image.top = pointer.y - - canvas.add(image) - objs.push({ type: 9, name: resName('BAR_CODE_'), val: '123456789', color: '#000000', fontSize: 18, font: 'Arial', show: false, black: false }) //show是取消文字显示 - canvas.renderAll() - updateList() - recordState() - }) -} -function selectBarCode() { - //字段名 - $('#barcode_controll').show() - let idx = getIndex(canvas.getActiveObject()) - $('#barcode_field_name').val(objs[idx - 1].name) - $('#barcode_font_family').val(objs[idx - 1].font) - let val = parseFloat(objs[idx - 1].fontSize) * 72 / dpi - if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 - $("#barcode_size").val(val); - $('#barcode_val').val(objs[idx - 1].val) - $('#barcode_show').prop('checked', objs[idx - 1].show ? 'checked' : '') - $('#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() -} -function addCounter(pointer) { - let text = new fabric.Text('0', { - left: pointer.x, - top: pointer.y, - fill: '#000000' - }) - canvas.add(text) - objs.push({ type: 10, name: resName('COUNTER_'), start: 0, add: 1, black: false }) - canvas.renderAll() - updateList() - recordState() -} -function selectCounter() { - //起始 - $('#counter_control').show() - - let idx = getIndex(canvas.getActiveObject()) - $('#counter_start').val(objs[idx - 1].start) - $('#counter_add').val(objs[idx - 1].add) - $('#counter_color').val(canvas.getActiveObject().get('fill')) - $('#count_font_family').val(canvas.getActiveObject().get('fontFamily')) - let val = parseFloat(canvas.getActiveObject().get("fontSize")) * 72 / dpi - if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 - $("#count_size").val(val); - - $('#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() -} -function getIndex(target, _canvas = null) { - let temp_objs - 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 getType(target) { - let temp_objs = canvas.getObjects() - let i = 0 - for (let res of temp_objs) { - if (target == res) { - return objs[i].type - } - i++ - } -} - -function updateList() { - let str = '' - let i = 0 - for (let item of objs) { - switch (item.type) { - case 1 /* 2022-06-14修改*/: - str = '
IMG_" + i + '
' + str - break - case 2: - str = '
" + item.name + '
' + str - break - case 3: - str = '
" + 'TEXT_' + i + '
' + str - break - case 4: - str = '
" + item.name + '
' + str - break - case 5: - str = '
RECT_" + i + '
' + str - break - case 6: - str = '
CIRCLE_" + i + '
' + str - break - case 7: - str = '
LINE_" + i + '
' + str - break - case 8: - str = '
QRCODE_" + i + '
' + str - break - case 9: - str = '
BARCODE_" + i + '
' + str - break - case 10: - str = '
COUNTER_" + i + '
' + str - break - case 11: - str = "
" + "CIRCLE_TEXT_" + i + "
" + str; - break; - } - i++ - } - $('.obj_list').html(str) -} -function selectObj(i, notSelect = false) { - //for(let item in $(".obj_list").children()){ - $('.obj_list div').each(function (index) { - //if(index == i){ - if ($(this).children('img').attr('id') == 'obj' + i) { - $(this).css('background-color', '#6F7A84') - canvas.setActiveObject(canvas.getObjects()[i + 1]) - canvas.renderAll() - } else { - $(this).css('background-color', '') - } - }) - if (!notSelect) { - handleObjectSelected() - } -} -function recordState() { - //pre_objs.push(JSON.stringify(objs)); - ++step.val - for (let i = step.val; i < recordObjs.length; i++) { - recordObjs.pop() - recordJson.pop() - } - //recordObjs.splice(step.val, 1, JSON.stringify(objs)) - recordObjs.push(JSON.stringify(objs)) - j = canvas.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) - j.objects[0].hoverCursor = 'default' - recordJson.push(j) -} -function getCoordsMinX(acoords) { - x = acoords[0].x - for (let item of acoords) { - if (item.x < x) { - x = item.x - } - } - return x -} -function getCoordsMaxX(acoords) { - x = acoords[0].x - for (let item of acoords) { - if (item.x > x) { - x = item.x - } - } - return x -} -function getCoordsMinY(acoords) { - y = acoords[0].y - for (let item of acoords) { - if (item.y < y) { - y = item.y - } - } - return y -} -function getCoordsMaxY(acoords) { - y = acoords[0].y - for (let item of acoords) { - if (item.y > y) { - y = item.y - } - } - return y -} - -$('#text_y').bind('input propertychange', function () { - 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() - recordState() -}) -$('#text_x').bind('input propertychange', function () { - 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() - recordState() -}) -$('#text_w').bind('input propertychange', function () { - let val = '0' - if ($('#text_w').val() != '') { - val = $('#text_w').val() - } - let type = objs[getIndex(canvas.getActiveObject()) - 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() - recordState() -}) -$('#text_h').bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()) - 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[getIndex(canvas.getActiveObject()) - 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() - recordState() -}) -$('#text_r').bind('input propertychange', function () { - 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() - recordState() -}) -$('#out_pic_field_name').bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].name = $('#out_pic_field_name').val() - updateList() - 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 - } - recordState() -}) -// $("#out_pic_black").click(function () { -$('#out_text_field_name').bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].name = $('#out_text_field_name').val() - updateList() - recordState() -}) -$('#qrcode_field_name').bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].name = $('#qrcode_field_name').val() - updateList() - recordState() -}) -$('#qrcode_color').bind('input propertychange', function () { - let item = canvas.getActiveObject() - let qr = jrQrcode.getQrBase64('https://www.cardsoon.com', { padding: 0, foreground: $(this).val() }) - let idx = getIndex(item) - objs[idx - 1].color = $(this).val() - item.setSrc(qr, function (img) { - canvas.renderAll() - 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(); - 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() - recordState() - }) -}) -$('#barcode_field_name').bind('input propertychange', function () { - let idx = getIndex(canvas.getActiveObject()) - objs[idx - 1].name = $('#barcode_field_name').val() - updateList() - recordState() -}) -$('#text_color').bind('input propertychange', function () { - canvas.getActiveObject().set('fill', $('#text_color').val()) - canvas.renderAll() - recordState() -}) -$('#text_back_color').bind('input propertychange', function () { - canvas.getActiveObject().set('textBackgroundColor', $('#text_back_color').val()) - canvas.renderAll() - recordState() -}) -$('#out_text_back_color').bind('input propertychange', function () { - canvas.getActiveObject().set('textBackgroundColor', $('#out_text_back_color').val()) - - canvas.renderAll() - 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(); - recordState(); -}) -$("#circle_text_color").bind('input propertychange', function () { - canvas.getActiveObject().set("fill", $("#circle_text_color").val()); - canvas.renderAll(); - recordState(); -}) -$("#circle_text_back_color").bind('input propertychange', function () { - canvas.getActiveObject().set("textBackgroundColor", $("#circle_text_back_color").val()); - - canvas.renderAll(); - recordState(); -}) -$("#circle_text_text").bind('input propertychange', function () { - let val = $("#circle_text_text").val().trim() - canvas.getActiveObject().set("text", ` ${val} `); - canvas.renderAll(); - updateList(); - 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; - } - recordState(); -}); -$('#out_text_color').bind('input propertychange', function () { - canvas.getActiveObject().set('fill', $('#out_text_color').val()) - canvas.renderAll() - 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(); - recordState(); -}) -$('#out_text_text').bind('input propertychange', function () { - let val = $("#out_text_text").val().trim() - canvas.getActiveObject().set("text", ` ${val} `); - canvas.renderAll() - updateList() - recordState() -}) -$('#rect_color').bind('input propertychange', function () { - canvas.getActiveObject().set('fill', $('#rect_color').val()) - - canvas.renderAll() - recordState() -}) -$('#rect_stroke').bind('input propertychange', function () { - canvas.getActiveObject().set('stroke', $('#rect_stroke').val()) - - canvas.renderAll() - 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() - 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() - recordState() -}) -$('#circle_color').bind('input propertychange', function () { - canvas.getActiveObject().set('fill', $('#circle_color').val()) - - canvas.renderAll() - recordState() -}) -$('#circle_stroke').bind('input propertychange', function () { - canvas.getActiveObject().set('stroke', $('#circle_stroke').val()) - - canvas.renderAll() - 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() - 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() - recordState() -}) -$('#counter_add').bind('input propertychange', function () { - let item = canvas.getActiveObject() - let idx = getIndex(item) - objs[idx - 1].add = $(this).val() - canvas.renderAll() - recordState() -}) -$('#counter_color').bind('input propertychange', function () { - canvas.getActiveObject().set('fill', $('#counter_color').val()) - canvas.renderAll() - 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(); - recordState(); -}) -$('#line_color').bind('input propertychange', function () { - canvas.getActiveObject().set('stroke', $('#line_color').val()) - canvas.renderAll() - 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() - recordState() -}) -$('#text_text').bind('input propertychange', function () { - let val = $("#text_text").val().trim() - canvas.getActiveObject().set("text", ` ${val} `); - canvas.renderAll() - updateList() - 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() - 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(); - 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(); - recordState(); - }); -}) -$('#count_font_family').on('change', function () { - canvas.getActiveObject().set('fontFamily', $(this).find('option:selected').text()) - canvas.renderAll() - recordState() -}) -$('#text_font_family').on('change', function () { - canvas.getActiveObject().set('fontFamily', $(this).find('option:selected').text()) - canvas.renderAll() - recordState() -}) - -$('#circle_text_font_family').on('change', function () { - canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) - canvas.renderAll() - 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() - recordState() - }) - //recordState(); -}) -$('#out_text_font_family').on('change', function () { - canvas.getActiveObject().set('fontFamily', $(this).find('option:selected').text()) - canvas.renderAll() - recordState() -}) -$('.obj_list').on('click', 'div', function () { - let idx = objs.length - 1 - $(this).index() - 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 - } - recordState() -}) -$('#autoWrap').click(function () { - let idx = getIndex(canvas.getActiveObject()) - if ($(this).prop('checked')) { - objs[idx - 1].autoWrap = true - } else { - objs[idx - 1].autoWrap = false - } - recordState() -}) -$('#fixSize').click(function () { - let idx = getIndex(canvas.getActiveObject()) - if ($(this).prop('checked')) { - objs[idx - 1].fixSize = true - } else { - objs[idx - 1].fixSize = false - } - 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 - } - } - updateList() - canvas.discardActiveObject() - if (flag == 1) { - recordState() - canvas.renderAll() - } - // let actObjs = canvas.getActiveObjects(); -}) - -//在关于我们获取版本号。 -$("#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 + '_2.png', function (i1) { - i1.left = background_image.left - i1.top = background_image.top - let img1 = i1 - - fabric.Image.fromURL('./public/images/back_bg_2.png', function (i2) { - i2.left = background_image.left - i2.top = background_image.top - let img2 = i2 - fabric.Image.fromURL('./public/images/op_2.png', function (i3) { - i2.left = background_image.left - i2.top = background_image.top - let img3 = i3 - display_func(img1, img2, img3); - }) - }) - }) -}); -$("#output").click(function () { - output(); // 调用output函数(在output.js中定义) -}); -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')) - } -} - -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() - - // 如果是辅助线,直接返回,不处理 - 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; - } -}) +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 - 清空 + if (isModifierKey && event.shiftKey && event.keyCode == 46) { + event.preventDefault(); + $('#clean').click(); + return; + } + // CTRL/CMD+DEL - 删除 + if (isModifierKey && !event.shiftKey && event.keyCode == 46) { + 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 + } + if (canvas.getActiveObject()) { + let x = canvas.getActiveObject().get('left') + x += v + canvas.getActiveObject().set('left', x) + canvas.renderAll() + recordState() + updateControls() + } + } + if (event.keyCode == 38) { + //up + let v = -1 + if (_keyctrl || event.ctrlKey || event.metaKey) { + v = -5 + } + if (canvas.getActiveObject()) { + let y = canvas.getActiveObject().get('top') + y += v + canvas.getActiveObject().set('top', y) + canvas.renderAll() + recordState() + updateControls() + } + } + if (event.keyCode == 39) { + //right + let v = 1 + if (_keyctrl || event.ctrlKey || event.metaKey) { + v = 5 + } + if (canvas.getActiveObject()) { + let x = canvas.getActiveObject().get('left') + x += v + canvas.getActiveObject().set('left', x) + canvas.renderAll() + recordState() + updateControls() + } + } + if (event.keyCode == 40) { + //down + let v = +1 + if (_keyctrl || event.ctrlKey || event.metaKey) { + v = 5 + } + if (canvas.getActiveObject()) { + let y = canvas.getActiveObject().get('top') + y += v + canvas.getActiveObject().set('top', y) + canvas.renderAll() + 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) { + recordState() + canvas.renderAll() + if (typeof window.handleObjectSelected === 'function') { + window.handleObjectSelected() + } + } + } +}) +// pre_add_image 已在 design2.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 + '_2.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() + $("#set_bg").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() + $("#set_bg").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() + 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() + recordState() +}) +$('#bottom_alignment').click(function () { + let _objs = canvas.getActiveObjects() + if (_objs.length == 1) { + //只选中了一个,对齐到背景底部 + 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() + 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() + recordState() +}) +$('#center_y_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 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() + 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() + 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() + 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() + recordState() +}) +$('#right_alignment').click(function () { + let _objs = canvas.getActiveObjects() + if (_objs.length == 1) { + //只选中了一个,对齐到背景右边缘 + 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() + 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) + } + canvas.discardActiveObject() + let sel = new fabric.ActiveSelection(groupItems, { + canvas: canvas + }) + canvas.setActiveObject(sel) + canvas.requestRenderAll() + canvas.renderAll() + recordState() +}) +$('#center_x_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 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() + 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() + 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); + + 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 + 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(canvas.getActiveObject()) + const scaleX = 1012 / obj.width + const scaleY = 648 / 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(1012) + $('#text_h').val(648) + $('#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(canvas.getActiveObject()) + canvas.bringForward(canvas.getActiveObject()) + 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); + + recordState() + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (typeof window.selectObj === 'function') { + window.selectObj(0); + } +}) +$('#previous').click(function () { + //撤销一次操作 + if (step.val == 0) { + return + } + + step.val-- + if ($('#front_side').hasClass('ui-button-active')) { + // 使用 recordJson1 和 recordObjs1 + if (recordJson1 && recordJson1[step.val]) { + canvas.loadFromJSON(recordJson1[step.val]) + } + if (recordObjs1 && recordObjs1[step.val]) { + objs1 = JSON.parse(recordObjs1[step.val]) + objs = objs1 + } + } else if ($('#back_side').hasClass('ui-button-active')) { + // 使用 recordJson2 和 recordObjs2 + if (recordJson2 && recordJson2[step.val]) { + canvas.loadFromJSON(recordJson2[step.val]) + } + if (recordObjs2 && recordObjs2[step.val]) { + objs2 = JSON.parse(recordObjs2[step.val]) + objs = objs2 + } + } + + background_image = canvas.getObjects()[0] + canvas.renderAll() + //recordState(); + if (typeof window.updateList === 'function') { + window.updateList(); + } + + selectObj(-1) + + $('#base_control').hide() + $('#line_control').hide() + $('#pic_control').hide() + $("#set_bg").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() +}) +$('#next').click(function () { + //撤销一次撤销操作 + // 根据当前是正面还是背面检查对应的 recordObjs 长度 + if ($('#front_side').hasClass('ui-button-active')) { + if (step.val >= recordObjs1.length - 1) { + return + } + } else if ($('#back_side').hasClass('ui-button-active')) { + if (step.val >= recordObjs2.length - 1) { + return + } + } + + ++step.val + if ($('#front_side').hasClass('ui-button-active')) { + // 使用 recordJson1 和 recordObjs1 + if (recordJson1 && recordJson1[step.val]) { + canvas.loadFromJSON(recordJson1[step.val]) + } + if (recordObjs1 && recordObjs1[step.val]) { + objs1 = JSON.parse(recordObjs1[step.val]) + objs = objs1 + } + } else if ($('#back_side').hasClass('ui-button-active')) { + // 使用 recordJson2 和 recordObjs2 + if (recordJson2 && recordJson2[step.val]) { + canvas.loadFromJSON(recordJson2[step.val]) + } + if (recordObjs2 && recordObjs2[step.val]) { + objs2 = JSON.parse(recordObjs2[step.val]) + objs = objs2 + } + } + background_image = canvas.getObjects()[0] + canvas.renderAll() + selectObj(-1) + + $('#base_control').hide() + $('#line_control').hide() + $('#pic_control').hide() + $("#set_bg").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() + if (typeof window.updateList === 'function') { + window.updateList(); + } +}) +$('#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(); + } + 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() + recordState() +}) +$('#vertical_obj').click(function () { + let obj = canvas.getActiveObject() + obj.set('flipY', !obj.get('flipY')) + canvas.renderAll() + updateControls() + recordState() +}) +$('#align_obj').click(function () { + let obj = canvas.getActiveObject() + obj.set('flipX', !obj.get('flipX')) + canvas.renderAll() + updateControls() + 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') + } + recordState() + canvas.renderAll() +}) +$('#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') + } + recordState() + canvas.renderAll() +}) +$('#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') + } + recordState() + canvas.renderAll() +}) +$('#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') + } + recordState() + canvas.renderAll() +}) +$("#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") + } + recordState(); + canvas.renderAll(); +}); +$("#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") + } + recordState(); + canvas.renderAll(); +}); +$('#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' + 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' + 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' + 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') + } + recordState() + canvas.renderAll() +}) +$('#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') + } + recordState() + canvas.renderAll() +}) +$('#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') + } + recordState() + canvas.renderAll() +}) +$('#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') + } + recordState() + canvas.renderAll() +}) +$('#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(); + canvas.renderAll(); + // 锁定后不需要调用 updateControls,因为已经没有选中对象了 + } else { + $('#lock_img').attr('src', 'public/images/unlock20.png') //已解锁 + // 解锁后更新控件 + updateControls(); + } + recordState() + // 更新对象列表以同步锁状态 + if (typeof window.updateList === 'function') { + window.updateList(); + } + if (!shouldLock) { + canvas.renderAll(); + } +}) +$('#text_back_transparent').click(function () { + canvas.getActiveObject().set('textBackgroundColor', '') + $('#text_back_color').val('#ffffff') + canvas.renderAll() +}) +$('#circle_text_back_transparent').click(function () { + canvas.getActiveObject().set('textBackgroundColor', '') + $('#circle_text_back_color').val('#ffffff') + canvas.renderAll() +}) +$('#out_text_back_transparent').click(function () { + canvas.getActiveObject().set('textBackgroundColor', '') + $('#out_text_back_color').val('#ffffff') + canvas.renderAll() +}) +$('#rect_transparent').click(function () { + canvas.getActiveObject().set('fill', '') + $('#rect_color').val('#ffffff') + canvas.renderAll() +}) +$('#rect_stroke_transparent').click(function () { + canvas.getActiveObject().set('stroke', '') + $('#rect_stroke').val('#ffffff') + canvas.renderAll() +}) +$('#circle_transparent').click(function () { + canvas.getActiveObject().set('fill', '') + $('#circle_color').val('#ffffff') + canvas.renderAll() +}) +$('#circle_stroke_transparent').click(function () { + canvas.getActiveObject().set('stroke', '') + $('#circle_stroke').val('#ffffff') + canvas.renderAll() +}) +// 清理不需要的 src 字段(保留自定义图片的 src) +// cleanupSrcFields 函数已在 output.js 中定义 + +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: 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 = 2 + 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; +}) +function getDate() { + let date = new Date() + return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() +} +function getAbsoluteXY(_obj) { + let coord = _obj.get('lineCoords') + //let xs = [], ys = []; + return [_obj.get('left'), _obj.get('top')] +} +// fullPath, saveHistory 和 open 函数已在 output.js 中定义 +$('#open').click(function () { + if (step.val == 0) { + OpenDialog(); + return; + } + layer.confirm( + '' + language_str('whetherSave') + '', + function (index) { + 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 == 1) { + 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); + }) + } +}) +$('#new').click(function () { + if (step.val == 0) { + ipcRenderer.send('open-first-page'); + return; + } + layer.confirm( + '' + language_str('whetherSave') + '', + function (index) { + if (typeof window.output === 'function') { + window.output(() => ipcRenderer.send('open-first-page')); + } + layer.close(index); + }, + function (index) { + ipcRenderer.send('open-first-page'); + } + ) +}) +function chagneTitle() { } +function addBackground() { + // 类型改变 + fabric.Image.fromURL('./public/images/bg_front_2.png', function (image) { + //image.set("scaleX",$("#canvas-div").width() / 1200 < 1 ? $("#canvas-div").width() / 1200 : 1) + + image.left = ($('#canvas1').width() - image.width * image.get('scaleX')) / 2 + image.top = ($('#canvas1').height() - image.height * image.get('scaleY')) / 2 + + image.selectable = false + image.hoverable = false + image.hoverCursor = 'default' + image.setSrc(image.toDataURL(), function (image) { + background_image1 = image + background_image = background_image1 + canvas.add(image) + canvas.renderAll() + //pre_objs1.push(JSON.stringify(objs1)); + + recordObjs1.push(JSON.stringify(objs1)) + recordJson1.push(canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])) + }) + // 类型改变 + fabric.Image.fromURL('./public/images/bg_back_2.png', function (image) { + image.left = ($('#canvas2').width() - image.width) / 2 + image.top = ($('#canvas2').height() - image.height) / 2 + + image.selectable = false + image.hoverable = false + image.hoverCursor = 'default' + + image.setSrc(image.toDataURL(), function (image) { + background_image2 = image + canvas2.add(image) + canvas2.renderAll() + //pre_objs2.push(JSON.stringify(objs2)); + + recordObjs2.push(JSON.stringify(objs2)) + recordJson2.push(canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])) + + let file = GetFile().get('file') + if (file && file != 'empty') { + if (typeof window.openFile === 'function') { + window.openFile(file); + } else { + console.error('openFile 函数未定义!'); + } + } + }) + }) + is_bgi_add = true + }) +} +function selectObject(target, index) { + updateControls() + + $('#base_control').show() + //$("#text_x").val((target.left - background_image.left).toFixed(1)); +} +function updateControls() { + // 检查是否有选中对象,如果没有则直接返回 + if (!canvas || !canvas.getActiveObject()) return; + + const activeObj = canvas.getActiveObject(); + $('#text_r').val(activeObj.get('angle').toFixed(0)) + $('#text_x').val((activeObj.get('left') - background_image.left).toFixed(0)) + $('#text_y').val((activeObj.get('top') - background_image.top).toFixed(0)) + $('#text_h').val((activeObj.get('scaleY') * activeObj.get('height')).toFixed(0)) + $('#text_w').val((activeObj.get('scaleX') * activeObj.get('width')).toFixed(0)) + // 根据锁定状态显示图标(使用lockMovementX判断,因为锁定时会设置所有lock属性) + if (activeObj.get('lockMovementX')) { + $('#lock_img').attr('src', 'public/images/lock20.png') //已锁定 + } else { + $('#lock_img').attr('src', 'public/images/unlock20.png') //未锁定 + } +} +function checkName(name) { + //检查字段名是否重复了 + 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 resName(pre_name) { + //返回的是不重复的字段名 + let num = objs1.length + objs2.length - 1 + do { + num++ + } while (!checkName(pre_name + num)) //重复了就再加1 + return pre_name + num +} +function addPic(pointer) { + pre_add_image.left = pointer.x + pre_add_image.top = pointer.y + + canvas.add(pre_add_image) + + objs.push({ type: 1, black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() + //OpenDialog(); +} +function selectPic(target, index) { + // 检查是否有选中对象,如果没有则直接返回 + if (!canvas || !canvas.getActiveObject()) return; + + 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; + } + } + + //透明度 + $('#pic_control').show() + $("#set_bg").show(); + + // 检查 pic_op 是否存在且有 setValue 方法 + if (typeof pic_op !== 'undefined' && pic_op && typeof pic_op.setValue === 'function') { + pic_op.setValue(100 - activeObj.get('opacity') * 100); + } else { + $("#pic_op").next().children(".layui-slider-bar").css("width", (1 - activeObj.get("opacity")) * 100 + "%"); + $("#pic_op").next().children(".layui-slider-handle").css("left", (1 - activeObj.get("opacity")) * 100 + "%"); + } + + // $("#pic_black").prop("checked", objs[idx-1].black ? 'checked' : ''); + + $('#out_pic_control').hide() + $('#text_control').hide() + $("#circle_text_control").hide(); + $('#out_text_control').hide() + $('#rect_control').hide() + $('#circle_control').hide() + $('#line_control').hide() + $('#counter_control').hide() + $('#qrcode_Controll').hide() + $('#barcode_controll').hide() +} +function addOutPic(pointer) { + fabric.Image.fromURL('./public/images/outpic_extra.png', function (image) { + let width = canvas.getWidth() + let height = canvas.getHeight() + image.left = pointer.x + image.top = pointer.y + image.opacity = 1 + //image.on("selected",function(){//test well + image.setSrc(image.toDataURL(), function (image) { + canvas.add(image) + objs.push({ type: 2, name: resName('OUT_PIC_'), black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() + }) + }) +} +function selectOutPic(target, index) { + //字段名 + $('#out_pic_control').show() + out_pic_op.setValue(100 - canvas.getActiveObject().get('opacity') * 100) + let idx = getIndex(canvas.getActiveObject()) + $('#out_pic_field_name').val(objs[idx - 1].name) + // $("#out_pic_black").prop("checked", objs[idx-1].black ? 'checked' : ''); + + $('#pic_control').hide() + $("#set_bg").hide(); + $('#text_control').hide() + $("#circle_text_control").hide(); + $('#out_text_control').hide() + $('#rect_control').hide() + $('#circle_control').hide() + $('#line_control').hide() + $('#counter_control').hide() + $('#qrcode_Controll').hide() + $('#barcode_controll').hide() +} + +function addText(pointer) { + let text = new fabric.IText('TEXT', { + //源:文本 + left: pointer.x, + top: pointer.y, + fill: '#000000', + textBackgroundColor: '', + fontStyle: 'normal', + fontWeight: 'normal', + underline: false, + linethrough: false, + fontFamily: 'Arial' + }) + text.setControlVisible('ml', false) + text.setControlVisible('mt', false) + text.setControlVisible('mr', false) + text.setControlVisible('mb', false) + canvas.add(text) + objs.push({ type: 3, black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() +} +function selectText() { + //console.log(canvas.getActiveObject().get("fontFamily")); + $('#text_control').show() + $('#text_color').val(canvas.getActiveObject().get('fill')) + $('#text_back_color').val(canvas.getActiveObject().get('textBackgroundColor') == '' ? '#ffffff' : canvas.getActiveObject().get('textBackgroundColor')) + let val = parseFloat(canvas.getActiveObject().get("fontSize")) * 72 / dpi + if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 + $("#text_size").val(val); + $('#text_text').val(canvas.getActiveObject().get('text')) + $('#text_font_family').val(canvas.getActiveObject().get('fontFamily')) + + if (canvas.getActiveObject().get('underline') == true) { + $('#text_underline').addClass('ui-radio-acitve') + } else { + $('#text_underline').removeClass('ui-radio-acitve') + } + if (canvas.getActiveObject().get('fontWeight') == 'bold') { + $('#text_bold').addClass('ui-radio-acitve') + } else { + $('#text_bold').removeClass('ui-radio-acitve') + } + if (canvas.getActiveObject().get('fontStyle') == 'italic') { + $('#text_italics').addClass('ui-radio-acitve') + } else { + $('#text_italics').removeClass('ui-radio-acitve') + } + if (canvas.getActiveObject().get('linethrough') == true) { + $('#text_linethrough').addClass('ui-radio-acitve') + } else { + $('#text_linethrough').removeClass('ui-radio-acitve') + } + $('#pic_control').hide() + $("#set_bg").hide(); + $('#out_pic_control').hide() + $("#circle_text_control").hide(); + $('#out_text_control').hide() + $('#rect_control').hide() + $('#circle_control').hide() + $('#line_control').hide() + $('#counter_control').hide() + $('#qrcode_Controll').hide() + $('#barcode_controll').hide() +} +function getDisdance(x1, y1, x2, y2) { + var dx = Math.abs(x2 - x1); // 计算x轴上的距离差,并取绝对值 + var dy = Math.abs(y2 - y1); // 计算y轴上的距离差,并取绝对值 + var distance = Math.sqrt(dx * dx + dy * dy); // 应用勾股定理计算距离 + return distance; +} +function getDeg(pointer) { + // 计算点击位置与画布中心的坐标差 + var centerX = canvas.width / 2; + var centerY = canvas.height / 2; + var mouseX = pointer.x; + var mouseY = pointer.y; + var dx = mouseX - centerX; + var dy = mouseY - centerY; + // 计算旋转角度(弧度) + var angleRad = Math.atan2(dy, dx); + // 将角度转换为度数 + var angleDeg = angleRad * (180 / Math.PI); + if (angleDeg < 0) { + angleDeg += 360; + } + angleDeg += 90 + return angleDeg +} +function addCircleText(pointer) { + let distance = getDisdance(pointer.x, pointer.y, canvas.width / 2, canvas.height / 2) + let angleDeg = getDeg(pointer) + let text = new fabric.CurvedText('Circle TEXT', {//源:圆形文本 + left: pointer.x, + top: pointer.y, + fill: "#000000", + textBackgroundColor: "", + fontStyle: "normal", + fontWeight: "normal", + diameter: distance * 2, + fontSize: 30, + underline: false, + linethrough: false, + lockScalingX: true, + lockScalingY: true, + fontFamily: 'Arial', + originX: 'center', + originY: 'center', + angle: angleDeg, + flipped: pointer.y > canvas.height / 2 ? true : false + }); + // distance = getDisdance(pointer.x+text.width/2, pointer.y, canvas.width/2,canvas.height/2) + text.setControlVisible("ml", false); + text.setControlVisible("mt", false); + text.setControlVisible("mr", false); + text.setControlVisible("mb", false); + canvas.add(text); + objs.push({ type: 11, black: false, circleCenter: 0 }); + canvas.renderAll(); + if (typeof window.updateList === 'function') { + window.updateList(); + }; + recordState(); +} +function selectCircleText() { + 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_updating !== 'undefined') { + circle_text_size_updating = true; + } + circle_text_size.setValue(canvas.getActiveObject().get("fontSize")); + if (typeof circle_text_size_updating !== 'undefined') { + circle_text_size_updating = false; + } + circle_text_diameter.setValue(canvas.getActiveObject().get("diameter")); + $("#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")); + + if (canvas.getActiveObject().get("underline") == true) { + $("#circle_text_underline").addClass("ui-radio-acitve") + } else { + $("#circle_text_underline").removeClass("ui-radio-acitve") + } + if (canvas.getActiveObject().get("fontWeight") == "bold") { + $("#circle_text_bold").addClass("ui-radio-acitve") + } else { + $("#circle_text_bold").removeClass("ui-radio-acitve") + } + if (canvas.getActiveObject().get("fontStyle") == "italic") { + $("#circle_text_italics").addClass("ui-radio-acitve") + } else { + $("#circle_text_italics").removeClass("ui-radio-acitve") + } + if (canvas.getActiveObject().get("linethrough") == true) { + $("#circle_text_linethrough").addClass("ui-radio-acitve") + } else { + $("#circle_text_linethrough").removeClass("ui-radio-acitve") + } + $("#pic_control").hide(); + $("#set_bg").hide(); + $("#rotate").hide(); + $("#out_pic_control").hide(); + $("#text_control").hide(); + $("#out_text_control").hide(); + $("#rect_control").hide(); + $("#circle_control").hide(); + $("#line_control").hide(); + $("#counter_control").hide(); + $("#qrcode_Controll").hide(); + $("#barcode_controll").hide(); + +} +function addOutText(pointer) { + //MERGE_TEXT_1 + let text = new fabric.Text('MERGE TEXT', { + //源:合成文本 + left: pointer.x, + top: pointer.y, + fill: '#000000', + fontStyle: 'normal', + fontWeight: 'normal', + textBackgroundColor: '', + underline: false, + linethrough: false, + fontFamily: 'Arial', + textAlign: 'center' + }) + + //text.on({ + text.setControlVisible('ml', false) + text.setControlVisible('mt', false) + text.setControlVisible('mr', false) + text.setControlVisible('mb', false) + + canvas.add(text) + objs.push({ type: 4, name: resName('OUT_TEXT_'), exceed: false, autoWrap: false, fixSize: false, black: false, align: 'center' }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() +} +function selectOutText() { + //color + const align = canvas.getActiveObject().get('textAlign') + if (align === 'left') { + $('#out_left_alignment').parent().addClass('tool1') + } else if (align === 'right') { + $('#out_right_alignment').parent().addClass('tool1') + } else { + $('#out_center_alignment').parent().addClass('tool1') + } + $('#out_text_control').show() + $('#out_text_color').val(canvas.getActiveObject().get('fill')) + $('#out_text_text').val(canvas.getActiveObject().get('text')) + let val = parseFloat(canvas.getActiveObject().get("fontSize")) * 72 / dpi + if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 + $("#out_text_size").val(val); + $('#out_text_back_color').val(canvas.getActiveObject().get('textBackgroundColor') == '' ? '#ffffff' : canvas.getActiveObject().get('textBackgroundColor')) + let idx = getIndex(canvas.getActiveObject()) + $('#out_text_field_name').val(objs[idx - 1].name) + $('#out_text_font_family').val(canvas.getActiveObject().get('fontFamily')) + $('#exceed').prop('checked', objs[idx - 1].exceed ? 'checked' : '') + $('#autoWrap').prop('checked', objs[idx - 1].autoWrap ? 'checked' : '') + $('#fixSize').prop('checked', objs[idx - 1].fixSize ? 'checked' : '') + if (canvas.getActiveObject().get('underline') == true) { + $('#out_text_underline').addClass('ui-radio-acitve') + } else { + $('#out_text_underline').removeClass('ui-radio-acitve') + } + if (canvas.getActiveObject().get('fontWeight') == 'bold') { + $('#out_text_bold').addClass('ui-radio-acitve') + } else { + $('#out_text_bold').removeClass('ui-radio-acitve') + } + if (canvas.getActiveObject().get('fontStyle') == 'italic') { + $('#out_text_italics').addClass('ui-radio-acitve') + } else { + $('#out_text_italics').removeClass('ui-radio-acitve') + } + if (canvas.getActiveObject().get('linethrough') == true) { + $('#out_text_linethrough').addClass('ui-radio-acitve') + } else { + $('#out_text_linethrough').removeClass('ui-radio-acitve') + } + + $('#pic_control').hide() + $("#set_bg").hide(); + $('#out_pic_control').hide() + $('#text_control').hide() + $("#circle_text_control").hide(); + $('#rect_control').hide() + $('#circle_control').hide() + $('#line_control').hide() + $('#counter_control').hide() + $('#qrcode_Controll').hide() + $('#barcode_controll').hide() +} +function addRect(pointer) { + let rect = new fabric.Rect({ + left: pointer.x, + top: pointer.y, + fill: '', + stroke: "#ff0000", + strokeWidth: 3, + width: 100, + height: 100 + }) + canvas.add(rect) + objs.push({ type: 5, black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() +} +function selectRect() { + //color + $('#rect_control').show() + $('#rect_color').val(canvas.getActiveObject().get('fill') == '' ? '#ffffff' : canvas.getActiveObject().get('fill')) + $('#rect_stroke').val(canvas.getActiveObject().get('stroke') == '' ? '#ffffff' : canvas.getActiveObject().get('stroke')) + $('#rect_stroke_width').val(canvas.getActiveObject().get('strokeWidth')) + $('#rect_radius').val(canvas.getActiveObject().get('rx')) + rect_op.setValue(100 - canvas.getActiveObject().get('opacity') * 100) + let a = canvas.getActiveObject().getCoords() + $('#pic_control').hide() + $("#set_bg").hide(); + $('#out_pic_control').hide() + $('#text_control').hide() + $("#circle_text_control").hide(); + $('#out_text_control').hide() + $('#circle_control').hide() + $('#line_control').hide() + $('#counter_control').hide() + $('#qrcode_Controll').hide() + $('#barcode_controll').hide() +} +function addCircle(pointer) { + let circle = new fabric.Circle({ + left: pointer.x, + top: pointer.y, + fill: '', + stroke: '#ff0000', + strokeWidth: 3, + radius: 100, + strokeUniform: true + }) + canvas.add(circle) + objs.push({ type: 6, black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() +} +function selectCircle() { + //border-color + $('#circle_control').show() + $('#circle_color').val(canvas.getActiveObject().get('fill') == '' ? '#ffffff' : canvas.getActiveObject().get('fill')) + $('#circle_stroke').val(canvas.getActiveObject().get('stroke') == '' ? '#ffffff' : canvas.getActiveObject().get('stroke')) + $('#circle_stroke_width').val(canvas.getActiveObject().get('strokeWidth')) + circle_op.setValue(100 - canvas.getActiveObject().get('opacity') * 100) + $('#pic_control').hide() + $("#set_bg").hide(); + $('#out_pic_control').hide() + $('#text_control').hide() + $("#circle_text_control").hide(); + $('#out_text_control').hide() + $('#rect_control').hide() + $('#line_control').hide() + $('#counter_control').hide() + $('#qrcode_Controll').hide() + $('#barcode_controll').hide() +} +function addLine(pointer) { + let line = new fabric.Line([50, 100, 200, 100], { + left: pointer.x, + top: pointer.y, + stroke: '#ff0000', + strokeWidth: 3, + strokeDashArray: [0, 0], + }) + + line.setControlVisible('tl', false) + line.setControlVisible('tr', false) + line.setControlVisible('br', false) + line.setControlVisible('bl', false) + line.setControlVisible('mt', false) + line.setControlVisible('mb', false) + canvas.add(line) + objs.push({ type: 7, black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() +} +function selectLine() { + //color + $('#line_control').show() + + let idx = getIndex(canvas.getActiveObject()) + $('#line_color').val(canvas.getActiveObject().get('stroke')) + $('#line_dist').val(canvas.getActiveObject().get('strokeDashArray')[0]) + $('#text_h').val(canvas.getActiveObject().get('strokeWidth')) + + $('#pic_control').hide() + $("#set_bg").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() +} +function addQrCode(pointer) { + let qr = jrQrcode.getQrBase64('https://www.cardsoon.com', { padding: 0 }) + fabric.Image.fromURL(qr, function (image) { + image.left = pointer.x + image.top = pointer.y + canvas.add(image) + objs.push({ type: 8, name: resName('QR_CODE_'), color: '#000000', val: 'http://www.cardsoon.com', black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() + }) +} +function selectQrCode() { + //字段名 + $('#qrcode_Controll').show() + let idx = getIndex(canvas.getActiveObject()) + $('#qrcode_field_name').val(objs[idx - 1].name) + $('#qrcode_color').val(objs[idx - 1].color) + $('#qrcode_val').val(objs[idx - 1].val) + $('#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() + $('#barcode_controll').hide() +} +function addBarCode(pointer) { + JsBarcode('#barcode', '123456789', { margin: 0, lineColor: '#000000', fontSize: 18, font: 'Arial' }) + let barcode = document.getElementById('barcode') + let bar = barcode.toDataURL('image/png') + fabric.Image.fromURL(bar, function (image) { + image.left = pointer.x + image.top = pointer.y + + canvas.add(image) + objs.push({ type: 9, name: resName('BAR_CODE_'), val: '123456789', color: '#000000', fontSize: 18, font: 'Arial', show: false, black: false }) //show是取消文字显示 + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() + }) +} +function selectBarCode() { + //字段名 + $('#barcode_controll').show() + let idx = getIndex(canvas.getActiveObject()) + $('#barcode_field_name').val(objs[idx - 1].name) + $('#barcode_font_family').val(objs[idx - 1].font) + let val = parseFloat(objs[idx - 1].fontSize) * 72 / dpi + if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 + $("#barcode_size").val(val); + $('#barcode_val').val(objs[idx - 1].val) + $('#barcode_show').prop('checked', objs[idx - 1].show ? 'checked' : '') + $('#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() +} +function addCounter(pointer) { + let text = new fabric.Text('0', { + left: pointer.x, + top: pointer.y, + fill: '#000000' + }) + canvas.add(text) + objs.push({ type: 10, name: resName('COUNTER_'), start: 0, add: 1, black: false }) + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() +} +function selectCounter() { + //起始 + $('#counter_control').show() + + let idx = getIndex(canvas.getActiveObject()) + $('#counter_start').val(objs[idx - 1].start) + $('#counter_add').val(objs[idx - 1].add) + $('#counter_color').val(canvas.getActiveObject().get('fill')) + $('#count_font_family').val(canvas.getActiveObject().get('fontFamily')) + let val = parseFloat(canvas.getActiveObject().get("fontSize")) * 72 / dpi + if (val % 0.5 !== 0) val = Math.round(val * 2) / 2 + $("#count_size").val(val); + + $('#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() +} +function getIndex(target, _canvas = null) { + let temp_objs + 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 getType(target) { + let temp_objs = canvas.getObjects() + let i = 0 + for (let res of temp_objs) { + if (target == res) { + return objs[i].type + } + i++ + } +} + +// updateList 和 selectObj 函数在 core.js 中定义并附加到 window 对象 +function recordState() { + //pre_objs.push(JSON.stringify(objs)); + ++step.val + for (let i = step.val; i < recordObjs.length; i++) { + recordObjs.pop() + recordJson.pop() + } + //recordObjs.splice(step.val, 1, JSON.stringify(objs)) + recordObjs.push(JSON.stringify(objs)) + j = canvas.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']) + j.objects[0].hoverCursor = 'default' + recordJson.push(j) +} +function getCoordsMinX(acoords) { + x = acoords[0].x + for (let item of acoords) { + if (item.x < x) { + x = item.x + } + } + return x +} +function getCoordsMaxX(acoords) { + x = acoords[0].x + for (let item of acoords) { + if (item.x > x) { + x = item.x + } + } + return x +} +function getCoordsMinY(acoords) { + y = acoords[0].y + for (let item of acoords) { + if (item.y < y) { + y = item.y + } + } + return y +} +function getCoordsMaxY(acoords) { + y = acoords[0].y + for (let item of acoords) { + if (item.y > y) { + y = item.y + } + } + return y +} + +$('#text_y').bind('input propertychange', function () { + 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() + recordState() +}) +$('#text_x').bind('input propertychange', function () { + 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() + recordState() +}) +$('#text_w').bind('input propertychange', function () { + let val = '0' + if ($('#text_w').val() != '') { + val = $('#text_w').val() + } + let type = objs[getIndex(canvas.getActiveObject()) - 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() + recordState() +}) +$('#text_h').bind('input propertychange', function () { + let idx = getIndex(canvas.getActiveObject()) + 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[getIndex(canvas.getActiveObject()) - 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() + recordState() +}) +$('#text_r').bind('input propertychange', function () { + 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() + 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(); + } + 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 + } + recordState() +}) +// $("#out_pic_black").click(function () { +$('#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(); + } + 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(); + } + recordState() +}) +$('#qrcode_color').bind('input propertychange', function () { + let item = canvas.getActiveObject() + let qr = jrQrcode.getQrBase64('https://www.cardsoon.com', { padding: 0, foreground: $(this).val() }) + let idx = getIndex(item) + objs[idx - 1].color = $(this).val() + item.setSrc(qr, function (img) { + canvas.renderAll() + 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(); + 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() + 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(); + } + recordState() +}) +$('#text_color').bind('input propertychange', function () { + canvas.getActiveObject().set('fill', $('#text_color').val()) + canvas.renderAll() + recordState() +}) +$('#text_back_color').bind('input propertychange', function () { + canvas.getActiveObject().set('textBackgroundColor', $('#text_back_color').val()) + canvas.renderAll() + recordState() +}) +$('#out_text_back_color').bind('input propertychange', function () { + canvas.getActiveObject().set('textBackgroundColor', $('#out_text_back_color').val()) + + canvas.renderAll() + 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(); + recordState(); +}) +$("#circle_text_color").bind('input propertychange', function () { + canvas.getActiveObject().set("fill", $("#circle_text_color").val()); + canvas.renderAll(); + recordState(); +}) +$("#circle_text_back_color").bind('input propertychange', function () { + canvas.getActiveObject().set("textBackgroundColor", $("#circle_text_back_color").val()); + + canvas.renderAll(); + 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(); + }; + 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; + } + recordState(); +}); +$('#out_text_color').bind('input propertychange', function () { + canvas.getActiveObject().set('fill', $('#out_text_color').val()) + canvas.renderAll() + 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(); + recordState(); +}) +$('#out_text_text').bind('input propertychange', function () { + let val = $("#out_text_text").val().trim() + canvas.getActiveObject().set("text", ` ${val} `); + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + recordState() +}) +$('#rect_color').bind('input propertychange', function () { + canvas.getActiveObject().set('fill', $('#rect_color').val()) + + canvas.renderAll() + recordState() +}) +$('#rect_stroke').bind('input propertychange', function () { + canvas.getActiveObject().set('stroke', $('#rect_stroke').val()) + + canvas.renderAll() + 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() + 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() + recordState() +}) +$('#circle_color').bind('input propertychange', function () { + canvas.getActiveObject().set('fill', $('#circle_color').val()) + + canvas.renderAll() + recordState() +}) +$('#circle_stroke').bind('input propertychange', function () { + canvas.getActiveObject().set('stroke', $('#circle_stroke').val()) + + canvas.renderAll() + 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() + 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() + recordState() +}) +$('#counter_add').bind('input propertychange', function () { + let item = canvas.getActiveObject() + let idx = getIndex(item) + objs[idx - 1].add = $(this).val() + canvas.renderAll() + recordState() +}) +$('#counter_color').bind('input propertychange', function () { + canvas.getActiveObject().set('fill', $('#counter_color').val()) + canvas.renderAll() + 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(); + recordState(); +}) +$('#line_color').bind('input propertychange', function () { + canvas.getActiveObject().set('stroke', $('#line_color').val()) + canvas.renderAll() + 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() + recordState() +}) +$('#text_text').bind('input propertychange', function () { + let val = $("#text_text").val().trim() + canvas.getActiveObject().set("text", ` ${val} `); + canvas.renderAll() + if (typeof window.updateList === 'function') { + window.updateList(); + } + 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() + 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(); + 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(); + recordState(); + }); +}) +$('#count_font_family').on('change', function () { + canvas.getActiveObject().set('fontFamily', $(this).find('option:selected').text()) + canvas.renderAll() + recordState() +}) +$('#text_font_family').on('change', function () { + canvas.getActiveObject().set('fontFamily', $(this).find('option:selected').text()) + canvas.renderAll() + recordState() +}) + +$('#circle_text_font_family').on('change', function () { + canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text()) + canvas.renderAll() + 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() + recordState() + }) + //recordState(); +}) +$('#out_text_font_family').on('change', function () { + canvas.getActiveObject().set('fontFamily', $(this).find('option:selected').text()) + canvas.renderAll() + recordState() +}) +$('.obj_list').on('click', 'div', function () { + let idx = objs.length - 1 - $(this).index() + 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 + } + recordState() +}) +$('#autoWrap').click(function () { + let idx = getIndex(canvas.getActiveObject()) + if ($(this).prop('checked')) { + objs[idx - 1].autoWrap = true + } else { + objs[idx - 1].autoWrap = false + } + recordState() +}) +$('#fixSize').click(function () { + let idx = getIndex(canvas.getActiveObject()) + if ($(this).prop('checked')) { + objs[idx - 1].fixSize = true + } else { + objs[idx - 1].fixSize = false + } + 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) { + recordState() + canvas.renderAll() + } + // let actObjs = canvas.getActiveObjects(); +}) + +//在关于我们获取版本号。 +$("#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').off('click').on('click', function () { + // 类型改变 + fabric.Image.fromURL('./public/images/front_bg' + bg_version + '_2.png', function (i1) { + i1.left = background_image.left + i1.top = background_image.top + let img1 = i1 + + fabric.Image.fromURL('./public/images/back_bg_2.png', function (i2) { + i2.left = background_image.left + i2.top = background_image.top + let img2 = i2 + fabric.Image.fromURL('./public/images/op_2.png', function (i3) { + i2.left = background_image.left + i2.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进行另存为 + } +}); +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() + + // 如果是辅助线,直接返回,不处理 + 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; + } + }) +} diff --git a/lib/difxapi.dl b/lib/difxapi.dl deleted file mode 100644 index 6f1b042..0000000 --- a/lib/difxapi.dl +++ /dev/null @@ -1,21 +0,0 @@ -Example: - nvm install v0.10.32 Install a specific version number - nvm use 0.10 Use the latest available 0.10.x release - nvm run 0.10.32 app.js Run app.js using node v0.10.32 - nvm exec 0.10.32 node app.js Run `node app.js` with the PATH pointing to node v0.10.32 - nvm alias default 0.10.32 Set default node version on a shell - -Note: - to remove, delete, or uninstall nvm - just remove the `$NVM_DIR` folder (usually `~/.nvm`) - -Xupnei:~ xuwenwei$ nvm install v16.5.0 - -Version 'v16.5.0' not found - try `nvm ls-remote` to browse available versions. -Xupnei:~ xuwenwei$ -Xupnei:~ xuwenwei$ nvm install v16.5.0 -Downloading and installing node v16.5.0... -Downloading https://nodejs.org/dist/v16.5.0/node-v16.5.0-darwin-arm64.tar.gz... -######################################################################### 100.0% -Computing checksum with shasum -a 256 -Checksums matched! -Now using node v16.5.0 (npm v7.19.1) diff --git a/lib/difxapi.jsc b/lib/difxapi.jsc deleted file mode 100644 index 6f1b042..0000000 --- a/lib/difxapi.jsc +++ /dev/null @@ -1,21 +0,0 @@ -Example: - nvm install v0.10.32 Install a specific version number - nvm use 0.10 Use the latest available 0.10.x release - nvm run 0.10.32 app.js Run app.js using node v0.10.32 - nvm exec 0.10.32 node app.js Run `node app.js` with the PATH pointing to node v0.10.32 - nvm alias default 0.10.32 Set default node version on a shell - -Note: - to remove, delete, or uninstall nvm - just remove the `$NVM_DIR` folder (usually `~/.nvm`) - -Xupnei:~ xuwenwei$ nvm install v16.5.0 - -Version 'v16.5.0' not found - try `nvm ls-remote` to browse available versions. -Xupnei:~ xuwenwei$ -Xupnei:~ xuwenwei$ nvm install v16.5.0 -Downloading and installing node v16.5.0... -Downloading https://nodejs.org/dist/v16.5.0/node-v16.5.0-darwin-arm64.tar.gz... -######################################################################### 100.0% -Computing checksum with shasum -a 256 -Checksums matched! -Now using node v16.5.0 (npm v7.19.1) diff --git a/lib/directx9.dl b/lib/directx9.dl deleted file mode 100644 index 46e41ff9aa7e9c688bc8132c0a491dc3cc6dcb00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12192 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

c$pptaF`4iHChMY*ph($A;gTz;7XmiPs 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 BNiP5Z diff --git a/lib/drwsfg.dl b/lib/drwsfg.dl deleted file mode 100644 index 1e3d37b3e5367472809a83c06351659870f845ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208736 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 amy0~E29^+eJR!lyGyf8Qyhizb&g~yUfI>+C diff --git a/lib/drwssd.dl b/lib/drwssd.dl deleted file mode 100644 index 4435fd33c7fb5b96ecc1f5c217eabc848fd877b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209696 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 UewmNADP4XQ_g)O+??)g11sBboWB>pF diff --git a/lib/drwssd.jsc b/lib/drwssd.jsc deleted file mode 100644 index 760160cc85e92fead704cbf0010deb1afab3fc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11672 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 InUsJ2Hw+A|QUCw| diff --git a/lib/module-map.json b/lib/module-map.json new file mode 100644 index 0000000..c81bc05 --- /dev/null +++ b/lib/module-map.json @@ -0,0 +1,28 @@ +{ + "description": "模块文件名映射配置 - 用于加密后重命名文件", + "version": "1.0.0", + "mappings": { + "design1": { + "core": "core1", + "output": "output1", + "ui": "ui1" + }, + "design2": { + "core": "core2", + "output": "output2", + "ui": "ui2" + }, + "main": { + "index": "index1", + "design1": "design11", + "design2": "design22" + } + }, + "notes": [ + "修改此文件中的映射值可以重命名加密后的文件", + "例如:将 'core' 改为 'core_v2',加密后会生成 core_v2.jsc", + "修改后需要重新运行加密脚本", + "确保映射值唯一,避免冲突" + ] +} + diff --git a/main.js b/main.js index 88778ce..3f0b688 100644 --- a/main.js +++ b/main.js @@ -152,26 +152,78 @@ function createWindow() { const fileName = 'User Manual.pdf'; if (app.isPackaged) { - helpPath = path.join(process.resourcesPath, 'help', fileName); + // Linux打包后的路径:resources/help/ 或 resources/app.asar/help/ + // Windows/Mac打包后的路径:resources/help/ + if (process.platform === 'linux') { + // Linux上,尝试多个可能的路径 + const possiblePaths = [ + path.join(process.resourcesPath, 'help', fileName), + path.join(process.resourcesPath, 'app.asar', 'help', fileName), + path.join(__dirname, 'help', fileName), + path.join(process.resourcesPath, '..', 'help', fileName) + ]; + + for (const testPath of possiblePaths) { + if (fs.existsSync(testPath)) { + helpPath = testPath; + break; + } + } + } else { + helpPath = path.join(process.resourcesPath, 'help', fileName); + } } else { helpPath = path.join(process.cwd(), 'help', fileName); } console.log("Help file path: ", helpPath); - if (fs.existsSync(helpPath)) { + if (helpPath && fs.existsSync(helpPath)) { try { - const errorMessage = await shell.openPath(helpPath); - if (errorMessage) { - console.error('Error opening help file:', errorMessage); + // Linux上使用shell.openExternal更可靠 + if (process.platform === 'linux') { + await shell.openExternal(`file://${helpPath}`); } else { - console.log('Help file opened successfully'); + const errorMessage = await shell.openPath(helpPath); + if (errorMessage) { + console.error('Error opening help file:', errorMessage); + // 如果openPath失败,尝试openExternal + await shell.openExternal(`file://${helpPath}`); + } } + console.log('Help file opened successfully'); } catch (err) { console.error('Exception when opening file:', err); + // 尝试使用openExternal作为后备方案 + try { + await shell.openExternal(`file://${helpPath}`); + } catch (err2) { + console.error('Failed to open with openExternal:', err2); + } } } else { console.error('Help file not found at:', helpPath); + // 尝试查找help文件的其他可能位置 + const searchPaths = [ + path.join(__dirname, 'help', fileName), + path.join(process.cwd(), 'help', fileName), + path.join(app.getAppPath(), 'help', fileName) + ]; + for (const searchPath of searchPaths) { + if (fs.existsSync(searchPath)) { + console.log('Found help file at alternative path:', searchPath); + try { + if (process.platform === 'linux') { + await shell.openExternal(`file://${searchPath}`); + } else { + await shell.openPath(searchPath); + } + return; + } catch (err) { + console.error('Failed to open help file:', err); + } + } + } } }); diff --git a/package.json b/package.json index 4687750..78c8a19 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,20 @@ "main": "main.js", "scripts": { "start": "electron .", - "build": "electron-builder", + "encrypt:win": "scripts/encrypt/encrypt-electron-win.bat", + "encrypt:linux": "./scripts/encrypt/encrypt-electron.sh", + "cleanup:jsc": "node scripts/encrypt/cleanup-jsc.js", + "cleanup": "node scripts/encrypt/cleanup.js", + "restore": "node scripts/encrypt/restore.js", "build:win": "electron-builder --win --x64", "build:mac": "electron-builder --mac --x64", "build:linux": "electron-builder --linux --x64", - "build:all": "electron-builder -mwl" + "build:linux:arm64": "electron-builder --linux --arm64", + "build:all": "electron-builder -mwl", + "release:win": "npm run encrypt:win && npm run cleanup && npm run build:win", + "release:mac": "npm run encrypt:linux && npm run cleanup && npm run build:mac", + "release:linux": "npm run encrypt:linux && npm run cleanup && npm run build:linux", + "release:linux:arm64": "npm run build:linux:arm64" }, "build": { "productName": "SoonDesign", @@ -21,6 +30,23 @@ "extraFiles": [ "lib" ], + "files": [ + "**/*", + "!.backup/**", + "!scripts/**", + "!**/*.jsc.map", + "!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme}", + "!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples}", + "!**/node_modules/*.d.ts", + "!**/node_modules/.bin", + "!**/*.{iml,o,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,xproj}", + "!.editorconfig", + "!**/._*", + "!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,.gitignore,.gitattributes}", + "!**/{__pycache__,thumbs.db,.flowconfig,.idea,.vs,.nyc_output}", + "!**/{appveyor.yml,.travis.yml,circle.yml}", + "!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json}" + ], "nsis": { "oneClick": false, "allowElevation": true, @@ -65,8 +91,8 @@ }, "linux": { "target": [ - { "target": "AppImage", "arch": ["x64"] }, - { "target": "deb", "arch": ["x64"] } + { "target": "AppImage", "arch": ["x64", "arm64"] }, + { "target": "deb", "arch": ["x64", "arm64"] } ], "category": "Utility", "icon": "public/images/IconA256.png", diff --git a/public/js/guideLines1.js b/public/js/guideLines1.js index 91080b2..eaf3694 100644 --- a/public/js/guideLines1.js +++ b/public/js/guideLines1.js @@ -62,7 +62,7 @@ function initAligningGuidelines(canvas) { }); canvas.on('object:moving', function(e) { - + var activeObject = e.target, canvasObjects = canvas.getObjects(), activeObjectCenter = activeObject.getCenterPoint(), @@ -74,15 +74,22 @@ function initAligningGuidelines(canvas) { horizontalInTheRange = false, verticalInTheRange = false, transform = canvas._currentTransform; - + if (!transform) return; - + + // 清空辅助线数组,避免累积 + verticalLines.length = 0; + horizontalLines.length = 0; + // It should be trivial to DRY this up by encapsulating (repeating) creation of x1, x2, y1, and y2 into functions, // but we're not doing it here for perf. reasons -- as this a function that's invoked on every mouse move - + for (var i = canvasObjects.length; i--; ) { - + if (canvasObjects[i] === activeObject) continue; + + // 跳过辅助线对象,避免辅助线之间相互对齐产生重影 + if (canvasObjects[i].isGuideLine) continue; var objectCenter = canvasObjects[i].getCenterPoint(), objectLeft = objectCenter.x, @@ -202,11 +209,40 @@ function initAligningGuidelines(canvas) { }); canvas.on('after:render', function() { + // 合并相同 x 坐标的竖向辅助线(使用四舍五入处理浮点数精度问题) + var mergedVerticalLines = {}; for (var i = verticalLines.length; i--; ) { - drawVerticalLine(verticalLines[i]); + var line = verticalLines[i]; + // 使用四舍五入到整数作为 key,避免浮点数精度问题 + var key = Math.round(line.x); + if (!mergedVerticalLines[key]) { + mergedVerticalLines[key] = { x: line.x, y1: line.y1, y2: line.y2 }; + } else { + // 合并 y 范围 + mergedVerticalLines[key].y1 = Math.min(mergedVerticalLines[key].y1, line.y1); + mergedVerticalLines[key].y2 = Math.max(mergedVerticalLines[key].y2, line.y2); + } } + for (var key in mergedVerticalLines) { + drawVerticalLine(mergedVerticalLines[key]); + } + + // 合并相同 y 坐标的横向辅助线(使用四舍五入处理浮点数精度问题) + var mergedHorizontalLines = {}; for (var i = horizontalLines.length; i--; ) { - drawHorizontalLine(horizontalLines[i]); + var line = horizontalLines[i]; + // 使用四舍五入到整数作为 key,避免浮点数精度问题 + var key = Math.round(line.y); + if (!mergedHorizontalLines[key]) { + mergedHorizontalLines[key] = { y: line.y, x1: line.x1, x2: line.x2 }; + } else { + // 合并 x 范围 + mergedHorizontalLines[key].x1 = Math.min(mergedHorizontalLines[key].x1, line.x1); + mergedHorizontalLines[key].x2 = Math.max(mergedHorizontalLines[key].x2, line.x2); + } + } + for (var key in mergedHorizontalLines) { + drawHorizontalLine(mergedHorizontalLines[key]); } verticalLines.length = horizontalLines.length = 0; }); diff --git a/public/js/guideLines2.js b/public/js/guideLines2.js index 0a01726..86498f5 100644 --- a/public/js/guideLines2.js +++ b/public/js/guideLines2.js @@ -62,7 +62,7 @@ function initAligningGuidelines(canvas) { }); canvas.on('object:moving', function(e) { - + var activeObject = e.target, canvasObjects = canvas.getObjects(), activeObjectCenter = activeObject.getCenterPoint(), @@ -74,15 +74,22 @@ function initAligningGuidelines(canvas) { horizontalInTheRange = false, verticalInTheRange = false, transform = canvas._currentTransform; - + if (!transform) return; - + + // 清空辅助线数组,避免累积 + verticalLines.length = 0; + horizontalLines.length = 0; + // It should be trivial to DRY this up by encapsulating (repeating) creation of x1, x2, y1, and y2 into functions, // but we're not doing it here for perf. reasons -- as this a function that's invoked on every mouse move - + for (var i = canvasObjects.length; i--; ) { - + if (canvasObjects[i] === activeObject) continue; + + // 跳过辅助线对象,避免辅助线之间相互对齐产生重影 + if (canvasObjects[i].isGuideLine) continue; var objectCenter = canvasObjects[i].getCenterPoint(), objectLeft = objectCenter.x, @@ -202,11 +209,40 @@ function initAligningGuidelines(canvas) { }); canvas.on('after:render', function() { + // 合并相同 x 坐标的竖向辅助线(使用四舍五入处理浮点数精度问题) + var mergedVerticalLines = {}; for (var i = verticalLines.length; i--; ) { - drawVerticalLine(verticalLines[i]); + var line = verticalLines[i]; + // 使用四舍五入到整数作为 key,避免浮点数精度问题 + var key = Math.round(line.x); + if (!mergedVerticalLines[key]) { + mergedVerticalLines[key] = { x: line.x, y1: line.y1, y2: line.y2 }; + } else { + // 合并 y 范围 + mergedVerticalLines[key].y1 = Math.min(mergedVerticalLines[key].y1, line.y1); + mergedVerticalLines[key].y2 = Math.max(mergedVerticalLines[key].y2, line.y2); + } } + for (var key in mergedVerticalLines) { + drawVerticalLine(mergedVerticalLines[key]); + } + + // 合并相同 y 坐标的横向辅助线(使用四舍五入处理浮点数精度问题) + var mergedHorizontalLines = {}; for (var i = horizontalLines.length; i--; ) { - drawHorizontalLine(horizontalLines[i]); + var line = horizontalLines[i]; + // 使用四舍五入到整数作为 key,避免浮点数精度问题 + var key = Math.round(line.y); + if (!mergedHorizontalLines[key]) { + mergedHorizontalLines[key] = { y: line.y, x1: line.x1, x2: line.x2 }; + } else { + // 合并 x 范围 + mergedHorizontalLines[key].x1 = Math.min(mergedHorizontalLines[key].x1, line.x1); + mergedHorizontalLines[key].x2 = Math.max(mergedHorizontalLines[key].x2, line.x2); + } + } + for (var key in mergedHorizontalLines) { + drawHorizontalLine(mergedHorizontalLines[key]); } verticalLines.length = horizontalLines.length = 0; }); diff --git a/scripts/encrypt/README.md b/scripts/encrypt/README.md new file mode 100644 index 0000000..7e44116 --- /dev/null +++ b/scripts/encrypt/README.md @@ -0,0 +1,116 @@ +# 加密脚本使用说明 + +## 📁 文件说明 + +- `encrypt-electron.js` - 主加密脚本 +- `encrypt-electron-win.bat` - Windows 批处理脚本 +- `encrypt-electron.sh` - Linux/Mac Shell 脚本 +- `cleanup-jsc.js` - 清理 .jsc 文件脚本 +- `cleanup.js` - 清理源文件脚本(备份到 .backup) +- `restore.js` - 恢复源文件脚本(从 .backup) +- `module-map.json` - **模块文件名映射配置**(位于 `lib` 目录) + +## 🔧 模块文件名映射配置 + +### 功能说明 + +`module-map.json` 允许你自定义加密后生成的文件名。这对于: +- 版本管理:不同版本使用不同的文件名 +- 安全加固:使用不易猜测的文件名 +- 多版本共存:同时保留多个版本的加密文件 + +### 配置文件结构 + +```json +{ + "mappings": { + "design1": { + "core": "core", // 原文件名 → 加密后文件名(不含扩展名) + "output": "output", + "ui": "ui" + }, + "design2": { + "core": "core", + "output": "output", + "ui": "ui" + }, + "main": { + "index": "index", + "design1": "design1", + "design2": "design2" + } + } +} +``` + +### 使用示例 + +#### 示例 1:添加版本号 +```json +{ + "mappings": { + "design1": { + "core": "core_v2", + "output": "output_v2", + "ui": "ui_v2" + } + } +} +``` +加密后会生成:`core_v2.jsc`, `output_v2.jsc`, `ui_v2.jsc` + +#### 示例 2:使用随机名称 +```json +{ + "mappings": { + "design1": { + "core": "a1b2c3", + "output": "x9y8z7", + "ui": "m5n6o4" + } + } +} +``` +加密后会生成:`a1b2c3.jsc`, `x9y8z7.jsc`, `m5n6o4.jsc` + +### 使用步骤 + +1. **修改配置文件** + ```bash + # 编辑 lib/module-map.json + # 修改 mappings 中的值 + ``` + +2. **运行加密脚本** + ```bash + npm run encrypt:win # Windows + npm run encrypt:linux # Linux/Mac + ``` + +3. **验证结果** + - 检查 `lib/design1/` 和 `lib/design2/` 目录 + - 确认生成了映射后的 `.jsc` 文件 + +### ⚠️ 注意事项 + +1. **唯一性**:确保映射值唯一,避免文件名冲突 +2. **重新加密**:修改配置后必须重新运行加密脚本 +3. **备份**:修改前建议备份配置文件 +4. **兼容性**:映射后的文件名会在运行时自动识别,无需修改代码 +5. **清理**:清理脚本会自动识别映射后的文件名 + +### 🔄 恢复默认 + +如果不想使用映射,将所有值改回原文件名即可: +```json +{ + "mappings": { + "design1": { + "core": "core", + "output": "output", + "ui": "ui" + } + } +} +``` + diff --git a/scripts/encrypt/cleanup-jsc.js b/scripts/encrypt/cleanup-jsc.js new file mode 100644 index 0000000..c3a43fb --- /dev/null +++ b/scripts/encrypt/cleanup-jsc.js @@ -0,0 +1,95 @@ +const fs = require('fs'); +const path = require('path'); + +// 获取项目根目录(脚本在 scripts/encrypt 目录下,需要向上两级) +const projectRoot = path.resolve(__dirname, '../..'); + +// 读取模块映射配置(从 lib 目录读取) +const moduleMapPath = path.join(projectRoot, 'lib', 'module-map.json'); +let moduleMap = {}; +if (fs.existsSync(moduleMapPath)) { + try { + moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); + } catch (error) { + console.warn(`⚠️ 读取模块映射配置失败: ${error.message},将清理所有 .jsc 文件\n`); + } +} + +// 文件映射函数:根据配置返回加密后的文件名(跨平台兼容) +function getEncryptedFileName(originalPath) { + // 使用 path 模块处理路径,确保跨平台兼容 + const normalizedPath = originalPath.replace(/\\/g, '/'); // 统一使用正斜杠 + const parts = normalizedPath.split('/'); + const fileName = parts[parts.length - 1].replace('.js', ''); + const dirName = parts[parts.length - 2]; + + // 检查是否有映射配置 + if (moduleMap.mappings) { + if (dirName === 'design1' && moduleMap.mappings.design1 && moduleMap.mappings.design1[fileName]) { + return moduleMap.mappings.design1[fileName] + '.jsc'; + } + if (dirName === 'design2' && moduleMap.mappings.design2 && moduleMap.mappings.design2[fileName]) { + return moduleMap.mappings.design2[fileName] + '.jsc'; + } + if (dirName === 'lib' && moduleMap.mappings.main && moduleMap.mappings.main[fileName]) { + return moduleMap.mappings.main[fileName] + '.jsc'; + } + } + + // 默认:原文件名 + 'c' + return fileName + '.jsc'; +} + +const filesToClean = [ + 'lib/index.js', 'lib/design1.js', 'lib/design2.js', + 'lib/design1/core.js', 'lib/design1/output.js', 'lib/design1/ui.js', + 'lib/design2/core.js', 'lib/design2/output.js', 'lib/design2/ui.js' +]; + +console.log('正在删除所有 .jsc 文件...\n'); + +let deletedCount = 0; +let notFoundCount = 0; + +filesToClean.forEach(filePath => { + // 跨平台兼容的路径处理 + const fullPath = path.join(projectRoot, filePath); + const dir = path.dirname(fullPath); + const encryptedFileName = getEncryptedFileName(filePath); + + // 尝试删除映射后的文件名 + const mappedJscPath = path.join(dir, encryptedFileName); + const defaultJscPath = fullPath + 'c'; + + // 使用 path.resolve 进行规范化比较,确保跨平台兼容 + const normalizedDefault = path.resolve(defaultJscPath); + const normalizedMapped = path.resolve(mappedJscPath); + + if (fs.existsSync(mappedJscPath)) { + try { + fs.unlinkSync(mappedJscPath); + console.log(`✅ 已删除: ${mappedJscPath}`); + deletedCount++; + } catch (error) { + console.error(`❌ 删除失败: ${mappedJscPath} - ${error.message}`); + } + } + + // 也尝试删除默认名称的 .jsc 文件(兼容旧版本) + if (fs.existsSync(defaultJscPath) && normalizedMapped !== normalizedDefault) { + try { + fs.unlinkSync(defaultJscPath); + console.log(`✅ 已删除: ${defaultJscPath}`); + deletedCount++; + } catch (error) { + console.error(`❌ 删除失败: ${defaultJscPath} - ${error.message}`); + } + } + + if (!fs.existsSync(mappedJscPath) && !fs.existsSync(defaultJscPath)) { + notFoundCount++; + } +}); + +console.log(`\n完成!已删除 ${deletedCount} 个文件,${notFoundCount} 个文件不存在`); + diff --git a/scripts/encrypt/cleanup.js b/scripts/encrypt/cleanup.js new file mode 100644 index 0000000..dc71d60 --- /dev/null +++ b/scripts/encrypt/cleanup.js @@ -0,0 +1,162 @@ +/** + * 清理脚本 - 删除源 JS 文件(保留 .jsc 文件) + * + * 使用方法: + * node cleanup.js + * + * 注意:此脚本会自动备份源文件到 .backup 目录 + */ + +const fs = require('fs'); +const path = require('path'); + +// 获取项目根目录(脚本在 scripts/encrypt 目录下,需要向上两级) +const projectRoot = path.resolve(__dirname, '../..'); + +// 读取模块映射配置(从 lib 目录读取,跨平台兼容) +const moduleMapPath = path.join(projectRoot, 'lib', 'module-map.json'); +let moduleMap = {}; +if (fs.existsSync(moduleMapPath)) { + try { + moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); + } catch (error) { + console.warn(`⚠️ 读取模块映射配置失败: ${error.message},将使用默认文件名\n`); + } +} + +// 文件映射函数:根据配置返回加密后的文件名(跨平台兼容) +function getEncryptedFileName(originalPath) { + // 使用 path 模块处理路径,确保跨平台兼容 + const normalizedPath = originalPath.replace(/\\/g, '/'); // 统一使用正斜杠 + const parts = normalizedPath.split('/'); + const fileName = parts[parts.length - 1].replace('.js', ''); + const dirName = parts[parts.length - 2]; + + // 检查是否有映射配置 + if (moduleMap.mappings) { + if (dirName === 'design1' && moduleMap.mappings.design1 && moduleMap.mappings.design1[fileName]) { + return moduleMap.mappings.design1[fileName] + '.jsc'; + } + if (dirName === 'design2' && moduleMap.mappings.design2 && moduleMap.mappings.design2[fileName]) { + return moduleMap.mappings.design2[fileName] + '.jsc'; + } + if (dirName === 'lib' && moduleMap.mappings.main && moduleMap.mappings.main[fileName]) { + return moduleMap.mappings.main[fileName] + '.jsc'; + } + } + + // 默认:原文件名 + 'c' + return fileName + '.jsc'; +} + +// 需要删除的源文件列表(对应的 .jsc 文件会被保留) +const filesToDelete = [ + 'lib/index.js', + 'lib/design1.js', + 'lib/design2.js', + 'lib/design1/core.js', + 'lib/design1/output.js', + 'lib/design1/ui.js', + 'lib/design2/core.js', + 'lib/design2/output.js', + 'lib/design2/ui.js', +]; + +// 备份目录 +const backupDir = path.join(projectRoot, '.backup'); + +console.log('开始清理源文件...\n'); +console.log('⚠️ 警告:此操作将删除源 JS 文件,只保留 .jsc 文件!\n'); + +// 创建备份目录 +if (!fs.existsSync(backupDir)) { + fs.mkdirSync(backupDir, { recursive: true }); + console.log(`✅ 已创建备份目录: ${backupDir}\n`); +} + +let deletedCount = 0; +let notFoundCount = 0; +let errorCount = 0; +let backedUpCount = 0; + +filesToDelete.forEach(filePath => { + try { + const fullPath = path.join(projectRoot, filePath); + const dir = path.dirname(fullPath); + + // 检查默认名称的 .jsc 文件 + const defaultJscPath = fullPath + 'c'; + // 检查映射后的 .jsc 文件 + const encryptedFileName = getEncryptedFileName(filePath); + const mappedJscPath = path.join(dir, encryptedFileName); + + // 检查是否存在 .jsc 文件(默认或映射后的) + const jscExists = fs.existsSync(defaultJscPath) || fs.existsSync(mappedJscPath); + + if (!jscExists) { + console.warn(`⚠️ 跳过: ${filePath} (对应的 .jsc 文件不存在)`); + notFoundCount++; + return; + } + + // 备份源文件 + if (fs.existsSync(fullPath)) { + const backupPath = path.join(backupDir, filePath); + const backupDirPath = path.dirname(backupPath); + + // 确保备份目录存在 + if (!fs.existsSync(backupDirPath)) { + fs.mkdirSync(backupDirPath, { recursive: true }); + } + + // 复制文件到备份目录 + fs.copyFileSync(fullPath, backupPath); + console.log(`📦 已备份: ${filePath} -> .backup/${filePath}`); + backedUpCount++; + + // 删除源文件 + fs.unlinkSync(fullPath); + console.log(`✅ 已删除: ${filePath}`); + deletedCount++; + } else { + console.log(`ℹ️ 不存在: ${filePath} (可能已删除)`); + notFoundCount++; + } + } catch (error) { + console.error(`❌ 处理失败: ${filePath}`); + console.error(` 错误: ${error.message}`); + errorCount++; + } +}); + +// 创建备份信息文件 +const backupInfo = { + timestamp: new Date().toISOString(), + files: filesToDelete.filter((filePath, index) => { + const fullPath = path.join(projectRoot, filePath); + return fs.existsSync(path.join(backupDir, filePath)); + }) +}; + +const backupInfoPath = path.join(backupDir, 'backup-info.json'); +fs.writeFileSync(backupInfoPath, JSON.stringify(backupInfo, null, 2)); +console.log(`\n📝 已创建备份信息文件: .backup/backup-info.json`); + +console.log('\n' + '='.repeat(50)); +console.log(`清理完成!`); +console.log(` 已备份: ${backedUpCount}`); +console.log(` 已删除: ${deletedCount}`); +console.log(` 未找到: ${notFoundCount}`); +console.log(` 错误: ${errorCount}`); +console.log(` 备份位置: ${backupDir}`); +console.log('='.repeat(50)); + +if (errorCount > 0) { + console.log('\n⚠️ 有文件处理失败,请检查错误信息'); + process.exit(1); +} else { + console.log('\n✅ 清理完成!源文件已备份到 .backup 目录'); + console.log('\n💡 恢复方法:'); + console.log(' 运行: node scripts/encrypt/restore.js'); + console.log(' 或手动从 .backup 目录复制文件回原位置'); +} diff --git a/scripts/encrypt/encrypt-electron-win.bat b/scripts/encrypt/encrypt-electron-win.bat new file mode 100644 index 0000000..f3b8aea --- /dev/null +++ b/scripts/encrypt/encrypt-electron-win.bat @@ -0,0 +1,8 @@ +@echo off +chcp 65001 >nul +set ELECTRON_RUN_AS_NODE=true +set NODE_OPTIONS=--max-old-space-size=4096 +cd /d "%~dp0\..\.." +electron scripts\encrypt\encrypt-electron.js +pause + diff --git a/scripts/encrypt/encrypt-electron.js b/scripts/encrypt/encrypt-electron.js new file mode 100644 index 0000000..8076e67 --- /dev/null +++ b/scripts/encrypt/encrypt-electron.js @@ -0,0 +1,154 @@ +// 设置输出编码为 UTF-8(修复 Windows 中文乱码问题) +if (process.platform === 'win32') { + process.stdout.setDefaultEncoding('utf8'); + process.stderr.setDefaultEncoding('utf8'); + // 设置环境变量确保中文正确显示 + if (!process.env.CHCP) { + process.env.CHCP = '65001'; + } +} + +// 确保在 Electron 环境中运行 +if (!process.versions.electron) { + console.error('❌ 错误:此脚本必须在 Electron 环境中运行!'); + console.error('请使用以下方式运行:'); + console.error(' Windows: encrypt-electron-win.bat'); + console.error(' Linux/Mac: ./encrypt-electron.sh'); + console.error(' 或: npm run encrypt:win / npm run encrypt:linux'); + process.exit(1); +} + +const bytenode = require('bytenode'); +const fs = require('fs'); +const path = require('path'); + +// 获取项目根目录(脚本在 scripts/encrypt 目录下,需要向上两级) +const projectRoot = path.resolve(__dirname, '../..'); + +// 读取模块映射配置(从 lib 目录读取) +const moduleMapPath = path.join(projectRoot, 'lib', 'module-map.json'); +let moduleMap = {}; +if (fs.existsSync(moduleMapPath)) { + try { + moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8')); + console.log('✅ 已加载模块映射配置\n'); + } catch (error) { + console.warn(`⚠️ 读取模块映射配置失败: ${error.message},使用默认文件名\n`); + } +} + +// 文件映射函数:根据配置返回加密后的文件名(跨平台兼容) +function getEncryptedFileName(originalPath) { + // 使用 path 模块处理路径,确保跨平台兼容 + const normalizedPath = originalPath.replace(/\\/g, '/'); // 统一使用正斜杠 + const parts = normalizedPath.split('/'); + const fileName = parts[parts.length - 1].replace('.js', ''); + const dirName = parts[parts.length - 2]; + + // 检查是否有映射配置 + if (moduleMap.mappings) { + if (dirName === 'design1' && moduleMap.mappings.design1 && moduleMap.mappings.design1[fileName]) { + return moduleMap.mappings.design1[fileName] + '.jsc'; + } + if (dirName === 'design2' && moduleMap.mappings.design2 && moduleMap.mappings.design2[fileName]) { + return moduleMap.mappings.design2[fileName] + '.jsc'; + } + if (dirName === 'lib' && moduleMap.mappings.main && moduleMap.mappings.main[fileName]) { + return moduleMap.mappings.main[fileName] + '.jsc'; + } + } + + // 默认:原文件名 + 'c' + return fileName + '.jsc'; +} + +const filesToEncrypt = [ + 'lib/index.js', 'lib/design1.js', 'lib/design2.js', + 'lib/design1/core.js', 'lib/design1/output.js', 'lib/design1/ui.js', + 'lib/design2/core.js', 'lib/design2/output.js', 'lib/design2/ui.js' +]; + +// 先删除所有旧的 .jsc 文件(包括映射后的文件名) +console.log('正在删除旧的 .jsc 文件...'); +let deletedCount = 0; +filesToEncrypt.forEach(filePath => { + // 删除默认名称的 .jsc 文件(跨平台兼容) + const fullPath = path.join(projectRoot, filePath); + const defaultJscPath = fullPath + 'c'; + if (fs.existsSync(defaultJscPath)) { + try { + fs.unlinkSync(defaultJscPath); + deletedCount++; + } catch (error) { + console.error(`⚠️ 删除失败: ${defaultJscPath} - ${error.message}`); + } + } + + // 删除映射后的 .jsc 文件(跨平台兼容) + const dir = path.dirname(fullPath); + const encryptedFileName = getEncryptedFileName(filePath); + const mappedJscPath = path.join(dir, encryptedFileName); + // 使用 path.resolve 进行规范化比较,确保跨平台兼容 + const normalizedDefault = path.resolve(defaultJscPath); + const normalizedMapped = path.resolve(mappedJscPath); + if (fs.existsSync(mappedJscPath) && normalizedMapped !== normalizedDefault) { + try { + fs.unlinkSync(mappedJscPath); + deletedCount++; + } catch (error) { + console.error(`⚠️ 删除失败: ${mappedJscPath} - ${error.message}`); + } + } +}); +console.log(`已删除 ${deletedCount} 个旧的 .jsc 文件\n`); + +// 开始编译 +let successCount = 0, failCount = 0; + +filesToEncrypt.forEach(filePath => { + try { + const fullPath = path.join(projectRoot, filePath); + if (!fs.existsSync(fullPath)) { + console.error(`❌ 文件不存在: ${filePath}`); + failCount++; + return; + } + + // 编译文件(bytenode 会生成默认的 .jsc 文件) + bytenode.compileFile({ filename: fullPath }); + + // 检查默认的 .jsc 文件是否生成 + const defaultJscPath = fullPath + 'c'; + if (!fs.existsSync(defaultJscPath)) { + console.error(`❌ 编译失败: ${filePath}`); + failCount++; + return; + } + + // 如果配置了映射,重命名文件(跨平台兼容) + const dir = path.dirname(fullPath); + const encryptedFileName = getEncryptedFileName(filePath); + const mappedJscPath = path.join(dir, encryptedFileName); + + // 使用 path.resolve 进行规范化比较,确保跨平台兼容 + const normalizedDefault = path.resolve(defaultJscPath); + const normalizedMapped = path.resolve(mappedJscPath); + + if (normalizedMapped !== normalizedDefault) { + // 重命名文件 + fs.renameSync(defaultJscPath, mappedJscPath); + console.log(`✅ ${filePath} → ${encryptedFileName}`); + } else { + console.log(`✅ ${filePath} → ${path.basename(defaultJscPath)}`); + } + + successCount++; + } catch (error) { + console.error(`❌ 编译失败: ${filePath} - ${error.message}`); + failCount++; + } +}); + +console.log(`\n编译完成!成功: ${successCount}, 失败: ${failCount}`); +process.exit(failCount > 0 ? 1 : 0); + diff --git a/scripts/encrypt/encrypt-electron.sh b/scripts/encrypt/encrypt-electron.sh new file mode 100644 index 0000000..d79b377 --- /dev/null +++ b/scripts/encrypt/encrypt-electron.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# 设置 UTF-8 编码环境变量,确保中文正确显示 +export LANG=en_US.UTF-8 +export LC_ALL=en_US.UTF-8 +export LC_CTYPE=en_US.UTF-8 +export ELECTRON_RUN_AS_NODE=true +export NODE_OPTIONS=--max-old-space-size=4096 + +# 切换到项目根目录 +cd "$(dirname "$0")/../.." + +# 运行加密脚本 +electron scripts/encrypt/encrypt-electron.js + diff --git a/scripts/encrypt/restore.js b/scripts/encrypt/restore.js new file mode 100644 index 0000000..497bf4e --- /dev/null +++ b/scripts/encrypt/restore.js @@ -0,0 +1,126 @@ +/** + * 恢复脚本 - 从备份目录恢复源 JS 文件 + * + * 使用方法: + * node restore.js + * + * 此脚本会从 .backup 目录恢复所有备份的源文件 + */ + +const fs = require('fs'); +const path = require('path'); + +// 获取项目根目录(脚本在 scripts/encrypt 目录下,需要向上两级) +const projectRoot = path.resolve(__dirname, '../..'); + +// 备份目录 +const backupDir = path.join(projectRoot, '.backup'); +const backupInfoPath = path.join(backupDir, 'backup-info.json'); + +console.log('开始恢复源文件...\n'); + +// 检查备份目录是否存在 +if (!fs.existsSync(backupDir)) { + console.error('❌ 错误:备份目录不存在!'); + console.error(` 路径: ${backupDir}`); + console.error('\n💡 提示:如果没有备份,请从 Git 仓库恢复文件'); + process.exit(1); +} + +// 检查备份信息文件 +if (!fs.existsSync(backupInfoPath)) { + console.warn('⚠️ 警告:备份信息文件不存在,将尝试恢复所有 .js 文件\n'); +} + +let restoredCount = 0; +let notFoundCount = 0; +let errorCount = 0; + +// 读取备份信息 +let filesToRestore = []; +if (fs.existsSync(backupInfoPath)) { + try { + const backupInfo = JSON.parse(fs.readFileSync(backupInfoPath, 'utf8')); + filesToRestore = backupInfo.files || []; + console.log(`📋 从备份信息读取到 ${filesToRestore.length} 个文件\n`); + } catch (error) { + console.warn(`⚠️ 无法读取备份信息文件: ${error.message}\n`); + } +} + +// 如果没有备份信息,扫描备份目录 +if (filesToRestore.length === 0) { + console.log('📂 扫描备份目录...\n'); + function scanDir(dir, baseDir = '') { + const files = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + const relativePath = path.join(baseDir, entry.name); + + if (entry.isDirectory()) { + files.push(...scanDir(fullPath, relativePath)); + } else if (entry.isFile() && entry.name.endsWith('.js')) { + files.push(relativePath); + } + } + return files; + } + + filesToRestore = scanDir(backupDir); + console.log(`📋 扫描到 ${filesToRestore.length} 个备份文件\n`); +} + +if (filesToRestore.length === 0) { + console.error('❌ 错误:没有找到任何备份文件!'); + process.exit(1); +} + +// 恢复文件 +filesToRestore.forEach(filePath => { + try { + const backupPath = path.join(backupDir, filePath); + const restorePath = path.join(projectRoot, filePath); + + // 检查备份文件是否存在 + if (!fs.existsSync(backupPath)) { + console.warn(`⚠️ 备份文件不存在: ${filePath}`); + notFoundCount++; + return; + } + + // 确保目标目录存在 + const restoreDir = path.dirname(restorePath); + if (!fs.existsSync(restoreDir)) { + fs.mkdirSync(restoreDir, { recursive: true }); + } + + // 复制文件 + fs.copyFileSync(backupPath, restorePath); + console.log(`✅ 已恢复: ${filePath}`); + restoredCount++; + } catch (error) { + console.error(`❌ 恢复失败: ${filePath}`); + console.error(` 错误: ${error.message}`); + errorCount++; + } +}); + +console.log('\n' + '='.repeat(50)); +console.log(`恢复完成!`); +console.log(` 已恢复: ${restoredCount}`); +console.log(` 未找到: ${notFoundCount}`); +console.log(` 错误: ${errorCount}`); +console.log('='.repeat(50)); + +if (errorCount > 0) { + console.log('\n⚠️ 有文件恢复失败,请检查错误信息'); + process.exit(1); +} else { + console.log('\n✅ 恢复完成!源文件已从备份目录恢复'); + console.log('\n💡 提示:'); + console.log(' - 备份文件仍保留在 .backup 目录'); + console.log(' - 如需删除备份,请手动删除 .backup 目录'); +} +