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 0000000..60e3046 Binary files /dev/null and b/public/images/bg_back.png differ