updateC.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { deepClone, getAllChildren } from '@meta2d/core';
  2. import axios from 'axios';
  3. import { MessagePlugin } from 'tdesign-vue-next';
  4. export async function updateC() {
  5. MessagePlugin.loading('正在更新...',2000);
  6. const scale = meta2d.store.data.scale;
  7. //所有需要更新的自定义组件
  8. let cPens = meta2d.store.data.pens.filter(
  9. (pen: any) => pen.name === 'combine' && pen.componentId
  10. );
  11. meta2d.canvas.opening = true;
  12. // let replacePens = []; //所有需要替换
  13. // cPens.forEach((pen) => {
  14. // replacePens.push(getAllChildren(pen, meta2d.store));
  15. // });
  16. let cMap = {};
  17. cPens.forEach((pen: any) => {
  18. if (!cMap[pen.componentId]) {
  19. cMap[pen.componentId] = [];
  20. }
  21. cMap[pen.componentId].push(pen.id);
  22. });
  23. //let deletePens = [];
  24. for (let key in cMap) {
  25. const newData = await axios.post(`/api/data/v.component/get`, {
  26. id: key,
  27. projection: 'data,id,name',
  28. });
  29. if(!newData){
  30. continue;
  31. }
  32. for (let i = 0; i < cMap[key].length; i++) {
  33. let id = cMap[key][i];
  34. let componentDatas = deepClone(newData.data.componentDatas);
  35. componentDatas[0].componentId = key;
  36. componentDatas.forEach((item)=>{
  37. item.originId = item.id;
  38. })
  39. let beforeP:any = meta2d.store.pens[id];
  40. let beforePens = deepClone(getAllChildren(beforeP, meta2d.store));
  41. let rect = beforeP.calculative.worldRect; //meta2d.getPenRect(beforeP);
  42. //更新新组件大小位置
  43. componentDatas[0].width = rect.width/scale;
  44. componentDatas[0].height = rect.height/scale;
  45. componentDatas[0].x = rect.x;
  46. componentDatas[0].y = rect.y;
  47. // deletePens.push(beforeP);
  48. //删除原组件
  49. meta2d.delete([beforeP], true);
  50. //更新新组件
  51. //拖拽前ids
  52. const beforeIds = componentDatas.map((pen) => pen.id);
  53. await meta2d.canvas.dropPens(
  54. componentDatas,
  55. {
  56. x: rect.x + rect.width / 2,
  57. y: rect.y + rect.height / 2,
  58. }
  59. );
  60. //拖拽前ids
  61. const afterIds = componentDatas.map((pen) => pen.id);
  62. // meta2d.addPens(deepClone(componentDatas));
  63. let childrenMap = {};
  64. componentDatas.forEach((pen) => {
  65. let idIdx = afterIds.indexOf(pen.id);
  66. let matchPen:any = beforePens.find((p: any) => p.originId ===beforeIds[idIdx]);
  67. if (matchPen) {
  68. //更新更新的图元id为原拖拽到画布的id
  69. meta2d.changePenId(pen.id, matchPen.id);
  70. childrenMap[pen.id] = matchPen.id;
  71. if(matchPen.connectedLines){
  72. //更新连接关系中的锚点id
  73. for(let j=0;j<matchPen.anchors.length;j++){
  74. let line = matchPen.connectedLines.find((_line)=>_line.anchor===matchPen.anchors[j].id);
  75. if(line){
  76. line.anchor = pen.anchors[j].id;
  77. }
  78. }
  79. }
  80. pen.connectedLines = deepClone(matchPen.connectedLines);
  81. // pen.originId = matchPen.originId;
  82. //已经绑定了数据点
  83. if(matchPen.realTimes&&matchPen.realTimes.length){
  84. let bindPts = matchPen.realTimes.filter((item)=>item.bind);
  85. if( bindPts.length ){
  86. bindPts.forEach((item)=>{
  87. let idx = pen.realTimes?.findIndex((f)=>f.key===item.key);
  88. if(idx!==-1){
  89. // pen.form[idx].dataIds = item.dataIds;
  90. pen.realTimes.splice(idx,1,deepClone(item)); //更新
  91. }else{
  92. pen.realTimes.push(deepClone(item)); //新增
  93. }
  94. })
  95. }
  96. //已经初始化的数据-属性值不需要更新。
  97. let beforeKv = {};
  98. matchPen.realTimes.forEach((item)=>{
  99. beforeKv[item.key] = matchPen[item.key];
  100. });
  101. beforeKv['id'] = pen.id;
  102. meta2d.setValue(beforeKv,{render:false,doEvent:false,history:false});
  103. }
  104. }
  105. });
  106. meta2d.changePenId(componentDatas[0].id, beforeP.id);
  107. componentDatas[0].connectedLines = deepClone(beforeP.connectedLines);
  108. componentDatas[0].children = componentDatas[0].children.map((item) => {
  109. if (childrenMap[item]) {
  110. return childrenMap[item];
  111. }else return item;
  112. });
  113. //父节点绑定了数据点
  114. if(beforeP.realTimes&&beforeP.realTimes.length){
  115. let bindPts = beforeP.realTimes?.filter((item)=>item.bind);
  116. if( bindPts.length ){
  117. bindPts.forEach((item)=>{
  118. let idx = componentDatas[0].realTimes.findIndex((f)=>f.key===item.key);
  119. if(idx!==-1){
  120. componentDatas[0].realTimes.splice(idx,1,deepClone(item)); //更新
  121. }else{
  122. componentDatas[0].realTimes.push(deepClone(item)); //新增
  123. }
  124. })
  125. }
  126. //已经初始化的数据-属性值不需要更新。
  127. let beforeKv = {};
  128. beforeP.realTimes.forEach((item)=>{
  129. beforeKv[item.key] = beforeP[item.key];
  130. });
  131. beforeKv['id'] = componentDatas[0].id;
  132. meta2d.setValue(beforeKv,{render:false,doEvent:false,history:false});
  133. }
  134. // componentDatas[0].originId = beforeP.originId;
  135. //componentDatas[0].componentId = beforeP.componentId;
  136. // meta2d.addPens(deepClone(componentDatas));
  137. }
  138. }
  139. //删除原组件
  140. // meta2d.delete(deletePens);
  141. meta2d.inactive(); // dropPens默认会选中新添加的图元,这里取消选中
  142. meta2d.render(true);
  143. meta2d.initBinds(); //初始化绑定
  144. // MessagePlugin.closeAll();
  145. }