From fef055494ec39b1f1d1644f85bd22350f762f5d4 Mon Sep 17 00:00:00 2001 From: 24kycj <1637269896@qq.com> Date: Tue, 3 Jun 2025 02:02:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=8D=E5=88=B6=E7=B2=98=E8=B4=B4=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=BF=AB=E6=8D=B7=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data.json | 2 +- design1.html | 100 ++++++++++++++++++++++++++++++++++++-- design2.html | 94 +++++++++++++++++++++++++++++++++++ public/images/bg_back.png | Bin 0 -> 17901 bytes 4 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 public/images/bg_back.png diff --git a/data.json b/data.json index 8e19de7..beeaf36 100644 --- a/data.json +++ b/data.json @@ -1 +1 @@ -{"history":[{"time":"2025-5-28","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi6.soon"},{"time":"2025-4-10","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi7.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi5.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi.soon"}]} \ No newline at end of file +{"history":[{"time":"2025-6-2","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi6.soon"},{"time":"2025-4-10","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi7.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi5.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi.soon"}]} \ No newline at end of file diff --git a/design1.html b/design1.html index ef3e84b..f046191 100644 --- a/design1.html +++ b/design1.html @@ -775,6 +775,11 @@ ipcRenderer.send('get-scale-rate'); const { clipboard } = require('electron') const dpi = 600 + // 内部剪贴板 + let clipboardData = { + objects: null, + offset: 10 // 粘贴位置偏移量 + }; //var encrypt = new JSEncrypt(); //encrypt.setPublicKey(`-----BEGIN PUBLIC KEY----- //MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDAbKQ46WevL9PapJ+AlZqSzczkTovu7STH @@ -4354,7 +4359,7 @@ recordObjs2.push(JSON.stringify(objs2)) let j2 = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); - j2.objects[0].hoverCursor = "default"; + // j2.objects[0].hoverCursor = "default"; recordJson2.push(j2); }, 0); } @@ -5001,7 +5006,6 @@ recordState(); } function selectCircleText() { - console.log(canvas.getActiveObject().get("text")) $("#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")); @@ -6191,7 +6195,7 @@ }); canvas1.on("object:moving", function (e) { let obj = canvas.getActiveObject() - if (objs[getIndex(e.target) - 1].type ===11) { + if (objs[getIndex(e.target) - 1].type && objs[getIndex(e.target) - 1].type ===11) { let pointer = { x: obj.left, y: obj.top @@ -6210,6 +6214,96 @@ } updateControls(); }); + // 监听键盘事件 + window.addEventListener('keydown', handleKeyDown); + function handleKeyDown(e) { + // 检测 Ctrl+C + if ((e.ctrlKey || e.metaKey) && e.keyCode === 67) { + copySelection(); + e.preventDefault(); // 阻止默认复制行为 + } + + // 检测 Ctrl+V + if ((e.ctrlKey || e.metaKey) && e.keyCode === 86) { + pasteFromClipboard(); + e.preventDefault(); // 阻止默认粘贴行为 + } + + // 检测 Ctrl+S + if ((e.ctrlKey || e.metaKey) && e.keyCode === 83) { + output(); + e.preventDefault(); // 阻止默认粘贴行为 + } + } + + // 复制选中对象 + function copySelection() { + const activeObjects = canvas.getActiveObjects(); + + if (!activeObjects || activeObjects.length === 0) { + console.log("未选中任何对象"); + return; + } + + // 存储原始对象用于克隆 + clipboardData.objects = activeObjects; + console.log(activeObjects) + console.log(`已复制 ${activeObjects.length} 个对象`); + } + + // 粘贴对象 + function pasteFromClipboard() { + if (!clipboardData.objects || clipboardData.objects.length === 0) { + console.log("剪贴板为空"); + return; + } + + // 克隆所有对象 + fabric.util.enlivenObjects( + clipboardData.objects.map(obj => obj.toObject()), + clonedObjects => { + // 设置新位置(添加偏移) + clonedObjects.forEach((clone, index) => { + let idx = getIndex(clipboardData.objects[index]) + console.log(clone) + clone.set({ + left: clone.left + clipboardData.offset, + top: clone.top + clipboardData.offset, + evented: true + }); + // 计算整体偏移 + const groupOffset = clone.group; + if (groupOffset) { + clone.set({ + left: groupOffset.left + clipboard.offset, + top: groupOffset.top + clipboard.offset + }); + } + + // 添加到画布 + canvas.add(clone); + let tobj = {...objs[idx-1]} + if (tobj.name) tobj.name = tobj.name + objs.length + objs.push(tobj); + canvas.renderAll(); + updateList(); + recordState(); + }); + + // 选中粘贴的对象 + canvas.discardActiveObject(); + const sel = new fabric.ActiveSelection(clonedObjects, { + canvas: canvas + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + selectObj(objs.length - 1); + // 增加下次偏移 + clipboardData.offset += 10; + } + ); + } + canvas1.on("object:scaling", function (event) { //if(objs[getIndex(event.target) - 1].type == 5 || objs[getIndex(event.target) - 1].type == 6){ // //canvas.getActiveObject().set("width", canvas.getActiveObject().get("width") * canvas.getActiveObject().get("scaleX")); diff --git a/design2.html b/design2.html index b4a9a51..19b93da 100644 --- a/design2.html +++ b/design2.html @@ -752,6 +752,11 @@ ipcRenderer.send('get-scale-rate') const { clipboard } = require('electron') const dpi = 300 + // 内部剪贴板 + let clipboardData = { + objects: null, + offset: 10 // 粘贴位置偏移量 + }; //var encrypt = new JSEncrypt(); //encrypt.setPublicKey(`-----BEGIN PUBLIC KEY----- //MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDAbKQ46WevL9PapJ+AlZqSzczkTovu7STH @@ -5629,6 +5634,95 @@ // } updateControls(); }); + // 监听键盘事件 + window.addEventListener('keydown', handleKeyDown); + function handleKeyDown(e) { + // 检测 Ctrl+C + if ((e.ctrlKey || e.metaKey) && e.keyCode === 67) { + copySelection(); + e.preventDefault(); // 阻止默认复制行为 + } + + // 检测 Ctrl+V + if ((e.ctrlKey || e.metaKey) && e.keyCode === 86) { + pasteFromClipboard(); + e.preventDefault(); // 阻止默认粘贴行为 + } + + // 检测 Ctrl+S + if ((e.ctrlKey || e.metaKey) && e.keyCode === 83) { + output(); + e.preventDefault(); // 阻止默认粘贴行为 + } + } + + // 复制选中对象 + function copySelection() { + const activeObjects = canvas.getActiveObjects(); + + if (!activeObjects || activeObjects.length === 0) { + console.log("未选中任何对象"); + return; + } + + // 存储原始对象用于克隆 + clipboardData.objects = activeObjects; + console.log(activeObjects) + console.log(`已复制 ${activeObjects.length} 个对象`); + } + + // 粘贴对象 + function pasteFromClipboard() { + if (!clipboardData.objects || clipboardData.objects.length === 0) { + console.log("剪贴板为空"); + return; + } + + // 克隆所有对象 + fabric.util.enlivenObjects( + clipboardData.objects.map(obj => obj.toObject()), + clonedObjects => { + // 设置新位置(添加偏移) + clonedObjects.forEach((clone, index) => { + let idx = getIndex(clipboardData.objects[index]) + console.log(clone) + clone.set({ + left: clone.left + clipboardData.offset, + top: clone.top + clipboardData.offset, + evented: true + }); + // 计算整体偏移 + const groupOffset = clone.group; + if (groupOffset) { + clone.set({ + left: groupOffset.left + clipboard.offset, + top: groupOffset.top + clipboard.offset + }); + } + + // 添加到画布 + canvas.add(clone); + let tobj = {...objs[idx-1]} + if (tobj.name) tobj.name = tobj.name + objs.length + objs.push(tobj); + canvas.renderAll(); + updateList(); + recordState(); + }); + + // 选中粘贴的对象 + canvas.discardActiveObject(); + const sel = new fabric.ActiveSelection(clonedObjects, { + canvas: canvas + }); + canvas.setActiveObject(sel); + canvas.requestRenderAll(); + selectObj(objs.length - 1); + // 增加下次偏移 + clipboardData.offset += 10; + } + ); + } canvas1.on('object:scaling', function (event) { //if(objs[getIndex(event.target) - 1].type == 5 || objs[getIndex(event.target) - 1].type == 6){ // //canvas.getActiveObject().set("width", canvas.getActiveObject().get("width") * canvas.getActiveObject().get("scaleX")); diff --git a/public/images/bg_back.png b/public/images/bg_back.png new file mode 100644 index 0000000000000000000000000000000000000000..60e30466488e2d7078a3d9aa370b16c0cd2eb354 GIT binary patch literal 17901 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