@@ -1151,6 +1155,9 @@ window.updateList = function updateList() {
}
// 将 selectObj 附加到 window 对象,确保全局可访问
+// 标记是否通过对象列表选中(用于区分鼠标点击和列表点击)
+window._selectingFromList = false;
+
window.selectObj = function selectObj(objIndices, isFromCanvas = false) {
let indicesArray = (Array.isArray(objIndices)) ? objIndices : ((typeof objIndices === 'number' && objIndices >= 0) ? [objIndices] : []);
@@ -1166,16 +1173,6 @@ window.selectObj = function selectObj(objIndices, isFromCanvas = false) {
if (indicesArray.includes(idIndex)) {
$(this).css("background-color", "#6F7A84");
- // 如果对象被锁定,临时允许选中以便解锁
- if (idIndex >= 0 && canvas.getObjects()[idIndex + 1]) {
- let obj = canvas.getObjects()[idIndex + 1];
- if (obj && obj.get('lockMovementX') === true) {
- obj.set({
- selectable: true,
- evented: true
- })
- }
- }
// 自动滚动到可视区域
if (isFromCanvas && indicesArray[0] === idIndex) {
@@ -1188,15 +1185,39 @@ window.selectObj = function selectObj(objIndices, isFromCanvas = false) {
if (!isFromCanvas && indicesArray.length === 1) {
let target = canvas.getObjects()[indicesArray[0] + 1];
if (target) {
- // 如果对象被锁定,临时允许选中以便解锁
- if (target.get('lockMovementX') === true) {
+ // 检查对象是否被锁定
+ let isLocked = isObjectLocked(target);
+
+ // 设置标志位,表示这是通过对象列表选中的(无论是否锁定)
+ window._selectingFromList = true;
+
+ // 如果被锁定,临时设置 selectable 和 evented 为 true,以便能够选中
+ if (isLocked) {
target.set({
selectable: true,
evented: true
- })
+ });
}
+
canvas.setActiveObject(target);
canvas.requestRenderAll();
+
+ // 如果对象被锁定,选中后立即恢复锁定状态(但保持选中状态)
+ if (isLocked) {
+ setTimeout(() => {
+ target.set({
+ selectable: false,
+ evented: false
+ });
+ canvas.requestRenderAll();
+ }, 0);
+ }
+
+ // 清除标志位(延迟清除,确保事件处理完成)
+ setTimeout(() => {
+ window._selectingFromList = false;
+ }, 10);
+
handleObjectSelected();
}
}
@@ -1217,7 +1238,7 @@ window.recordState = function recordState() {
//recordObjs.splice(step.val, 1, JSON.stringify(objs))
//recordJson.splice(step.val, 1, canvas.toJSON(["selectable","hoverable","hoverCursor","text","fontStyle","fontWeight","underline"]))
recordObjs.push(JSON.stringify(objs))
- j = canvas.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ j = canvas.toJSON(TO_JSON_PROPERTIES);
j.objects[0].hoverCursor = "default";
recordJson.push(j);
}
@@ -1228,7 +1249,6 @@ window.getIndex = function getIndex(target, _canvas = null) {
// 使用 window.canvas 作为默认值,确保在 eval() 执行时也能访问
const currentCanvas = _canvas || window.canvas || canvas;
if (!currentCanvas) {
- console.error('getIndex: canvas is undefined');
return 0;
}
temp_objs = currentCanvas.getObjects();
@@ -1377,6 +1397,16 @@ function handleObjectSelected(e) {
// 2. 获取索引
let i = getIndex(select_obj, canvas);
+
+ // 如果不是通过对象列表选中的,且对象被锁定,则取消选中
+ if (!window._selectingFromList && isObjectLocked(select_obj)) {
+ canvas.discardActiveObject();
+ canvas.renderAll();
+ $("#base_control, #line_control, #pic_control, #out_pic_control, #text_control, #circle_text_control, #out_text_control, #rect_control, #circle_control, #counter_control, #qrcode_Controll, #barcode_controll").hide();
+ $("#component_type").text(language_str("bg"));
+ selectObj(-1, true);
+ return;
+ }
if (i != 0) {
// --- 选中了普通对象 ---
@@ -1450,6 +1480,61 @@ function handleObjectMoving(e) {
updateControls();
}
+// 辅助函数:检查对象是否被锁定
+// 只有当 lockMovementX 为 true 时才认为对象被锁定
+// selectable 为 false 可能是其他原因(如背景图),所以只检查 lockMovementX
+function isObjectLocked(obj) {
+ if (!obj) return false;
+ // 主要检查 lockMovementX,这是锁定的主要标志
+ return obj.get('lockMovementX') === true;
+}
+// 暴露到全局作用域,确保其他模块可以访问
+window.isObjectLocked = isObjectLocked;
+
+// 统一的 toJSON 属性列表,不包含锁定相关属性(锁定状态不应被保存)
+const TO_JSON_PROPERTIES = [
+ "selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "evented"
+];
+// 暴露到全局作用域
+window.TO_JSON_PROPERTIES = TO_JSON_PROPERTIES;
+
+// 辅助函数:解锁所有对象(加载时使用)
+function unlockAllObjects(canvas) {
+ if (!canvas) return;
+ const objects = canvas.getObjects();
+ objects.forEach((obj, index) => {
+ // 背景对象(索引0)保持锁定状态
+ if (index === 0) {
+ obj.set({
+ lockMovementX: true,
+ lockMovementY: true,
+ lockRotation: true,
+ lockScalingX: true,
+ lockScalingY: true,
+ lockSkewingX: true,
+ lockSkewingY: true,
+ selectable: false,
+ evented: false
+ });
+ } else {
+ // 其他对象默认解锁
+ obj.set({
+ lockMovementX: false,
+ lockMovementY: false,
+ lockRotation: false,
+ lockScalingX: false,
+ lockScalingY: false,
+ lockSkewingX: false,
+ lockSkewingY: false,
+ selectable: true,
+ evented: true
+ });
+ }
+ });
+}
+// 暴露到全局作用域
+window.unlockAllObjects = unlockAllObjects;
+
// 将 handleObjectSelected 附加到 window 对象,确保全局可访问
window.handleObjectSelected = handleObjectSelected;
@@ -1489,6 +1574,17 @@ function initCanvasEvents() {
objs = (currentCanvas === canvas1) ? objs1 : objs2;
handleObjectSelected(e);
});
+
+ // 阻止被锁定的对象被框选选中(只过滤被锁定的对象,保留未锁定的对象)
+ currentCanvas.on('before:selection:created', (e) => {
+ if (!e.targets || e.targets.length === 0) return;
+ // 过滤掉被锁定的对象,保留辅助线和未锁定的对象
+ e.targets = e.targets.filter(target => {
+ if (target.isGuideLine) return true; // 保留辅助线
+ return !isObjectLocked(target); // 移除被锁定的对象,保留未锁定的对象
+ });
+ });
+
// 添加 selection 事件以确保对象选中时正确显示属性面板
currentCanvas.on('selection:created', (e) => {
canvas = currentCanvas;
@@ -1504,16 +1600,12 @@ function initCanvasEvents() {
canvas = currentCanvas;
objs = (currentCanvas === canvas1) ? objs1 : objs2;
- // 阻止背景图(索引0)被选中(如果已锁定)
- let selectedObj = e.target;
- let idx = getIndex(selectedObj);
- if (idx === 0) {
- let bgObj = currentCanvas.getObjects()[0];
- if (bgObj && (bgObj.get('lockMovementX') === true || bgObj.get('selectable') === false)) {
- currentCanvas.discardActiveObject();
- currentCanvas.renderAll();
- return;
- }
+ // 如果不是通过对象列表选中的,且对象被锁定,则取消选中
+ // 注意:只有真正被锁定的对象才会被取消选中,未锁定的对象应该正常选中
+ if (!window._selectingFromList && e.target && isObjectLocked(e.target)) {
+ currentCanvas.discardActiveObject();
+ currentCanvas.renderAll();
+ return;
}
handleObjectSelected(e);
@@ -1582,7 +1674,6 @@ function initCanvasEvents() {
if (typeof window.updateList === 'function') {
window.updateList();
}
- console.warn('objData is undefined or missing type at index', idx - 1);
return;
}
let target = event.target;
@@ -2081,7 +2172,6 @@ window.copySelection = function copySelection() {
});
clipboardData.offset = 10; // 重置偏移量
- console.log(`已复制 ${activeObjects.length} 个对象`);
layer.msg("已复制");
}
diff --git a/lib/design1/output.js b/lib/design1/output.js
index 751e54f..81fdfbf 100644
--- a/lib/design1/output.js
+++ b/lib/design1/output.js
@@ -25,17 +25,14 @@ async function saveImageAsPNG(buffer) {
});
if (canceled) {
- console.log('用户取消了保存操作');
return;
}
// 将Buffer写入PNG文件到用户选择的路径
fs.writeFile(filePath, buffer, (err) => {
if (err) {
- console.error('写入文件失败:', err);
} else {
layer.msg(language_str("saveSucc") + filePath);//'保存成功至'
- console.log('PNG文件已保存至:', filePath);
}
});
}
@@ -1110,15 +1107,31 @@ window.openFile = function open(file) {
});
canvas1.loadFromJSON(j.f, function () {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas1);
+ }
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
window.regenerateQrCodesAndBarcodes(canvas1, fo);
}
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
canvas1.renderAll();
});
canvas2.loadFromJSON(j.b, function () {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas2);
+ }
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
window.regenerateQrCodesAndBarcodes(canvas2, bo);
}
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
canvas2.renderAll();
});
@@ -1165,12 +1178,13 @@ window.openFile = function open(file) {
}
setTimeout(() => {
recordObjs1.push(JSON.stringify(objs1))
- let j1 = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ const props = window.TO_JSON_PROPERTIES || ["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "evented"];
+ let j1 = canvas1.toJSON(props);
j1.objects[0].hoverCursor = "default";
recordJson1.push(j1);
recordObjs2.push(JSON.stringify(objs2))
- let j2 = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ let j2 = canvas2.toJSON(props);
recordJson2.push(j2);
}, 0);
} catch (e) {
@@ -1229,8 +1243,9 @@ function saveAs(op1, callback) {
}
});
- let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
- let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ const props = window.TO_JSON_PROPERTIES || ["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "lockMovementX", "lockMovementY", "lockRotation", "lockScalingX", "lockScalingY", "lockSkewingX", "lockSkewingY", "evented"];
+ let j = canvas1.toJSON(props);
+ let b = canvas2.toJSON(props);
// 恢复辅助线
guideLines1.forEach(obj => canvas1.add(obj));
@@ -1271,7 +1286,6 @@ function saveAs(op1, callback) {
callback();
}
}).catch(err => {
- console.log()
})
}
@@ -1292,8 +1306,9 @@ function save(op1, callback) {
}
});
- let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
- let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ const props = window.TO_JSON_PROPERTIES || ["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "lockMovementX", "lockMovementY", "lockRotation", "lockScalingX", "lockScalingY", "lockSkewingX", "lockSkewingY", "evented"];
+ let j = canvas1.toJSON(props);
+ let b = canvas2.toJSON(props);
// 恢复辅助线
guideLines1.forEach(obj => canvas1.add(obj));
@@ -1346,7 +1361,6 @@ function save(op1, callback) {
callback();
}
}).catch(err => {
- console.log()
})
}
@@ -1365,7 +1379,6 @@ window.saveHistory = function saveHistory() {
}
}
} catch (e) {
- console.error("读取历史记录失败,将重置:", e);
// 出错时使用默认空数组,不中断流程
j = { history: [] };
}
@@ -1398,7 +1411,6 @@ window.saveHistory = function saveHistory() {
try {
fs.writeFileSync(fullPath, JSON.stringify(j), 'utf8');
} catch (e) {
- console.error("写入历史记录失败:", e);
}
};
// 向后兼容
@@ -1448,7 +1460,6 @@ function clearAll() {
if (typeof window.updateList === 'function') {
window.updateList();
}
- console.log();
}
// 将 clearAll 附加到 window 对象,确保全局可访问
diff --git a/lib/design1/ui.js b/lib/design1/ui.js
index a795d54..c3d6027 100644
--- a/lib/design1/ui.js
+++ b/lib/design1/ui.js
@@ -1,2338 +1,2417 @@
-var _keyctrl = false, _keyc = false, _textEdit = false, _inputEdit = false;
-$("input").focus(function () {
- console.log(1)
- _inputEdit = true
-})
-$("input").blur(function () {
- _inputEdit = false
-})
-$("textarea").focus(function () {
- console.log(1)
- _inputEdit = true
-})
-$("textarea").blur(function () {
- _inputEdit = false
-})
-$("body").keyup(function (event) {
- // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�?
- if (event.keyCode == 17 || event.keyCode == 91 || event.keyCode == 93) { // Ctrl 键或 Meta 键(Mac Cmd)释�?
- _keyctrl = false;
- };
- if (event.keyCode == 67) {
- _keyc = false;
- };
-})
-$("body").keydown(function (event) {
- // 统一的快捷键处理(兼�?Windows/Linux: Ctrl, Mac: Cmd/Meta�?
- const isModifierKey = event.ctrlKey || event.metaKey; // 兼容三端
-
- // 快捷键处理(在输入框或文本区域中时不触发,除了删除相关的�?
- if (!_inputEdit && !_textEdit) {
- // CTRL/CMD+N - 新建
- if (isModifierKey && event.keyCode == 78) {
- event.preventDefault();
- $("#new").click();
- return;
- }
- // CTRL/CMD+O - 打开
- if (isModifierKey && event.keyCode == 79) {
- event.preventDefault();
- $("#open").click();
- return;
- }
- // CTRL/CMD+S - 保存
- if (isModifierKey && !event.shiftKey && event.keyCode == 83) {
- event.preventDefault();
- $("#save").click();
- return;
- }
- // CTRL/CMD+SHIFT+S - 保存副本
- if (isModifierKey && event.shiftKey && event.keyCode == 83) {
- event.preventDefault();
- if (typeof window.output === 'function') {
- window.output(null, saveAs);
- }
- return;
- }
- // CTRL/CMD+Z - 还原
- if (isModifierKey && !event.shiftKey && event.keyCode == 90) {
- event.preventDefault();
- $("#previous").click();
- return;
- }
- // CTRL/CMD+Y - 重做
- if (isModifierKey && !event.shiftKey && event.keyCode == 89) {
- event.preventDefault();
- $("#next").click();
- return;
- }
- // CTRL/CMD+C - 复制
- if (isModifierKey && event.keyCode == 67 && event.target.nodeName == 'BODY') {
- event.preventDefault();
- window.copySelection();
- return;
- }
- // CTRL/CMD+V - 粘贴
- if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') {
- event.preventDefault();
- window.pasteFromClipboard();
- return;
- }
-
- // CTRL/CMD + SHIFT + DEL (Windows) �?CMD + SHIFT + Backspace (Mac) - 清空
- if (isModifierKey && event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
- event.preventDefault();
- $("#clean").click();
- return;
- }
-
- // CTRL/CMD + DEL (Windows) �?CMD + Backspace (Mac) - 删除
- if (isModifierKey && !event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
- event.preventDefault();
- $("#delete").click();
- return;
- }
-
- }
- // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�?
- if (event.keyCode == 17 || event.metaKey) { // Ctrl 键或 Meta 键(Mac Cmd�?
- _keyctrl = true;
- if (_keyc && _textEdit) {
- //同时按下且在编辑状�?
- setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1)
- //clipboard.writeText((clipboard.readText()+' '))
- }
- }
- if (event.keyCode == 67) {
- _keyc = true;
- if (_keyctrl & _textEdit) {
- //同时按下且在编辑状�?
- setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1)
- //clipboard.writeText((clipboard.readText()+' '))
- }
- }
- if (event.keyCode == 37) {
- //left
- let v = -1;
- if (_keyctrl || event.ctrlKey || event.metaKey) {
- v = -5;
- }
- let x = canvas.getActiveObject().get("left");
- x += v;
- canvas.getActiveObject().set("left", x);
- canvas.renderAll();
- window.recordState();
- updateControls();
- }
- if (event.keyCode == 38) {
- //up
- let v = -1;
- if (_keyctrl || event.ctrlKey || event.metaKey) {
- v = -5;
- }
- let y = canvas.getActiveObject().get("top");
- y += v;
- canvas.getActiveObject().set("top", y);
- canvas.renderAll();
- window.recordState();
- updateControls();
- }
- if (event.keyCode == 39) {
- //right
- let v = 1;
- if (_keyctrl || event.ctrlKey || event.metaKey) {
- v = 5;
- }
- let x = canvas.getActiveObject().get("left");
- x += v;
- canvas.getActiveObject().set("left", x);
- canvas.renderAll();
- window.recordState();
- updateControls();
- }
- if (event.keyCode == 40) {
- //down
- let v = +1;
- if (_keyctrl || event.ctrlKey || event.metaKey) {
- v = 5;
- }
- let y = canvas.getActiveObject().get("top");
- y += v;
- canvas.getActiveObject().set("top", y);
- canvas.renderAll();
- window.recordState();
- updateControls();
- }
- // 普通删除键(DEL键,没有按CTRL/CMD�?
- if (event.keyCode == 46 && !isModifierKey && !_inputEdit && !_textEdit) {
- // 使用 window.canvas 作为后备,确保在 eval() 加载 .jsc 时也能访问
- const currentCanvas = window.canvas || canvas;
- const currentObjs = window.objs || objs;
- if (!currentCanvas) {
- console.error('canvas is undefined in delete handler');
- return;
- }
- let actObjs = currentCanvas.getActiveObjects();
- let allObjs = currentCanvas.getObjects();
- let flag = 0;
- for (let item of actObjs) {
- if (item != allObjs[0]) {
- let i = getIndex(item, currentCanvas);//0是背景,所以从1开始,但objs不包含背景图片,故要-1
- currentObjs.splice(i - 1, 1);
- currentCanvas.remove(item);
- flag = 1;
-
- }
- }
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
- currentCanvas.discardActiveObject();
- if (flag == 1) {
- window.recordState();
- canvas.renderAll();
- handleObjectSelected()
- }
- }
-});
-// pre_add_image 已在 design1.js 中定义为全局变量
-$("#addPic").click(function () {
- OpenDialog();
- function OpenDialog() {
- dialog.showOpenDialog({
- title: language_str("selectPic"),//请选择图片
- buttonLabel: language_str("comf"),//"确认"
- filters: [
- { name: 'Image File Type', extensions: ['png', 'jpg', 'jpeg'] },
- ]
- }).then(result => {
- if (result.canceled) return;
- //console.log(result.filePaths)
- fabric.Image.fromURL(result.filePaths[0], function (image) {
- //image.left = pointer.x;
- image.setSrc(image.toDataURL(), function (image) {
- pre_add_image = image;
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 1;
- });
- //canvas.add(image);
- });
- }).catch(err => {
- console.log(err)
- })
- }
-});
-$("#addOutPic").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 2;
-});
-$("#addText").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 3;
-});
-
-$("#addCircleText").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 11;
-});
-$("#addOutText").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 4;
-});
-$("#addRect").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 5;
-});
-$("#addCircle").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 6;
-});
-$("#addLine").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 7;
-});
-$("#addQrCode").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 8;
-});
-$("#addBarCode").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addCounter").css("background-color", "");
- addState = 9;
-});
-$("#addCounter").click(function () {
- background_image.hoverCursor = "crosshair";
- $(this).css("background-color", "#646E76");
-
- $("#addPic").css("background-color", "");
- $("#addOutPic").css("background-color", "");
- $("#addText").css("background-color", "");
- $("#addCircleText").css("background-color", "");
- $("#addOutText").css("background-color", "");
- $("#addRect").css("background-color", "");
- $("#addCircle").css("background-color", "");
- $("#addLine").css("background-color", "");
- $("#addQrCode").css("background-color", "");
- $("#addBarCode").css("background-color", "");
- addState = 10;
-});
-$("#version_change").click(function () {
- if (bg_version == 1) {
- bg_version = 2;
- } else {
- bg_version = 1;
- }
- // 类型改变
- $("#source_front").attr("src", "./public/images/front_bg" + bg_version + "_1.png");
- canvas.renderAll();
-
-});
-$("#front_side").click(function () {
- $(this).addClass("ui-button-active");
- $("#back_side").removeClass("ui-button-active");
- $(".canvas-container:eq(0)").show();
- $(".canvas-container:eq(1)").hide();
- console.log("------");
- console.log(recordObjs1);
- console.log("------");
- canvas = canvas1;
- objs = objs1;
- background_image = background_image1;
- window.canvas = canvas;
- window.objs = objs;
- window.background_image = background_image;
- next_objs = next_objs1;
- pre_objs = pre_objs1;
- next_json = next_json1;
- pre_json = pre_json1;
- recordObjs = recordObjs1;
- recordJson = recordJson1;
- step = step1;
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
-
- $("#line_control").hide();
- $("#base_control").hide();
- $("#pic_control").hide();
- $("#out_pic_control").hide();
- $("#text_control").hide();
- $("#circle_text_control").hide();
- $("#out_text_control").hide();
- $("#rect_control").hide();
- $("#circle_control").hide();
- $("#counter_control").hide();
- $("#qrcode_Controll").hide();
- $("#barcode_controll").hide();
- $("#component_type").text(language_str("bg"));//背景
-});
-$("#back_side").click(function () {
- $(this).addClass("ui-button-active");
- $("#front_side").removeClass("ui-button-active");
- $(".canvas-container:eq(0)").hide();
- $(".canvas-container:eq(1)").show();
- canvas = canvas2;
- objs = objs2;
- background_image = background_image2;
- window.canvas = canvas;
- window.objs = objs;
- window.background_image = background_image;
- next_objs = next_objs2;
- pre_objs = pre_objs2;
- next_json = next_json2;
- pre_json = pre_json2;
- recordObjs = recordObjs2;
- recordJson = recordJson2;
- step = step2;
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
- $("#line_control").hide();
- $("#base_control").hide();
- $("#pic_control").hide();
- $("#out_pic_control").hide();
- $("#text_control").hide();
- $("#circle_text_control").hide();
- $("#out_text_control").hide();
- $("#rect_control").hide();
- $("#circle_control").hide();
- $("#counter_control").hide();
- $("#qrcode_Controll").hide();
- $("#barcode_controll").hide();
- $("#component_type").text(language_str("bg"));//"背景"
-});
-$("#top_alignment").click(function () {
- let _objs = canvas.getActiveObjects();
- if (_objs.length == 1) {
- //只选中了一�?
- let obj = _objs[0];
- obj.setCoords();
- let coords = obj.getCoords(true);
- let objMinY = getCoordsMinY(coords);
- let bgMinY = getCoordsMinY(background_image.getCoords(true));
- let deltaY = bgMinY - objMinY;
- obj.set("top", obj.get("top") + deltaY);
- obj.setCoords();
- canvas.renderAll();
- window.recordState();
- return;
- }
- // 多个对象对齐:找到所有对象边界框的最小Y值
- let minTop = Infinity;
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinY = getCoordsMinY(coords);
- if (itemMinY < minTop) {
- minTop = itemMinY;
- }
- }
- // 将所有对象对齐到最小Y值
- groupItems = [];
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinY = getCoordsMinY(coords);
- let deltaY = minTop - itemMinY;
- item.set("top", item.get("top") + deltaY);
- item.setCoords();
- groupItems.push(item);
- }
- canvas.discardActiveObject();
- let sel = new fabric.ActiveSelection(groupItems, {
- canvas: canvas,
- });
- canvas.setActiveObject(sel);
- canvas.requestRenderAll();
- canvas.renderAll();
-
-});
-$("#bottom_alignment").click(function () {
- let _objs = canvas.getActiveObjects();
- if (_objs.length == 1) {
- //只选中了一�?
- let idx = getIndex(_objs[0]);
- let type = objs[idx - 1].type;
- let other = 0;//strokeWidth
- if (type == 5 || type == 6 || type == 7) {
- other = _objs[0].get("strokeWidth")
- }
- let obj = _objs[0];
- obj.setCoords();
- let coords = obj.getCoords(true);
- let objMaxY = getCoordsMaxY(coords);
- let bgMaxY = getCoordsMaxY(background_image.getCoords(true));
- let deltaY = bgMaxY - objMaxY;
- obj.set("top", obj.get("top") + deltaY);
- obj.setCoords();
- canvas.renderAll();
- window.recordState();
- return;
- }
- // 多个对象对齐:找到所有对象边界框的最大Y值
- let maxBottom = -Infinity;
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMaxY = getCoordsMaxY(coords);
- if (itemMaxY > maxBottom) {
- maxBottom = itemMaxY;
- }
- }
- // 将所有对象对齐到最大Y值
- groupItems = [];
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMaxY = getCoordsMaxY(coords);
- let deltaY = maxBottom - itemMaxY;
- item.set("top", item.get("top") + deltaY);
- item.setCoords();
- groupItems.push(item);
- }
- canvas.discardActiveObject();
- let sel = new fabric.ActiveSelection(groupItems, {
- canvas: canvas,
- });
- canvas.setActiveObject(sel);
- canvas.requestRenderAll();
- canvas.renderAll();
-
-});
-$("#center_y_alignment").click(function () {
- let _objs = canvas.getActiveObjects();
- if (_objs.length == 1) {
- //只选中了一�?
- let idx = getIndex(_objs[0]);
- let type = objs[idx - 1].type;
- let other = 0;//strokeWidth
- if (type == 5 || type == 6 || type == 7) {
- other = _objs[0].get("strokeWidth")
- }
- let obj = _objs[0];
- obj.setCoords();
- let coords = obj.getCoords(true);
- let objMinY = getCoordsMinY(coords);
- let objMaxY = getCoordsMaxY(coords);
- let objCenterY = (objMinY + objMaxY) / 2;
- let bgCoords = background_image.getCoords(true);
- let bgMinY = getCoordsMinY(bgCoords);
- let bgMaxY = getCoordsMaxY(bgCoords);
- let bgCenterY = (bgMinY + bgMaxY) / 2;
- let deltaY = bgCenterY - objCenterY;
- obj.set("top", obj.get("top") + deltaY);
- obj.setCoords();
- canvas.renderAll();
- window.recordState();
- return;
- }
- // 多个对象对齐:找到所有对象边界框的中心Y值
- let minTop = Infinity;
- let maxBottom = -Infinity;
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinY = getCoordsMinY(coords);
- let itemMaxY = getCoordsMaxY(coords);
- if (itemMinY < minTop) minTop = itemMinY;
- if (itemMaxY > maxBottom) maxBottom = itemMaxY;
- }
- let groupCenterY = (minTop + maxBottom) / 2;
- // 将所有对象对齐到中心Y值
- groupItems = [];
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinY = getCoordsMinY(coords);
- let itemMaxY = getCoordsMaxY(coords);
- let itemCenterY = (itemMinY + itemMaxY) / 2;
- let deltaY = groupCenterY - itemCenterY;
- item.set("top", item.get("top") + deltaY);
- item.setCoords();
- groupItems.push(item);
- }
- canvas.discardActiveObject();
- let sel = new fabric.ActiveSelection(groupItems, {
- canvas: canvas,
- });
- canvas.setActiveObject(sel);
- canvas.requestRenderAll();
- canvas.renderAll();
- window.recordState();
-});
-$("#left_alignment").click(function () {
- let _objs = canvas.getActiveObjects();
- if (_objs.length == 1) {
- //只选中了一�?
- let obj = _objs[0];
- obj.setCoords();
- let coords = obj.getCoords(true);
- let objMinX = getCoordsMinX(coords);
- let bgMinX = getCoordsMinX(background_image.getCoords(true));
- let deltaX = bgMinX - objMinX;
- obj.set("left", obj.get("left") + deltaX);
- obj.setCoords();
- canvas.renderAll();
- window.recordState();
- return;
- }
- // 多个对象对齐:找到所有对象边界框的最小X值
- let minLeft = Infinity;
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinX = getCoordsMinX(coords);
- if (itemMinX < minLeft) {
- minLeft = itemMinX;
- }
- }
- // 将所有对象对齐到最小X值
- groupItems = [];
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinX = getCoordsMinX(coords);
- let deltaX = minLeft - itemMinX;
- item.set("left", item.get("left") + deltaX);
- item.setCoords();
- groupItems.push(item);
- }
- canvas.discardActiveObject();
- let sel = new fabric.ActiveSelection(groupItems, {
- canvas: canvas,
- });
- canvas.setActiveObject(sel);
- canvas.requestRenderAll();
- canvas.renderAll();
- window.recordState();
-});
-$("#right_alignment").click(function () {
- let _objs = canvas.getActiveObjects();
- if (_objs.length == 1) {
- //只选中了一�?
- let idx = getIndex(_objs[0]);
- let type = objs[idx - 1].type;
- let other = 0;//strokeWidth
- if (type == 5 || type == 6 || type == 7) {
- other = item.get("strokeWidth")
- }
- let obj = _objs[0];
- obj.setCoords();
- let coords = obj.getCoords(true);
- let objMaxX = getCoordsMaxX(coords);
- let bgMaxX = getCoordsMaxX(background_image.getCoords(true));
- let deltaX = bgMaxX - objMaxX;
- obj.set("left", obj.get("left") + deltaX);
- obj.setCoords();
- canvas.renderAll();
- window.recordState();
- return;
- }
- // 多个对象对齐:找到所有对象边界框的最大X值
- let maxRight = -Infinity;
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMaxX = getCoordsMaxX(coords);
- if (itemMaxX > maxRight) {
- maxRight = itemMaxX;
- }
- }
- // 将所有对象对齐到最大X值
- let groupItems = [];
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMaxX = getCoordsMaxX(coords);
- let deltaX = maxRight - itemMaxX;
- item.set("left", item.get("left") + deltaX);
- item.setCoords();
- groupItems.push(item);
- }
- //BUG1
- canvas.discardActiveObject();
- let sel = new fabric.ActiveSelection(groupItems, {
- canvas: canvas,
- });
- canvas.setActiveObject(sel);
- canvas.requestRenderAll();
- canvas.renderAll();
- window.recordState();
-});
-$("#center_x_alignment").click(function () {
- let _objs = canvas.getActiveObjects();
- if (_objs.length == 1) {
- //只选中了一�?
- let idx = getIndex(_objs[0]);
- let type = objs[idx - 1].type;
- let other = 0;//strokeWidth
- if (type == 5 || type == 6 || type == 7) {
- other = _objs[0].get("strokeWidth")
- }
- let obj = _objs[0];
- obj.setCoords();
- let coords = obj.getCoords(true);
- let objMinX = getCoordsMinX(coords);
- let objMaxX = getCoordsMaxX(coords);
- let objCenterX = (objMinX + objMaxX) / 2;
- let bgCoords = background_image.getCoords(true);
- let bgMinX = getCoordsMinX(bgCoords);
- let bgMaxX = getCoordsMaxX(bgCoords);
- let bgCenterX = (bgMinX + bgMaxX) / 2;
- let deltaX = bgCenterX - objCenterX;
- obj.set("left", obj.get("left") + deltaX);
- obj.setCoords();
- canvas.renderAll();
- window.recordState();
- return;
- }
- // 多个对象对齐:找到所有对象边界框的中心X值
- let minLeft = Infinity;
- let maxRight = -Infinity;
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinX = getCoordsMinX(coords);
- let itemMaxX = getCoordsMaxX(coords);
- if (itemMinX < minLeft) minLeft = itemMinX;
- if (itemMaxX > maxRight) maxRight = itemMaxX;
- }
- let groupCenterX = (minLeft + maxRight) / 2;
- // 将所有对象对齐到中心X值
- groupItems = [];
- for (let item of _objs) {
- item.setCoords();
- let coords = item.getCoords(true);
- let itemMinX = getCoordsMinX(coords);
- let itemMaxX = getCoordsMaxX(coords);
- let itemCenterX = (itemMinX + itemMaxX) / 2;
- let deltaX = groupCenterX - itemCenterX;
- item.set("left", item.get("left") + deltaX);
- item.setCoords();
- groupItems.push(item);
- }
- canvas.discardActiveObject();
- let sel = new fabric.ActiveSelection(groupItems, {
- canvas: canvas,
- });
- canvas.setActiveObject(sel);
- canvas.requestRenderAll();
- canvas.renderAll();
- window.recordState();
-});
-$("#up_obj").click(function () {//上移,放到前�?数组中在后面
- let idx = getIndex(canvas.getActiveObject());
- if (idx + 1 != canvas.getObjects().length) {
- canvas.bringForward(canvas.getActiveObject());
- canvas.renderAll();
- let temp = objs[idx - 1];
- objs[idx - 1] = objs[idx];
- objs[idx] = temp;
- //console.log(objs);
-
- window.recordState();
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
- if (typeof window.selectObj === 'function') {
- window.selectObj(idx);
- }
- }
-});
-$("#down_obj").click(function () {//下移,放到后�?数组中在前面
- let idx = getIndex(canvas.getActiveObject());
- if (idx != 1) {
- canvas.sendBackwards(canvas.getActiveObject());
- canvas.renderAll();
- //[objs[idx-2],objs[idx-1]] = [objs[idx-1],objs[idx-2]];
-
- let temp = objs[idx - 1];
- objs[idx - 1] = objs[idx - 2];
- objs[idx - 2] = temp;
- window.recordState();
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
- if (typeof window.selectObj === 'function') {
- window.selectObj(idx - 2);
- }
- }
-});
-$("#set_bg").click(function () {//设置为背�?
- let obj = canvas.getActiveObject();
- console.log(obj, obj.get("selectable"))
- let idx = getIndex(obj);
- const scaleX = 2787 / obj.width
- const scaleY = 2787 / obj.height
- // 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致
- const scaledWidth = obj.width * scaleX;
- const scaledHeight = obj.height * scaleY;
- obj.set({
- scaleX: scaleX,
- scaleY: scaleY,
- left: ($('#canvas1').width() - scaledWidth) / 2,
- top: ($('#canvas1').height() - scaledHeight) / 2,
- });
- $('#text_w').val(2787)
- $('#text_h').val(2787)
- $('#text_x').val(0)
- $('#text_y').val(0)
- if (obj.get("selectable")) {
- obj.set("selectable", false);
- $("#lock_img").attr("src", "public/images/lock20.png")
- }
- canvas.sendToBack(obj);
- canvas.bringForward(obj);
- canvas.renderAll();
- let objItem = objs.splice(idx - 1, 1)[0]
- objs.unshift(objItem)
- window.recordState();
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
- if (typeof window.selectObj === 'function') {
- window.selectObj(0);
- }
-});
-
-// ==========================================
-// onStateRestored 函数在 core.js 中定义并附加到 window 对象
-// ==========================================
-$("#previous").click(function () {
- if (step.val == 0) return;
-
- step.val--;
-
- // 判断当前是正面还是背面
- if ($("#front_side").hasClass("ui-button-active")) {
- // 1. 恢复业务数据
- objs1 = JSON.parse(recordObjs1[step.val]);
- objs = objs1;
-
- // 2. 恢复画布 (使用回调函数)
- canvas.loadFromJSON(recordJson1[step.val], function () {
- if (typeof window.onStateRestored === 'function') {
- window.onStateRestored(); // 图片加载完才执行这一行
- }
- });
- } else {
- // 背面逻辑
- objs2 = JSON.parse(recordObjs2[step.val]);
- objs = objs2;
-
- canvas.loadFromJSON(recordJson2[step.val], function () {
- if (typeof window.onStateRestored === 'function') {
- window.onStateRestored();
- }
- });
- }
-});
-// ==========================================
-$("#next").click(function () {
- // 获取当前历史记录的最大长度
- let maxLen = $("#front_side").hasClass("ui-button-active") ? recordObjs1.length : recordObjs2.length;
-
- if (step.val >= maxLen - 1) return;
-
- step.val++;
-
- if ($("#front_side").hasClass("ui-button-active")) {
- objs1 = JSON.parse(recordObjs1[step.val]);
- objs = objs1;
-
- canvas.loadFromJSON(recordJson1[step.val], function () {
- if (typeof window.onStateRestored === 'function') {
- window.onStateRestored(); // 图片加载完才执行这一行
- }
- });
- } else {
- objs2 = JSON.parse(recordObjs2[step.val]);
- objs = objs2;
-
- canvas.loadFromJSON(recordJson2[step.val], function () {
- if (typeof window.onStateRestored === 'function') {
- window.onStateRestored();
- }
- });
- }
-});
-
-$("#clean").click(function () {
- objs.splice(0, objs.length);
-
- let allObjs = canvas.getObjects();
- for (let item of allObjs) {
- if (item != allObjs[0]) {
- canvas.remove(item);
- }
- }
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
- window.recordState();
-});
-$("#rotate").click(function () {
- let obj = canvas.getActiveObject();
- obj.rotate(Math.round((obj.get("angle") + 90) % 360));
- $("#text_r").val(obj.get("angle"));
- canvas.renderAll();
- updateControls();
- window.recordState();
-});
-$('#vertical_obj').click(function () {
- let obj = canvas.getActiveObject();
- obj.set("flipY", !obj.get("flipY"));
- canvas.renderAll();
- updateControls();
- window.recordState();
-});
-$('#align_obj').click(function () {
- let obj = canvas.getActiveObject();
- obj.set("flipX", !obj.get("flipX"));
- canvas.renderAll();
- updateControls();
- window.recordState();
-});
-$("#text_italics").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?
- canvas.getActiveObject().set("fontStyle", "normal")
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("fontStyle", "italic")
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#text_bold").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?恢复正常
- canvas.getActiveObject().set("fontWeight", "normal")
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("fontWeight", "bold")
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#text_underline").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?
- canvas.getActiveObject().set("underline", false)
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("underline", true)
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#text_linethrough").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?
- canvas.getActiveObject().set("linethrough", false)
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("linethrough", true)
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-
-$("#circle_text_italics").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?
- canvas.getActiveObject().set("fontStyle", "normal")
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("fontStyle", "italic")
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#circle_text_bold").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?恢复正常
- canvas.getActiveObject().set("fontWeight", "normal")
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("fontWeight", "bold")
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-
-$('#out_left_alignment').click(function () {
- $('#out_left_alignment').parent().removeClass('tool1')
- $('#out_right_alignment').parent().removeClass('tool1')
- $('#out_center_alignment').parent().removeClass('tool1')
- setTimeout(() => {
- $('#out_left_alignment').parent().addClass('tool1')
- });
- canvas.getActiveObject().set('textAlign', 'left')
- let idx = getIndex(canvas.getActiveObject())
- objs[idx - 1].align = 'left'
- window.recordState();
- canvas.renderAll();
-})
-$('#out_right_alignment').click(function () {
- $('#out_left_alignment').parent().removeClass('tool1')
- $('#out_right_alignment').parent().removeClass('tool1')
- $('#out_center_alignment').parent().removeClass('tool1')
- setTimeout(() => {
- $('#out_right_alignment').parent().addClass('tool1')
- });
- canvas.getActiveObject().set('textAlign', 'right')
- let idx = getIndex(canvas.getActiveObject())
- objs[idx - 1].align = 'right'
- window.recordState();
- canvas.renderAll();
-})
-$('#out_center_alignment').click(function () {
- $('#out_left_alignment').parent().removeClass('tool1')
- $('#out_right_alignment').parent().removeClass('tool1')
- $('#out_center_alignment').parent().removeClass('tool1')
- setTimeout(() => {
- $('#out_center_alignment').parent().addClass('tool1')
- });
- canvas.getActiveObject().set('textAlign', 'center')
- let idx = getIndex(canvas.getActiveObject())
- objs[idx - 1].align = 'center'
- window.recordState();
- canvas.renderAll();
-})
-
-$("#out_text_italics").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?
- canvas.getActiveObject().set("fontStyle", "normal")
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("fontStyle", "italic")
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#out_text_bold").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?恢复正常
- canvas.getActiveObject().set("fontWeight", "normal")
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("fontWeight", "bold")
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#out_text_underline").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?
- canvas.getActiveObject().set("underline", false)
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("underline", true)
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#out_text_linethrough").click(function () {
- if ($(this).hasClass("ui-radio-acitve")) {
- //已�?
- canvas.getActiveObject().set("linethrough", false)
- $(this).removeClass("ui-radio-acitve")
- } else {
- //未�?
- canvas.getActiveObject().set("linethrough", true)
- $(this).addClass("ui-radio-acitve")
- }
- window.recordState();
- canvas.renderAll();
- window.recordState();
-});
-$("#lock").off('click').on('click', function (e) {
- e.stopPropagation();
- if (!canvas.getActiveObject()) return;
- let obj = canvas.getActiveObject();
- // 检查是否已锁定(通过lockMovementX判断,因为锁定时会设置所有lock属性)
- let isLocked = obj.get("lockMovementX") === true;
- let shouldLock = !isLocked;
-
- // 锁定/解锁所有编辑操作,锁定后不可选中
- obj.set({
- lockMovementX: shouldLock,
- lockMovementY: shouldLock,
- lockRotation: shouldLock,
- lockScalingX: shouldLock,
- lockScalingY: shouldLock,
- lockSkewingX: shouldLock,
- lockSkewingY: shouldLock,
- // 锁定时不可选中,解锁时可选中
- selectable: !shouldLock,
- evented: !shouldLock
- });
- if (shouldLock) {
- $("#lock_img").attr("src", "public/images/lock20.png")//已锁定//已经上锁,需要解�?
- // 锁定后取消选中
- canvas.discardActiveObject();
- } else {
- $("#lock_img").attr("src", "public/images/unlock20.png")//已解锁
- }
- updateControls();
- window.recordState();
- // 更新对象列表以同步锁状态
- if (typeof window.updateList === 'function') {
- window.updateList();
- }
- canvas.renderAll();
- window.recordState();
-});
-$("#text_back_transparent").click(function () {
- canvas.getActiveObject().set("textBackgroundColor", "");
- $("#text_back_color").val("#ffffff");
- canvas.renderAll();
- window.recordState();
-});
-$("#circle_text_back_transparent").click(function () {
- canvas.getActiveObject().set("textBackgroundColor", "");
- $("#circle_text_back_color").val("#ffffff");
- canvas.renderAll();
- window.recordState();
-});
-$("#out_text_back_transparent").click(function () {
- canvas.getActiveObject().set("textBackgroundColor", "");
- $("#out_text_back_color").val("#ffffff");
- canvas.renderAll();
- window.recordState();
-});
-$("#rect_transparent").click(function () {
- canvas.getActiveObject().set("fill", "");
- $("#rect_color").val("#ffffff");
- canvas.renderAll();
- window.recordState();
-});
-$("#rect_stroke_transparent").click(function () {
- canvas.getActiveObject().set("stroke", "");
- $("#rect_stroke").val("#ffffff");
- canvas.renderAll();
- window.recordState();
-});
-$("#circle_transparent").click(function () {
- canvas.getActiveObject().set("fill", "");
- $("#circle_color").val("#ffffff");
- canvas.renderAll();
- window.recordState();
-});
-$("#circle_stroke_transparent").click(function () {
- canvas.getActiveObject().set("stroke", "");
- $("#circle_stroke").val("#ffffff");
- canvas.renderAll();
- window.recordState();
-});
-
-// saveAs 函数保留,因为它被作为回调传递给 output 函数(第52行)
-function saveAs(op1, callback) {
- let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
- let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
-
- // 清理不需要的 src 字段(使用 window.cleanupSrcFields,在 output.js 中定义)
- if (typeof window.cleanupSrcFields === 'function') {
- window.cleanupSrcFields(j.objects, objs1);
- window.cleanupSrcFields(b.objects, objs2);
- }
-
- let o = { f: j, b: {}, fo: objs1, bo: objs2 };
- let con_o = Object.assign(o, op1);
- dialog.showSaveDialog({
- title: language_str("saveFile"),//'保存文件'
- filters: [
- { name: 'Soon File Type', extensions: ['soon'] },
- ]
- }).then(result => {
- if (result.filePath == "") { return; }
- if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) {
- result.filePath += '.soon';
- }
- let fs = require('fs')
- con_o.soonType = 1
- fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8')
- openAs.name = result.filePath;
- layer.msg(language_str("saveSucc") + openAs.name);//'保存成功�?
- if (typeof window.saveHistory === 'function') {
- window.saveHistory();
- }
- if (callback && typeof callback === 'function') {
- callback();
- }
- }).catch(err => {
- console.log()
- })
-}
-// save 函数已在 output.js 中定义
-$("#copy").click(function () {
- window.copySelection();
-})
-// 粘贴
-$("#paste").click(function () {
- window.pasteFromClipboard();
-})
-
-// 保存 (保持你原有的保存逻辑不变)
-$("#save").click(function () {
- if (typeof window.output === 'function') {
- window.output(); // 这里调用你的 output 函数
- }
- return;
- // ... (下面是你原有的被 return 截断的代码,建议以后清理掉,但这里我按要求保�?
- let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
- // ... (省略你原来那段很长的保存代码) ...
-});
-
-function getDate() {
- let date = new Date();
- return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
-}
-function getAbsoluteXY(_obj) {
- let coord = _obj.get("lineCoords");
- return [_obj.get("left"), _obj.get("top")]
-}
-// fullPath 和 saveHistory 已在 output.js 中定义
-$("#open").click(function () {
- if (step.val == 0) {
- OpenDialog();
- return;
- }
- layer.confirm('
' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�?
- if (typeof window.output === 'function') {
- window.output(OpenDialog);
- }
- layer.close(index);
-
- }, function (index) {
- OpenDialog();
- });
- function OpenDialog() {
- dialog.showOpenDialog({
- title: "请选择文件",
- buttonLabel: language_str("comf"),
- filters: [
- { name: 'Soon File Type', extensions: ['soon'] },
- ]
- }).then(result => {
- if (result.canceled) return;
- let filePath = result.filePaths[0];
- let fs = require('fs');
- let fsData = fs.readFileSync(filePath);
- let j = JSON.parse(fsData.toString());
- let type = j.soonType ? j.soonType : j.backBlackPic ? 2 : 1;
-
- if (type == 2) {
- ipcRenderer.send('open-design-page', filePath, type);
- return;
- }
-
- // 调用 output.js 中的 openFile 函数
- if (typeof window.openFile === 'function') {
- window.openFile(filePath);
- } else {
- console.error('openFile 函数未定义!');
- }
- }).catch(err => {
- console.log(err)
- })
- }
-});
- //let blank = "{\"f\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":2787,\"height\":2787,\"fill\":\"#000000\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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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进行另存为
- }
-});
+// 移至上层和移至下层的事件处理在下方(第 2179 行),避免重复绑定
+
+var _keyctrl = false,
+ _keyc = false,
+ _textEdit = false,
+ _inputEdit = false;
+$('input').focus(function () {
+ _inputEdit = true;
+});
+$('input').blur(function () {
+ _inputEdit = false;
+});
+$('textarea').focus(function () {
+ _inputEdit = true;
+});
+$('textarea').blur(function () {
+ _inputEdit = false;
+});
+$("body").keyup(function (event) {
+ // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�?
+ if (event.keyCode == 17 || event.keyCode == 91 || event.keyCode == 93) { // Ctrl 键或 Meta 键(Mac Cmd)释�?
+ _keyctrl = false;
+ };
+ if (event.keyCode == 67) {
+ _keyc = false;
+ };
+})
+$("body").keydown(function (event) {
+ // 统一的快捷键处理(兼�?Windows/Linux: Ctrl, Mac: Cmd/Meta�?
+ const isModifierKey = event.ctrlKey || event.metaKey; // 兼容三端
+
+ // 快捷键处理(在输入框或文本区域中时不触发,除了删除相关的�?
+ if (!_inputEdit && !_textEdit) {
+ // CTRL/CMD+N - 新建
+ if (isModifierKey && event.keyCode == 78) {
+ event.preventDefault();
+ $("#new").click();
+ return;
+ }
+ // CTRL/CMD+O - 打开
+ if (isModifierKey && event.keyCode == 79) {
+ event.preventDefault();
+ $("#open").click();
+ return;
+ }
+ // CTRL/CMD+S - 保存
+ if (isModifierKey && !event.shiftKey && event.keyCode == 83) {
+ event.preventDefault();
+ $("#save").click();
+ return;
+ }
+ // CTRL/CMD+SHIFT+S - 保存副本
+ if (isModifierKey && event.shiftKey && event.keyCode == 83) {
+ event.preventDefault();
+ if (typeof window.output === 'function') {
+ window.output(null, saveAs);
+ }
+ return;
+ }
+ // CTRL/CMD+Z - 还原
+ if (isModifierKey && !event.shiftKey && event.keyCode == 90) {
+ event.preventDefault();
+ $("#previous").click();
+ return;
+ }
+ // CTRL/CMD+Y - 重做
+ if (isModifierKey && !event.shiftKey && event.keyCode == 89) {
+ event.preventDefault();
+ $("#next").click();
+ return;
+ }
+ // CTRL/CMD+C - 复制
+ if (isModifierKey && event.keyCode == 67 && event.target.nodeName == 'BODY') {
+ event.preventDefault();
+ window.copySelection();
+ return;
+ }
+ // CTRL/CMD+V - 粘贴
+ if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') {
+ event.preventDefault();
+ window.pasteFromClipboard();
+ return;
+ }
+
+ // CTRL/CMD + SHIFT + DEL (Windows) �?CMD + SHIFT + Backspace (Mac) - 清空
+ if (isModifierKey && event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
+ event.preventDefault();
+ $("#clean").click();
+ return;
+ }
+
+ // CTRL/CMD + DEL (Windows) �?CMD + Backspace (Mac) - 删除
+ if (isModifierKey && !event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
+ event.preventDefault();
+ $("#delete").click();
+ return;
+ }
+
+ }
+ // 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�?
+ if (event.keyCode == 17 || event.metaKey) { // Ctrl 键或 Meta 键(Mac Cmd�?
+ _keyctrl = true;
+ if (_keyc && _textEdit) {
+ //同时按下且在编辑状�?
+ setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1)
+ //clipboard.writeText((clipboard.readText()+' '))
+ }
+ }
+ if (event.keyCode == 67) {
+ _keyc = true;
+ if (_keyctrl & _textEdit) {
+ //同时按下且在编辑状�?
+ setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1)
+ //clipboard.writeText((clipboard.readText()+' '))
+ }
+ }
+ if (event.keyCode == 37) {
+ //left
+ let v = -1;
+ if (_keyctrl || event.ctrlKey || event.metaKey) {
+ v = -5;
+ }
+ const currentCanvas = window.canvas || canvas;
+ if (currentCanvas && currentCanvas.getActiveObject()) {
+ let x = currentCanvas.getActiveObject().get('left');
+ x += v;
+ currentCanvas.getActiveObject().set('left', x);
+ currentCanvas.renderAll();
+ if (typeof window.recordState === 'function') {
+ window.recordState();
+ } else if (typeof recordState === 'function') {
+ recordState();
+ }
+ if (typeof updateControls === 'function') {
+ updateControls();
+ }
+ }
+ }
+ if (event.keyCode == 38) {
+ //up
+ let v = -1;
+ if (_keyctrl || event.ctrlKey || event.metaKey) {
+ v = -5;
+ }
+ const currentCanvas = window.canvas || canvas;
+ if (currentCanvas && currentCanvas.getActiveObject()) {
+ let y = currentCanvas.getActiveObject().get('top');
+ y += v;
+ currentCanvas.getActiveObject().set('top', y);
+ currentCanvas.renderAll();
+ if (typeof window.recordState === 'function') {
+ window.recordState();
+ } else if (typeof recordState === 'function') {
+ recordState();
+ }
+ if (typeof updateControls === 'function') {
+ updateControls();
+ }
+ }
+ }
+ if (event.keyCode == 39) {
+ //right
+ let v = 1;
+ if (_keyctrl || event.ctrlKey || event.metaKey) {
+ v = 5;
+ }
+ const currentCanvas = window.canvas || canvas;
+ if (currentCanvas && currentCanvas.getActiveObject()) {
+ let x = currentCanvas.getActiveObject().get('left');
+ x += v;
+ currentCanvas.getActiveObject().set('left', x);
+ currentCanvas.renderAll();
+ if (typeof window.recordState === 'function') {
+ window.recordState();
+ } else if (typeof recordState === 'function') {
+ recordState();
+ }
+ if (typeof updateControls === 'function') {
+ updateControls();
+ }
+ }
+ }
+ if (event.keyCode == 40) {
+ //down
+ let v = 1;
+ if (_keyctrl || event.ctrlKey || event.metaKey) {
+ v = 5;
+ }
+ const currentCanvas = window.canvas || canvas;
+ if (currentCanvas && currentCanvas.getActiveObject()) {
+ let y = currentCanvas.getActiveObject().get('top');
+ y += v;
+ currentCanvas.getActiveObject().set('top', y);
+ currentCanvas.renderAll();
+ if (typeof window.recordState === 'function') {
+ window.recordState();
+ } else if (typeof recordState === 'function') {
+ recordState();
+ }
+ if (typeof updateControls === 'function') {
+ updateControls();
+ }
+ }
+ }
+ // 普通删除键(DEL键,没有按CTRL/CMD�?
+ if (event.keyCode == 46 && !isModifierKey && !_inputEdit && !_textEdit) {
+ // 使用 window.canvas 作为后备,确保在 eval() 加载 .jsc 时也能访问
+ const currentCanvas = window.canvas || canvas;
+ const currentObjs = window.objs || objs;
+ if (!currentCanvas) {
+ return;
+ }
+ let actObjs = currentCanvas.getActiveObjects();
+ let allObjs = currentCanvas.getObjects();
+ let flag = 0;
+ for (let item of actObjs) {
+ if (item != allObjs[0]) {
+ let i = getIndex(item, currentCanvas);//0是背景,所以从1开始,但objs不包含背景图片,故要-1
+ currentObjs.splice(i - 1, 1);
+ currentCanvas.remove(item);
+ flag = 1;
+
+ }
+ }
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ currentCanvas.discardActiveObject();
+ if (flag == 1) {
+ if (typeof window.recordState === 'function') {
+ window.recordState();
+ } else if (typeof recordState === 'function') {
+ recordState();
+ }
+ currentCanvas.renderAll();
+ if (typeof window.handleObjectSelected === 'function') {
+ window.handleObjectSelected();
+ }
+ }
+ }
+});
+// pre_add_image 已在 design1.js 中定义为全局变量
+$("#addPic").click(function () {
+ OpenDialog();
+ function OpenDialog() {
+ dialog.showOpenDialog({
+ title: language_str("selectPic"),//请选择图片
+ buttonLabel: language_str("comf"),//"确认"
+ filters: [
+ { name: 'Image File Type', extensions: ['png', 'jpg', 'jpeg'] },
+ ]
+ }).then(result => {
+ if (result.canceled) return;
+ //console.log(result.filePaths)
+ fabric.Image.fromURL(result.filePaths[0], function (image) {
+ //image.left = pointer.x;
+ image.setSrc(image.toDataURL(), function (image) {
+ pre_add_image = image;
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 1;
+ });
+ //canvas.add(image);
+ });
+ }).catch(err => {
+ })
+ }
+});
+$("#addOutPic").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 2;
+});
+$("#addText").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 3;
+});
+
+$("#addCircleText").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 11;
+});
+$("#addOutText").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 4;
+});
+$("#addRect").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 5;
+});
+$("#addCircle").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 6;
+});
+$("#addLine").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 7;
+});
+$("#addQrCode").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 8;
+});
+$("#addBarCode").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addCounter").css("background-color", "");
+ addState = 9;
+});
+$("#addCounter").click(function () {
+ background_image.hoverCursor = "crosshair";
+ $(this).css("background-color", "#646E76");
+
+ $("#addPic").css("background-color", "");
+ $("#addOutPic").css("background-color", "");
+ $("#addText").css("background-color", "");
+ $("#addCircleText").css("background-color", "");
+ $("#addOutText").css("background-color", "");
+ $("#addRect").css("background-color", "");
+ $("#addCircle").css("background-color", "");
+ $("#addLine").css("background-color", "");
+ $("#addQrCode").css("background-color", "");
+ $("#addBarCode").css("background-color", "");
+ addState = 10;
+});
+$("#version_change").click(function () {
+ if (bg_version == 1) {
+ bg_version = 2;
+ } else {
+ bg_version = 1;
+ }
+ // 类型改变
+ $("#source_front").attr("src", "./public/images/front_bg" + bg_version + "_1.png");
+ canvas.renderAll();
+
+});
+$("#front_side").click(function () {
+ $(this).addClass("ui-button-active");
+ $("#back_side").removeClass("ui-button-active");
+ $(".canvas-container:eq(0)").show();
+ $(".canvas-container:eq(1)").hide();
+ canvas = canvas1;
+ objs = objs1;
+ background_image = background_image1;
+ window.canvas = canvas;
+ window.objs = objs;
+ window.background_image = background_image;
+ next_objs = next_objs1;
+ pre_objs = pre_objs1;
+ next_json = next_json1;
+ pre_json = pre_json1;
+ recordObjs = recordObjs1;
+ recordJson = recordJson1;
+ step = step1;
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+
+ $("#line_control").hide();
+ $("#base_control").hide();
+ $("#pic_control").hide();
+ $("#out_pic_control").hide();
+ $("#text_control").hide();
+ $("#circle_text_control").hide();
+ $("#out_text_control").hide();
+ $("#rect_control").hide();
+ $("#circle_control").hide();
+ $("#counter_control").hide();
+ $("#qrcode_Controll").hide();
+ $("#barcode_controll").hide();
+ $("#component_type").text(language_str("bg"));//背景
+});
+$("#back_side").click(function () {
+ $(this).addClass("ui-button-active");
+ $("#front_side").removeClass("ui-button-active");
+ $(".canvas-container:eq(0)").hide();
+ $(".canvas-container:eq(1)").show();
+ canvas = canvas2;
+ objs = objs2;
+ background_image = background_image2;
+ window.canvas = canvas;
+ window.objs = objs;
+ window.background_image = background_image;
+ next_objs = next_objs2;
+ pre_objs = pre_objs2;
+ next_json = next_json2;
+ pre_json = pre_json2;
+ recordObjs = recordObjs2;
+ recordJson = recordJson2;
+ step = step2;
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ $("#line_control").hide();
+ $("#base_control").hide();
+ $("#pic_control").hide();
+ $("#out_pic_control").hide();
+ $("#text_control").hide();
+ $("#circle_text_control").hide();
+ $("#out_text_control").hide();
+ $("#rect_control").hide();
+ $("#circle_control").hide();
+ $("#counter_control").hide();
+ $("#qrcode_Controll").hide();
+ $("#barcode_controll").hide();
+ $("#component_type").text(language_str("bg"));//"背景"
+});
+$("#top_alignment").click(function () {
+ let _objs = canvas.getActiveObjects();
+ if (_objs.length == 1) {
+ //只选中了一�?
+ let obj = _objs[0];
+ obj.setCoords();
+ let coords = obj.getCoords(true);
+ let objMinY = getCoordsMinY(coords);
+ let bgMinY = getCoordsMinY(background_image.getCoords(true));
+ let deltaY = bgMinY - objMinY;
+ obj.set("top", obj.get("top") + deltaY);
+ obj.setCoords();
+ canvas.renderAll();
+ window.recordState();
+ return;
+ }
+ // 多个对象对齐:找到所有对象边界框的最小Y值
+ let minTop = Infinity;
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinY = getCoordsMinY(coords);
+ if (itemMinY < minTop) {
+ minTop = itemMinY;
+ }
+ }
+ // 将所有对象对齐到最小Y值
+ groupItems = [];
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinY = getCoordsMinY(coords);
+ let deltaY = minTop - itemMinY;
+ item.set("top", item.get("top") + deltaY);
+ item.setCoords();
+ groupItems.push(item);
+ }
+ canvas.discardActiveObject();
+ let sel = new fabric.ActiveSelection(groupItems, {
+ canvas: canvas,
+ });
+ canvas.setActiveObject(sel);
+ canvas.requestRenderAll();
+ canvas.renderAll();
+
+});
+$("#bottom_alignment").click(function () {
+ let _objs = canvas.getActiveObjects();
+ if (_objs.length == 1) {
+ //只选中了一�?
+ let idx = getIndex(_objs[0]);
+ let type = objs[idx - 1].type;
+ let other = 0;//strokeWidth
+ if (type == 5 || type == 6 || type == 7) {
+ other = _objs[0].get("strokeWidth")
+ }
+ let obj = _objs[0];
+ obj.setCoords();
+ let coords = obj.getCoords(true);
+ let objMaxY = getCoordsMaxY(coords);
+ let bgMaxY = getCoordsMaxY(background_image.getCoords(true));
+ let deltaY = bgMaxY - objMaxY;
+ obj.set("top", obj.get("top") + deltaY);
+ obj.setCoords();
+ canvas.renderAll();
+ window.recordState();
+ return;
+ }
+ // 多个对象对齐:找到所有对象边界框的最大Y值
+ let maxBottom = -Infinity;
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMaxY = getCoordsMaxY(coords);
+ if (itemMaxY > maxBottom) {
+ maxBottom = itemMaxY;
+ }
+ }
+ // 将所有对象对齐到最大Y值
+ groupItems = [];
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMaxY = getCoordsMaxY(coords);
+ let deltaY = maxBottom - itemMaxY;
+ item.set("top", item.get("top") + deltaY);
+ item.setCoords();
+ groupItems.push(item);
+ }
+ canvas.discardActiveObject();
+ let sel = new fabric.ActiveSelection(groupItems, {
+ canvas: canvas,
+ });
+ canvas.setActiveObject(sel);
+ canvas.requestRenderAll();
+ canvas.renderAll();
+
+});
+$("#center_y_alignment").click(function () {
+ let _objs = canvas.getActiveObjects();
+ if (_objs.length == 1) {
+ //只选中了一�?
+ let idx = getIndex(_objs[0]);
+ let type = objs[idx - 1].type;
+ let other = 0;//strokeWidth
+ if (type == 5 || type == 6 || type == 7) {
+ other = _objs[0].get("strokeWidth")
+ }
+ let obj = _objs[0];
+ obj.setCoords();
+ let coords = obj.getCoords(true);
+ let objMinY = getCoordsMinY(coords);
+ let objMaxY = getCoordsMaxY(coords);
+ let objCenterY = (objMinY + objMaxY) / 2;
+ let bgCoords = background_image.getCoords(true);
+ let bgMinY = getCoordsMinY(bgCoords);
+ let bgMaxY = getCoordsMaxY(bgCoords);
+ let bgCenterY = (bgMinY + bgMaxY) / 2;
+ let deltaY = bgCenterY - objCenterY;
+ obj.set("top", obj.get("top") + deltaY);
+ obj.setCoords();
+ canvas.renderAll();
+ window.recordState();
+ return;
+ }
+ // 多个对象对齐:找到所有对象边界框的中心Y值
+ let minTop = Infinity;
+ let maxBottom = -Infinity;
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinY = getCoordsMinY(coords);
+ let itemMaxY = getCoordsMaxY(coords);
+ if (itemMinY < minTop) minTop = itemMinY;
+ if (itemMaxY > maxBottom) maxBottom = itemMaxY;
+ }
+ let groupCenterY = (minTop + maxBottom) / 2;
+ // 将所有对象对齐到中心Y值
+ groupItems = [];
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinY = getCoordsMinY(coords);
+ let itemMaxY = getCoordsMaxY(coords);
+ let itemCenterY = (itemMinY + itemMaxY) / 2;
+ let deltaY = groupCenterY - itemCenterY;
+ item.set("top", item.get("top") + deltaY);
+ item.setCoords();
+ groupItems.push(item);
+ }
+ canvas.discardActiveObject();
+ let sel = new fabric.ActiveSelection(groupItems, {
+ canvas: canvas,
+ });
+ canvas.setActiveObject(sel);
+ canvas.requestRenderAll();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#left_alignment").click(function () {
+ let _objs = canvas.getActiveObjects();
+ if (_objs.length == 1) {
+ //只选中了一�?
+ let obj = _objs[0];
+ obj.setCoords();
+ let coords = obj.getCoords(true);
+ let objMinX = getCoordsMinX(coords);
+ let bgMinX = getCoordsMinX(background_image.getCoords(true));
+ let deltaX = bgMinX - objMinX;
+ obj.set("left", obj.get("left") + deltaX);
+ obj.setCoords();
+ canvas.renderAll();
+ window.recordState();
+ return;
+ }
+ // 多个对象对齐:找到所有对象边界框的最小X值
+ let minLeft = Infinity;
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinX = getCoordsMinX(coords);
+ if (itemMinX < minLeft) {
+ minLeft = itemMinX;
+ }
+ }
+ // 将所有对象对齐到最小X值
+ groupItems = [];
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinX = getCoordsMinX(coords);
+ let deltaX = minLeft - itemMinX;
+ item.set("left", item.get("left") + deltaX);
+ item.setCoords();
+ groupItems.push(item);
+ }
+ canvas.discardActiveObject();
+ let sel = new fabric.ActiveSelection(groupItems, {
+ canvas: canvas,
+ });
+ canvas.setActiveObject(sel);
+ canvas.requestRenderAll();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#right_alignment").click(function () {
+ let _objs = canvas.getActiveObjects();
+ if (_objs.length == 1) {
+ //只选中了一�?
+ let idx = getIndex(_objs[0]);
+ let type = objs[idx - 1].type;
+ let other = 0;//strokeWidth
+ if (type == 5 || type == 6 || type == 7) {
+ other = item.get("strokeWidth")
+ }
+ let obj = _objs[0];
+ obj.setCoords();
+ let coords = obj.getCoords(true);
+ let objMaxX = getCoordsMaxX(coords);
+ let bgMaxX = getCoordsMaxX(background_image.getCoords(true));
+ let deltaX = bgMaxX - objMaxX;
+ obj.set("left", obj.get("left") + deltaX);
+ obj.setCoords();
+ canvas.renderAll();
+ window.recordState();
+ return;
+ }
+ // 多个对象对齐:找到所有对象边界框的最大X值
+ let maxRight = -Infinity;
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMaxX = getCoordsMaxX(coords);
+ if (itemMaxX > maxRight) {
+ maxRight = itemMaxX;
+ }
+ }
+ // 将所有对象对齐到最大X值
+ let groupItems = [];
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMaxX = getCoordsMaxX(coords);
+ let deltaX = maxRight - itemMaxX;
+ item.set("left", item.get("left") + deltaX);
+ item.setCoords();
+ groupItems.push(item);
+ }
+ //BUG1
+ canvas.discardActiveObject();
+ let sel = new fabric.ActiveSelection(groupItems, {
+ canvas: canvas,
+ });
+ canvas.setActiveObject(sel);
+ canvas.requestRenderAll();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#center_x_alignment").click(function () {
+ let _objs = canvas.getActiveObjects();
+ if (_objs.length == 1) {
+ //只选中了一�?
+ let idx = getIndex(_objs[0]);
+ let type = objs[idx - 1].type;
+ let other = 0;//strokeWidth
+ if (type == 5 || type == 6 || type == 7) {
+ other = _objs[0].get("strokeWidth")
+ }
+ let obj = _objs[0];
+ obj.setCoords();
+ let coords = obj.getCoords(true);
+ let objMinX = getCoordsMinX(coords);
+ let objMaxX = getCoordsMaxX(coords);
+ let objCenterX = (objMinX + objMaxX) / 2;
+ let bgCoords = background_image.getCoords(true);
+ let bgMinX = getCoordsMinX(bgCoords);
+ let bgMaxX = getCoordsMaxX(bgCoords);
+ let bgCenterX = (bgMinX + bgMaxX) / 2;
+ let deltaX = bgCenterX - objCenterX;
+ obj.set("left", obj.get("left") + deltaX);
+ obj.setCoords();
+ canvas.renderAll();
+ window.recordState();
+ return;
+ }
+ // 多个对象对齐:找到所有对象边界框的中心X值
+ let minLeft = Infinity;
+ let maxRight = -Infinity;
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinX = getCoordsMinX(coords);
+ let itemMaxX = getCoordsMaxX(coords);
+ if (itemMinX < minLeft) minLeft = itemMinX;
+ if (itemMaxX > maxRight) maxRight = itemMaxX;
+ }
+ let groupCenterX = (minLeft + maxRight) / 2;
+ // 将所有对象对齐到中心X值
+ groupItems = [];
+ for (let item of _objs) {
+ item.setCoords();
+ let coords = item.getCoords(true);
+ let itemMinX = getCoordsMinX(coords);
+ let itemMaxX = getCoordsMaxX(coords);
+ let itemCenterX = (itemMinX + itemMaxX) / 2;
+ let deltaX = groupCenterX - itemCenterX;
+ item.set("left", item.get("left") + deltaX);
+ item.setCoords();
+ groupItems.push(item);
+ }
+ canvas.discardActiveObject();
+ let sel = new fabric.ActiveSelection(groupItems, {
+ canvas: canvas,
+ });
+ canvas.setActiveObject(sel);
+ canvas.requestRenderAll();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#up_obj").click(function () {//上移,放到前�?数组中在后面
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx + 1 != canvas.getObjects().length) {
+ canvas.bringForward(canvas.getActiveObject());
+ canvas.renderAll();
+ let temp = objs[idx - 1];
+ objs[idx - 1] = objs[idx];
+ objs[idx] = temp;
+ //console.log(objs);
+
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(idx);
+ }
+ }
+});
+$("#down_obj").click(function () {//下移,放到后�?数组中在前面
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx != 1) {
+ canvas.sendBackwards(canvas.getActiveObject());
+ canvas.renderAll();
+ //[objs[idx-2],objs[idx-1]] = [objs[idx-1],objs[idx-2]];
+
+ let temp = objs[idx - 1];
+ objs[idx - 1] = objs[idx - 2];
+ objs[idx - 2] = temp;
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(idx - 2);
+ }
+ }
+});
+$("#set_bg").click(function () {//设置为背�?
+ let obj = canvas.getActiveObject();
+ let idx = getIndex(obj);
+ const scaleX = 2787 / obj.width
+ const scaleY = 2787 / obj.height
+ // 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致
+ const scaledWidth = obj.width * scaleX;
+ const scaledHeight = obj.height * scaleY;
+ obj.set({
+ scaleX: scaleX,
+ scaleY: scaleY,
+ left: ($('#canvas1').width() - scaledWidth) / 2,
+ top: ($('#canvas1').height() - scaledHeight) / 2,
+ });
+ $('#text_w').val(2787)
+ $('#text_h').val(2787)
+ $('#text_x').val(0)
+ $('#text_y').val(0)
+ if (obj.get("selectable")) {
+ obj.set("selectable", false);
+ $("#lock_img").attr("src", "public/images/lock20.png")
+ }
+ canvas.sendToBack(obj);
+ canvas.bringForward(obj);
+ canvas.renderAll();
+ let objItem = objs.splice(idx - 1, 1)[0]
+ objs.unshift(objItem)
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(0);
+ }
+});
+
+// ==========================================
+// onStateRestored 函数在 core.js 中定义并附加到 window 对象
+// ==========================================
+$("#previous").click(function () {
+ if (step.val == 0) return;
+
+ step.val--;
+
+ // 判断当前是正面还是背面
+ if ($("#front_side").hasClass("ui-button-active")) {
+ // 1. 恢复业务数据
+ objs1 = JSON.parse(recordObjs1[step.val]);
+ objs = objs1;
+
+ // 2. 恢复画布 (使用回调函数)
+ canvas.loadFromJSON(recordJson1[step.val], function () {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas);
+ }
+ if (typeof window.onStateRestored === 'function') {
+ window.onStateRestored(); // 图片加载完才执行这一行
+ }
+ });
+ } else {
+ // 背面逻辑
+ objs2 = JSON.parse(recordObjs2[step.val]);
+ objs = objs2;
+
+ canvas.loadFromJSON(recordJson2[step.val], function () {
+ if (typeof window.onStateRestored === 'function') {
+ window.onStateRestored();
+ }
+ });
+ }
+});
+// ==========================================
+$("#next").click(function () {
+ // 获取当前历史记录的最大长度
+ let maxLen = $("#front_side").hasClass("ui-button-active") ? recordObjs1.length : recordObjs2.length;
+
+ if (step.val >= maxLen - 1) return;
+
+ step.val++;
+
+ if ($("#front_side").hasClass("ui-button-active")) {
+ objs1 = JSON.parse(recordObjs1[step.val]);
+ objs = objs1;
+
+ canvas.loadFromJSON(recordJson1[step.val], function () {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas);
+ }
+ if (typeof window.onStateRestored === 'function') {
+ window.onStateRestored(); // 图片加载完才执行这一行
+ }
+ });
+ } else {
+ objs2 = JSON.parse(recordObjs2[step.val]);
+ objs = objs2;
+
+ canvas.loadFromJSON(recordJson2[step.val], function () {
+ if (typeof window.onStateRestored === 'function') {
+ window.onStateRestored();
+ }
+ });
+ }
+});
+
+$("#clean").click(function () {
+ objs.splice(0, objs.length);
+
+ let allObjs = canvas.getObjects();
+ for (let item of allObjs) {
+ if (item != allObjs[0]) {
+ canvas.remove(item);
+ }
+ }
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+});
+$("#rotate").click(function () {
+ let obj = canvas.getActiveObject();
+ obj.rotate(Math.round((obj.get("angle") + 90) % 360));
+ $("#text_r").val(obj.get("angle"));
+ canvas.renderAll();
+ updateControls();
+ window.recordState();
+});
+$('#vertical_obj').click(function () {
+ let obj = canvas.getActiveObject();
+ obj.set("flipY", !obj.get("flipY"));
+ canvas.renderAll();
+ updateControls();
+ window.recordState();
+});
+$('#align_obj').click(function () {
+ let obj = canvas.getActiveObject();
+ obj.set("flipX", !obj.get("flipX"));
+ canvas.renderAll();
+ updateControls();
+ window.recordState();
+});
+$("#text_italics").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?
+ canvas.getActiveObject().set("fontStyle", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("fontStyle", "italic")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#text_bold").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?恢复正常
+ canvas.getActiveObject().set("fontWeight", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("fontWeight", "bold")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#text_underline").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?
+ canvas.getActiveObject().set("underline", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("underline", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#text_linethrough").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?
+ canvas.getActiveObject().set("linethrough", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("linethrough", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+
+$("#circle_text_italics").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?
+ canvas.getActiveObject().set("fontStyle", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("fontStyle", "italic")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_text_bold").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?恢复正常
+ canvas.getActiveObject().set("fontWeight", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("fontWeight", "bold")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+
+$('#out_left_alignment').click(function () {
+ $('#out_left_alignment').parent().removeClass('tool1')
+ $('#out_right_alignment').parent().removeClass('tool1')
+ $('#out_center_alignment').parent().removeClass('tool1')
+ setTimeout(() => {
+ $('#out_left_alignment').parent().addClass('tool1')
+ });
+ canvas.getActiveObject().set('textAlign', 'left')
+ let idx = getIndex(canvas.getActiveObject())
+ objs[idx - 1].align = 'left'
+ window.recordState();
+ canvas.renderAll();
+})
+$('#out_right_alignment').click(function () {
+ $('#out_left_alignment').parent().removeClass('tool1')
+ $('#out_right_alignment').parent().removeClass('tool1')
+ $('#out_center_alignment').parent().removeClass('tool1')
+ setTimeout(() => {
+ $('#out_right_alignment').parent().addClass('tool1')
+ });
+ canvas.getActiveObject().set('textAlign', 'right')
+ let idx = getIndex(canvas.getActiveObject())
+ objs[idx - 1].align = 'right'
+ window.recordState();
+ canvas.renderAll();
+})
+$('#out_center_alignment').click(function () {
+ $('#out_left_alignment').parent().removeClass('tool1')
+ $('#out_right_alignment').parent().removeClass('tool1')
+ $('#out_center_alignment').parent().removeClass('tool1')
+ setTimeout(() => {
+ $('#out_center_alignment').parent().addClass('tool1')
+ });
+ canvas.getActiveObject().set('textAlign', 'center')
+ let idx = getIndex(canvas.getActiveObject())
+ objs[idx - 1].align = 'center'
+ window.recordState();
+ canvas.renderAll();
+})
+
+$("#out_text_italics").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?
+ canvas.getActiveObject().set("fontStyle", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("fontStyle", "italic")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_bold").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?恢复正常
+ canvas.getActiveObject().set("fontWeight", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("fontWeight", "bold")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_underline").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?
+ canvas.getActiveObject().set("underline", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("underline", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_linethrough").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已�?
+ canvas.getActiveObject().set("linethrough", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未�?
+ canvas.getActiveObject().set("linethrough", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#lock").off('click').on('click', function (e) {
+ e.stopPropagation();
+ if (!canvas.getActiveObject()) return;
+ let obj = canvas.getActiveObject();
+ // 检查是否已锁定(通过lockMovementX判断,因为锁定时会设置所有lock属性)
+ let isLocked = obj.get("lockMovementX") === true;
+ let shouldLock = !isLocked;
+
+ // 锁定/解锁所有编辑操作,但保持选中状态(不取消选中)
+ obj.set({
+ lockMovementX: shouldLock,
+ lockMovementY: shouldLock,
+ lockRotation: shouldLock,
+ lockScalingX: shouldLock,
+ lockScalingY: shouldLock,
+ lockSkewingX: shouldLock,
+ lockSkewingY: shouldLock,
+ // 锁定时不可选中,解锁时可选中(但保持当前选中状态)
+ selectable: !shouldLock,
+ evented: !shouldLock
+ });
+ if (shouldLock) {
+ $("#lock_img").attr("src", "public/images/lock20.png")//已锁定
+ } else {
+ $("#lock_img").attr("src", "public/images/unlock20.png")//已解锁
+ }
+ updateControls();
+ window.recordState();
+ // 更新对象列表以同步锁状态
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ canvas.renderAll();
+});
+$("#text_back_transparent").click(function () {
+ canvas.getActiveObject().set("textBackgroundColor", "");
+ $("#text_back_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_text_back_transparent").click(function () {
+ canvas.getActiveObject().set("textBackgroundColor", "");
+ $("#circle_text_back_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_back_transparent").click(function () {
+ canvas.getActiveObject().set("textBackgroundColor", "");
+ $("#out_text_back_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#rect_transparent").click(function () {
+ canvas.getActiveObject().set("fill", "");
+ $("#rect_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#rect_stroke_transparent").click(function () {
+ canvas.getActiveObject().set("stroke", "");
+ $("#rect_stroke").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_transparent").click(function () {
+ canvas.getActiveObject().set("fill", "");
+ $("#circle_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_stroke_transparent").click(function () {
+ canvas.getActiveObject().set("stroke", "");
+ $("#circle_stroke").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+
+// saveAs 函数保留,因为它被作为回调传递给 output 函数(第52行)
+function saveAs(op1, callback) {
+ let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ let b = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+
+ // 清理不需要的 src 字段(使用 window.cleanupSrcFields,在 output.js 中定义)
+ if (typeof window.cleanupSrcFields === 'function') {
+ window.cleanupSrcFields(j.objects, objs1);
+ window.cleanupSrcFields(b.objects, objs2);
+ }
+
+ let o = { f: j, b: {}, fo: objs1, bo: objs2 };
+ let con_o = Object.assign(o, op1);
+ dialog.showSaveDialog({
+ title: language_str("saveFile"),//'保存文件'
+ filters: [
+ { name: 'Soon File Type', extensions: ['soon'] },
+ ]
+ }).then(result => {
+ if (result.filePath == "") { return; }
+ if (result.filePath.substring(result.filePath.length - 5).indexOf('.') == -1) {
+ result.filePath += '.soon';
+ }
+ let fs = require('fs')
+ con_o.soonType = 1
+ fs.writeFileSync(result.filePath, JSON.stringify(con_o), 'utf8')
+ openAs.name = result.filePath;
+ layer.msg(language_str("saveSucc") + openAs.name);//'保存成功�?
+ if (typeof window.saveHistory === 'function') {
+ window.saveHistory();
+ }
+ if (callback && typeof callback === 'function') {
+ callback();
+ }
+ }).catch(err => {
+ })
+}
+// save 函数已在 output.js 中定义
+$("#copy").click(function () {
+ window.copySelection();
+})
+// 粘贴
+$("#paste").click(function () {
+ window.pasteFromClipboard();
+})
+
+// 保存 (保持你原有的保存逻辑不变)
+$("#save").click(function () {
+ if (typeof window.output === 'function') {
+ window.output(); // 这里调用你的 output 函数
+ }
+ return;
+ // ... (下面是你原有的被 return 截断的代码,建议以后清理掉,但这里我按要求保�?
+ let j = canvas1.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ // ... (省略你原来那段很长的保存代码) ...
+});
+
+function getDate() {
+ let date = new Date();
+ return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
+}
+function getAbsoluteXY(_obj) {
+ let coord = _obj.get("lineCoords");
+ return [_obj.get("left"), _obj.get("top")]
+}
+// fullPath 和 saveHistory 已在 output.js 中定义
+$("#open").click(function () {
+ if (step.val == 0) {
+ OpenDialog();
+ return;
+ }
+ layer.confirm('
' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�?
+ if (typeof window.output === 'function') {
+ window.output(OpenDialog);
+ }
+ layer.close(index);
+
+ }, function (index) {
+ OpenDialog();
+ });
+ function OpenDialog() {
+ dialog.showOpenDialog({
+ title: "请选择文件",
+ buttonLabel: language_str("comf"),
+ filters: [
+ { name: 'Soon File Type', extensions: ['soon'] },
+ ]
+ }).then(result => {
+ if (result.canceled) return;
+ let filePath = result.filePaths[0];
+ let fs = require('fs');
+ let fsData = fs.readFileSync(filePath);
+ let j = JSON.parse(fsData.toString());
+ let type = j.soonType ? j.soonType : j.backBlackPic ? 2 : 1;
+
+ if (type == 2) {
+ ipcRenderer.send('open-design-page', filePath, type);
+ return;
+ }
+
+ // 调用 output.js 中的 openFile 函数
+ if (typeof window.openFile === 'function') {
+ window.openFile(filePath);
+ }
+ }).catch(err => {
+ })
+ }
+});
+ //let blank = "{\"f\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":2787,\"height\":2787,\"fill\":\"#000000\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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YFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMT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\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"b\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":2787,\"height\":2787,\"fill\":\"rgb(0,0,0)\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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YFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMT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\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"fo\":[],\"bo\":[]}";
+ let t_objs1 = canvas1.getObjects();
+ let t_objs2 = canvas2.getObjects();
+ for (let i = 1; i < t_objs1.length; i++) {
+ canvas1.remove(t_objs1[i]);
+ }
+ for (let i = 1; i < t_objs2.length; i++) {
+ canvas2.remove(t_objs2[i]);
+ }
+ objs2 = [];
+ objs1 = [];
+ step1.val = 0;
+ step2.val = 0;
+ recordJson1 = [];
+ recordJson2 = [];
+ recordObjs1 = [];
+ recordObjs2 = [];
+ if ($("#front_side").hasClass("ui-button-active")) {
+ objs = objs1;
+ recordObjs = recordObjs1;
+ recordJson = recordJson1;
+ step = step1;
+ } else if ($("#back_side").hasClass("ui-button-active")) {
+ objs = objs2;
+ recordObjs = recordObjs2;
+ recordJson = recordJson2;
+ step = step2;
+ }
+ openAs.name = "";
+ canvas1.renderAll();
+ canvas2.renderAll();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+}
+$("#new").click(function () {
+ if (step.val == 0) {
+ ipcRenderer.send('open-first-page');
+ return;
+ }
+ layer.confirm('
' + language_str("whetherSave") + '', function (index) {//confirm 是否保存当前文件�?
+ if (typeof window.output === 'function') {
+ window.output(() => ipcRenderer.send('open-first-page'));
+ }
+ }, function (index) {
+ ipcRenderer.send('open-first-page');
+ });
+});
+
+// ===========================================================
+$("#text_y").bind('input propertychange', function () {
+ if (!canvas.getActiveObject()) return;
+ if ($("#text_y").val() == "") {
+ $("#text_y").val(0)
+ }
+ let val = background_image.top;
+ if ($("#text_y").val() != "") {
+ val = background_image.top + parseInt($("#text_y").val());
+ }
+ canvas.getActiveObject().set("top", val)
+ canvas.renderAll();
+ window.recordState();
+})
+$("#text_x").bind('input propertychange', function () {
+ if (!canvas.getActiveObject()) return;
+ if ($("#text_x").val() == "") {
+ $("#text_x").val(0)
+ }
+ let val = background_image.left;
+ if ($("#text_x").val() != "") {
+ val = background_image.left + parseInt($("#text_x").val());
+ }
+ canvas.getActiveObject().set("left", val)
+ canvas.renderAll();
+ window.recordState();
+})
+$("#text_w").bind('input propertychange', function () {
+ if (!canvas.getActiveObject()) return;
+ let val = "0";
+ if ($("#text_w").val() != "") {
+ val = $("#text_w").val();
+ }
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx <= 0 || !objs[idx - 1]) return;
+ let type = objs[idx - 1].type;
+ if (type == 3 || type == 4) {
+ canvas.getActiveObject().set("width", parseInt(val))
+ } else {
+ canvas.getActiveObject().set("scaleX", parseInt(val) / canvas.getActiveObject().get("width"))
+ }
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#text_h").bind('input propertychange', function () {
+ if (!canvas.getActiveObject()) return;
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx <= 0 || !objs[idx - 1]) return;
+ if (objs[idx - 1].type == 7) {
+ if ($("#text_h").val() == "") {
+ $("#text_h").val(canvas.getActiveObject().get("strokeWidth"));
+ }
+ canvas.getActiveObject().set("strokeWidth", parseInt($("#text_h").val()));
+ canvas.renderAll();
+ return;
+ }
+ let val = "0";
+ if ($("#text_h").val() != "") {
+ val = $("#text_h").val();
+ }
+ let type = objs[idx - 1].type;
+ if (type == 3 || type == 4) {
+ canvas.getActiveObject().set("height", parseInt(val))
+ } else {
+ canvas.getActiveObject().set("scaleY", parseInt(val) / canvas.getActiveObject().get("height"))
+ }
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#text_r").bind('input propertychange', function () {
+ if (!canvas.getActiveObject()) return;
+ if ($("#text_r").val() == "") {
+ $("#text_r").val("0")
+ }
+ $("#text_r").val(parseInt($("#text_r").val()) % 360)
+ //canvas.getActiveObject().set("rotate", val)
+ canvas.getActiveObject().rotate(parseInt($("#text_r").val()))
+ canvas.renderAll();
+ window.recordState();
+})
+$("#out_pic_field_name").bind('input propertychange', function () {
+ let idx = getIndex(canvas.getActiveObject());
+ objs[idx - 1].name = $("#out_pic_field_name").val();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+})
+
+$("#text_black").click(function () {
+ let idx = getIndex(canvas.getActiveObject());
+ if ($(this).prop("checked")) {
+ objs[idx - 1].black = true;
+ } else {
+ objs[idx - 1].black = false;
+ }
+ window.recordState();
+});
+$("#out_text_field_name").bind('input propertychange', function () {
+ let idx = getIndex(canvas.getActiveObject());
+ objs[idx - 1].name = $("#out_text_field_name").val();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+})
+$("#qrcode_field_name").bind('input propertychange', function () {
+ let idx = getIndex(canvas.getActiveObject());
+ objs[idx - 1].name = $("#qrcode_field_name").val();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+})
+$("#qrcode_color").bind('input propertychange', function () {
+ let item = canvas.getActiveObject();
+ let qr = jrQrcode.getQrBase64($("#qrcode_val").val(), { padding: 0, foreground: $(this).val() });
+ let idx = getIndex(item);
+ objs[idx - 1].color = $(this).val();
+ item.setSrc(qr, function (img) {
+ canvas.renderAll();
+ window.recordState();
+ });
+});
+$("#qrcode_val").bind('change', function () {
+ let val = $(this).val() ? $(this).val() : 'https://www.cardsoon.com'
+ let item = canvas.getActiveObject();
+ let qr = jrQrcode.getQrBase64(val, { padding: 0, foreground: $("#qrcode_color").val() });
+ let idx = getIndex(item);
+ objs[idx - 1].val = val;
+ item.setSrc(qr, function (img) {
+ canvas.renderAll();
+ window.recordState();
+ });
+});
+$("#barcode_color").bind('input propertychange', function () {
+ let item = canvas.getActiveObject();
+ let idx = getIndex(item);
+ objs[idx - 1].color = $(this).val();
+ JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
+ let barcode = document.getElementById('barcode');
+ let bar = barcode.toDataURL("image/png");
+ item.setSrc(bar, function (img) {
+ canvas.renderAll();
+ window.recordState();
+ });
+});
+$("#barcode_field_name").bind('input propertychange', function () {
+ let idx = getIndex(canvas.getActiveObject());
+ objs[idx - 1].name = $("#barcode_field_name").val();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+})
+$("#text_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("fill", $("#text_color").val());
+ canvas.renderAll();
+ window.recordState();
+})
+$("#text_back_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("textBackgroundColor", $("#text_back_color").val());
+ canvas.renderAll();
+ window.recordState();
+})
+$("#text_size").bind('input propertychange', function () {
+ let val = 1
+ if (parseFloat($("#text_size").val())) {
+ val = parseFloat($("#text_size").val())
+ if (val < 1) {
+ val = 1
+ } else if (val > dpi) {
+ val = dpi
+ } else if (val % 0.5 !== 0) {
+ val = Math.round(val * 2) / 2
+ }
+
+ }
+ $("#text_size").val(val)
+ canvas.getActiveObject().set("fontSize", val * dpi / 72);
+ $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0));
+ $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0));
+ canvas.renderAll();
+ window.recordState();
+})
+$("#circle_text_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("fill", $("#circle_text_color").val());
+ canvas.renderAll();
+ window.recordState();
+})
+$("#circle_text_back_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("textBackgroundColor", $("#circle_text_back_color").val());
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#circle_text_text").bind('input propertychange', function () {
+ let val = $("#circle_text_text").val().trim()
+ canvas.getActiveObject().set("text", ` ${val} `);
+ canvas.renderAll();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+})
+$("#out_text_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("fill", $("#out_text_color").val());
+ canvas.renderAll();
+ window.recordState();
+})
+$("#out_text_back_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("textBackgroundColor", $("#out_text_back_color").val());
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#out_text_size").bind('input propertychange', function () {
+ let val = 1
+ if (parseFloat($("#out_text_size").val())) {
+ val = parseFloat($("#out_text_size").val())
+ if (val < 1) {
+ val = 1
+ } else if (val > dpi) {
+ val = dpi
+ } else if (val % 0.5 !== 0) {
+ val = Math.round(val * 2) / 2
+ }
+
+ }
+ $("#out_text_size").val(val)
+ canvas.getActiveObject().set("fontSize", val * dpi / 72);
+ $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0));
+ $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0));
+ canvas.renderAll();
+ window.recordState();
+})
+// 监听合成文本输入框 (占位符)
+$("#out_text_text").on('input propertychange', function () {
+ let val = $(this).val();
+
+ // 【核心修改】如果值为空,强制给 2 个空格
+ if (val === "") {
+ val = " ";
+ }
+
+ let obj = canvas.getActiveObject();
+ if (obj) {
+ obj.set("text", val);
+ obj.setCoords();
+ canvas.requestRenderAll();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+ }
+});
+$("#rect_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("fill", $("#rect_color").val());
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#rect_stroke").bind('input propertychange', function () {
+ canvas.getActiveObject().set("stroke", $("#rect_stroke").val());
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#rect_stroke_width").bind('input propertychange', function () {
+ if ($("#rect_stroke_width").val() == "") {
+ $("#rect_stroke_width").val("0")
+ } else {
+ $("#rect_stroke_width").val(parseInt($("#rect_stroke_width").val()))
+ }
+ canvas.getActiveObject().set("strokeWidth", parseInt($("#rect_stroke_width").val()));
+ canvas.renderAll();
+ window.recordState();
+})
+$("#rect_radius").bind('input propertychange', function () {
+ if ($("#rect_radius").val() == "") {
+ $("#rect_radius").val("0")
+ } else {
+ $("#rect_radius").val(parseInt($("#rect_radius").val()))
+ }
+ canvas.getActiveObject().set("rx", parseInt($("#rect_radius").val()));
+ canvas.getActiveObject().set("ry", parseInt($("#rect_radius").val()));
+ canvas.renderAll();
+ window.recordState();
+})
+$("#circle_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("fill", $("#circle_color").val());
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#circle_stroke").bind('input propertychange', function () {
+ canvas.getActiveObject().set("stroke", $("#circle_stroke").val());
+
+ canvas.renderAll();
+ window.recordState();
+})
+$("#circle_stroke_width").bind('input propertychange', function () {
+ if ($("#circle_stroke_width").val() == "") {
+ $("#circle_stroke_width").val("0")
+ } else {
+ $(this).val(parseInt($(this).val()))
+ }
+ canvas.getActiveObject().set("strokeWidth", parseInt($("#circle_stroke_width").val()));
+ canvas.renderAll();
+ window.recordState();
+})
+$("#counter_start").bind('input propertychange', function () {
+ canvas.getActiveObject().set("text", $("#counter_start").val());
+ let item = canvas.getActiveObject();
+ let idx = getIndex(item);
+ objs[idx - 1].start = $(this).val();
+ canvas.renderAll();
+ window.recordState();
+})
+$("#counter_add").bind('input propertychange', function () {
+ let item = canvas.getActiveObject();
+ let idx = getIndex(item);
+ objs[idx - 1].add = $(this).val();
+ canvas.renderAll();
+ window.recordState();
+})
+$("#counter_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("fill", $("#counter_color").val());
+ canvas.renderAll();
+ window.recordState();
+})
+$("#count_size").bind('input propertychange', function () {
+ let val = 1
+ if (parseFloat($("#count_size").val())) {
+ val = parseFloat($("#count_size").val())
+ if (val < 1) {
+ val = 1
+ } else if (val > dpi) {
+ val = dpi
+ } else if (val % 0.5 !== 0) {
+ val = Math.round(val * 2) / 2
+ }
+
+ }
+ $("#count_size").val(val)
+ canvas.getActiveObject().set("fontSize", val * dpi / 72);
+ $("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0));
+ $("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0));
+ canvas.renderAll();
+ window.recordState();
+})
+$("#line_color").bind('input propertychange', function () {
+ canvas.getActiveObject().set("stroke", $("#line_color").val());
+ canvas.renderAll();
+ window.recordState();
+})
+$("#line_dist").bind('input propertychange', function () {
+ if ($("#line_dist").val() == "") {
+ $("#line_dist").val(0)
+ }
+ canvas.getActiveObject().set("strokeDashArray", [parseInt($("#line_dist").val()), parseInt($("#line_dist").val())])
+ canvas.renderAll();
+ window.recordState();
+})
+// 监听普通文本输入 (占位符)
+$("#text_text").on('input propertychange', function () {
+ // 1. 获取输入框的值,不要用 trim(),否则无法输入空格
+ let val = $(this).val();
+
+ // 2. 核心修改:只有当删光时,才给 4 个空格作为占位符
+ if (val === "") {
+ val = " "; // 4个空格,比原来的2个更宽,更好点
+ }
+ // 3. 更新对象
+ canvas.getActiveObject().set("text", val);
+ canvas.requestRenderAll(); // 使用 requestRenderAll 性能更好
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ window.recordState();
+});
+$("#barcode_val").bind('input propertychange', function () {
+ let item = canvas.getActiveObject();
+ let idx = getIndex(item);
+ objs[idx - 1].val = $(this).val();
+ JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
+
+ let barcode = document.getElementById('barcode');
+ let bar = barcode.toDataURL("image/png");
+ item.setSrc(bar, function (img) {
+ canvas.renderAll();
+ window.recordState();
+ });
+})
+$("#barcode_show").click(function () {
+ let item = canvas.getActiveObject();
+ let idx = getIndex(canvas.getActiveObject());
+ let val = $("#barcode_size").val()
+ if ($(this).prop("checked")) {
+ objs[idx - 1].show = true;
+ val = 0
+ } else {
+ objs[idx - 1].show = false;
+ }
+ JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: val * dpi / 72, font: objs[idx - 1].font });
+ let barcode = document.getElementById('barcode');
+ let bar = barcode.toDataURL("image/png");
+ item.setSrc(bar, function (img) {
+ canvas.renderAll();
+ window.recordState();
+ });
+});
+$("#barcode_size").bind('input propertychange', function () {
+ let item = canvas.getActiveObject();
+ let idx = getIndex(item);
+ let val = 1
+ if (parseFloat($(this).val())) {
+ val = parseFloat($(this).val())
+ if (val < 1) {
+ val = 1
+ } else if (val > dpi) {
+ val = dpi
+ } else if (val % 0.5 !== 0) {
+ val = Math.round(val * 2) / 2
+ }
+
+ }
+ $("#barcode_size").val(val)
+ objs[idx - 1].fontSize = val * dpi / 72;
+ JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
+
+ let barcode = document.getElementById('barcode');
+ let bar = barcode.toDataURL("image/png");
+ item.setSrc(bar, function (img) {
+ canvas.renderAll();
+ window.recordState();
+ });
+})
+$('#count_font_family').on('change', function () {
+ canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
+ canvas.renderAll()
+ window.recordState();
+});
+$('#text_font_family').on('change', function () {
+ canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
+ canvas.renderAll()
+ window.recordState();
+});
+
+$('#circle_text_font_family').on('change', function () {
+ canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
+ canvas.renderAll()
+ window.recordState();
+});
+
+$('#language_select').on('change', function () {//语言选择
+ langua_ge($(this).find('option:selected').val());
+ s_lan = $(this).find('option:selected').val();
+ localStorage.setItem("lang", s_lan);
+});
+$('#barcode_font_family').on('change', function () {
+ let item = canvas.getActiveObject();
+ let idx = getIndex(item);
+ objs[idx - 1].font = $(this).find('option:selected').text();
+ JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
+
+ let barcode = document.getElementById('barcode');
+ let bar = barcode.toDataURL("image/png");
+ item.setSrc(bar, function (img) {
+ canvas.renderAll();
+ window.recordState();
+ });
+ //window.recordState();
+});
+$('#out_text_font_family').on('change', function () {
+ canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
+ canvas.renderAll()
+ window.recordState();
+});
+$(".obj_list").on("click", "div", function () {
+ let idx = objs.length - 1 - $(this).index();
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(idx);
+ }
+});
+$("#exceed").click(function () {
+ let idx = getIndex(canvas.getActiveObject());
+ if ($(this).prop("checked")) {
+ objs[idx - 1].exceed = true;
+ } else {
+ objs[idx - 1].exceed = false;
+ }
+ window.recordState();
+});
+$("#autoWrap").click(function () {
+ let idx = getIndex(canvas.getActiveObject());
+ if ($(this).prop("checked")) {
+
+ objs[idx - 1].autoWrap = true;
+ } else {
+ objs[idx - 1].autoWrap = false;
+ }
+ window.recordState();
+});
+$("#fixSize").click(function () {
+ let idx = getIndex(canvas.getActiveObject());
+ if ($(this).prop("checked")) {
+
+ objs[idx - 1].fixSize = true;
+ } else {
+ objs[idx - 1].fixSize = false;
+ }
+ window.recordState();
+});
+$("#circle_text_center").click(function () {
+ let idx = getIndex(canvas.getActiveObject());
+ if ($(this).prop("checked")) {
+ objs[idx - 1].circleCenter = 1;
+ } else {
+ objs[idx - 1].circleCenter = 0;
+ }
+ window.recordState();
+});
+
+// ===========================================================
+$("#text_italics").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选
+ canvas.getActiveObject().set("fontStyle", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("fontStyle", "italic")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#text_bold").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选,恢复正常
+ canvas.getActiveObject().set("fontWeight", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("fontWeight", "bold")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#text_underline").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选
+ canvas.getActiveObject().set("underline", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("underline", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#text_linethrough").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选
+ canvas.getActiveObject().set("linethrough", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("linethrough", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+
+$("#circle_text_italics").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选
+ canvas.getActiveObject().set("fontStyle", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("fontStyle", "italic")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_text_bold").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选,恢复正常
+ canvas.getActiveObject().set("fontWeight", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("fontWeight", "bold")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+
+$('#out_left_alignment').click(function () {
+ $('#out_left_alignment').parent().removeClass('tool1')
+ $('#out_right_alignment').parent().removeClass('tool1')
+ $('#out_center_alignment').parent().removeClass('tool1')
+ setTimeout(() => {
+ $('#out_left_alignment').parent().addClass('tool1')
+ });
+ canvas.getActiveObject().set('textAlign', 'left')
+ let idx = getIndex(canvas.getActiveObject())
+ objs[idx - 1].align = 'left'
+ window.recordState();
+ canvas.renderAll()
+})
+$('#out_right_alignment').click(function () {
+ $('#out_left_alignment').parent().removeClass('tool1')
+ $('#out_right_alignment').parent().removeClass('tool1')
+ $('#out_center_alignment').parent().removeClass('tool1')
+ setTimeout(() => {
+ $('#out_right_alignment').parent().addClass('tool1')
+ });
+ canvas.getActiveObject().set('textAlign', 'right')
+ let idx = getIndex(canvas.getActiveObject())
+ objs[idx - 1].align = 'right'
+ window.recordState();
+ canvas.renderAll()
+})
+$('#out_center_alignment').click(function () {
+ $('#out_left_alignment').parent().removeClass('tool1')
+ $('#out_right_alignment').parent().removeClass('tool1')
+ $('#out_center_alignment').parent().removeClass('tool1')
+ setTimeout(() => {
+ $('#out_center_alignment').parent().addClass('tool1')
+ });
+ canvas.getActiveObject().set('textAlign', 'center')
+ let idx = getIndex(canvas.getActiveObject())
+ objs[idx - 1].align = 'center'
+ window.recordState();
+ canvas.renderAll()
+})
+
+$("#out_text_italics").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选
+ canvas.getActiveObject().set("fontStyle", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("fontStyle", "italic")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_bold").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选,恢复正常
+ canvas.getActiveObject().set("fontWeight", "normal")
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("fontWeight", "bold")
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_underline").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选
+ canvas.getActiveObject().set("underline", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("underline", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_linethrough").click(function () {
+ if ($(this).hasClass("ui-radio-acitve")) {
+ //已选
+ canvas.getActiveObject().set("linethrough", false)
+ $(this).removeClass("ui-radio-acitve")
+ } else {
+ //未选
+ canvas.getActiveObject().set("linethrough", true)
+ $(this).addClass("ui-radio-acitve")
+ }
+ window.recordState();
+ canvas.renderAll();
+ window.recordState();
+});
+
+// ===========================================================
+$("#delete").click(function () {
+ let actObjs = canvas.getActiveObjects();
+ let allObjs = canvas.getObjects();
+ let flag = 0;
+ for (let item of actObjs) {
+ if (item != allObjs[0]) {
+ let i = getIndex(item);//0是背景,所以从1开始,但objs不包含背景图片,故要-1
+ objs.splice(i - 1, 1);
+ canvas.remove(item);
+ flag = 1;
+
+ }
+ }
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ canvas.discardActiveObject();
+ if (flag == 1) {
+ window.recordState();
+ canvas.renderAll();
+ }
+});
+// 移至上层和移至下层:先取消所有绑定(包括第一处的绑定),然后重新绑定(确保只绑定一次)
+// 注意:第一处的事件绑定(第 842 行和第 861 行)会被这里的 off('click') 取消
+$("#up_obj").off('click').on('click', function () {//上移,放到前面 数组中在后面
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx + 1 != canvas.getObjects().length) {
+ canvas.bringForward(canvas.getActiveObject());
+ canvas.renderAll();
+ let temp = objs[idx - 1];
+ objs[idx - 1] = objs[idx];
+ objs[idx] = temp;
+
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(idx);
+ }
+ }
+});
+$("#down_obj").off('click').on('click', function () {//下移,放到后面 数组中在前面
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx != 1) {
+ canvas.sendBackwards(canvas.getActiveObject());
+ canvas.renderAll();
+
+ let temp = objs[idx - 1];
+ objs[idx - 1] = objs[idx - 2];
+ objs[idx - 2] = temp;
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(idx - 2);
+ }
+ }
+});
+$("#set_bg").click(function () {//设置为背景
+ let obj = canvas.getActiveObject();
+ let idx = getIndex(obj);
+ const scaleX = 2787 / obj.width
+ const scaleY = 2787 / obj.height
+ // 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致
+ const scaledWidth = obj.width * scaleX;
+ const scaledHeight = obj.height * scaleY;
+ obj.set({
+ scaleX: scaleX,
+ scaleY: scaleY,
+ left: ($('#canvas1').width() - scaledWidth) / 2,
+ top: ($('#canvas1').height() - scaledHeight) / 2,
+ });
+ $('#text_w').val(2787)
+ $('#text_h').val(2787)
+ $('#text_x').val(0)
+ $('#text_y').val(0)
+ // 设为背景时,锁定所有编辑操作,并设置为不可选中
+ obj.set({
+ lockMovementX: true,
+ lockMovementY: true,
+ lockRotation: true,
+ lockScalingX: true,
+ lockScalingY: true,
+ lockSkewingX: true,
+ lockSkewingY: true,
+ selectable: false,
+ evented: false
+ });
+ $("#lock_img").attr("src", "public/images/lock20.png")
+ canvas.sendToBack(obj);
+ canvas.bringForward(obj);
+ canvas.renderAll();
+ let objItem = objs.splice(idx - 1, 1)[0]
+ objs.unshift(objItem)
+
+ // 确保背景图(索引0)的锁定属性被正确设置
+ setTimeout(() => {
+ let bgObj = canvas.getObjects()[0];
+ if (bgObj) {
+ bgObj.set({
+ lockMovementX: true,
+ lockMovementY: true,
+ lockRotation: true,
+ lockScalingX: true,
+ lockScalingY: true,
+ lockSkewingX: true,
+ lockSkewingY: true,
+ selectable: false,
+ evented: false
+ });
+ canvas.renderAll();
+ }
+ }, 100);
+
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(0);
+ }
+});
+// 重复的lock点击事件已移除,使用第一处的绑定
+$("#text_back_transparent").click(function () {
+ canvas.getActiveObject().set("textBackgroundColor", "");
+ $("#text_back_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_text_back_transparent").click(function () {
+ canvas.getActiveObject().set("textBackgroundColor", "");
+ $("#circle_text_back_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#out_text_back_transparent").click(function () {
+ canvas.getActiveObject().set("textBackgroundColor", "");
+ $("#out_text_back_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#rect_transparent").click(function () {
+ canvas.getActiveObject().set("fill", "");
+ $("#rect_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#rect_stroke_transparent").click(function () {
+ canvas.getActiveObject().set("stroke", "");
+ $("#rect_stroke").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_transparent").click(function () {
+ canvas.getActiveObject().set("fill", "");
+ $("#circle_color").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+$("#circle_stroke_transparent").click(function () {
+ canvas.getActiveObject().set("stroke", "");
+ $("#circle_stroke").val("#ffffff");
+ canvas.renderAll();
+ window.recordState();
+});
+
+// ===========================================================
+$("#about").click(async function () {
+ // 1. 先异步获取版本号
+ let version = "0.0.0"; // 默认值,防止获取失败
+ try {
+ if (window.sysAPI && window.sysAPI.getAppVersion) {
+ const v = await window.sysAPI.getAppVersion();
+ version = "v" + v; // 拼接一个 v,变成 v2.3.017
+ }
+ } catch (e) {
+ }
+
+ // 2. 获取成功后再弹出窗口
+ layer.open({
+ type: 1
+ , title: language_str("about")
+ , area: '450px;'
+ , id: 'LAY_layuipro'
+ , moveType: 1
+ , content: '
' +
+ '
' +
+ '
Soon Design
' +
+ // 【修改点】这里使用了刚才获取到的 version 变量
+ '
' + language_str("vers") + ' ' + version + '
' +
+ '
' + language_str("copyright") + '
' +
+ '
'
+ });
+})
+$("#help").click(() => {
+ ipcRenderer.send('open-help-file');
+});
+
+// ===========================================================
+$('#display').on('click', function () {
+ // 类型改变
+ fabric.Image.fromURL('./public/images/front_bg' + bg_version + '_1.png', function (i1) {
+ i1.left = background_image.left;
+ i1.top = background_image.top;
+ let img1 = i1;
+
+ fabric.Image.fromURL('./public/images/back_bg_1.png', function (i2) {
+ i2.left = background_image.left;
+ i2.top = background_image.top;
+ let img2 = i2;
+ fabric.Image.fromURL('./public/images/op_1.png', function (i3) {
+ i3.left = background_image.left;
+ i3.top = background_image.top;
+ let img3 = i3;
+ if (typeof window.display_func === 'function') {
+ window.display_func(img1, img2, img3);
+ }
+ })
+ })
+ })
+});
+$("#output").click(function () {
+ // 另存为:传递 saveAs 函数作为第二个参数
+ if (typeof window.output === 'function') {
+ window.output(null, saveAs); // 调用output函数,使用saveAs进行另存为
+ }
+});
+
+// 确保移至上层和移至下层的事件绑定正确(在文件末尾再次确认)
+// 取消所有绑定,然后重新绑定第二处的实现(第 2171 行和第 2189 行)
+$(document).ready(function() {
+ setTimeout(function() {
+ $("#up_obj").off('click').on('click', function () {
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx + 1 != canvas.getObjects().length) {
+ canvas.bringForward(canvas.getActiveObject());
+ canvas.renderAll();
+ let temp = objs[idx - 1];
+ objs[idx - 1] = objs[idx];
+ objs[idx] = temp;
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(idx);
+ }
+ }
+ });
+ $("#down_obj").off('click').on('click', function () {
+ let idx = getIndex(canvas.getActiveObject());
+ if (idx != 1) {
+ canvas.sendBackwards(canvas.getActiveObject());
+ canvas.renderAll();
+ let temp = objs[idx - 1];
+ objs[idx - 1] = objs[idx - 2];
+ objs[idx - 2] = temp;
+ window.recordState();
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ if (typeof window.selectObj === 'function') {
+ window.selectObj(idx - 2);
+ }
+ }
+ });
+ }, 100);
+});
diff --git a/lib/design2.js b/lib/design2.js
index fad71b9..d5f5910 100644
--- a/lib/design2.js
+++ b/lib/design2.js
@@ -108,8 +108,6 @@ ipcRenderer.send('get-scale-rate');
});
APIFMS = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
} catch (err) {
- console.log('des 加密 -------------------------');
- console.log(err);
}
return APIFMS;
};
@@ -491,7 +489,6 @@ ipcRenderer.send('get-scale-rate');
bytenode = require('bytenode');
require.extensions['.dl'] = require.extensions['.jsc'];
} catch(e) {
- console.warn('[加载模块] bytenode 未安装,无法加载 .jsc 文件');
}
const appPath = (() => { try { return remote.app.getAppPath(); } catch(e) { return __dirname || process.cwd(); } })();
@@ -504,7 +501,6 @@ ipcRenderer.send('get-scale-rate');
moduleMap = JSON.parse(fs.readFileSync(moduleMapPath, 'utf8'));
}
} catch (e) {
- console.warn('[加载模块] 无法读取模块映射配置,使用默认文件名');
}
// 获取映射后的文件名(跨平台兼容)
@@ -524,10 +520,8 @@ ipcRenderer.send('get-scale-rate');
if (fs.existsSync(jscPath) && bytenode) {
try {
require(jscPath);
- console.log(`[加载模块] ✅ ${moduleName} → ${mappedName}.jsc`);
return;
} catch (e) {
- console.error(`[加载模块] ❌ ${moduleName}.jsc 加载失败:`, e.message);
}
}
@@ -535,9 +529,7 @@ ipcRenderer.send('get-scale-rate');
if (fs.existsSync(jsPath)) {
try {
eval(fs.readFileSync(jsPath, 'utf8'));
- console.log(`[加载模块] ✅ ${moduleName} → ${moduleName}.js`);
} catch (e) {
- console.error(`[加载模块] ❌ ${moduleName}.js 加载失败:`, e.message);
alert(`加载 ${moduleName} 失败!\n\n错误: ${e.message}`);
}
} else {
diff --git a/lib/design2/core.js b/lib/design2/core.js
index bd9f730..d39803b 100644
--- a/lib/design2/core.js
+++ b/lib/design2/core.js
@@ -425,17 +425,17 @@ function initRulers() {
function createFabricGuide(type, domX, domY) {
// domX 和 domY 是相对于 canvas-wrapper 的坐标
// 需要转换为相对于 canvas 的坐标,然后再转换为 Fabric 画布坐标
-
+
// 获取 canvas 相对于 canvas-wrapper 的位置
let canvas1El = $('#canvas1');
let canvasPosition = canvas1El.position();
let canvasMarginLeft = parseFloat(canvas1El.css('margin-left')) || 0;
let canvasMarginTop = parseFloat(canvas1El.css('margin-top')) || 0;
-
+
// 计算相对于 canvas 的坐标(减去 canvas 在 wrapper 中的位置和 margin)
let relX = domX - canvasPosition.left - canvasMarginLeft;
let relY = domY - canvasPosition.top - canvasMarginTop;
-
+
// 转为 Fabric 坐标 (除以 zoom)
let canvasX = relX / zoom;
let canvasY = relY / zoom;
@@ -555,22 +555,18 @@ function selectObject(target, index) {
function selectPic(target, index) {
// 检查是否有选中对象,如果没有则直接返回
if (!canvas || !canvas.getActiveObject()) return;
-
+
$("#pic_control").show();
$("#set_bg").show();
let activeObj = canvas.getActiveObject();
-
- // 检查对象是否被锁定或设为背景(索引0且已锁定)
- let idx = getIndex(activeObj, canvas);
- if (idx === 0) {
- // 如果是背景图且已锁定,不应该显示图片控件
- if (activeObj.get('lockMovementX') === true || activeObj.get('selectable') === false) {
- canvas.discardActiveObject();
- canvas.renderAll();
- return;
- }
+
+ // 检查对象是否被锁定
+ if (isObjectLocked(activeObj)) {
+ canvas.discardActiveObject();
+ canvas.renderAll();
+ return;
}
-
+
if (typeof pic_op !== 'undefined' && pic_op && typeof pic_op.setValue === 'function') {
pic_op.setValue(100 - (activeObj.get("opacity") * 100));
} else {
@@ -656,44 +652,48 @@ function selectText(target, index) {
}
function selectCircleText(target, index) {
- let idx = getIndex(canvas.getActiveObject(), canvas);
+ const activeObj = target || canvas.getActiveObject();
+ if (!activeObj) return;
+
+ let idx = getIndex(activeObj);
$("#circle_text_control").show();
- $("#circle_text_color").val(canvas.getActiveObject().get("fill"));
- $("#circle_text_back_color").val(canvas.getActiveObject().get("textBackgroundColor") == "" ? '#ffffff' : canvas.getActiveObject().get("textBackgroundColor"));
- if (typeof circle_text_size !== 'undefined' && circle_text_size.setValue) {
- circle_text_size_updating = true; // 设置标志位
- circle_text_size.setValue(canvas.getActiveObject().get("fontSize"));
- circle_text_size_updating = false; // 清除标志位
- } else {
- $("#circle_text_size").next().children(".layui-slider-bar").css("width", ((canvas.getActiveObject().get("fontSize") - 10) / (120 - 10)) * 100 + "%");
- $("#circle_text_size").next().children(".layui-slider-handle").css("left", ((canvas.getActiveObject().get("fontSize") - 10) / (120 - 10)) * 100 + "%");
+ $("#circle_text_color").val(activeObj.get("fill"));
+ $("#circle_text_back_color").val(activeObj.get("textBackgroundColor") == "" ? '#ffffff' : activeObj.get("textBackgroundColor"));
+
+ if (typeof circle_text_size !== 'undefined' && circle_text_size && typeof circle_text_size.setValue === 'function') {
+ if (typeof circle_text_size_updating !== 'undefined') {
+ circle_text_size_updating = true;
+ }
+ circle_text_size.setValue(activeObj.get("fontSize") - 10);
+ if (typeof circle_text_size_updating !== 'undefined') {
+ circle_text_size_updating = false;
+ }
}
- if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter.setValue) {
- circle_text_diameter.setValue(canvas.getActiveObject().get("diameter"));
- } else {
- $("#circle_text_diameter").next().children(".layui-slider-bar").css("width", ((canvas.getActiveObject().get("diameter") - 50) / (1100 - 50)) * 100 + "%");
- $("#circle_text_diameter").next().children(".layui-slider-handle").css("left", ((canvas.getActiveObject().get("diameter") - 50) / (1100 - 50)) * 100 + "%");
+
+ if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter && typeof circle_text_diameter.setValue === 'function') {
+ circle_text_diameter.setValue(activeObj.get("diameter") - 50);
}
+
$("#circle_text_center").prop("checked", objs[idx - 1].circleCenter ? 'checked' : '');
- $("#circle_text_text").val(canvas.getActiveObject().get("text"));
- $("#circle_text_font_family").val(canvas.getActiveObject().get("fontFamily"));
+ $("#circle_text_text").val(activeObj.get("text"));
+ $("#circle_text_font_family").val(activeObj.get("fontFamily"));
- if (canvas.getActiveObject().get("underline") == true) {
+ if (activeObj.get("underline") == true) {
$("#circle_text_underline").addClass("ui-radio-acitve")
} else {
$("#circle_text_underline").removeClass("ui-radio-acitve")
}
- if (canvas.getActiveObject().get("fontWeight") == "bold") {
+ if (activeObj.get("fontWeight") == "bold") {
$("#circle_text_bold").addClass("ui-radio-acitve")
} else {
$("#circle_text_bold").removeClass("ui-radio-acitve")
}
- if (canvas.getActiveObject().get("fontStyle") == "italic") {
+ if (activeObj.get("fontStyle") == "italic") {
$("#circle_text_italics").addClass("ui-radio-acitve")
} else {
$("#circle_text_italics").removeClass("ui-radio-acitve")
}
- if (canvas.getActiveObject().get("linethrough") == true) {
+ if (activeObj.get("linethrough") == true) {
$("#circle_text_linethrough").addClass("ui-radio-acitve")
} else {
$("#circle_text_linethrough").removeClass("ui-radio-acitve")
@@ -931,18 +931,15 @@ function handleObjectSelected(e) {
// 3. 获取索引
let i = getIndex(select_obj, canvas);
-
- // 检查对象是否被锁定或设为背景(索引0且已锁定)
- if (i === 0) {
- if (select_obj.get('lockMovementX') === true || select_obj.get('selectable') === false) {
- // 如果是背景图且已锁定,取消选中
- canvas.discardActiveObject();
- canvas.renderAll();
- $("#base_control, #line_control, #pic_control, #out_pic_control, #text_control, #circle_text_control, #out_text_control, #rect_control, #circle_control, #counter_control, #qrcode_Controll, #barcode_controll").hide();
- $("#component_type").text(language_str("bg"));
- selectObj(-1, true);
- return;
- }
+
+ // 如果不是通过对象列表选中的,且对象被锁定,则取消选中
+ if (!window._selectingFromList && isObjectLocked(select_obj)) {
+ canvas.discardActiveObject();
+ canvas.renderAll();
+ $("#base_control, #line_control, #pic_control, #out_pic_control, #text_control, #circle_text_control, #out_text_control, #rect_control, #circle_control, #counter_control, #qrcode_Controll, #barcode_controll").hide();
+ $("#component_type").text(language_str("bg"));
+ selectObj(-1, true);
+ return;
}
if (i != 0) {
@@ -1026,6 +1023,61 @@ function handleObjectMoving(e) {
updateControls();
}
+// 辅助函数:检查对象是否被锁定
+// 只有当 lockMovementX 为 true 时才认为对象被锁定
+// selectable 为 false 可能是其他原因(如背景图),所以只检查 lockMovementX
+function isObjectLocked(obj) {
+ if (!obj) return false;
+ // 主要检查 lockMovementX,这是锁定的主要标志
+ return obj.get('lockMovementX') === true;
+}
+// 暴露到全局作用域,确保其他模块可以访问
+window.isObjectLocked = isObjectLocked;
+
+// 统一的 toJSON 属性列表,不包含锁定相关属性(锁定状态不应被保存)
+const TO_JSON_PROPERTIES = [
+ "selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline", "evented"
+];
+// 暴露到全局作用域
+window.TO_JSON_PROPERTIES = TO_JSON_PROPERTIES;
+
+// 辅助函数:解锁所有对象(加载时使用)
+function unlockAllObjects(canvas) {
+ if (!canvas) return;
+ const objects = canvas.getObjects();
+ objects.forEach((obj, index) => {
+ // 背景对象(索引0)保持锁定状态
+ if (index === 0) {
+ obj.set({
+ lockMovementX: true,
+ lockMovementY: true,
+ lockRotation: true,
+ lockScalingX: true,
+ lockScalingY: true,
+ lockSkewingX: true,
+ lockSkewingY: true,
+ selectable: false,
+ evented: false
+ });
+ } else {
+ // 其他对象默认解锁
+ obj.set({
+ lockMovementX: false,
+ lockMovementY: false,
+ lockRotation: false,
+ lockScalingX: false,
+ lockScalingY: false,
+ lockSkewingX: false,
+ lockSkewingY: false,
+ selectable: true,
+ evented: true
+ });
+ }
+ });
+}
+// 暴露到全局作用域
+window.unlockAllObjects = unlockAllObjects;
+
// 将 handleObjectSelected 附加到 window 对象,确保全局可访问
window.handleObjectSelected = handleObjectSelected;
@@ -1087,6 +1139,16 @@ function initCanvasEvents() {
objs = (currentCanvas === canvas1) ? objs1 : objs2;
handleObjectSelected(e);
});
+ // 阻止被锁定的对象被框选选中(只过滤被锁定的对象,保留未锁定的对象)
+ currentCanvas.on('before:selection:created', (e) => {
+ if (!e.targets || e.targets.length === 0) return;
+ // 过滤掉被锁定的对象,保留辅助线和未锁定的对象
+ e.targets = e.targets.filter(target => {
+ if (target.isGuideLine) return true; // 保留辅助线
+ return !isObjectLocked(target); // 移除被锁定的对象,保留未锁定的对象
+ });
+ });
+
// 添加 selection 事件以确保对象选中时正确显示属性面板
currentCanvas.on('selection:created', (e) => {
canvas = currentCanvas;
@@ -1101,19 +1163,15 @@ function initCanvasEvents() {
currentCanvas.on('object:selected', (e) => {
canvas = currentCanvas;
objs = (currentCanvas === canvas1) ? objs1 : objs2;
-
- // 阻止背景图(索引0)被选中(如果已锁定)
- let selectedObj = e.target;
- let idx = getIndex(selectedObj, currentCanvas);
- if (idx === 0) {
- let bgObj = currentCanvas.getObjects()[0];
- if (bgObj && (bgObj.get('lockMovementX') === true || bgObj.get('selectable') === false)) {
- currentCanvas.discardActiveObject();
- currentCanvas.renderAll();
- return;
- }
+
+ // 如果不是通过对象列表选中的,且对象被锁定,则取消选中
+ // 注意:只有真正被锁定的对象才会被取消选中,未锁定的对象应该正常选中
+ if (!window._selectingFromList && e.target && isObjectLocked(e.target)) {
+ currentCanvas.discardActiveObject();
+ currentCanvas.renderAll();
+ return;
}
-
+
handleObjectSelected(e);
// 更新对象列表以同步锁状态
if (typeof window.updateList === 'function') {
@@ -1157,7 +1215,6 @@ function initCanvasEvents() {
let objData = objs[idx - 1];
// 安全检查:确保 objData 存在且有 type 属性
if (!objData || typeof objData.type === 'undefined') {
- console.warn('objData is undefined or missing type at index', idx - 1);
return;
}
let target = event.target;
@@ -1228,10 +1285,10 @@ window.updateList = function updateList() {
let canvasObj = canvas.getObjects()[i + 1];
isLocked = canvasObj.get('lockMovementX') === true;
}
-
+
// 锁定状态图标
- const lockIcon = isLocked ?
- '

' :
+ const lockIcon = isLocked ?
+ '

' :
'

';
// 组装 HTML
@@ -1257,6 +1314,9 @@ window.updateList = function updateList() {
});
}
+// 标记是否通过对象列表选中(用于区分鼠标点击和列表点击)
+window._selectingFromList = false;
+
// 将 selectObj 附加到 window 对象,确保全局可访问
window.selectObj = function selectObj(objIndices, isFromCanvas = false) {
let indicesArray = (Array.isArray(objIndices)) ? objIndices : ((typeof objIndices === 'number' && objIndices >= 0) ? [objIndices] : []);
@@ -1285,8 +1345,39 @@ window.selectObj = function selectObj(objIndices, isFromCanvas = false) {
if (!isFromCanvas && indicesArray.length === 1) {
let target = canvas.getObjects()[indicesArray[0] + 1];
if (target) {
+ // 检查对象是否被锁定
+ let isLocked = isObjectLocked(target);
+
+ // 设置标志位,表示这是通过对象列表选中的(无论是否锁定)
+ window._selectingFromList = true;
+
+ // 如果被锁定,临时设置 selectable 和 evented 为 true,以便能够选中
+ if (isLocked) {
+ target.set({
+ selectable: true,
+ evented: true
+ });
+ }
+
canvas.setActiveObject(target);
canvas.requestRenderAll();
+
+ // 如果对象被锁定,选中后立即恢复锁定状态(但保持选中状态)
+ if (isLocked) {
+ setTimeout(() => {
+ target.set({
+ selectable: false,
+ evented: false
+ });
+ canvas.requestRenderAll();
+ }, 0);
+ }
+
+ // 清除标志位(延迟清除,确保事件处理完成)
+ setTimeout(() => {
+ window._selectingFromList = false;
+ }, 10);
+
handleObjectSelected();
}
}
@@ -1306,7 +1397,8 @@ window.recordState = function recordState() {
currentRecordJson.pop();
}
currentRecordObjs.push(JSON.stringify(currentObjs))
- let j = currentCanvas.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
+ // 保存所有锁定相关的属性,确保锁定状态可以正确恢复
+ let j = currentCanvas.toJSON(TO_JSON_PROPERTIES);
j.objects[0].hoverCursor = "default";
currentRecordJson.push(j);
};
@@ -1321,7 +1413,6 @@ window.getIndex = function getIndex(target, _canvas = null) {
// 使用 window.canvas 作为默认值,确保在 eval() 执行时也能访问
const currentCanvas = _canvas || window.canvas || canvas;
if (!currentCanvas) {
- console.error('getIndex: canvas is undefined');
return 0;
}
temp_objs = currentCanvas.getObjects();
@@ -1487,7 +1578,7 @@ function addBackground() {
canvas2.renderAll()
recordObjs2.push(JSON.stringify(objs2))
- recordJson2.push(canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']))
+ recordJson2.push(canvas2.toJSON(TO_JSON_PROPERTIES))
let file = GetFile().get('file')
if (file && file != 'empty') {
@@ -1909,12 +2000,16 @@ var circle_text_size = slider.render({
max: 120,
value: 50,
change: function (value) {
- if (circle_text_size_updating) return; // 如果正在更新slider,跳过change事件
- if (canvas.getActiveObject()) {
+ if (circle_text_size_updating) return;
+ if (canvas && canvas.getActiveObject && canvas.getActiveObject()) {
canvas.getActiveObject().set('fontSize', value);
canvas.renderAll();
- updateControls();
- recordState();
+ if (typeof updateControls === 'function') {
+ updateControls();
+ }
+ if (typeof recordState === 'function') {
+ recordState();
+ }
}
}
});
@@ -1925,11 +2020,15 @@ var circle_text_diameter = slider.render({
max: 1100,
value: 500,
change: function (value) {
- if (canvas.getActiveObject()) {
+ if (canvas && canvas.getActiveObject && canvas.getActiveObject()) {
canvas.getActiveObject().set('diameter', value);
canvas.renderAll();
- updateControls();
- recordState();
+ if (typeof updateControls === 'function') {
+ updateControls();
+ }
+ if (typeof recordState === 'function') {
+ recordState();
+ }
}
}
});
@@ -2030,17 +2129,14 @@ window.savePdf = async function savePdf(buffer) {
});
if (canceled) {
- console.log('用户取消了保存操作');
return;
}
// 将Buffer写入PDF文件到用户选择的路径
fs.writeFile(filePath, buffer, (err) => {
if (err) {
- console.error('写入文件失败:', err);
} else {
layer.msg(language_str("saveSucc") + filePath);//'保存成功至'
- console.log('PDF文件已保存至:', filePath);
}
});
};
diff --git a/lib/design2/output.js b/lib/design2/output.js
index 7be7afb..e957e3f 100644
--- a/lib/design2/output.js
+++ b/lib/design2/output.js
@@ -346,8 +346,6 @@ window.display_func = function display_func(img1, img2, img3) {
// 只处理导出(保存PDF)
if (typeof window.savePdf === 'function') {
window.savePdf(Buffer.from(pdfBuffer));
- } else {
- console.error('savePdf 函数未定义!');
}
},
btn2: function () {
@@ -1045,8 +1043,9 @@ function saveAs(op1, callback) {
}
})
- let j = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])
- let b = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])
+ const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented'];
+ let j = canvas1.toJSON(props)
+ let b = canvas2.toJSON(props)
// 恢复辅助线
guideLines1.forEach(obj => canvas1.add(obj))
@@ -1112,8 +1111,9 @@ function save(op1, callback) {
}
})
- let j = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])
- let b = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])
+ const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented'];
+ let j = canvas1.toJSON(props)
+ let b = canvas2.toJSON(props)
// 恢复辅助线
guideLines1.forEach(obj => canvas1.add(obj))
@@ -1248,15 +1248,31 @@ window.openFile = function open(file) {
// 加载 JSON,并在回调中重新生成二维码和条形码
canvas1.loadFromJSON(j.f, function () {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas1);
+ }
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
window.regenerateQrCodesAndBarcodes(canvas1, fo);
}
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
canvas1.renderAll()
})
canvas2.loadFromJSON(j.b, function () {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas2);
+ }
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
window.regenerateQrCodesAndBarcodes(canvas2, bo);
}
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
canvas2.renderAll()
})
background_image1 = canvas1.getObjects()[0]
@@ -1296,19 +1312,18 @@ window.openFile = function open(file) {
setTimeout(() => {
if (typeof window.updateList === 'function') {
window.updateList();
- } else {
- console.error('[open函数] ❌ updateList 函数未定义!');
}
}, 100);
}
setTimeout(() => {
recordObjs1.push(JSON.stringify(objs1))
- let j1 = canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])
+ const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented'];
+ let j1 = canvas1.toJSON(props)
j1.objects[0].hoverCursor = 'default'
recordJson1.push(j1)
recordObjs2.push(JSON.stringify(objs2))
- let j2 = canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])
+ let j2 = canvas2.toJSON(props)
j2.objects[0].hoverCursor = 'default'
recordJson2.push(j2)
}, 0)
@@ -1359,12 +1374,9 @@ function clearAll() {
setTimeout(() => {
if (typeof window.updateList === 'function') {
window.updateList();
- } else {
- console.error('[clearAll] ❌ updateList 函数未定义!');
}
}, 100);
}
- console.log()
}
// 将 clearAll 附加到 window 对象,确保全局可访问
diff --git a/lib/design2/ui.js b/lib/design2/ui.js
index fc7d430..f7b97ce 100644
--- a/lib/design2/ui.js
+++ b/lib/design2/ui.js
@@ -79,14 +79,14 @@ $('body').keydown(function (event) {
window.pasteFromClipboard();
return;
}
- // CTRL/CMD+SHIFT+DEL - 清空
- if (isModifierKey && event.shiftKey && event.keyCode == 46) {
+ // CTRL/CMD+SHIFT+DEL (Windows) 或 CMD+SHIFT+Backspace (Mac) - 清空
+ if (isModifierKey && event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
event.preventDefault();
$('#clean').click();
return;
}
- // CTRL/CMD+DEL - 删除
- if (isModifierKey && !event.shiftKey && event.keyCode == 46) {
+ // CTRL/CMD+DEL (Windows) 或 CMD+Backspace (Mac) - 删除
+ if (isModifierKey && !event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
event.preventDefault();
$('#delete').click();
return;
@@ -156,17 +156,24 @@ $('body').keydown(function (event) {
}
if (event.keyCode == 40) {
//down
- let v = +1
+ let v = 1;
if (_keyctrl || event.ctrlKey || event.metaKey) {
- v = 5
+ v = 5;
}
- if (canvas.getActiveObject()) {
- let y = canvas.getActiveObject().get('top')
- y += v
- canvas.getActiveObject().set('top', y)
- canvas.renderAll()
- recordState()
- updateControls()
+ const currentCanvas = window.canvas || canvas;
+ if (currentCanvas && currentCanvas.getActiveObject()) {
+ let y = currentCanvas.getActiveObject().get('top');
+ y += v;
+ currentCanvas.getActiveObject().set('top', y);
+ currentCanvas.renderAll();
+ if (typeof window.recordState === 'function') {
+ window.recordState();
+ } else if (typeof recordState === 'function') {
+ recordState();
+ }
+ if (typeof updateControls === 'function') {
+ updateControls();
+ }
}
}
// 普通删除键(DEL键,没有按CTRL/CMD)
@@ -175,7 +182,6 @@ $('body').keydown(function (event) {
const currentCanvas = window.canvas || canvas;
const currentObjs = window.objs || objs;
if (!currentCanvas) {
- console.error('canvas is undefined in delete handler');
return;
}
let actObjs = currentCanvas.getActiveObjects()
@@ -194,10 +200,14 @@ $('body').keydown(function (event) {
}
currentCanvas.discardActiveObject()
if (flag == 1) {
- recordState()
- canvas.renderAll()
+ if (typeof window.recordState === 'function') {
+ window.recordState();
+ } else if (typeof recordState === 'function') {
+ recordState();
+ }
+ currentCanvas.renderAll();
if (typeof window.handleObjectSelected === 'function') {
- window.handleObjectSelected()
+ window.handleObjectSelected();
}
}
}
@@ -607,7 +617,7 @@ $('#center_y_alignment').click(function () {
let itemMaxY = getCoordsMaxY(coords)
if (itemMinY < minTop) minTop = itemMinY
if (itemMaxY > maxBottom) maxBottom = itemMaxY
- }
+ }
let groupCenterY = (minTop + maxBottom) / 2
// 将所有对象对齐到中心Y值
groupItems = []
@@ -754,7 +764,7 @@ $('#center_x_alignment').click(function () {
let itemMaxX = getCoordsMaxX(coords)
if (itemMinX < minLeft) minLeft = itemMinX
if (itemMaxX > maxRight) maxRight = itemMaxX
- }
+ }
let groupCenterX = (minLeft + maxRight) / 2
// 将所有对象对齐到中心X值
groupItems = []
@@ -893,20 +903,40 @@ $('#previous').click(function () {
if ($('#front_side').hasClass('ui-button-active')) {
// 使用 recordJson1 和 recordObjs1
if (recordJson1 && recordJson1[step.val]) {
- canvas.loadFromJSON(recordJson1[step.val])
+ canvas.loadFromJSON(recordJson1[step.val], function() {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas);
+ }
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ canvas.renderAll();
+ })
}
if (recordObjs1 && recordObjs1[step.val]) {
objs1 = JSON.parse(recordObjs1[step.val])
- objs = objs1
+ objs = objs1
}
} else if ($('#back_side').hasClass('ui-button-active')) {
// 使用 recordJson2 和 recordObjs2
if (recordJson2 && recordJson2[step.val]) {
- canvas.loadFromJSON(recordJson2[step.val])
+ canvas.loadFromJSON(recordJson2[step.val], function() {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas);
+ }
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ canvas.renderAll();
+ })
}
if (recordObjs2 && recordObjs2[step.val]) {
objs2 = JSON.parse(recordObjs2[step.val])
- objs = objs2
+ objs = objs2
}
}
@@ -938,7 +968,7 @@ $('#next').click(function () {
// 根据当前是正面还是背面检查对应的 recordObjs 长度
if ($('#front_side').hasClass('ui-button-active')) {
if (step.val >= recordObjs1.length - 1) {
- return
+ return
}
} else if ($('#back_side').hasClass('ui-button-active')) {
if (step.val >= recordObjs2.length - 1) {
@@ -950,20 +980,40 @@ $('#next').click(function () {
if ($('#front_side').hasClass('ui-button-active')) {
// 使用 recordJson1 和 recordObjs1
if (recordJson1 && recordJson1[step.val]) {
- canvas.loadFromJSON(recordJson1[step.val])
+ canvas.loadFromJSON(recordJson1[step.val], function() {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas);
+ }
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ canvas.renderAll();
+ })
}
if (recordObjs1 && recordObjs1[step.val]) {
objs1 = JSON.parse(recordObjs1[step.val])
- objs = objs1
+ objs = objs1
}
} else if ($('#back_side').hasClass('ui-button-active')) {
// 使用 recordJson2 和 recordObjs2
if (recordJson2 && recordJson2[step.val]) {
- canvas.loadFromJSON(recordJson2[step.val])
+ canvas.loadFromJSON(recordJson2[step.val], function() {
+ // 加载后解锁所有对象(背景除外)
+ if (typeof window.unlockAllObjects === 'function') {
+ window.unlockAllObjects(canvas);
+ }
+ // 加载后更新列表和图标显示
+ if (typeof window.updateList === 'function') {
+ window.updateList();
+ }
+ canvas.renderAll();
+ })
}
if (recordObjs2 && recordObjs2[step.val]) {
objs2 = JSON.parse(recordObjs2[step.val])
- objs = objs2
+ objs = objs2
}
}
background_image = canvas.getObjects()[0]
@@ -1200,7 +1250,7 @@ $('#lock').off('click').on('click', function (e) {
let isLocked = obj.get('lockMovementX') === true;
let shouldLock = !isLocked;
- // 锁定/解锁所有编辑操作,锁定后不可选中
+ // 锁定/解锁所有编辑操作,但保持选中状态(不取消选中)
obj.set({
lockMovementX: shouldLock,
lockMovementY: shouldLock,
@@ -1209,29 +1259,23 @@ $('#lock').off('click').on('click', function (e) {
lockScalingY: shouldLock,
lockSkewingX: shouldLock,
lockSkewingY: shouldLock,
- // 锁定时不可选中,解锁时可选中
+ // 锁定时不可选中,解锁时可选中(但保持当前选中状态)
selectable: !shouldLock,
evented: !shouldLock
});
if (shouldLock) {
$('#lock_img').attr('src', 'public/images/lock20.png') //已锁定
- // 锁定后取消选中
- canvas.discardActiveObject();
- canvas.renderAll();
- // 锁定后不需要调用 updateControls,因为已经没有选中对象了
} else {
$('#lock_img').attr('src', 'public/images/unlock20.png') //已解锁
- // 解锁后更新控件
- updateControls();
}
+ // 更新控件(保持选中状态,所以可以更新)
+ updateControls();
recordState()
// 更新对象列表以同步锁状态
if (typeof window.updateList === 'function') {
window.updateList();
}
- if (!shouldLock) {
- canvas.renderAll();
- }
+ canvas.renderAll();
})
$('#text_back_transparent').click(function () {
canvas.getActiveObject().set('textBackgroundColor', '')
@@ -1376,12 +1420,9 @@ $('#open').click(function () {
// 调用 output.js 中的 openFile 函数
if (typeof window.openFile === 'function') {
window.openFile(filePath);
- } else {
- console.error('openFile 函数未定义!');
}
})
.catch((err) => {
- console.log(err);
})
}
})
@@ -1423,7 +1464,8 @@ function addBackground() {
//pre_objs1.push(JSON.stringify(objs1));
recordObjs1.push(JSON.stringify(objs1))
- recordJson1.push(canvas1.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']))
+ const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented'];
+ recordJson1.push(canvas1.toJSON(props))
})
// 类型改变
fabric.Image.fromURL('./public/images/bg_back_2.png', function (image) {
@@ -1441,14 +1483,13 @@ function addBackground() {
//pre_objs2.push(JSON.stringify(objs2));
recordObjs2.push(JSON.stringify(objs2))
- recordJson2.push(canvas2.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline']))
+ const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented'];
+ recordJson2.push(canvas2.toJSON(props))
let file = GetFile().get('file')
if (file && file != 'empty') {
if (typeof window.openFile === 'function') {
window.openFile(file);
- } else {
- console.error('openFile 函数未定义!');
}
}
})
@@ -1521,15 +1562,11 @@ function selectPic(target, index) {
let activeObj = canvas.getActiveObject();
- // 检查对象是否被锁定或设为背景(索引0且已锁定)
- let idx = getIndex(activeObj, canvas);
- if (idx === 0) {
- // 如果是背景图且已锁定,不应该显示图片控件
- if (activeObj.get('lockMovementX') === true || activeObj.get('selectable') === false) {
- canvas.discardActiveObject();
- canvas.renderAll();
- return;
- }
+ // 检查对象是否被锁定
+ if (isObjectLocked(activeObj)) {
+ canvas.discardActiveObject();
+ canvas.renderAll();
+ return;
}
//透明度
@@ -2128,7 +2165,8 @@ function recordState() {
}
//recordObjs.splice(step.val, 1, JSON.stringify(objs))
recordObjs.push(JSON.stringify(objs))
- j = canvas.toJSON(['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline'])
+ const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY', 'lockSkewingX', 'lockSkewingY', 'evented'];
+ j = canvas.toJSON(props)
j.objects[0].hoverCursor = 'default'
recordJson.push(j)
}
@@ -2698,7 +2736,6 @@ $("#about").click(async function () {
version = "v" + v; // 拼接一个 v,变成 v2.3.017
}
} catch (e) {
- console.error("获取版本号失败", e);
}
// 2. 获取成功后再弹出窗口
@@ -2750,721 +2787,52 @@ $("#output").click(function () {
window.output(null, saveAs); // 调用output函数,使用saveAs进行另存为
}
});
-function handleObjectSelected() {
- let select_obj = canvas.getActiveObject()
- if (!select_obj) {
- $('#base_control').hide()
- $('#line_control').hide()
- $('#pic_control').hide()
- $('#out_pic_control').hide()
- $('#text_control').hide()
- $("#circle_text_control").hide();
- $('#out_text_control').hide()
- $('#rect_control').hide()
- $('#circle_control').hide()
- $('#counter_control').hide()
- $('#qrcode_Controll').hide()
- $('#barcode_controll').hide()
- $('#component_type').text(language_str('bg')) //comfirm
- return
- }
-
- // 如果是辅助线,直接返回,不处理
- if (select_obj.isGuideLine) {
- return
- }
-
- let i = getIndex(select_obj)
- if (i != 0) {
- //不是背景
- --i
-
- // 安全检查:确保 objs[i] 存在且有 type 属性
- if (!objs[i] || typeof objs[i].type === 'undefined') {
- return
- }
-
- switch (objs[i].type) {
- case 1:
- //console.log("图片");
- $('#component_type').text(language_str('img')) //"图片"
- selectObject(select_obj, i)
- selectPic(select_obj, i)
- break
- case 2:
- //console.log("预留图片");
-
- $('#component_type').text(language_str('simg')) //"合成图片"
- selectObject(select_obj, i)
- selectOutPic(select_obj, i)
- break
- case 3:
- $('#component_type').text(language_str('text')) //"文字"
- //console.log("文字");
- selectObject(select_obj, i)
- selectText(select_obj, i)
- break
- case 4:
- //console.log("标签");
-
- $('#component_type').text(language_str('stext')) //"合成文字"
- selectObject(select_obj, i)
- selectOutText(select_obj, i)
- break
- case 5:
- //console.log("矩形");
-
- $('#component_type').text(language_str('rect')) //"矩形"
- selectObject(select_obj, i)
- selectRect(select_obj, i)
- break
- case 6:
- //console.log("圆形");
-
- $('#component_type').text(language_str('circ')) //"圆形"
- selectObject(select_obj, i)
- selectCircle(select_obj, i)
- break
- case 7:
- //console.log("直线");
-
- $('#component_type').text(language_str('line')) //"直线"
- selectObject(select_obj, i)
- selectLine(select_obj, i)
- break
- case 8:
- //console.log("二维码");
-
- $('#component_type').text(language_str('qrc')) //"二维码"
- selectObject(select_obj, i)
- selectQrCode(select_obj, i)
- break
- case 9:
- //console.log("条形码");
-
- $('#component_type').text(language_str('barc')) //"条形码"
- selectObject(select_obj, i)
- selectBarCode(select_obj, i)
- break
- case 10:
- //console.log("计数器");
-
- $('#component_type').text(language_str('counter')) //"计数器"
- selectObject(select_obj, i)
- selectCounter(select_obj, i)
- break
- case 11:
-
- $("#component_type").text(language_str("ctext"));//"圆形文字"
- //console.log("圆形文字");
- selectObject(select_obj, i);
- selectCircleText(select_obj, i);
- break;
- }
- } else {
- //背景,收起对象属性
- $('#base_control').hide()
- $('#line_control').hide()
- $('#pic_control').hide()
- $('#out_pic_control').hide()
- $('#text_control').hide()
- $("#circle_text_control").hide();
- $('#out_text_control').hide()
- $('#rect_control').hide()
- $('#circle_control').hide()
- $('#counter_control').hide()
- $('#qrcode_Controll').hide()
- $('#barcode_controll').hide()
- $('#component_type').text(language_str('bg'))
- }
-}
// 防止重复初始化事件监听器
if (typeof window._design2CanvasEventsInitialized === 'undefined') {
window._design2CanvasEventsInitialized = true;
- canvas1.on('mouse:move', (e) => {
- if (!e.pointer || typeof background_image === 'undefined' || !background_image) return;
- let width = canvas.getWidth()
- let height = canvas.getHeight()
- $('#posText').text(
- 'X: ' + (e.pointer.x - (width / 2 - (width / 2 - background_image.left) * zoom)).toFixed(0) + ' Y: ' + (e.pointer.y - (height / 2 - (height / 2 - background_image.top) * zoom)).toFixed(0)
- )
- })
- canvas1.on("object:moving", function (e) {
- let obj = canvas1.getActiveObject()
- let idx = getIndex(e.target, canvas1);
- // 添加边界检查,避免访问 undefined
- if (idx > 0 && idx <= objs1.length && objs1[idx - 1] && objs1[idx - 1].type && objs1[idx - 1].type === 11 && $("#circle_text_center").prop("checked")) {
- let pointer = {
- x: obj.left,
- y: obj.top
- }
- let distance = getDisdance(pointer.x, pointer.y, canvas1.width / 2, canvas1.height / 2)
- let angleDeg = getDeg(pointer)
- let flipped = pointer.y > canvas1.height / 2 ? true : false
- if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter.setValue) {
- circle_text_diameter.setValue(distance * 2 - 50);
- }
- obj.set("diameter", distance * 2);
- obj.set("angle", angleDeg);
- obj.set("flipped", flipped);
- }
- updateControls();
- });
- canvas1.on('object:scaling', function (event) {
- updateControls();
- })
- canvas1.on('object:rotating', function (e) {
- updateControls()
- })
- canvas1.on('object:rotated', function (e) {
- recordState()
- })
- canvas1.on('object:added', function (e) {
- //recordState();
- })
- canvas1.on('mouse:down', (e) => {
- //单选
- canvas = canvas1;
- objs = objs1;
- let select_obj = canvas.getActiveObject()
+// 所有 canvas 事件已在 core.js 的 initCanvasEvents() 中统一处理,这里不再重复监听
+// 如果需要 canvas1 特定的 mouse:move 处理,可以在这里添加
+canvas1.on('mouse:move', (e) => {
+ if (!e.pointer || typeof background_image === 'undefined' || !background_image) return;
+ let width = canvas.getWidth()
+ let height = canvas.getHeight()
+ $('#posText').text(
+ 'X: ' + (e.pointer.x - (width / 2 - (width / 2 - background_image.left) * zoom)).toFixed(0) + ' Y: ' + (e.pointer.y - (height / 2 - (height / 2 - background_image.top) * zoom)).toFixed(0)
+ )
+})
+// 注意:以下事件已在 core.js 的 initCanvasEvents() 中统一处理,移除重复监听以避免冲突:
+// - mouse:down (通过 handleObjectSelected 处理)
+// - object:scaling, object:rotating, object:rotated
+// - text:editing:entered, text:editing:exited
+// - object:modified (已在 core.js 中处理)
+// - mouse:up (已在 core.js 中处理)
+// 如果需要 canvas1 特定的处理逻辑,请修改 core.js 中的相应函数
- // 如果是辅助线,直接返回,不处理
- if (select_obj && select_obj.isGuideLine) {
- return
- }
-
- let i = getIndex(select_obj, canvas)
- if (i != 0) {
- //不是背景
- --i
-
- // 安全检查:确保 objs[i] 存在且有 type 属性
- if (!objs[i] || typeof objs[i].type === 'undefined') {
- return
- }
-
- switch (objs[i].type) {
- case 1:
- $('#component_type').text(language_str('img'))
- selectObject(select_obj, i)
- selectPic(select_obj, i)
- break
- case 2:
- $('#component_type').text(language_str('simg'))
- selectObject(select_obj, i)
- selectOutPic(select_obj, i)
- break
- case 3:
- $('#component_type').text(language_str('text'))
- selectObject(select_obj, i)
- selectText(select_obj, i)
- break
- case 4:
- $('#component_type').text(language_str('stext'))
- selectObject(select_obj, i)
- selectOutText(select_obj, i)
- break
- case 5:
- $('#component_type').text(language_str('rect'))
- selectObject(select_obj, i)
- selectRect(select_obj, i)
- break
- case 6:
- $('#component_type').text(language_str('circ'))
- selectObject(select_obj, i)
- selectCircle(select_obj, i)
- break
- case 7:
- $('#component_type').text(language_str('line'))
- selectObject(select_obj, i)
- selectLine(select_obj, i)
- break
- case 8:
- $('#component_type').text(language_str('qrc'))
- selectObject(select_obj, i)
- selectQrCode(select_obj, i)
- break
- case 9:
- $('#component_type').text(language_str('barc'))
- selectObject(select_obj, i)
- selectBarCode(select_obj, i)
- break
- case 10:
- $('#component_type').text(language_str('counter'))
- selectObject(select_obj, i)
- selectCounter(select_obj, i)
- break
- case 11:
- $("#component_type").text(language_str("ctext"));
- selectObject(select_obj, i);
- selectCircleText(select_obj, i);
- break;
- }
- selectObj(i, true)
- } else {
- //背景,收起对象属性
- $('#base_control').hide()
- $('#line_control').hide()
- $('#pic_control').hide()
- $('#out_pic_control').hide()
- $('#text_control').hide()
- $("#circle_text_control").hide();
- $('#out_text_control').hide()
- $('#rect_control').hide()
- $('#circle_control').hide()
- $('#qrcode_Controll').hide()
- $('#barcode_controll').hide()
- $('#counter_control').hide()
- selectObj(-1)
- $('#component_type').text(language_str('bg'))
- }
- })
- canvas1.on('text:editing:entered', function () {
- _textEdit = true
- })
- canvas1.on('text:editing:exited', function () {
- _textEdit = false
- })
- canvas1.on('object:modified', function (event) {
- if (canvas1.getActiveObjects().length > 1) {
- return
- }
-
- // 跳过辅助线
- if (event.target.isGuideLine) {
- return
- }
-
- let idx = getIndex(event.target, canvas1);
- if (idx <= 0) return;
-
- // 安全检查:确保 objs[idx - 1] 存在且有 type 属性
- if (!objs[idx - 1] || typeof objs[idx - 1].type === 'undefined') {
- return
- }
-
- if (objs[idx - 1].type == 3) {
- event.target.fontSize *= event.target.scaleX
- event.target.fontSize = event.target.fontSize.toFixed(0)
- event.target.scaleX = 1
- event.target.scaleY = 1
- event.target._clearCache()
- canvas1.renderAll()
- updateControls()
- } else if (objs[idx - 1].type == 4) {
- event.target.fontSize *= event.target.scaleX
- event.target.fontSize = event.target.fontSize.toFixed(0)
- event.target.scaleX = 1
- event.target.scaleY = 1
- event.target._clearCache()
- canvas1.renderAll()
- } else if (objs[idx - 1].type == 10) {
- event.target.fontSize *= event.target.scaleX
- event.target.fontSize = event.target.fontSize.toFixed(0)
- event.target.scaleX = 1
- event.target.scaleY = 1
- event.target._clearCache()
- canvas1.renderAll()
- } else if (objs[idx - 1].type == 5) {
- canvas1.getActiveObject().set('width', canvas1.getActiveObject().get('width') * canvas1.getActiveObject().get('scaleX'))
- canvas1.getActiveObject().set('height', canvas1.getActiveObject().get('height') * canvas1.getActiveObject().get('scaleY'))
- canvas1.getActiveObject().set('scaleX', 1)
- canvas1.getActiveObject().set('scaleY', 1)
- updateControls()
- }
- recordState()
- })
- canvas1.on('mouse:up', (e) => {
- canvas = canvas1;
- objs = objs1;
- switch (addState) {
- case 1:
- addPic(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addPic').css('background-color', '')
- break
- case 2:
- addOutPic(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addOutPic').css('background-color', '')
- break
- case 3:
- addText(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addText').css('background-color', '')
- break
- case 4:
- addOutText(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addOutText').css('background-color', '')
- break
- case 5:
- addRect(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addRect').css('background-color', '')
- break
- case 6:
- addCircle(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addCircle').css('background-color', '')
- break
- case 7:
- addLine(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addLine').css('background-color', '')
- break
- case 8:
- addQrCode(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addQrCode').css('background-color', '')
- break
- case 9:
- addBarCode(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas1.renderAll()
- $('#addBarCode').css('background-color', '')
- break
- case 10:
- addCounter(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- $('#addCounter').css('background-color', '')
- break
- case 11:
- addCircleText(e.pointer);
- addState = 0;
- background_image.hoverCursor = "default";
- canvas1.renderAll();
- $("#addCircleText").css("background-color", "");
- break;
- }
- })
- canvas1.on('text:changed', (e) => {
- $('#text_text').val(e.target.get('text'))
- })
- canvas1.on('after:render', function () {
- if (is_bgi_add) {
- var image = document.getElementById('source_front')
- ctx1.drawImage(image, (canvas.width - $('#source_front').width()) / 2, (canvas.height - $('#source_front').height()) / 2, $('#source_front').width(), $('#source_front').height())
- }
- })
- canvas2.on('text:editing:entered', function () {
- _textEdit = true
- })
- canvas2.on('text:editing:exited', function () {
- _textEdit = false
- })
- canvas2.on('after:render', function () {
- if (is_bgi_add) {
- var image = document.getElementById('source_back')
- ctx2.drawImage(image, (canvas.width - $('#source_back').width()) / 2, (canvas1.height - $('#source_back').height()) / 2, $('#source_back').width(), $('#source_back').height())
- }
- })
- canvas2.on('mouse:move', (e) => {
- if (!e.pointer || typeof background_image === 'undefined' || !background_image) return;
- canvas = canvas2;
- objs = objs2;
- $('#posText').text('X: ' + (e.pointer.x - background_image.left).toFixed(0) + ' Y: ' + (e.pointer.y - background_image.top).toFixed(0))
- })
- canvas2.on("object:moving", function (e) {
- canvas = canvas2;
- objs = objs2;
- let obj = canvas2.getActiveObject()
- let idx = getIndex(e.target, canvas2);
- // 添加边界检查,避免访问 undefined
- if (idx > 0 && idx <= objs2.length && objs2[idx - 1] && objs2[idx - 1].type && objs2[idx - 1].type === 11 && $("#circle_text_center").prop("checked")) {
- let pointer = {
- x: obj.left,
- y: obj.top
- }
- let distance = getDisdance(pointer.x, pointer.y, canvas2.width / 2, canvas2.height / 2)
- // 计算角度时需要使用 canvas2
- let centerX = canvas2.width / 2;
- let centerY = canvas2.height / 2;
- let mouseX = pointer.x;
- let mouseY = pointer.y;
- let dx = mouseX - centerX;
- let dy = mouseY - centerY;
- let angleRad = Math.atan2(dy, dx);
- let angleDeg = angleRad * (180 / Math.PI);
- if (angleDeg < 0) {
- angleDeg += 360;
- }
- angleDeg += 90;
- let flipped = pointer.y > canvas2.height / 2 ? true : false
- if (typeof circle_text_diameter !== 'undefined' && circle_text_diameter.setValue) {
- circle_text_diameter.setValue(distance * 2 - 50);
- }
- obj.set("diameter", distance * 2);
- obj.set("angle", angleDeg);
- obj.set("flipped", flipped);
- }
- updateControls();
- });
- canvas2.on('object:scaling', function (e) {
- canvas = canvas2;
- objs = objs2;
- updateControls()
- })
- canvas2.on('object:rotating', function (e) {
- canvas = canvas2;
- objs = objs2;
- updateControls()
- })
- canvas2.on('object:rotated', function (e) {
- canvas = canvas2;
- objs = objs2;
- recordState()
- })
- canvas2.on('object:added', function (e) {
- //recordState();
- })
- canvas2.on('mouse:down', (e) => {
- //单选
- canvas = canvas2;
- objs = objs2;
- let select_obj = canvas.getActiveObject()
-
- // 如果是辅助线,直接返回,不处理
- if (select_obj && select_obj.isGuideLine) {
- return
- }
-
- let i = getIndex(select_obj, canvas)
- if (i != 0) {
- //不是背景
- --i
-
- // 安全检查:确保 objs[i] 存在且有 type 属性
- if (!objs[i] || typeof objs[i].type === 'undefined') {
- return
- }
-
- switch (objs[i].type) {
- case 1:
- $('#component_type').text(language_str('img'))
- selectObject(select_obj, i)
- selectPic(select_obj, i)
- break
- case 2:
- $('#component_type').text(language_str('simg'))
- selectObject(select_obj, i)
- selectOutPic(select_obj, i)
- break
- case 3:
- $('#component_type').text(language_str('text'))
- selectObject(select_obj, i)
- selectText(select_obj, i)
- break
- case 4:
- $('#component_type').text(language_str('stext'))
- selectObject(select_obj, i)
- selectOutText(select_obj, i)
- break
- case 5:
- $('#component_type').text(language_str('rect'))
- selectObject(select_obj, i)
- selectRect(select_obj, i)
- break
- case 6:
- $('#component_type').text(language_str('circ'))
- selectObject(select_obj, i)
- selectCircle(select_obj, i)
- break
- case 7:
- $('#component_type').text(language_str('line'))
- selectObject(select_obj, i)
- selectLine(select_obj, i)
- break
- case 8:
- $('#component_type').text(language_str('qrc'))
- selectObject(select_obj, i)
- selectQrCode(select_obj, i)
- break
- case 9:
- $('#component_type').text(language_str('barc'))
- selectObject(select_obj, i)
- selectBarCode(select_obj, i)
- break
- case 10:
- $('#component_type').text(language_str('counter'))
- selectObject(select_obj, i)
- selectCounter(select_obj, i)
- break
- case 11:
- $("#component_type").text(language_str("ctext"));
- selectObject(select_obj, i);
- selectCircleText(select_obj, i);
- break;
- }
- selectObj(i, true)
- } else {
- //背景,收起对象属性
- $('#base_control').hide()
- $('#line_control').hide()
- $('#pic_control').hide()
- $('#out_pic_control').hide()
- $('#text_control').hide()
- $("#circle_text_control").hide();
- $('#out_text_control').hide()
- $('#rect_control').hide()
- $('#circle_control').hide()
- $('#qrcode_Controll').hide()
- $('#barcode_controll').hide()
- $('#counter_control').hide()
- selectObj(-1)
- $('#component_type').text(language_str('bg'))
- }
- })
- canvas2.on('object:modified', function (event) {
- canvas = canvas2;
- objs = objs2;
- if (canvas.getActiveObjects().length > 1) {
- return
- }
-
- // 跳过辅助线
- if (event.target.isGuideLine) {
- return
- }
-
- let idx = getIndex(event.target, canvas2);
- if (idx <= 0) return;
-
- // 安全检查:确保 objs[idx - 1] 存在且有 type 属性
- if (!objs[idx - 1] || typeof objs[idx - 1].type === 'undefined') {
- return
- }
-
- if (objs[idx - 1].type == 3) {
- event.target.fontSize *= event.target.scaleX
- event.target.fontSize = event.target.fontSize.toFixed(0)
- event.target.scaleX = 1
- event.target.scaleY = 1
- event.target._clearCache()
- canvas2.renderAll()
- } else if (objs[idx - 1].type == 4) {
- event.target.fontSize *= event.target.scaleX
- event.target.fontSize = event.target.fontSize.toFixed(0)
- event.target.scaleX = 1
- event.target.scaleY = 1
- event.target._clearCache()
- canvas2.renderAll()
- } else if (objs[idx - 1].type == 10) {
- event.target.fontSize *= event.target.scaleX
- event.target.fontSize = event.target.fontSize.toFixed(0)
- event.target.scaleX = 1
- event.target.scaleY = 1
- event.target._clearCache()
- canvas2.renderAll()
- } else if (objs[idx - 1].type == 5) {
- canvas2.getActiveObject().set('width', canvas2.getActiveObject().get('width') * canvas2.getActiveObject().get('scaleX'))
- canvas2.getActiveObject().set('height', canvas2.getActiveObject().get('height') * canvas2.getActiveObject().get('scaleY'))
- canvas2.getActiveObject().set('scaleX', 1)
- canvas2.getActiveObject().set('scaleY', 1)
- updateControls()
- }
- recordState()
- })
- canvas2.on('mouse:up', (e) => {
- canvas = canvas2;
- objs = objs2;
- switch (addState) {
- case 1:
- addPic(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addPic').css('background-color', '')
- break
- case 2:
- addOutPic(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addOutPic').css('background-color', '')
- break
- case 3:
- addText(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addText').css('background-color', '')
- break
- case 4:
- addOutText(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addOutText').css('background-color', '')
- break
- case 5:
- addRect(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addRect').css('background-color', '')
- break
- case 6:
- addCircle(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addCircle').css('background-color', '')
- break
- case 7:
- addLine(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addLine').css('background-color', '')
- break
- case 8:
- addQrCode(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addQrCode').css('background-color', '')
- break
- case 9:
- addBarCode(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- canvas2.renderAll()
- $('#addBarCode').css('background-color', '')
- break
- case 10:
- addCounter(e.pointer)
- addState = 0
- background_image.hoverCursor = 'default'
- $('#addCounter').css('background-color', '')
- break
- case 11:
- addCircleText(e.pointer);
- addState = 0;
- background_image.hoverCursor = "default";
- canvas2.renderAll();
- $("#addCircleText").css("background-color", "");
- break;
- }
- })
+// 保留 canvas1 特定的 after:render 处理
+canvas1.on('after:render', function () {
+ if (is_bgi_add) {
+ var image = document.getElementById('source_front')
+ ctx1.drawImage(image, (canvas.width - $('#source_front').width()) / 2, (canvas.height - $('#source_front').height()) / 2, $('#source_front').width(), $('#source_front').height())
+ }
+})
+// 保留 canvas1 特定的 text:changed 处理
+canvas1.on('text:changed', (e) => {
+ $('#text_text').val(e.target.get('text'))
+})
+// 保留 canvas2 特定的 after:render 处理
+canvas2.on('after:render', function () {
+ if (is_bgi_add) {
+ var image = document.getElementById('source_back')
+ ctx2.drawImage(image, (canvas.width - $('#source_back').width()) / 2, (canvas1.height - $('#source_back').height()) / 2, $('#source_back').width(), $('#source_back').height())
+ }
+})
+// 注意:以下事件已在 core.js 的 initCanvasEvents() 中统一处理,移除重复监听以避免冲突:
+// - mouse:down (通过 handleObjectSelected 处理)
+// - mouse:up (已在 core.js 中处理)
+// - object:scaling, object:rotating, object:rotated, object:added
+// - text:editing:entered, text:editing:exited
+// - object:modified (已在 core.js 中处理)
+// 如果需要 canvas2 特定的处理逻辑,请修改 core.js 中的相应函数
}