@@ -28,7 +28,22 @@
{
tier: NODE_DATATIER.SURFACE_EDIT,
type: NODE_DATATYPE.SURFACE_EDIT,
- title: 'Surface Edit'
+ title: 'Surface Edit',
+ secondaryMenu: {
+ title: 'Surface Edit',
+ icon: NODE_DATATYPE.SURFACE_EDIT,
+ selectList: [
+ {
+ tier: NODE_DATATIER.CANVAS_MODE,
+ type: NODE_DATATYPE.CANVAS_MODE,
+ title: 'Surface Edit (Canvas)',
+ },{
+ tier: NODE_DATATIER.Fast_MODE,
+ type: NODE_DATATYPE.Fast_MODE,
+ title: 'Surface Edit',
+ },
+ ]
+ }
},
{
tier: NODE_DATATIER.SCENE_COMPOSITION,
@@ -55,15 +70,27 @@
const id = props.node.id
if (!id) return
stateManager.deleteNode(id)
- const superiorID = props.node.data.superiorID
- nodeManager.createCardNode({
- data: {
- tier: v.tier,
- type: v.type,
- superiorID,
- originalImage: props.node.data?.originalImage,
- }
- })
+ console.log(props.node)
+ if(v.secondaryMenu){
+ nodeManager.createCardsSelect({
+ data: {
+ tier: props.node.data?.tier,
+ superiorID: props.node.data?.superiorID,
+ originalImage: props.node.data?.originalImage,
+ secondaryMenu: v.secondaryMenu
+ }
+ })
+ }else{
+ const superiorID = props.node.data.superiorID
+ nodeManager.createCardNode({
+ data: {
+ tier: v.tier,
+ type: v.type,
+ superiorID,
+ originalImage: props.node.data?.originalImage,
+ }
+ })
+ }
}
defineExpose({})
diff --git a/src/components/Canvas/FlowCanvas/components/nodes/cards/fast-mode.vue b/src/components/Canvas/FlowCanvas/components/nodes/cards/fast-mode.vue
new file mode 100644
index 0000000..bdf6c78
--- /dev/null
+++ b/src/components/Canvas/FlowCanvas/components/nodes/cards/fast-mode.vue
@@ -0,0 +1,77 @@
+
+
+
+
Output
+
+
![]()
+
+
+
+
+
+
+
diff --git a/src/components/Canvas/FlowCanvas/components/nodes/cards/index.vue b/src/components/Canvas/FlowCanvas/components/nodes/cards/index.vue
index ee7c74c..41da0ec 100644
--- a/src/components/Canvas/FlowCanvas/components/nodes/cards/index.vue
+++ b/src/components/Canvas/FlowCanvas/components/nodes/cards/index.vue
@@ -2,13 +2,13 @@
+
@@ -31,6 +37,7 @@
import CardsSelect from './cards-select.vue'
import ToRealStyle from './to-real-style.vue'
import SurfaceEdit from './surface-edit.vue'
+ import FastMode from './fast-mode.vue'
import SceneComposition from './scene-composition.vue'
import ColorPalette from './color-palette.vue'
import To3View from './to-3view.vue'
@@ -41,6 +48,8 @@
// import ToVideo from './to-video.vue'
// import AddPrint from './add-print.vue'
// import ToCAD from './to-cad.vue'
+ const attrs = useAttrs()
+ const componentRef = ref(null)
const components = [
{
tier: NODE_DATATIER.CARDS_SELECT,
@@ -58,12 +67,23 @@
api: toRealStyleApi
},
{
- tier: NODE_DATATIER.SURFACE_EDIT,
- type: NODE_DATATYPE.SURFACE_EDIT,
+ tier: NODE_DATATIER.Fast_MODE,
+ type: NODE_DATATYPE.Fast_MODE,
title: 'Surface Edit',
component: SurfaceEdit,
api: sketchAddPrintApi
},
+ {
+ tier: NODE_DATATIER.CANVAS_MODE,
+ type: NODE_DATATYPE.CANVAS_MODE,
+ title: 'Surface Edit (Canvas)',
+ component: FastMode,
+ hideFooter: true,
+ showCanvasEdit: true,
+ on: ()=>{
+ componentRef.value?.opCanvas()
+ }
+ },
{
tier: NODE_DATATIER.SCENE_COMPOSITION,
type: NODE_DATATYPE.SCENE_COMPOSITION,
@@ -117,11 +137,9 @@
default: () => ({})
}
})
- const attrs = useAttrs()
const currentComponent = computed(() => {
return components.find((item) => item.type === props.type)
})
- const componentRef = ref(null)
const onGenerateClick = async () => {
const data = componentRef.value?.getApiData?.() || {}
@@ -140,13 +158,16 @@
}) || []
// const taskList = [{taskId:'123'}]
// if (!subordNode) {
+
+ //如果是添加印花的结果就作为一级节点可以再次选择添加印花或者生成真实图
+ let tier = NODE_DATATIER.Fast_MODE == currentComponent.value.tier?0:currentComponent.value.tier
taskList.forEach((item,index) => {
nodeManager.createResultNode({
data: {
superiorID: attrs.node.id,
superiorNodeType: attrs.node?.data?.type,
createIndexPosition: index + subordNodes.length,
- tier: currentComponent.value.tier,
+ tier: tier,
isActive: index == 0 && subordNodes.length == 0,
data: {
imageProcessTasks:[item],
@@ -251,6 +272,7 @@
font-size: 12px;
font-family: SemiBold;
cursor: pointer;
+
&:active {
opacity: 0.5;
}
@@ -260,6 +282,12 @@
margin-right: 4px;
}
}
+ &.canvasEdit{
+ > button{
+ margin: 0 8px;
+ width: 201px;
+ }
+ }
}
}
diff --git a/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue b/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue
index 64176b8..81f9d70 100644
--- a/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue
+++ b/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue
@@ -181,7 +181,7 @@
])
const onPreview = (item: any) => {
if(data.superiorNodeType == NODE_DATATYPE.TO_3D_MODEL){
- openThreeModelPreview({url:item?.glbPath,glbInfoObj:item?.glbInfoObj})
+ openThreeModelPreview({glbPath:item?.glbPath,glbInfoObj:item?.glbInfoObj})
}else{
openImagePreview(item.url)
}
diff --git a/src/components/Canvas/FlowCanvas/components/tools/threeModel/index.vue b/src/components/Canvas/FlowCanvas/components/tools/threeModel/index.vue
index fc522db..dee681c 100644
--- a/src/components/Canvas/FlowCanvas/components/tools/threeModel/index.vue
+++ b/src/components/Canvas/FlowCanvas/components/tools/threeModel/index.vue
@@ -18,8 +18,7 @@ let data = reactive({
const modelRef = ref(null)
onMounted(()=>{
- console.log(props?.currentData?.url)
- if(props?.currentData?.url)modelRef.value.open(props?.currentData?.url)
+ if(props?.currentData?.glbPath)modelRef.value.open(props?.currentData?.glbPath)
})
onUnmounted(()=>{
})
diff --git a/src/components/Canvas/FlowCanvas/tools/index.d.ts b/src/components/Canvas/FlowCanvas/tools/index.d.ts
index 49c4d93..0cd2e03 100644
--- a/src/components/Canvas/FlowCanvas/tools/index.d.ts
+++ b/src/components/Canvas/FlowCanvas/tools/index.d.ts
@@ -25,6 +25,8 @@ export const NODE_DATATYPE = {
CARDS_SELECT: 'cards-select',
TO_REAL_STYLE: 'to-real-style',
SURFACE_EDIT: 'surface-edit',
+ CANVAS_MODE: 'canvas-mode',
+ Fast_MODE: 'fast-mode',
SCENE_COMPOSITION: 'scene-composition',
COLOR_PALETTE: 'color-palette',
TO_3D_MODEL: 'to-3d-model',
@@ -38,6 +40,8 @@ export const NODE_DATATIER = {
CARDS_SELECT: 0,
TO_REAL_STYLE: 1,
SURFACE_EDIT: 1,
+ CANVAS_MODE: 1,
+ Fast_MODE: 1,
SCENE_COMPOSITION: 2,
COLOR_PALETTE: 2,
TO_3D_MODEL: 2,
diff --git a/src/components/Canvas/tools/tools.ts b/src/components/Canvas/tools/tools.ts
index 3e8dab7..e08e6f5 100644
--- a/src/components/Canvas/tools/tools.ts
+++ b/src/components/Canvas/tools/tools.ts
@@ -77,4 +77,16 @@ export const base64Tofile = (base64: string,name: string) => {
// 4. 创建 File 对象(可选)
const file = new File([blob], name, { type: mime })
return file
+}
+//获取当前时间2026-03-20 11:38:29
+export const getCurrentTime = () => {
+ const now = new Date()
+ const currentTime =
+ now.getFullYear() + '-' +
+ String(now.getMonth() + 1).padStart(2, '0') + '-' +
+ String(now.getDate()).padStart(2, '0') + ' ' +
+ String(now.getHours()).padStart(2, '0') + ':' +
+ String(now.getMinutes()).padStart(2, '0') + ':' +
+ String(now.getSeconds()).padStart(2, '0')
+ return currentTime
}
\ No newline at end of file
From 8390d79e5f1ed508556623f86da4ef14b1a4cb6d Mon Sep 17 00:00:00 2001
From: lzp
Date: Fri, 20 Mar 2026 13:59:53 +0800
Subject: [PATCH 6/9] 111
---
.../Canvas/DepthCanvas/manager/CanvasManager.ts | 12 +-----------
.../Canvas/DepthCanvas/manager/LayerManager.ts | 10 +++++-----
2 files changed, 6 insertions(+), 16 deletions(-)
diff --git a/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts b/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts
index 4a89cad..5541422 100644
--- a/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts
+++ b/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts
@@ -29,17 +29,6 @@ fabric.Object.prototype.toObject = function () {
return object
}
-fabric.Image.fromURL = (function (originalFromURL) {
- return function (url, callback, imgOptions) {
- // 为所有图片请求添加 crossOrigin
- const options = {
- crossOrigin: 'anonymous', // 关键设置
- ...imgOptions
- };
- return originalFromURL.call(this, url, callback, options);
- };
-})(fabric.Image.fromURL);
-
interface CanvasInitOptions {
canvasRef: any
canvasViewWidth?: number
@@ -317,6 +306,7 @@ export class CanvasManager {
}
if (object.src) {
object.src = create(object.src)
+ object.crossOrigin = 'anonymous'
}
if (object.fill?.source) {
object.fill.source = create(object.fill.source)
diff --git a/src/components/Canvas/DepthCanvas/manager/LayerManager.ts b/src/components/Canvas/DepthCanvas/manager/LayerManager.ts
index cbf24a4..aabe849 100644
--- a/src/components/Canvas/DepthCanvas/manager/LayerManager.ts
+++ b/src/components/Canvas/DepthCanvas/manager/LayerManager.ts
@@ -156,10 +156,10 @@ export class LayerManager {
const child = options?.child || []
delete options.child
const groupObject = new fabric.Group(child, {
- subTargetCheck: true, // 关键:检测子对象
- interactive: true, // 启用交互
- hasControls: true,
- hasBorders: true,
+ // subTargetCheck: true, // 关键:检测子对象
+ // interactive: true, // 启用交互
+ // hasControls: true,
+ // hasBorders: true,
// // 子对象样式
// cornerColor: 'blue',
@@ -368,7 +368,7 @@ export class LayerManager {
}
})
resolve(img)
- })
+ }, { crossOrigin: 'anonymous' })
})
// console.log(mergedImage)
const index = this.canvasManager.getObjects().indexOf(targetLayer);
From 73845df5948ecb2c4c15b6185d149ad95ad0c1a6 Mon Sep 17 00:00:00 2001
From: lzp
Date: Fri, 20 Mar 2026 14:35:46 +0800
Subject: [PATCH 7/9] 111
---
.../Canvas/DepthCanvas/depth-canvas.vue | 4 ++--
src/components/Canvas/DepthCanvas/index.vue | 4 ++--
.../DepthCanvas/manager/CanvasManager.ts | 23 +++++++++++--------
3 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/src/components/Canvas/DepthCanvas/depth-canvas.vue b/src/components/Canvas/DepthCanvas/depth-canvas.vue
index 60e2e52..e4578cd 100644
--- a/src/components/Canvas/DepthCanvas/depth-canvas.vue
+++ b/src/components/Canvas/DepthCanvas/depth-canvas.vue
@@ -63,8 +63,8 @@
provide('stateManager', stateManager)
// 画布管理器
- const canvasManager = new CanvasManager({ stateManager })
- stateManager.setManager({ canvasManager, canvasRef })
+ const canvasManager = new CanvasManager({ stateManager, props })
+ stateManager.setManager({ canvasManager })
provide('canvasManager', canvasManager)
// 图层管理器
diff --git a/src/components/Canvas/DepthCanvas/index.vue b/src/components/Canvas/DepthCanvas/index.vue
index 210a7a4..002b998 100644
--- a/src/components/Canvas/DepthCanvas/index.vue
+++ b/src/components/Canvas/DepthCanvas/index.vue
@@ -48,13 +48,13 @@
id: config.value.canvasId || null
}
const sData = await saveDepthCanvas(data)
-
+
const canvasId = sData.id
// base64 转 file 上传转换为 url
const file = base64Tofile(options.url, 'canvas.png')
const formData = new FormData()
formData.append('file', file)
- const url = await uploadImage(formData)
+ const url = await uploadImage(formData, true)
config.value.onWorkbench?.({ url, canvasId })
dialogVisible.value = false
diff --git a/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts b/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts
index 5541422..2f8eb50 100644
--- a/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts
+++ b/src/components/Canvas/DepthCanvas/manager/CanvasManager.ts
@@ -6,6 +6,7 @@ import { detectDeviceType } from '../tools/index'
import { CanvasEventManager } from "./events/CanvasEventManager";
import { OperationType } from '../tools/layerHelper'
import { createId } from '../../tools/tools'
+import md5 from 'md5'
// 自定义画布转对象属性
fabric.Object.prototype.customProperties = ["top", "left", "width", "height", "scaleX", "scaleY", "info", "thumbnail"];
@@ -45,8 +46,10 @@ export class CanvasManager {
deviceInfo: any
canvas: any
currentZoom: any
+ uniqueId: string
constructor(options) {
this.stateManager = options.stateManager;
+ this.uniqueId = md5(options.props.config.url || Date.now());
this.deviceInfo = detectDeviceType();
this.currentZoom = ref(100)
}
@@ -279,6 +282,7 @@ export class CanvasManager {
console.error('JSON解析错误:', error)
}
if (!jsonObj) return resolve(false)
+ if (jsonObj.uniqueId) this.uniqueId = jsonObj.uniqueId
this.canvas.loadFromJSON(jsonObj, () => {
if (rerecord) this.stateManager.clearState()
this.resetZoom(false)
@@ -294,25 +298,26 @@ export class CanvasManager {
getCanvasDisUrlJSON() {
const canvas = this.canvas.toJSON()
const images = {};
- var i = 0;
- const create = (url) => {
- const key = `xxxxxxxx_${i++}_xxxxxxxx`;
- images[key] = url
- return key
+ const create = (url, key) => {
+ const key_ = `xxxxx_${this.uniqueId}_${md5(key)}_xxxxx`;
+ images[key_] = url
+ return key_
}
+ canvas.uniqueId = this.uniqueId
canvas.objects.forEach((object: any) => {
+ const id = object.info?.id
if (object.thumbnail) {
- object.thumbnail = create(object.thumbnail)
+ object.thumbnail = create(object.thumbnail, `thumbnail_${id}`)
}
if (object.src) {
- object.src = create(object.src)
+ object.src = create(object.src, `src_${id}`)
object.crossOrigin = 'anonymous'
}
if (object.fill?.source) {
- object.fill.source = create(object.fill.source)
+ object.fill.source = create(object.fill.source, `fillsource_${id}`)
}
if (object.info?.fill?.source) {
- object.info.fill.source = create(object.info.fill.source)
+ object.info.fill.source = create(object.info.fill.source, `infofillsource_${id}`)
}
})
return { canvas: JSON.stringify(canvas), images }
From 6d9b9f3f20c19806f131e394edf40b076ec8a6ad Mon Sep 17 00:00:00 2001
From: "X1627315083@163.com" <1627315083@qq.com>
Date: Fri, 20 Mar 2026 15:37:50 +0800
Subject: [PATCH 8/9] fix
---
src/components/Canvas/FlowCanvas/components/node-el.vue | 1 +
.../Canvas/FlowCanvas/components/nodes/result-image.vue | 7 ++++---
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/components/Canvas/FlowCanvas/components/node-el.vue b/src/components/Canvas/FlowCanvas/components/node-el.vue
index a6a7408..0656914 100644
--- a/src/components/Canvas/FlowCanvas/components/node-el.vue
+++ b/src/components/Canvas/FlowCanvas/components/node-el.vue
@@ -79,6 +79,7 @@
props.stateManager.nodeManager.createCardsSelect({
data: { tier: tier_, superiorID: props.node.id, originalImage }
})
+ stateManager.setActiveNodeID('')
}
const posCenter = computed(() => {
const arr = [NODE_DATATYPE.RESULT_IMAGE]
diff --git a/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue b/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue
index 81f9d70..75c304c 100644
--- a/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue
+++ b/src/components/Canvas/FlowCanvas/components/nodes/result-image.vue
@@ -4,10 +4,10 @@
-