From 9ef61aec5e8b218db9d60941ef3ad576a927338b Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期五, 26 四月 2024 11:05:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 /dev/null                                                  |    0 
 web/public/modelImg/connect.svg                            |   14 
 web/src/views/modules/taskReliability/RBD-edit-img.vue     | 1917 +++++++++++++++++++++++++++++-------------------------
 web/src/views/modules/taskReliability/ConfigEdge/index.vue |   11 
 web/public/modelImg/switch.svg                             |   33 
 web/public/modelImg/start.svg                              |   16 
 web/public/modelImg/vote.svg                               |   28 
 web/public/index.html                                      |    6 
 web/public/modelImg/end.svg                                |   16 
 9 files changed, 1,140 insertions(+), 901 deletions(-)

diff --git a/web/public/index.html b/web/public/index.html
index f903242..8930306 100644
--- a/web/public/index.html
+++ b/web/public/index.html
@@ -219,8 +219,8 @@
     window.SITE_CONFIG['dynamicMenuRoutesHasAdded'] = false; // 鍔ㄦ��(鑿滃崟)璺敱鏄惁宸茬粡娣诲姞鐨勭姸鎬佹爣绀猴紙鐢ㄤ簬鍒ゆ柇鏄惁闇�瑕侀噸鏂版媺鍙栨暟鎹苟杩涜鍔ㄦ�佹坊鍔犳搷浣滐級
 
     // 鏈嶅姟鍦板潃
-    window.SITE_CONFIG['apiURL'] = 'http://' + location.hostname + ':8050/test-project';
-    window.SITE_CONFIG['apiURL2'] = 'http://' + location.hostname + ':8050/test-project';
+    window.SITE_CONFIG['apiURL'] = 'http://' + location.hostname + ':8066/test-project';
+    window.SITE_CONFIG['apiURL2'] = 'http://' + location.hostname + ':8066/test-project';
     //window.SITE_CONFIG['apiURL2'] = 'http://'+location.hostname+':8066';
 
     //window.SITE_CONFIG['apiURL'] = '<%= process.env.VUE_APP_API_URL %>';
@@ -228,7 +228,7 @@
 
 
     // WebSocket鍦板潃
-    window.SITE_CONFIG['socketURL'] = 'http://' + location.hostname + ':8050/test-project';
+    window.SITE_CONFIG['socketURL'] = 'http://' + location.hostname + ':8066/test-project';
     //window.SITE_CONFIG['socketURL'] ='<%= process.env.VUE_APP_SOCKET_URL %>';
 
   </script>
diff --git a/web/public/modelImg/connect.png b/web/public/modelImg/connect.png
deleted file mode 100644
index f69d4cf..0000000
--- a/web/public/modelImg/connect.png
+++ /dev/null
Binary files differ
diff --git a/web/public/modelImg/connect.svg b/web/public/modelImg/connect.svg
new file mode 100644
index 0000000..5c67178
--- /dev/null
+++ b/web/public/modelImg/connect.svg
@@ -0,0 +1,14 @@
+<svg width="70.000000" height="70.000000" viewBox="0 0 70 70" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<desc>
+			Created with Pixso.
+	</desc>
+	<defs>
+		<clipPath id="clip9_78">
+			<rect id="鐢绘澘 1" width="70.000000" height="70.000000" transform="translate(-0.000002 0.000000)" fill="white" fill-opacity="0"/>
+		</clipPath>
+	</defs>
+	<rect id="鐢绘澘 1" width="70.000000" height="70.000000" transform="translate(-0.000002 0.000000)" fill="#FFFFFF" fill-opacity="0"/>
+	<g clip-path="url(#clip9_78)">
+		<circle id="妞渾 2" cx="35.000000" cy="35.000000" r="35.000000" fill="#000000" fill-opacity="1.000000"/>
+	</g>
+</svg>
diff --git a/web/public/modelImg/end.png b/web/public/modelImg/end.png
deleted file mode 100644
index b993674..0000000
--- a/web/public/modelImg/end.png
+++ /dev/null
Binary files differ
diff --git a/web/public/modelImg/end.svg b/web/public/modelImg/end.svg
new file mode 100644
index 0000000..205a390
--- /dev/null
+++ b/web/public/modelImg/end.svg
@@ -0,0 +1,16 @@
+<svg width="138.000000" height="81.000000" viewBox="0 0 138 81" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<desc>
+			Created with Pixso.
+	</desc>
+	<defs>
+		<clipPath id="clip9_10">
+			<rect id="鐢绘澘 1" width="138.000000" height="81.000000" fill="white" fill-opacity="0"/>
+		</clipPath>
+	</defs>
+	<rect id="鐢绘澘 1" width="138.000000" height="81.000000" fill="#FFFFFF" fill-opacity="0"/>
+	<g clip-path="url(#clip9_10)">
+		<rect id="鐭╁舰 1" rx="36.500000" width="138.000000" height="81.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<rect id="鐭╁舰 1" x="4.000000" y="4.000000" rx="36.500000" width="130.000000" height="73.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="8.000000"/>
+		<path id="end" d="M90.43 47.08C89.14 48.34 87.43 49.38 85.48 49.38C81.4 49.38 78.76 46.29 78.76 40.87C78.76 35.58 82.09 32.29 85.81 32.29C87.73 32.29 88.96 33.01 90.4 34.21L90.28 31.39L90.28 25.12L92.98 25.12L92.98 49L90.76 49L90.52 47.08L90.43 47.08ZM56.95 47.71C55.51 48.64 53.77 49.38 51.55 49.38C47.23 49.38 43.75 46.23 43.75 40.87C43.75 35.58 47.32 32.29 51.1 32.29C55.24 32.29 57.58 35.28 57.58 39.93C57.58 40.54 57.52 41.11 57.46 41.5L46.48 41.5C46.66 44.97 48.79 47.19 51.88 47.19C53.47 47.19 54.76 46.72 55.96 45.9L56.95 47.71ZM64.33 49L61.6 49L61.6 32.71L63.85 32.71L64.09 35.04L64.18 35.04C65.74 33.51 67.42 32.29 69.64 32.29C73.06 32.29 74.62 34.51 74.62 38.68L74.62 49L71.89 49L71.89 39.03C71.89 35.97 70.96 34.68 68.8 34.68C67.12 34.68 65.98 35.53 64.33 37.17L64.33 49ZM51.13 34.48C48.82 34.48 46.78 36.33 46.45 39.52L55.18 39.52C55.18 36.24 53.68 34.48 51.13 34.48ZM81.58 40.84C81.58 44.76 83.2 47.11 86.08 47.11C87.58 47.11 88.9 46.36 90.28 44.86L90.28 36.3C88.87 35.07 87.64 34.6 86.29 34.6C83.65 34.6 81.58 37.12 81.58 40.84Z" fill="#000000" fill-opacity="1.000000" fill-rule="evenodd"/>
+	</g>
+</svg>
diff --git a/web/public/modelImg/logo.png b/web/public/modelImg/logo.png
deleted file mode 100644
index e154da0..0000000
--- a/web/public/modelImg/logo.png
+++ /dev/null
Binary files differ
diff --git a/web/public/modelImg/start.png b/web/public/modelImg/start.png
deleted file mode 100644
index 11ac8b4..0000000
--- a/web/public/modelImg/start.png
+++ /dev/null
Binary files differ
diff --git a/web/public/modelImg/start.svg b/web/public/modelImg/start.svg
new file mode 100644
index 0000000..a43906e
--- /dev/null
+++ b/web/public/modelImg/start.svg
@@ -0,0 +1,16 @@
+<svg width="138.000000" height="81.000000" viewBox="0 0 138 81" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<desc>
+			Created with Pixso.
+	</desc>
+	<defs>
+		<clipPath id="clip9_3">
+			<rect id="鐢绘澘 1" width="138.000000" height="81.000000" transform="translate(-0.008560 -0.982471)" fill="white" fill-opacity="0"/>
+		</clipPath>
+	</defs>
+	<rect id="鐢绘澘 1" width="138.000000" height="81.000000" transform="translate(-0.008560 -0.982471)" fill="#FFFFFF" fill-opacity="0"/>
+	<g clip-path="url(#clip9_3)">
+		<rect id="鐭╁舰 1" x="-0.008560" y="-0.982471" rx="36.500000" width="138.000000" height="81.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<rect id="鐭╁舰 1" x="3.991440" y="3.017529" rx="36.500000" width="130.000000" height="73.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="8.000000"/>
+		<path id="start" d="M61.34 47.8C60.41 48.1 59.32 48.4 58.33 48.4C54.86 48.4 53.68 46.21 53.68 42.97L53.68 33.94L51.26 33.94L51.26 31.87L53.81 31.72L54.14 27.13L56.42 27.13L56.42 31.72L60.82 31.72L60.82 33.94L56.42 33.94L56.42 43.03C56.42 45.04 57.05 46.18 58.94 46.18C59.51 46.18 60.25 45.97 60.8 45.76L61.34 47.8ZM100.49 47.8C99.56 48.1 98.47 48.4 97.48 48.4C94.01 48.4 92.83 46.21 92.83 42.97L92.83 33.94L90.41 33.94L90.41 31.87L92.96 31.72L93.29 27.13L95.57 27.13L95.57 31.72L99.97 31.72L99.97 33.94L95.57 33.94L95.57 43.03C95.57 45.04 96.2 46.18 98.09 46.18C98.66 46.18 99.4 45.97 99.95 45.76L100.49 47.8ZM50.02 43.57C50.02 46.21 47.93 48.4 44.08 48.4C41.78 48.4 39.56 47.44 38 46.15L39.34 44.35C40.76 45.49 42.23 46.27 44.18 46.27C46.34 46.27 47.39 45.13 47.39 43.72C47.39 42.04 45.47 41.33 43.67 40.63C41.39 39.79 38.9 38.68 38.9 35.92C38.9 33.34 41 31.31 44.54 31.31C46.54 31.31 48.32 32.14 49.58 33.13L48.26 34.9C47.14 34.06 46.01 33.46 44.57 33.46C42.49 33.46 41.53 34.54 41.53 35.8C41.53 37.36 43.22 37.93 45.05 38.62C47.42 39.52 50.02 40.48 50.02 43.57ZM72.95 46.06C71.39 47.35 69.55 48.4 67.55 48.4C64.82 48.4 62.78 46.72 62.78 43.78C62.78 40.24 65.86 38.47 72.8 37.69C72.8 35.59 72.1 33.58 69.44 33.58C67.55 33.58 65.83 34.46 64.54 35.32L63.47 33.43C64.97 32.47 67.28 31.31 69.88 31.31C73.85 31.31 75.52 33.97 75.52 37.99L75.52 48.01L73.28 48.01L73.03 46.06L72.95 46.06ZM83.45 48.01L80.72 48.01L80.72 31.72L82.97 31.72L83.21 34.69L83.3 34.69C84.44 32.62 86.09 31.31 87.92 31.31C88.64 31.31 89.15 31.39 89.65 31.66L89.15 34.06C88.61 33.85 88.22 33.79 87.56 33.79C86.2 33.79 84.53 34.76 83.45 37.54L83.45 48.01ZM65.45 43.6C65.45 45.46 66.71 46.21 68.32 46.21C69.91 46.21 71.21 45.46 72.8 44.05L72.8 39.49C67.31 40.15 65.45 41.5 65.45 43.6Z" fill="#000000" fill-opacity="1.000000" fill-rule="evenodd"/>
+	</g>
+</svg>
diff --git a/web/public/modelImg/switch.svg b/web/public/modelImg/switch.svg
new file mode 100644
index 0000000..91e4162
--- /dev/null
+++ b/web/public/modelImg/switch.svg
@@ -0,0 +1,33 @@
+<svg width="150.000000" height="150.000000" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<desc>
+			Created with Pixso.
+	</desc>
+	<defs>
+		<clipPath id="clip9_15">
+			<rect id="鐢绘澘 1" width="150.000000" height="150.000000" fill="white" fill-opacity="0"/>
+		</clipPath>
+	</defs>
+	<rect id="鐢绘澘 1" width="150.000000" height="150.000000" fill="#FFFFFF" fill-opacity="0"/>
+	<g clip-path="url(#clip9_15)">
+		<circle id="妞渾 1" cx="75.000000" cy="75.000000" r="75.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<circle id="妞渾 1" cx="75.000000" cy="75.000000" r="72.500000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 1" x1="0.000000" y1="72.000000" x2="30.000000" y2="72.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 2" x1="31.500000" y1="113.002548" x2="31.500000" y2="33.002548" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 3" x1="29.000000" y1="35.000000" x2="79.000000" y2="35.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 4" x1="30.000000" y1="58.000000" x2="80.000000" y2="58.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 5" x1="30.000000" y1="85.000000" x2="80.000000" y2="85.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 6" x1="30.000000" y1="110.500000" x2="80.000000" y2="110.500000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 7" x1="118.000000" y1="76.000000" x2="148.000000" y2="76.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 8" x1="85.896255" y1="37.340614" x2="111.483505" y2="73.882980" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<circle id="妞渾 2" cx="114.000000" cy="76.000000" r="5.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<circle id="妞渾 2" cx="114.000000" cy="76.000000" r="4.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="2.000000"/>
+		<circle id="妞渾 2" cx="83.000000" cy="35.000000" r="5.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<circle id="妞渾 2" cx="83.000000" cy="35.000000" r="4.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="2.000000"/>
+		<circle id="妞渾 2" cx="84.000000" cy="58.000000" r="5.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<circle id="妞渾 2" cx="84.000000" cy="58.000000" r="4.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="2.000000"/>
+		<circle id="妞渾 2" cx="84.000000" cy="111.000000" r="5.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<circle id="妞渾 2" cx="84.000000" cy="111.000000" r="4.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="2.000000"/>
+		<circle id="妞渾 2" cx="84.000000" cy="85.000000" r="5.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<circle id="妞渾 2" cx="84.000000" cy="85.000000" r="4.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="2.000000"/>
+	</g>
+</svg>
diff --git a/web/public/modelImg/switchRight.png b/web/public/modelImg/switchRight.png
deleted file mode 100644
index b63c351..0000000
--- a/web/public/modelImg/switchRight.png
+++ /dev/null
Binary files differ
diff --git a/web/public/modelImg/vote.svg b/web/public/modelImg/vote.svg
new file mode 100644
index 0000000..eb29f2b
--- /dev/null
+++ b/web/public/modelImg/vote.svg
@@ -0,0 +1,28 @@
+<svg width="150.000000" height="150.000000" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<desc>
+			Created with Pixso.
+	</desc>
+	<defs>
+		<clipPath id="clip9_41">
+			<rect id="鐢绘澘 1" width="150.000000" height="150.000000" fill="white" fill-opacity="0"/>
+		</clipPath>
+	</defs>
+	<rect id="鐢绘澘 1" width="150.000000" height="150.000000" fill="#FFFFFF" fill-opacity="0"/>
+	<g clip-path="url(#clip9_41)">
+		<circle id="妞渾 1" cx="75.000000" cy="75.000000" r="75.000000" fill="#C4C4C4" fill-opacity="0"/>
+		<circle id="妞渾 1" cx="75.000000" cy="75.000000" r="72.500000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 1" x1="11.000000" y1="111.000000" x2="51.000000" y2="111.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 2" x1="50.000000" y1="113.500000" x2="50.000000" y2="33.500000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 3" x1="14.000000" y1="36.000000" x2="50.000000" y2="36.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 4" x1="5.000000" y1="55.000000" x2="50.000000" y2="55.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 5" x1="2.000000" y1="75.000000" x2="50.000000" y2="75.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 6" x1="4.000000" y1="93.000000" x2="50.000000" y2="93.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<line id="鐩寸嚎 7" x1="126.000000" y1="75.000000" x2="146.000000" y2="75.000000" stroke="#000000" stroke-opacity="1.000000" stroke-width="5.000000"/>
+		<circle id="妞渾 2" cx="91.000000" cy="74.000000" r="40.000000" fill="#000000" fill-opacity="1.000000"/>
+		<line id="鐩寸嚎 8" x1="115.309998" y1="47.410000" x2="68.752884" y2="102.894600" stroke="#FFFFFF" stroke-opacity="1.000000" stroke-width="2.000000"/>
+		<path id="N" d="M68.3 72L65.67 72L65.67 49.98L68.55 49.98L76.55 63.87L78.9 68.39L79.04 68.39C78.9 66.17 78.68 63.72 78.68 61.43L78.68 49.98L81.33 49.98L81.33 72L78.48 72L70.47 58.11L68.09 53.57L67.98 53.57C68.09 55.79 68.3 58.14 68.3 60.44L68.3 72Z" fill="#FFFFFF" fill-opacity="1.000000" fill-rule="evenodd"/>
+		<path id="N" d="M68.3 72L65.67 72L65.67 49.98L68.55 49.98L76.55 63.87L78.9 68.39L79.04 68.39C78.9 66.17 78.68 63.72 78.68 61.43L78.68 49.98L81.33 49.98L81.33 72L78.48 72L70.47 58.11L68.09 53.57L67.98 53.57C68.09 55.79 68.3 58.14 68.3 60.44L68.3 72Z" fill="#FFFFFF" fill-opacity="1.000000" fill-rule="evenodd"/>
+		<path id="M" d="M100.84 98L98.32 98L98.32 75.98L101.67 75.98L105.91 87.76C106.42 89.29 106.92 90.82 107.47 92.36L107.61 92.36C108.13 90.82 108.61 89.29 109.11 87.76L113.32 75.98L116.67 75.98L116.67 98L114.07 98L114.07 85.81C114.07 83.93 114.28 81.25 114.42 79.33L114.31 79.33L112.56 84.34L108.4 95.78L106.54 95.78L102.37 84.34L100.63 79.33L100.51 79.33C100.63 81.25 100.84 83.93 100.84 85.81L100.84 98Z" fill="#FFFFFF" fill-opacity="1.000000" fill-rule="evenodd"/>
+		<path id="M" d="M100.84 98L98.32 98L98.32 75.98L101.67 75.98L105.91 87.76C106.42 89.29 106.92 90.82 107.47 92.36L107.61 92.36C108.13 90.82 108.61 89.29 109.11 87.76L113.32 75.98L116.67 75.98L116.67 98L114.07 98L114.07 85.81C114.07 83.93 114.28 81.25 114.42 79.33L114.31 79.33L112.56 84.34L108.4 95.78L106.54 95.78L102.37 84.34L100.63 79.33L100.51 79.33C100.63 81.25 100.84 83.93 100.84 85.81L100.84 98Z" fill="#FFFFFF" fill-opacity="1.000000" fill-rule="evenodd"/>
+	</g>
+</svg>
diff --git a/web/public/modelImg/voteRight.png b/web/public/modelImg/voteRight.png
deleted file mode 100644
index 55d7a48..0000000
--- a/web/public/modelImg/voteRight.png
+++ /dev/null
Binary files differ
diff --git a/web/public/modelImg/xianhao.png b/web/public/modelImg/xianhao.png
deleted file mode 100644
index 59612b7..0000000
--- a/web/public/modelImg/xianhao.png
+++ /dev/null
Binary files differ
diff --git a/web/src/views/modules/taskReliability/ConfigEdge/index.vue b/web/src/views/modules/taskReliability/ConfigEdge/index.vue
index 593ebcf..4c43ef7 100644
--- a/web/src/views/modules/taskReliability/ConfigEdge/index.vue
+++ b/web/src/views/modules/taskReliability/ConfigEdge/index.vue
@@ -68,11 +68,11 @@
       // globalGridAttr:{},
       curCell:Edge,
       options: [{
-        value: 'normal',
+        value: 'rounded',
         label: '榛樿'
       }, {
-        value: 'smooth',
-        label: '骞虫粦杩炵嚎'
+        value: 'normal',
+        label: '鐩寸嚎'
       }]
     }
   },
@@ -122,6 +122,11 @@
     },
     onConnectorChange(val){
       this.globalGridAttr.connector = val
+      if(val === 'normal'){
+        this.curCell.setRouter(val)
+      }else {
+        this.curCell.setRouter('manhattan')
+      }
       this.curCell.setConnector(val)
     },
     onLabelChange(e) {
diff --git a/web/src/views/modules/taskReliability/RBD-edit-img.vue b/web/src/views/modules/taskReliability/RBD-edit-img.vue
index dcaa6b1..1beb7ca 100644
--- a/web/src/views/modules/taskReliability/RBD-edit-img.vue
+++ b/web/src/views/modules/taskReliability/RBD-edit-img.vue
@@ -3,7 +3,7 @@
     <el-row :gutter="[8,8]">
       <el-col :span="4">
         <div :style="'height:' +left_p+'px'">
-          <div  style="height: 100%">
+          <div style="height: 100%">
             <div id="stencilImg"></div>
           </div>
         </div>
@@ -12,13 +12,13 @@
         <div class="fa-card-a">
           <el-form :inline="true">
             <el-form-item>
-              妯″瀷鍚嶇О锛歿{modelName}}
+              妯″瀷鍚嶇О锛歿{ modelName }}
             </el-form-item>
             <el-form-item>
               <el-button type="primary" @click="saveDiagram()">鏆傚瓨</el-button>
               <el-button type="primary" @click="analyzeDiagram()">淇濆瓨</el-button>
               <el-button type="primary" @click="clearDiagram()">娓呯┖鍥惧舰</el-button>
-              <el-button  @click="leftAlign()">
+              <el-button @click="leftAlign()">
                 <i style="font-size: 1rem;" class="wt-iconfont icon-zuoduiqi"></i>
               </el-button>
               <el-button @click="centerAlign()">
@@ -37,51 +37,9 @@
                 <i style="font-size: 1rem;" class="wt-iconfont icon-diduiqi"></i>
               </el-button>
             </el-form-item>
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="宸﹀榻�" placement="left">-->
-<!--                <el-button class="" style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF;" @click="leftAlign()">-->
-<!--                  <i style="font-size: 2rem;" class="wt-iconfont icon-zuoduiqi"></i>-->
-<!--                </el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="灞呬腑瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="centerAlign()"><i style="font-size: 2rem;"-->
-<!--                                                     class="wt-iconfont icon-chuizhiduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="鍙冲榻�" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="rightAlign()"><i style="font-size: 2rem;"-->
-<!--                                                    class="wt-iconfont icon-youduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="椤堕儴瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="topAlign()"><i style="font-size: 2rem;"-->
-<!--                                                  class="wt-iconfont icon-dingduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="姘村钩瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="shuipingAlign()"><i style="font-size: 2rem;"-->
-<!--                                                       class="wt-iconfont icon-shuipingduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="搴曢儴瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="bottomAlign()"><i style="font-size: 2rem;"-->
-<!--                                                     class="wt-iconfont icon-diduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
           </el-form>
           <div id="containerImg" style="border: 1px solid #EAEBEE;border-radius: 6px;
-        box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);">
+        box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);height: 100%">
           </div>
           <config-node v-show="type === 'node'" :id="id" :diagramId="diagramId" :globalGridAttr="globalGridAttr"
                        :graph="graph"
@@ -96,479 +54,502 @@
 </template>
 
 <script>
-  import {Graph, Shape, Addon, Cell} from '@antv/x6'
-  import ConfigNode from './ConfigNode/index.vue'
-  import ConfigEdge from './ConfigEdge/index.vue'
-  import {removeCurrentTabHandle} from '@/commonJS/common'
-  import {setHartBeat} from '@/commonJS/common';
-  import Cookies from 'js-cookie'
+import {Graph, Shape, Addon, Cell} from '@antv/x6'
+import ConfigNode from './ConfigNode/index.vue'
+import ConfigEdge from './ConfigEdge/index.vue'
+import {removeCurrentTabHandle} from '@/commonJS/common'
+import {setHartBeat} from '@/commonJS/common';
+import Cookies from 'js-cookie'
 
-  export default {
-    name: 'RBD-edit-img',
-    /*props: {
+export default {
+  name: 'RBD-edit-img',
+  /*props: {
 
-    },*/
-    props: {
-      projectId: {
-        type: String
-      },
-      diagarmId: {
-        type: String
-      },
-      pageCode: {
-        default: 'wlt_pz'
-      },
-      flowCode: {
-        type: String,
-        default: 'wltFlow'
-      },
+  },*/
+  props: {
+    projectId: {
+      type: String
     },
-    components: {
-      ConfigNode,
-      ConfigEdge
+    diagarmId: {
+      type: String
     },
-    data() {
-      return {
-        modelId: '',
-        modelName: '',
-        modelType: '',
-        timer: null,
-        imgsList: [
-          {imgPath: 'start', imgName: 'start', nodeType: 'start', imgWidth: 60, imgHeight: 60, imgId: '1', data: {}},
-          {imgPath: 'end', imgName: 'end', nodeType: 'end', imgWidth: 60, imgHeight: 60, imgId: '2', data: {}},
-          {
-            imgPath: 'connect',
-            imgName: 'connect',
-            nodeType: 'connect',
-            imgWidth: 20,
-            imgHeight: 20,
-            imgId: '3',
-            data: {}
-          },
-          // {imgPath:'parallelLeft',imgName:'parallelLeft',nodeType:'parallelLeft',imgWidth:60,imgHeight:60,imgId:'3',data:{}},
-          // {imgPath:'parallelRight',imgName:'parallel',nodeType:'parallel',imgWidth:60,imgHeight:60,imgId:'4',data:{}},
-          {
-            imgPath: 'switchRight',
-            imgName: 'switch',
-            nodeType: 'switch',
-            imgWidth: 60,
-            imgHeight: 60,
-            imgId: '5',
-            data: {}
-          },
-          {imgPath: 'voteRight', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}},
-        ],
-        imgsList2: [
-          // {imgPath:'logo',imgName:'logo',nodeType:'node',,nodeTypeExt:'',productType:'',statusImg:'',imgWidth:60,imgHeight:60,imgId:'100',dataId:'123456'},
-        ],
-        nodeType: '',
-        first: true,
-        shape: '',
-        projectList: [],
-        diagramList: [],
-        diagramId: '',
-        projectId: '',
-        diagramJson: '',
-        diagramIdDisabled: false,
-        dataForm: {
-          id: null,
-          content: null,
-          publishContent: null,
-          hasPublish: 0,
-          urlPref: '',
+    pageCode: {
+      default: 'wlt_pz'
+    },
+    flowCode: {
+      type: String,
+      default: 'wltFlow'
+    },
+  },
+  components: {
+    ConfigNode,
+    ConfigEdge
+  },
+  data() {
+    return {
+      nodeAdded: false,
+      connectNode: {},
+      modelId: '',
+      modelName: '',
+      modelType: '',
+      timer: null,
+      imgsList: [
+        {imgPath: 'start', imgName: 'start', nodeType: 'start', imgWidth: 60, imgHeight: 60, imgId: '1', data: {}},
+        {imgPath: 'end', imgName: 'end', nodeType: 'end', imgWidth: 60, imgHeight: 60, imgId: '2', data: {}},
+        {
+          imgPath: 'connect',
+          imgName: 'connect',
+          nodeType: 'connect',
+          imgWidth: 30,
+          imgHeight: 30,
+          imgId: '3',
+          data: {}
         },
-        // emptyJson: {
-        //   // 鑺傜偣
-        //   nodes: [
-        //     {
-        //       id: 'node1', // String锛屽彲閫夛紝鑺傜偣鐨勫敮涓�鏍囪瘑
-        //       width: 500,   // Number锛屽彲閫夛紝鑺傜偣澶у皬鐨� width 鍊�
-        //       height: 300,  // Number锛屽彲閫夛紝鑺傜偣澶у皬鐨� height 鍊�
-        //       label: '璇ラ」鐩繕鏈厤缃巶瀹剁綉缁滃浘',
-        //       attrs: {
-        //         body: {
-        //           strokeWidth: 0
-        //         },
-        //       }
-        //       //   text: {
-        //       //     text: '璇ラ」鐩繕鏈紪鍒剁綉缁滃浘',
-        //       //     // fontSize: 56,
-        //       //     fill: 'rgba(0,0,0,0.7)'
-        //       //   },
-        //       // },
-        //     }
-        //   ],
-        // },
-        type: '',
-        id: '',
-        graph: null,
-        globalGridAttr: {
-          productType:'',
-          voteNum: '',
-          repairMttcr: '',
-          repairMttcrOther: '',
-          repairDistribType: '',
-          reliabDistribType: '',
-          taskMtbcfOther: '',
-          isRepair: 0,
-          taskMtbcf: '',
-          numberInputValue: '',
-          statusImg: '',
-          nodeTypeExt: '',
-          type: 'mesh',
-          size: 10,
-          color: '#e5e5e5',
-          thickness: 1,
-          colorSecond: '#d0d0d0',
-          thicknessSecond: 1,
-          factor: 4,
-          bgColor: '#e5e5e5',
-          showImage: true,
-          repeat: 'watermark',
-          position: 'center',
-          bgSize: JSON.stringify({width: 150, height: 150}),
-          opacity: 0.1,
-
-          stroke: '#5F95FF',
-          strokeWidth: 1,
-          connector: 'normal',
-          label: '',
-          nodeStroke: '#5F95FF',
-          nodeStrokeWidth: 1,
-          nodeFill: '#ffffff',
-          nodeFontSize: 12,
-          nodeColor: '#080808',
-          nodeText: '',
-          nodeDate: '',
-          nodeUsers: '',
-          nodeDataDate: '',
-          nodeDataText: '',
-          dataId: '',
-          inspectName: '',
-          distance: 0.5,
-          angle: 0,
+        {
+          imgPath: 'switch',
+          imgName: 'switch',
+          nodeType: 'switch',
+          imgWidth: 60,
+          imgHeight: 60,
+          imgId: '5',
+          data: {}
         },
-        isReady: false,
-        curCel: Cell,
-        left_p: document.documentElement.clientHeight - 100,
-        ports: {
-          groups: {
-            top: {
-              position: 'top',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
-                },
-              },
-            },
-            right: {
-              position: 'right',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
-                },
-              },
-            },
-            bottom: {
-              position: 'bottom',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
-                },
-              },
-            },
-            left: {
-              position: 'left',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
+        {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}},
+      ],
+      imgsList2: [
+        // {imgPath:'logo',imgName:'logo',nodeType:'node',,nodeTypeExt:'',productType:'',statusImg:'',imgWidth:60,imgHeight:60,imgId:'100',dataId:'123456'},
+      ],
+      combiningImages: [
+        {
+          imgPath: 'switch',
+          imgName: 'switch',
+          nodeType: 'switch',
+          imgWidth: 60,
+          imgHeight: 60,
+          imgId: '5',
+          data: {}
+        },
+        {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}}
+      ],
+      nodeType: '',
+      first: true,
+      shape: '',
+      projectList: [],
+      diagramList: [],
+      diagramId: '',
+      projectId: '',
+      diagramJson: '',
+      diagramIdDisabled: false,
+      dataForm: {
+        id: null,
+        content: null,
+        publishContent: null,
+        hasPublish: 0,
+        urlPref: '',
+      },
+      // emptyJson: {
+      //   // 鑺傜偣
+      //   nodes: [
+      //     {
+      //       id: 'node1', // String锛屽彲閫夛紝鑺傜偣鐨勫敮涓�鏍囪瘑
+      //       width: 500,   // Number锛屽彲閫夛紝鑺傜偣澶у皬鐨� width 鍊�
+      //       height: 300,  // Number锛屽彲閫夛紝鑺傜偣澶у皬鐨� height 鍊�
+      //       label: '璇ラ」鐩繕鏈厤缃巶瀹剁綉缁滃浘',
+      //       attrs: {
+      //         body: {
+      //           strokeWidth: 0
+      //         },
+      //       }
+      //       //   text: {
+      //       //     text: '璇ラ」鐩繕鏈紪鍒剁綉缁滃浘',
+      //       //     // fontSize: 56,
+      //       //     fill: 'rgba(0,0,0,0.7)'
+      //       //   },
+      //       // },
+      //     }
+      //   ],
+      // },
+      type: '',
+      id: '',
+      graph: null,
+      globalGridAttr: {
+        productType: '',
+        voteNum: '',
+        repairMttcr: '',
+        repairMttcrOther: '',
+        repairDistribType: '',
+        reliabDistribType: '',
+        taskMtbcfOther: '',
+        isRepair: 0,
+        taskMtbcf: '',
+        numberInputValue: '',
+        statusImg: '',
+        nodeTypeExt: '',
+        type: 'mesh',
+        size: 10,
+        color: '#e5e5e5',
+        thickness: 1,
+        colorSecond: '#d0d0d0',
+        thicknessSecond: 1,
+        factor: 4,
+        bgColor: '#e5e5e5',
+        showImage: true,
+        repeat: 'watermark',
+        position: 'center',
+        bgSize: JSON.stringify({width: 150, height: 150}),
+        opacity: 0.1,
+
+        stroke: '#5F95FF',
+        strokeWidth: 1,
+        connector: 'rounded',
+        router: 'manhattan',
+        label: '',
+        nodeStroke: '#5F95FF',
+        nodeStrokeWidth: 1,
+        nodeFill: '#ffffff',
+        nodeFontSize: 12,
+        nodeColor: '#080808',
+        nodeText: '',
+        nodeDate: '',
+        nodeUsers: '',
+        nodeDataDate: '',
+        nodeDataText: '',
+        dataId: '',
+        inspectName: '',
+        distance: 0.5,
+        angle: 0,
+      },
+      isReady: false,
+      curCel: Cell,
+      left_p: document.documentElement.clientHeight - 100,
+      ports: {
+        groups: {
+          top: {
+            position: {name: 'top'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
                 },
               },
             },
           },
-          items: [
-            {
-              group: 'top',
+          right: {
+            position: {name: 'right'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
+                },
+              },
             },
-            {
-              group: 'right',
+          },
+          bottom: {
+            position: {name: 'bottom'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
+                },
+              },
             },
-            {
-              group: 'bottom',
+          },
+          left: {
+            position: {name: 'left'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
+                },
+              },
             },
-            {
-              group: 'left',
-            },
-          ],
-        }
+          },
+        },
+        items: [
+          {
+            id: 'top1',
+            group: 'top',
+          },
+          {
+            id: 'right1',
+            group: 'right',
+          },
+          {
+            id: 'bottom1',
+            group: 'bottom',
+          },
+          {
+            id: 'left1',
+            group: 'left',
+          },
+        ],
       }
+    }
+  },
+  watch: {
+    '$route.params.configId'() {
+      // alert('$route.params.projectId change')
+      this.projectId = this.$route.params.projectId
+      //this.diagramId = this.$route.params.diagramId
+      console.log(this.$route.params.projectId, 'this.$route.params.projectId')
+      console.log(this.$route.params.diagramId, 'this.$route.params.diagramId')
+    }
+  },
+  mounted() {
+    //this.initDigram()
+    this.type = 'grid'
+  },
+  methods: {
+    init(row) {
+      this.modelName = row.modelName
+      this.dataForm.id = row.id
+      // this.productId = row.productId
+      // this.getProduct(row.productId)
+      this.initDigram(row.productId)
+      console.log(this.dataForm, 'init(row){')
     },
-    watch: {
-      '$route.params.configId'() {
-        // alert('$route.params.projectId change')
-        this.projectId = this.$route.params.projectId
-        //this.diagramId = this.$route.params.diagramId
-        console.log(this.$route.params.projectId, 'this.$route.params.projectId')
-        console.log(this.$route.params.diagramId, 'this.$route.params.diagramId')
+    async getDiagram(modelId) {
+      let params = {
+        modelId: modelId,
+        urlPref: window.SITE_CONFIG['apiURL'],
+        token: Cookies.get('token'),
       }
-    },
-    mounted() {
-      //this.initDigram()
-      this.type = 'grid'
-    },
-    methods: {
-      init(row) {
-        this.modelName = row.modelName
-        this.dataForm.id = row.id
-        // this.productId = row.productId
-        // this.getProduct(row.productId)
-        this.initDigram(row.productId)
-        console.log(this.dataForm, 'init(row){')
-      },
-      async getDiagram(modelId) {
-        let params = {
-          modelId: modelId,
-          urlPref: window.SITE_CONFIG['apiURL'],
-          token: Cookies.get('token'),
+      let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params})
+      console.log(res, 'async getDiagram( res')
+      if (res.data !== null && (res.data.content != null)) {
+        this.dataForm = res.data
+        console.log(this.dataForm, 'this.dataForm in getDiagram')
+        if (this.dataForm.content != '') {
+          this.diagramJson = JSON.parse(this.dataForm.content)
         }
-        let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params})
-        console.log(res, 'async getDiagram( res')
-        if (res.data !== null && (res.data.content != null)) {
-          this.dataForm = res.data
-          console.log(this.dataForm, 'this.dataForm in getDiagram')
-          if(this.dataForm.content!=''){
-            this.diagramJson = JSON.parse(this.dataForm.content)
-          }
-          // console.log(this.dataForm.content,'this.Diagram content')
-          console.log(this.diagramJson, 'this.Diagram json')
-          this.graph.fromJSON(this.diagramJson)
-          this.graph.positionContent('left')
-          // this.graph.centerContent()
-          // this.graph.zoomToFit()
-        } else {
-          await this.clearDiagram()
-        }
-      },
-      async clearDiagram() {
-        this.dataForm.id = null
-        // this.graph.fromJSON(this.emptyJson)
-        this.graph.fromJSON('')
+        // console.log(this.dataForm.content,'this.Diagram content')
+        console.log(this.diagramJson, 'this.Diagram json')
+        this.graph.fromJSON(this.diagramJson)
+        this.graph.positionContent('left')
         // this.graph.centerContent()
         // this.graph.zoomToFit()
-        // this.graph.freeze()
-      },
-      async initDigram(productId) {
-        this.timer = setHartBeat(10, 240);
-        console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
-        console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
-        this.graph = new Graph({
-          container: document.getElementById('containerImg'),
-          width: document.documentElement.clientWidth,
-          height: document.documentElement.clientHeight - 200,
-          // async: true,
-          grid: {
-            visible: true,
+      } else {
+        await this.clearDiagram()
+      }
+    },
+    async clearDiagram() {
+      this.dataForm.id = null
+      // this.graph.fromJSON(this.emptyJson)
+      this.graph.fromJSON('')
+      // this.graph.centerContent()
+      // this.graph.zoomToFit()
+      // this.graph.freeze()
+    },
+    async initDigram(productId) {
+      this.timer = setHartBeat(10, 240);
+      console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
+      console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
+      this.graph = new Graph({
+        container: document.getElementById('containerImg'),
+        width: document.documentElement.clientWidth,
+        height: document.documentElement.clientHeight - 200,
+        // async: true,
+        grid: {
+          visible: true,
+        },
+        autoResize: true,
+        history: {
+          enabled: true,
+          beforeAddCommand(event, args) {
+            if (args.key === 'tools') {
+              console.log(args.key, 'event, args')
+              return false
+            }
           },
+        },
+        // panning: {
+        //   enabled: true,
+        // },
+        scroller: {
+          enabled: true,
+          pageVisible: true,
           autoResize: true,
-            history: {
-                enabled: true,
-                beforeAddCommand(event, args) {
-                    if (args.key==='tools') {
-                        console.log(args.key,'event, args')
-                        return false
-                    }
-                },
-            },
-          // panning: {
-          //   enabled: true,
-          // },
-          scroller: {
-            enabled: true,
-            pageVisible: true,
-            pageBreak: true,
-            pannable: true,
-            minVisibleWidth: 200,
-            minVisibleHeight: 200,
-            modifiers: 'shift',
+          pageBreak: true,
+          pannable: true,
+          minVisibleWidth: 200,
+          minVisibleHeight: 200,
+          modifiers: 'shift',
+        },
+        mousewheel: {
+          enabled: true,
+          zoomAtMousePosition: true,
+          modifiers: 'ctrl',
+          minScale: 0.5,
+          maxScale: 3,
+        },
+        connecting: {
+          router: {
+            name: 'manhattan',
+            // args: {
+            //   padding: 1,
+            // },
           },
-          // panning: {
-          //   enabled: true,
-          //   modifiers: 'shift',
-          // },
-          mousewheel: {
-            enabled: true,
-            zoomAtMousePosition: true,
-            modifiers: 'ctrl',
-            minScale: 0.1,
-            maxScale: 10,
-          },
-          connecting: {
-            router: {
-              name: 'normal',
-              // args: {
-              //   padding: 1,
-              // },
+          connector: {
+            name: 'rounded',
+            args: {
+              radius: 5,
             },
-            connector: {
-              name: 'rounded',
-              args: {
-                radius: 8,
+          },
+          anchor: 'center',
+          connectionPoint: 'anchor',
+          allowBlank: false,
+          snap: {
+            radius: 20,
+          },
+          createEdge() {
+            return new Shape.Edge({
+              attrs: {
+                line: {
+                  stroke: '#A2B1C3',
+                  strokeWidth: 2,
+                  targetMarker: 'classic'
+                }
               },
-            },
-            // anchor: 'center',
-            connectionPoint: 'anchor',
-            allowBlank: false,
-            snap: {
-              radius: 20,
-            },
-            createEdge() {
-              return new Shape.Edge({
+              labels: [{
                 attrs: {
-                  line: {
-                    stroke: '#A2B1C3',
-                    strokeWidth: 2,
-                    targetMarker: 'classic'
+                  body: {
+                    stroke: '#5F95FF',
+                  },
+                  text: {
+                    text: ''
                   }
                 },
-                labels: [{
-                  attrs: {
-                    body: {
-                      stroke: '#5F95FF',
-                    },
-                    text: {
-                      text: ''
-                    }
-                  },
-                  position: {
-                    distance: 0.5,
-                    angle: 180,
-                    options: {
-                      keepGradient: true,
-                      ensureLegibility: true
-                    }
+                position: {
+                  distance: 0.5,
+                  angle: 180,
+                  options: {
+                    keepGradient: true,
+                    ensureLegibility: true
                   }
-                }],
-                tools: {
-                  name: 'segments',
-                  args: {
-                    attrs: { fill: '#666' },
-                  },
+                }
+              }],
+              tools: {
+                name: 'segments',
+                args: {
+                  attrs: {fill: '#666'},
                 },
-                zIndex: 0,
-              })
-            },
-            validateConnection({targetMagnet}) {
-              return !!targetMagnet
-            },
+              },
+              zIndex: 0,
+            })
           },
-          highlighting: {
-            magnetAdsorbed: {
-              name: 'stroke',
-              args: {
-                attrs: {
-                  fill: '#5F95FF',
-                  stroke: '#5F95FF',
-                },
+          validateConnection({targetMagnet}) {
+            return !!targetMagnet
+          },
+        },
+        highlighting: {
+          magnetAdsorbed: {
+            name: 'stroke',
+            args: {
+              attrs: {
+                fill: '#5F95FF',
+                stroke: '#5F95FF',
               },
             },
           },
-          resizing: {
-            enabled: true,
-            restricted: true
-          },
-          rotating: true,
-          selecting: {
-            enabled: true,
-            rubberband: true,
-            rubberEdge: true,
-            // showNodeSelectionBox: true,
-          },
-          snapline: true,
-          keyboard: true,
-          clipboard: true,
-        })
-        this.graph.centerContent()
-        const stencil = new Addon.Stencil({
-          getDragNode: (node) => node.clone({ keepId: true }),
-          getDropNode(node) {
-            let {width, height} = node.size()
-            if (node.getData().imgWidth) {
-              width = node.getData().imgWidth
+        },
+        resizing: true,
+        rotating: true,
+        selecting: {
+          enabled: true,
+          rubberband: true,
+          rubberEdge: true,
+          // showNodeSelectionBox: true,
+        },
+        snapline: true,
+        keyboard: true,
+        clipboard: true,
+      })
+      this.graph.centerContent()
+      const stencil = new Addon.Stencil({
+        getDragNode: (node) => node.clone({keepId: true}),
+        getDropNode: (node) => {
+          if (node.getData().type && node.getData().type === 'imageNodes2') {
+            return node.clone({keepId: true})
+          } else {
+            return node.clone()
+          }
+        },
+        validateNode: (node) => {
+          const existingNodes = this.graph.getNodes(); // 鑾峰彇鐢诲竷涓婃墍鏈夎妭鐐�
+          for (const existingNode of existingNodes) {
+            if (existingNode.id === node.id) {
+              this.$message({message: '璇ヨ澶囪妭鐐瑰凡鍦ㄧ敾甯冧笂锛屾棤娉曞啀娆$粯鍒�', type: 'warning'})
+              return false; // 鍙栨秷娣诲姞鑺傜偣鎿嶄綔
             }
-            if (node.getData().imgHeight) {
-              height = node.getData().imgHeight
-            }
-            return node.clone({ keepId: true }).size(width, height)
+          }
+        },
+        title: '',
+        target: this.graph,
+        stencilGraphWidth: 200,
+        stencilGraphHeight: 280,
+        collapsable: true,
+        groups: [
+          {
+            title: '杩愮畻绗﹀彿',
+            name: 'group1',
           },
-            validateNode(node){
-              console.log(node.id)
+          {
+            title: '缁勫悎鍥�',
+            name: 'combiningImages',
+            graphHeight: 100,
+          },
+          {
+            title: '璁惧鑺傜偣',
+            name: 'group2',
+            graphHeight: '',
+            layoutOptions: {
+              rowHeight: 90,
             },
-          title: '',
-          target: this.graph,
-            stencilGraphWidth: 200,
-            stencilGraphHeight: 280,
-            collapsable: true,
-          groups: [
-            {
-              title: '杩愮畻绗﹀彿',
-              name: 'group1',
-            },
-            {
-              title: '璁惧鑺傜偣',
-              name: 'group2',
-                graphHeight: '',
-                layoutOptions: {
-                    rowHeight: 90,
-                },
-            }
-          ],
-          layoutOptions: {
-            columns: 2,
-            columnWidth: 105,
-          },
-        })
-        document.getElementById('stencilImg').appendChild(stencil.container)
-        const imageNodes = this.imgsList.map((item) =>
+          }
+        ],
+        layoutOptions: {
+          columns: 2,
+          columnWidth: 105,
+        },
+      })
+      document.getElementById('stencilImg').appendChild(stencil.container)
+      const imageNodes = this.imgsList.map((item) =>
           this.graph.createNode({
             shape: 'image',
-            imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
+            // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
             width: item.imgWidth,
             height: item.imgHeight,
             data: {
+              type: 'imageNodes',
               dataId: '',
               nodeType: item.nodeType,
               nodeTypeExt: '',
-              voteNum:''
+              voteNum: ''
             },
             attrs: {
+              image: {
+                'xlink:href': '/modelImg/' + item.imgPath + '.svg',
+              },
               text: {
                 text: item.imgName,
                 fontSize: 14,
@@ -584,14 +565,47 @@
             },
             ports: {...this.ports},
           }),
-        )
-        let params = {
-          productId: productId
-        }
-        let res = await this.$http.get(`/basicInfo/XhProductModel/getProduct`, {params: params})
-        this.imgsList2 = res.data
-        console.log(this.imgsList2, 'getProduct(productId)234567890')
-        const imageNodes2 = this.imgsList2.map((item) =>
+      )
+      const combiningImages = this.combiningImages.map((item) =>
+          this.graph.createNode({
+            shape: 'image',
+            // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
+            width: item.imgWidth,
+            height: item.imgHeight,
+            data: {
+              type: 'imageNodes',
+              dataId: '',
+              nodeType: item.nodeType,
+              nodeTypeExt: '',
+              voteNum: ''
+            },
+            attrs: {
+              image: {
+                'xlink:href': '/modelImg/' + item.imgPath + '.svg',
+              },
+              text: {
+                text: item.imgName,
+                fontSize: 14,
+                style: {
+                  color: this.globalGridAttr.nodeColor
+                },
+                refX: 0.5,
+                refY: '100%',
+                refY2: 4,
+                textAnchor: 'middle',
+                textVerticalAnchor: 'top',
+              },
+            },
+            ports: {...this.ports},
+          }),
+      )
+      let params = {
+        productId: productId
+      }
+      let res = await this.$http.get(`/basicInfo/XhProductModel/getProduct`, {params: params})
+      this.imgsList2 = res.data
+      console.log(this.imgsList2, 'getProduct(productId)234567890')
+      const imageNodes2 = this.imgsList2.map((item) =>
           this.graph.createNode({
             shape: 'image',
             imageUrl: `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getProductImg?token=${Cookies.get('token')}&id=${item.imgPath}`,
@@ -599,6 +613,7 @@
             height: 60,
             id: item.dataId, // 鎵嬪姩璁剧疆鑺傜偣鐨� ID
             data: {
+              type: 'imageNodes2',
               isRepair: item.isRepair,
               dataId: item.dataId,
               nodeType: item.nodeType,
@@ -613,7 +628,7 @@
               taskMtbcfOther: item.taskMtbcfOther,
               imgHeight: item.imgHeight,
               imgWidth: item.imgWidth,
-              voteNum:'',
+              voteNum: '',
             },
             attrs: {
               text: {
@@ -652,450 +667,562 @@
             ],
             ports: {...this.ports},
           }),
-        )
-        stencil.load(imageNodes, 'group1')
-        stencil.load(imageNodes2, 'group2')
+      )
+      stencil.load(imageNodes, 'group1')
+      stencil.load(imageNodes2, 'group2')
+      stencil.load(combiningImages, 'combiningImages')
 
+      this.graph.bindKey(['meta+c', 'ctrl+c'], () => {
+        const cells = this.graph.getSelectedCells()
+        if (cells.length) {
+          this.graph.copy(cells)
+        }
+        return false
+      })
 
-        this.graph.bindKey(['meta+c', 'ctrl+c'], () => {
-          const cells = this.graph.getSelectedCells()
-          if (cells.length) {
-            this.graph.copy(cells)
-          }
-          return false
-        })
-
-        this.graph.bindKey(['meta+x', 'ctrl+x'], () => {
-          const cells = this.graph.getSelectedCells()
-          if (cells.length) {
-            this.graph.cut(cells)
-          }
-          return false
-        })
-        this.graph.bindKey(['meta+v', 'ctrl+v'], () => {
-          if (!this.graph.isClipboardEmpty()) {
-            const cells = this.graph.paste({offset: 32})
-            this.graph.cleanSelection()
-            this.graph.select(cells)
-          }
-          return false
-        })
+      this.graph.bindKey(['meta+x', 'ctrl+x'], () => {
+        const cells = this.graph.getSelectedCells()
+        if (cells.length) {
+          this.graph.cut(cells)
+        }
+        return false
+      })
+      this.graph.bindKey(['meta+v', 'ctrl+v'], () => {
+        if (!this.graph.isClipboardEmpty()) {
+          const cells = this.graph.paste({offset: 32})
+          this.graph.cleanSelection()
+          this.graph.select(cells)
+        }
+        return false
+      })
 //undo redo
-        this.graph.bindKey(['meta+z', 'ctrl+z'], () => {
-          if (this.graph.history.canUndo()) {
-            this.graph.history.undo()
-          }
-          return false
-        })
+      this.graph.bindKey(['meta+z', 'ctrl+z'], () => {
+        if (this.graph.history.canUndo()) {
+          this.graph.history.undo()
+        }
+        return false
+      })
 
-        this.graph.bindKey(['meta+shift+z', 'ctrl+shift+z'], () => {
-          if (this.graph.history.canRedo()) {
-            this.graph.history.redo()
-          }
-          return false
-        })
+      this.graph.bindKey(['meta+shift+z', 'ctrl+shift+z'], () => {
+        if (this.graph.history.canRedo()) {
+          this.graph.history.redo()
+        }
+        return false
+      })
 
 // select all
-        this.graph.bindKey(['meta+a', 'ctrl+a'], () => {
-          const nodes = this.graph.getNodes()
-          if (nodes) {
-            this.graph.select(nodes)
-          }
-        })
+      this.graph.bindKey(['meta+a', 'ctrl+a'], () => {
+        const nodes = this.graph.getNodes()
+        if (nodes) {
+          this.graph.select(nodes)
+        }
+      })
 //delete
-        this.graph.bindKey('delete', () => {
-          const cells = this.graph.getSelectedCells()
-          if (cells.length) {
-            this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', {
-              confirmButtonText: '纭畾',
-              cancelButtonText: '鍙栨秷',
-              type: 'warning'
-            }).then(() => {
-              this.$message({
-                type: 'success',
-                message: '鍒犻櫎鎴愬姛!'
-              })
-              this.graph.removeCells(cells)
-            }).catch(() => {
-              this.$message({
-                type: 'info',
-                message: '宸插彇娑堝垹闄�'
-              })
+      this.graph.bindKey('delete', () => {
+        const cells = this.graph.getSelectedCells()
+        if (cells.length) {
+          this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', {
+            confirmButtonText: '纭畾',
+            cancelButtonText: '鍙栨秷',
+            type: 'warning'
+          }).then(() => {
+            this.$message({
+              type: 'success',
+              message: '鍒犻櫎鎴愬姛!'
             })
-          }
-        })
+            this.graph.removeCells(cells)
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '宸插彇娑堝垹闄�'
+            })
+          })
+        }
+      })
 // zoom
-        this.graph.bindKey(['ctrl+1', 'meta+1'], () => {
-          const zoom = this.graph.zoom()
-          if (zoom < 1.5) {
-            this.graph.zoom(0.1)
+      this.graph.bindKey(['ctrl+1', 'meta+1'], () => {
+        const zoom = this.graph.zoom()
+        if (zoom < 1.5) {
+          this.graph.zoom(0.1)
+        }
+      })
+
+      this.graph.bindKey(['ctrl+2', 'meta+2'], () => {
+        const zoom = this.graph.zoom()
+        if (zoom > 0.5) {
+          this.graph.zoom(-0.1)
+        }
+      })
+
+      this.graph.on('blank:click', ({cell}) => {
+        this.reset()
+        // this.type.value = "grid"
+        this.type = 'grid'
+        // this.id = cell.id
+      })
+      // 鐩戝惉鑺傜偣娣诲姞浜嬩欢
+      this.graph.on('node:added', ({node}) => {
+        const nodeId = node.id; // 鑾峰彇鑺傜偣鐨勫敮涓� ID
+        const nodeObj = node
+        const intersectNodes = [];
+        // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜�
+        for (const otherNode of this.graph.getNodes()) {
+          if (otherNode === node) continue;
+          const bbox1 = node.getBBox();
+          const bbox2 = otherNode.getBBox();
+          if (this.isIntersect(bbox1, bbox2)) {
+            intersectNodes.push(otherNode);
           }
-        })
-
-        this.graph.bindKey(['ctrl+2', 'meta+2'], () => {
-          const zoom = this.graph.zoom()
-          if (zoom > 0.5) {
-            this.graph.zoom(-0.1)
-          }
-        })
-
-        this.graph.on('blank:click', ({cell}) => {
-          this.reset()
-          // this.type.value = "grid"
-          this.type = 'grid'
-          // this.id = cell.id
-        })
-
-        this.graph.on('cell:click', ({cell}) => {
-          // this.type.value = cell.isNode() ? "node" : "edge"
-          this.type = cell.isNode() ? 'node' : 'edge'
-          this.shape = cell.shape
-          this.id = cell.id
-          if (this.type === 'node') {
-            this.nodeType = cell.getData().nodeType
-            console.log(this.nodeType,cell.id,'this.nodeType')
-          }
-          console.log(this.shape, 'this.shape')
-          // this.nodeOpt(this.id, this.globalGridAttr)
-        })
-        //鍗曞嚮杈硅妭鐐�
-        this.graph.on('edge:click', ({edge}) => {
-          this.reset()
-          edge.attr('line/stroke', 'orange')
-          edge.prop('labels/0', {
-            attrs: {
-              body: {
-                stroke: 'orange',
-              },
-            },
-
+        }
+        if (intersectNodes.length > 0) {
+          // console.log('Nodes intersect with node:', node.id);
+          console.log('Intersecting nodes:', intersectNodes.map(n => n)); // 鐩镐氦鑺傜偣鐨勫璞�
+          intersectNodes.map(node => {
+            this.addNodeAndConnect(node, nodeObj);
           })
-        })
-        // 鍗曞嚮node鑺傜偣
-        this.graph.on('node:click', ({node}) => {
-          this.reset()
-          node.attr('line/stroke', 'orange')
-          node.prop('labels/0', {
-            attrs: {
-              body: {
-                stroke: 'orange',
-              },
+        }
+      });
+      this.graph.on('cell:click', ({cell}) => {
+        // this.type.value = cell.isNode() ? "node" : "edge"
+        this.type = cell.isNode() ? 'node' : 'edge'
+        this.shape = cell.shape
+        this.id = cell.id
+        if (this.type === 'node') {
+          this.nodeType = cell.getData().nodeType
+          console.log(this.nodeType, cell.id, 'this.nodeType')
+        }
+        console.log(this.shape, 'this.shape')
+        // this.nodeOpt(this.id, this.globalGridAttr)
+      })
+      //鍗曞嚮杈硅妭鐐�
+      this.graph.on('edge:click', ({edge}) => {
+        this.reset()
+        edge.attr('line/stroke', 'orange')
+        edge.prop('labels/0', {
+          attrs: {
+            body: {
+              stroke: 'orange',
             },
-          })
+          },
+
         })
-        // 鎺у埗杩炴帴妗╂樉绀�/闅愯棌
-        this.graph.on('node:delete', ({view, e}) => {
+      })
+      // 鍗曞嚮node鑺傜偣
+      this.graph.on('node:click', ({node}) => {
+      })
+      // 鎺у埗杩炴帴妗╂樉绀�/闅愯棌
+      this.graph.on('node:delete', ({view, e}) => {
+        e.stopPropagation()
+        view.cell.remove()
+      })
+
+      this.graph.on('node:customevent', ({name, view, e}) => {
+        if (name === 'node:delete') {
           e.stopPropagation()
           view.cell.remove()
-        })
-
-        this.graph.on('node:customevent', ({name, view, e}) => {
-          if (name === 'node:delete') {
-            e.stopPropagation()
-            view.cell.remove()
-          }
-        })
-        // 鍙屽嚮缂栬緫
-        this.graph.on('cell:dblclick', ({cell, e}) => {
-          const isNode = cell.isNode()
-          const name = cell.isNode() ? 'node-editor' : 'edge-editor'
-          cell.removeTool(name)
-          cell.addTools({
-            name,
-            args: {
-              event: e,
-              attrs: {
-                backgroundColor: isNode ? '#EFF4FF' : '#FFF',
-                text: {
-                  fontSize: 16,
-                  fill: '#262626',
-                },
-              },
-            },
-          })
-        })
-
-        this.graph.on('node:mouseenter', ({node}) => {
-          const container = document.getElementById('containerImg')
-          const ports = container.querySelectorAll(
-            '.x6-port-body',
-          )
-          this.showPorts(ports, true)
-        })
-
-        this.graph.on('node:mouseleave', ({node}) => {
-          // if (node.hasTool('button-remove')) {
-          //   node.removeTool('button-remove')
-          // }
-          const container = document.getElementById('containerImg')
-          const ports = container.querySelectorAll(
-            '.x6-port-body',
-          )
-          this.showPorts(ports, false)
-        })
-
-        this.graph.on('edge:mouseenter', ({cell}) => {
-          // alert(123)
-          cell.addTools([
-            {
-              name: 'source-arrowhead',
-            },
-            {
-              name: 'target-arrowhead',
-              args: {
-                attrs: {
-                  fill: 'red',
-                },
-              },
-            },
-              {
-                  name: 'segments',
-                  args: {snapRadius: 20, attrs: {fill: '#444'}}
-              },
-          ])
-        })
-
-        this.graph.on('edge:mouseleave', ({cell}) => {
-          cell.removeTools()
-        })
-
-        await this.getDiagram(this.dataForm.id)
-      },
-      showPorts(ports, show) {
-        for (let i = 0, len = ports.length; i < len; i = i + 1) {
-          ports[i].style.visibility = show ? 'visible' : 'hidden'
         }
-      },
-      reset() {
-        this.graph.drawBackground({color: '#fff'})
-        const nodes = this.graph.getNodes()
-        const edges = this.graph.getEdges()
-        nodes.forEach((node) => {
-          node.attr('body/stroke', '#5F95FF')
-        })
-        edges.forEach((edge) => {
-          edge.attr('line/stroke', '#5F95FF')
-          edge.prop('labels/0', {
+      })
+      // 鍙屽嚮缂栬緫
+      this.graph.on('cell:dblclick', ({cell, e}) => {
+        const isNode = cell.isNode()
+        const name = cell.isNode() ? 'node-editor' : 'edge-editor'
+        cell.removeTool(name)
+        cell.addTools({
+          name,
+          args: {
+            event: e,
             attrs: {
-              body: {
-                stroke: '#5F95FF',
+              backgroundColor: isNode ? '#EFF4FF' : '#FFF',
+              text: {
+                fontSize: 16,
+                fill: '#262626',
               },
             },
-          })
+          },
         })
-      },
-      // nodeOpt(id, globalGridAttr) {
-      //   this.curCel = null
-      //   if (id) {
-      //     let cell = this.graph.getCellById(id)
-      //     console.log(cell, 'let cell 123456')
-      //     if (!cell || !cell.isNode()) {
-      //       return
-      //     }
-      //     this.curCel = cell
-      //     globalGridAttr.nodeStroke = cell.attr('body/stroke')
-      //     globalGridAttr.nodeStrokeWidth = cell.attr('body/strokeWidth')
-      //     globalGridAttr.nodeFill = cell.attr('body/fill')
-      //     globalGridAttr.nodeFontSize = cell.attr('text/fontSize')
-      //     globalGridAttr.nodeFontSize = cell.attr('title/fontSize')
-      //     globalGridAttr.nodeColor = cell.attr('text/fill')
-      //     globalGridAttr.nodeColor = cell.attr('title/fill')
-      //     globalGridAttr.nodeColor = cell.attr('text/style/color')
-      //     globalGridAttr.nodeColor =  cell.attr('title/style/color')
-      //     globalGridAttr.nodeUsers = cell.attr('approve/users')
-      //     globalGridAttr.nodeText = cell.attr('text/text')
-      //     globalGridAttr.nodeDate = cell.attr('title/text')
-      //     // let data={
-      //     //   dataId:this.projectId,
-      //     //   finishDate: globalGridAttr.nodeDate,
-      //     // }
-      //     cell.getData()
-      //     console.log( cell.getData(),' cell.getData() 909')
-      //   }
-      //   return this.curCel;
-      // },
-      async search() {
-        await this.getDiagram();
-      },
-      async saveDiagram() {
-        console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
-        this.dataForm.content = JSON.stringify(this.graph.toJSON())
-        this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
-        console.log(this.dataForm, 'dataFrom')
-        await this.$http[this.dataForm.id === null ? 'post' : 'put'](`/taskReliability/ModelLine/`, this.dataForm).then(async res => {
-          if (res.msg === 'success') {
-            this.$alert('淇濆瓨鎴愬姛', '鎻愮ず', {
-              confirmButtonText: '纭畾'
-            })
-          }
-        })
-      },
-      async analyzeDiagram() {
-        console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
-        this.dataForm.content = JSON.stringify(this.graph.toJSON())
-        this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
-        await this.$http['post'](`/taskReliability/ModelLine/analyze`, this.dataForm).then(async res => {
-          if (res.msg === 'success') {
-            this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', {
-              confirmButtonText: '纭畾'
-            })
-          }
-        })
-      },
-      // AlignmentsChanges(val){
-      //   console.log(val,'align.value')
-      //     if(val ==='閫夐」1'){
-      //       console.log(val,'align.value')
-      //        this.leftAlign()
-      //     }
-      //     if(val ==='閫夐」2') {
-      //       console.log('鍙冲榻�','align.value')
-      //        this.rightAlign()
-      //     }
-      // },
-      leftAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let leftX = null
-        for (let a of NODE) {
-          if (leftX == null || a.getBBox().x < leftX) {
-            leftX = a.getBBox().x
-          }
-        }
-        for (let a of NODE) {
-          let y = a.getBBox().y
-          a.position(leftX, y)
-          // console.log(leftX, ':', y, '  x:y')
-        }
-      },
-      topAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let topY = null
-        for (let a of NODE) {
-          console.log(a.getBBox(), 'a.getBBox()')
-          if (topY == null || a.getBBox().y < topY) {
-            topY = a.getBBox().y
-          }
-        }
-        for (let a of NODE) {
-          let x = a.getBBox().x
-          a.position(x, topY)
-          // console.log(leftX, ':', y, '  x:y')
-        }
-      },
-      centerAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let rightX = null
-        let leftX = null
-        for (let a of NODE) {
-          if (leftX == null || a.getBBox().x < leftX) {
-            leftX = a.getBBox().x
-          }
-        }
-        for (let a of NODE) {
-          if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
-            rightX = a.getBBox().x + a.getBBox().width
-          }
-        }
+      })
 
-        let centerX = leftX + (rightX - leftX) / 2
+      this.graph.on('node:mouseenter', ({node}) => {
+        const container = document.getElementById('containerImg')
+        const ports = container.querySelectorAll(
+            '.x6-port-body',
+        )
+        this.showPorts(ports, true)
+      })
 
-        for (let a of NODE) {
-          let y = a.getBBox().y
-          a.position(centerX - a.getBBox().width / 2, y)
-          // console.log(leftX, ':', y, '  x:y')
-        }
-      },
-      shuipingAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let bottomY = null
-        let topY = null
-        for (let a of NODE) {
-          if (topY == null || a.getBBox().y || 0 < topY) {
-            topY = a.getBBox().y
-          }
-        }
-        for (let a of NODE) {
-          if (bottomY == null || a.getBBox().y + a.getBBox().height > bottomY) {
-            bottomY = a.getBBox().y + a.getBBox().height
-          }
-        }
+      this.graph.on('node:mouseleave', ({node}) => {
+        // if (node.hasTool('button-remove')) {
+        //   node.removeTool('button-remove')
+        // }
+        const container = document.getElementById('containerImg')
+        const ports = container.querySelectorAll(
+            '.x6-port-body',
+        )
+        this.showPorts(ports, false)
+      })
 
-        let centerY = topY + (bottomY - topY) / 2
-        for (let a of NODE) {
-          let x = a.getBBox().x
-          let centerHei = a.getBBox().height / 2
-          a.position(x, centerY - centerHei)
-        }
-      },
-      rightAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let rightX = null
-        for (let a of NODE) {
-          if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
-            rightX = a.getBBox().x + a.getBBox().width
-          }
-        }
-        for (let a of NODE) {
-          let y = a.getBBox().y
-          a.position(rightX - a.getBBox().width, y)
-        }
-      },
-      bottomAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let bottomY = null
-        for (let a of NODE) {
-          if (bottomY == null || (a.getBBox().y + a.getBBox().height) > bottomY) {
-            bottomY = a.getBBox().y + a.getBBox().height
-          }
-        }
+      this.graph.on('edge:mouseenter', ({cell}) => {
+        // alert(123)
+        cell.addTools([
+          {
+            name: 'source-arrowhead',
+          },
+          {
+            name: 'target-arrowhead',
+            args: {
+              attrs: {
+                fill: 'red',
+              },
+            },
+          },
+          {
+            name: 'segments',
+            args: {snapRadius: 20, attrs: {fill: '#444'}}
+          },
+        ])
+      })
 
-        for (let a of NODE) {
-          let x = a.getBBox().x
-          a.position(x, bottomY - a.getBBox().height)
-        }
-      },
-      close() {
-        if (this.timer) {
-          window.clearInterval(this.timer)
-        }
-      },
+      this.graph.on('edge:mouseleave', ({cell}) => {
+        cell.removeTools()
+      })
+
+      await this.getDiagram(this.dataForm.id)
     },
+    showPorts(ports, show) {
+      for (let i = 0, len = ports.length; i < len; i = i + 1) {
+        ports[i].style.visibility = show ? 'visible' : 'hidden'
+      }
+    },
+    reset() {
+      this.graph.drawBackground({color: '#fff'})
+      const nodes = this.graph.getNodes()
+      const edges = this.graph.getEdges()
+      nodes.forEach((node) => {
+        node.attr('body/stroke', '#5F95FF')
+      })
+      edges.forEach((edge) => {
+        edge.attr('line/stroke', '#5F95FF')
+        edge.prop('labels/0', {
+          attrs: {
+            body: {
+              stroke: '#5F95FF',
+            },
+          },
+        })
+      })
+    },
+    async search() {
+      await this.getDiagram();
+    },
+    async saveDiagram() {
+      console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
+      this.dataForm.content = JSON.stringify(this.graph.toJSON())
+      this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
+      console.log(this.dataForm, 'dataFrom')
+      await this.$http[this.dataForm.id === null ? 'post' : 'put'](`/taskReliability/ModelLine/`, this.dataForm).then(async res => {
+        if (res.msg === 'success') {
+          this.$alert('淇濆瓨鎴愬姛', '鎻愮ず', {
+            confirmButtonText: '纭畾'
+          })
+        }
+      })
+    },
+    async analyzeDiagram() {
+      console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
+      this.dataForm.content = JSON.stringify(this.graph.toJSON())
+      this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
+      await this.$http['post'](`/taskReliability/ModelLine/analyze`, this.dataForm).then(async res => {
+        if (res.msg === 'success') {
+          this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', {
+            confirmButtonText: '纭畾'
+          })
+        }
+      })
+    },
+    leftAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let leftX = null
+      for (let a of NODE) {
+        if (leftX == null || a.getBBox().x < leftX) {
+          leftX = a.getBBox().x
+        }
+      }
+      for (let a of NODE) {
+        let y = a.getBBox().y
+        a.position(leftX, y)
+        // console.log(leftX, ':', y, '  x:y')
+      }
+    },
+    topAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let topY = null
+      for (let a of NODE) {
+        console.log(a.getBBox(), 'a.getBBox()')
+        if (topY == null || a.getBBox().y < topY) {
+          topY = a.getBBox().y
+        }
+      }
+      for (let a of NODE) {
+        let x = a.getBBox().x
+        a.position(x, topY)
+        // console.log(leftX, ':', y, '  x:y')
+      }
+    },
+    centerAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let rightX = null
+      let leftX = null
+      for (let a of NODE) {
+        if (leftX == null || a.getBBox().x < leftX) {
+          leftX = a.getBBox().x
+        }
+      }
+      for (let a of NODE) {
+        if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
+          rightX = a.getBBox().x + a.getBBox().width
+        }
+      }
 
-  }
+      let centerX = leftX + (rightX - leftX) / 2
+
+      for (let a of NODE) {
+        let y = a.getBBox().y
+        a.position(centerX - a.getBBox().width / 2, y)
+        // console.log(leftX, ':', y, '  x:y')
+      }
+    },
+    shuipingAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let bottomY = null
+      let topY = null
+      for (let a of NODE) {
+        if (topY == null || a.getBBox().y || 0 < topY) {
+          topY = a.getBBox().y
+        }
+      }
+      for (let a of NODE) {
+        if (bottomY == null || a.getBBox().y + a.getBBox().height > bottomY) {
+          bottomY = a.getBBox().y + a.getBBox().height
+        }
+      }
+
+      let centerY = topY + (bottomY - topY) / 2
+      for (let a of NODE) {
+        let x = a.getBBox().x
+        let centerHei = a.getBBox().height / 2
+        a.position(x, centerY - centerHei)
+      }
+    },
+    rightAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let rightX = null
+      for (let a of NODE) {
+        if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
+          rightX = a.getBBox().x + a.getBBox().width
+        }
+      }
+      for (let a of NODE) {
+        let y = a.getBBox().y
+        a.position(rightX - a.getBBox().width, y)
+      }
+    },
+    bottomAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let bottomY = null
+      for (let a of NODE) {
+        if (bottomY == null || (a.getBBox().y + a.getBBox().height) > bottomY) {
+          bottomY = a.getBBox().y + a.getBBox().height
+        }
+      }
+
+      for (let a of NODE) {
+        let x = a.getBBox().x
+        a.position(x, bottomY - a.getBBox().height)
+      }
+    },
+    close() {
+      if (this.timer) {
+        window.clearInterval(this.timer)
+      }
+    },
+    // 瀹氫箟鍑芥暟鏉ユ鏌ヤ袱涓寘鍥存鏄惁鐩镐氦
+    isIntersect(bbox1, bbox2) {
+      return (
+          bbox1.x < bbox2.x + bbox2.width &&
+          bbox1.x + bbox1.width > bbox2.x &&
+          bbox1.y < bbox2.y + bbox2.height &&
+          bbox1.y + bbox1.height > bbox2.y
+      )
+    },
+    addNodeAndConnect(node, nodeObj) { // node鏄敾甯冨師鏈夌殑鑺傜偣銆俷odeObj鏄綋鍓嶆嫋鎷界殑鑺傜偣
+      const nodeType = node.getData().nodeType  // 鑾峰彇鑺傜偣绫诲瀷
+      const edges = this.graph.getConnectedEdges(node); // 鑾峰彇涓庡師鑺傜偣鐩稿叧鑱旂殑鎵�鏈夎繛鎺ョ嚎
+      let TopSum = 0 // 鍦ㄥ師鑺傜偣涓婃柟
+      let BottomSum = 0 // 鍦ㄥ師鑺傜偣涓嬫柟
+      const edgesSum = edges.length
+      if (nodeType !== 'node') {
+        if (edges.length === 0) {
+          if (!this.nodeAdded) {
+            // 娣诲姞鑺傜偣鐨勬搷浣�
+            this.connectNode = this.graph.addNode({
+              shape: 'image',
+              // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
+              width: 30,
+              height: 30,
+              data: {
+                type: 'imageNodes',
+                dataId: '',
+                nodeType: 'connect',
+                nodeTypeExt: '',
+                voteNum: ''
+              },
+              attrs: {
+                image: {
+                  'xlink:href': '/modelImg/connect.svg',
+                },
+                text: {
+                  text: 'connect',
+                  fontSize: 14,
+                  refX: 0.5,
+                  refY: '100%',
+                  refY2: 4,
+                  textAnchor: 'middle',
+                  textVerticalAnchor: 'top',
+                },
+              },
+              ports: {...this.ports},
+            })
+            // 璁剧疆鏍囪涓� true锛岃〃绀哄凡缁忔坊鍔犺繃鑺傜偣
+            this.nodeAdded = true;
+          }
+          nodeObj.position(node.position().x - 240, node.position().y - (120 * edgesSum));
+          this.connectNode.position(node.position().x - 480, node.position().y + (node.size().height - this.connectNode.size().height) / 2);
+        } else if (edges.length === 1) {
+          // 灏嗚妭鐐圭Щ鍔ㄥ埌鎸囧畾鐨勪綅缃�
+          nodeObj.position(node.position().x - 240, node.position().y - (120 * edgesSum));
+        } else {
+          for (const edge of edges) {
+            const sourcePointY = edge.getSourcePoint().y; // 鑾峰彇杩炴帴绾跨殑璧峰鐐箉鍧愭爣
+            const targetPointY = edge.getTargetPoint().y; // 鑾峰彇杩炴帴绾跨殑缁撴潫鐐箉鍧愭爣
+            console.log('鍘熻妭鐐筜鍧愭爣' + node.position().y, '杩炴帴绾胯捣濮媃鍧愭爣' + sourcePointY)
+            if (targetPointY > sourcePointY) {
+              TopSum++
+            } else if (targetPointY < sourcePointY) {
+              BottomSum++
+            }
+          }
+          console.log('鍦ㄥ師鑺傜偣涓婃柟鐨勮繛鎺ョ嚎鏁伴噺:' + TopSum, '鍦ㄥ師鑺傜偣涓嬫柟鐨勮繛鎺ョ嚎鏁伴噺:' + BottomSum)
+          if (TopSum > BottomSum) {
+            nodeObj.position(node.position().x - 240, node.position().y + (120 + (120 * BottomSum)))
+          } else {
+            nodeObj.position(node.position().x - 240, node.position().y - (120 + (120 * TopSum)));
+          }
+        }
+        this.graph.addEdge({
+          source: {cell: nodeObj, port: 'right1'},
+          target: {cell: node, port: 'left1'},
+          router: {name: 'manhattan'},
+          connector: {name: 'rounded'}
+        })
+        if (this.nodeAdded) {
+          console.log(this.connectNode, 'connectNode')
+          this.graph.addEdge({
+            source: {cell: this.connectNode, port: 'right1'},
+            target: {cell: nodeObj, port: 'left1'},
+            router: {name: 'manhattan'},
+            connector: {name: 'rounded'}
+          })
+        }
+      } else {
+          // 閬嶅巻鎵�鏈夎繛鎺ョ嚎骞跺垹闄や笌缁欏畾鑺傜偣瀵硅薄鐩稿叧鐨勮繛鎺ョ嚎
+        console.log(edges, '鎵�鏈夋湁鍏宠仈鐨勮繛鎺ョ嚎 edge')
+        if(edges.length === 0){
+          this.graph.addEdge({
+            source: {cell: node, port: 'right1'},
+            target: {cell: nodeObj, port: 'left1'},
+            router: {name: 'manhattan'},
+            connector: {name: 'rounded'}
+          })
+           return nodeObj.position(node.position().x +node.getBBox().width+50, node.position().y);
+        }else {
+          for (const edge of edges) {
+            console.log(edge, '鎵�鏈夋湁鍏宠仈鐨勮繛鎺ョ嚎 edge')
+            if (edge.source.cell === node.id) { // 濡傛灉杩炴帴绾跨殑璧峰鑺傜偣绛変簬褰撳墠鐢诲竷鐩爣鑺傜偣鐨処D
+              const sourceNode = this.graph.getCellById(edge.source.cell); // 鑾峰彇杩炴帴绾跨殑婧愯妭鐐瑰璞�
+              const targetNode = this.graph.getCellById(edge.target.cell) // 鑾峰彇杩炴帴绾跨殑鐩爣鑺傜偣瀵硅薄
+              console.log(sourceNode, targetNode, 'targetNode 鐩爣鑺傜偣瀵硅薄')
+              // edge.remove(); // 浠庡浘涓垹闄よ杩炴帴绾�
+              nodeObj.position(node.position().x +node.getBBox().width+50, node.position().y);
+              // edge.source = {cell: node, port: 'right1'}
+              edge.target = {cell: nodeObj, port: 'left1'}
+              // targetNode.position(nodeObj.position().x +nodeObj.getBBox().width+50, node.position().y);
+              // this.graph.addEdge({
+              //   source: {cell: node, port: 'right1'},
+              //   target: {cell: nodeObj, port: 'left1'},
+              //   router: {name: 'manhattan'},
+              //   connector: {name: 'rounded'}
+              // })
+              this.graph.addEdge({
+                source: {cell: nodeObj, port: 'right1'},
+                target: {cell: targetNode, port: 'left1'},
+                router: {name: 'manhattan'},
+                connector: {name: 'rounded'}
+              })
+            }else {
+              this.graph.addEdge({
+                source: {cell: node, port: 'right1'},
+                target: {cell: nodeObj, port: 'left1'},
+                router: {name: 'manhattan'},
+                connector: {name: 'rounded'}
+              })
+              nodeObj.position(node.position().x +node.getBBox().width+50, node.position().y);
+            }
+          }
+        }
+
+
+      }
+    },
+  },
+
+}
 </script>
 
 <style>
-  #containerImg {
-    display: flex;
-    border: 1px solid #dfe3e8;
-    height: 400px;
-    width: 100% !important;
-  }
-
-  .x6-graph-scroller.x6-graph-scroller-pannable {
-    width: 100% !important;
-  }
-
-  #stencilImg {
-    width: 100%;
-    height: 100%;
-    position: relative;
-    border-right: 1px solid #dfe3e8;
-  }
-
-  .x6-widget-stencil {
-    position: relative;
-    height: 100%;
-  }
-#stencilImg .x6-graph-svg-viewport{
-    height: 100%;
+#containerImg {
+  display: flex;
+  border: 1px solid #dfe3e8;
+  height: 400px;
+  width: 100% !important;
 }
-  .x6-widget-stencil-content {
-    position: relative;
+
+.x6-graph-scroller.x6-graph-scroller-pannable {
+  width: 100% !important;
+}
+
+#stencilImg {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  border-right: 1px solid #dfe3e8;
+}
+
+.x6-widget-stencil {
+  position: relative;
+  height: 100%;
+}
+
+#stencilImg .x6-graph-svg-viewport {
+  height: 100%;
+}
+
+.x6-widget-stencil-content {
+  position: relative;
   height: calc(100% - 32px);
 }
-#stencilImg .x6-widget-stencil.collapsable > .x6-widget-stencil-content{
-    top:0
-  }
+
+#stencilImg .x6-widget-stencil.collapsable > .x6-widget-stencil-content {
+  top: 0
+}
 
 </style>

--
Gitblit v1.9.1