import {Graph} from '@antv/x6'; import {convertPortConfig} from '../constants'; /** * 添加节点到图形 * @param isNew 是否为新节点 * @param graph X6 Graph实例 * @param currentNodeDefinition 工作流节点定义 * @param allNodeDefinitions 工作流节点定义列表 * @param position 新节点的位置(可选) * @returns 创建的节点实例 */ export const addNodeToGraph = ( isNew: boolean, graph: Graph, currentNodeDefinition: any, allNodeDefinitions: any, position?: { x: number; y: number } ) => { let nodeDefinition = allNodeDefinitions.find((def: any) => def.nodeType === currentNodeDefinition.nodeType); if (!nodeDefinition) { console.error('找不到节点定义:', currentNodeDefinition.nodeType); return null; } // 合并UI变量:使用节点定义中的完整配置,但保留保存数据中的位置信息 let uiVariables = isNew ? nodeDefinition.uiVariables : { ...nodeDefinition.uiVariables, // 完整的UI配置 ...currentNodeDefinition.uiVariables // 保存的位置信息(如果有的话) }; // 根据形状类型设置正确的 shape let shape = 'rect'; // 默认使用矩形 if (uiVariables.shape === 'circle') { shape = 'circle'; } else if (uiVariables.shape === 'diamond') { shape = 'polygon'; } // 创建节点配置 const nodeConfig: any = { inherit: 'rect', width: uiVariables.size.width, height: uiVariables.size.height, attrs: { body: { ...uiVariables.style, ...(uiVariables.shape === 'diamond' ? { refPoints: '0,10 10,0 20,10 10,20', } : {}) }, label: { text: isNew ? nodeDefinition.nodeName : currentNodeDefinition.nodeName }, }, shape, nodeType: isNew ? nodeDefinition.nodeType : currentNodeDefinition.nodeType, nodeCode: nodeDefinition.nodeCode, ports: convertPortConfig(uiVariables.ports) }; // 为还原的节点设置ID,保持与保存数据的一致性 if (!isNew && currentNodeDefinition.id) { nodeConfig.id = currentNodeDefinition.id; } const nodePosition = isNew ? position : currentNodeDefinition.uiVariables?.position; if (nodePosition) { Object.assign(nodeConfig, nodePosition); } console.log('创建节点配置:', nodeConfig); const node = graph.addNode(nodeConfig); return node; };