VisionJob.cs 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. using CommonMethods;
  2. using CommonMethods.Interface;
  3. using FormLib;
  4. using Logger;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. using System.Windows.Forms;
  14. using ViewROI;
  15. namespace ToolLib.VisionJob
  16. {
  17. [Serializable]
  18. public class VisionJob : IVisionJob
  19. {
  20. [Serializable]
  21. public delegate void CreateLineDelegate(TreeView inputTreeView, TreeNode startNode, TreeNode endNode);
  22. CreateLineDelegate createLineDelegateFun;
  23. public VisionJob(string jobName)
  24. {
  25. this.JobName = jobName;
  26. createLineDelegateFun = new CreateLineDelegate(CreateLine);
  27. }
  28. /// <summary>
  29. /// 获取当前流程所对应的流程树对象
  30. /// </summary>
  31. /// <param name="jobName">流程名</param>
  32. /// <returns>流程树控件对象</returns>
  33. public TreeView GetJobTree(string jobName)
  34. {
  35. try
  36. {
  37. for (int i = 0; i < FormJobManage.Instance.tabJobUnion.TabCount; i++)
  38. {
  39. if (FormJobManage.Instance.tabJobUnion.TabPages[i].Text == jobName)
  40. {
  41. return (TreeView)(FormJobManage.Instance.tabJobUnion.TabPages[i].Controls[0]);
  42. }
  43. }
  44. return new TreeView();
  45. }
  46. catch (Exception ex)
  47. {
  48. LoggerClass.WriteLog("获取流程树对象时出错!",ex);
  49. return new TreeView();
  50. }
  51. }
  52. /// <summary>
  53. /// 获取当前流程所对应的流程树对象
  54. /// </summary>
  55. /// <param name="jobName">流程名</param>
  56. /// <returns>流程树控件对象</returns>
  57. public TreeView GetJobTree()
  58. {
  59. try
  60. {
  61. for (int i = 0; i < FormJobManage.Instance.tabJobUnion.TabCount; i++)
  62. {
  63. if (FormJobManage.Instance.tabJobUnion.TabPages[i].Text == JobName)
  64. {
  65. return (TreeView)(FormJobManage.Instance.tabJobUnion.TabPages[i].Controls[0]);
  66. }
  67. }
  68. return new TreeView();
  69. }
  70. catch (Exception ex)
  71. {
  72. LoggerClass.WriteLog("获取流程树对象时出错!", ex);
  73. return new TreeView();
  74. }
  75. }
  76. /// <summary>
  77. /// 拖动工具节点
  78. /// </summary>
  79. /// <param name="sender"></param>
  80. /// <param name="e"></param>
  81. public void TvwJob_ItemDrag(object sender, ItemDragEventArgs e)//左键拖动
  82. {
  83. try
  84. {
  85. if (((TreeView)sender).SelectedNode != null)
  86. {
  87. if (((TreeView)sender).SelectedNode.Level == 1) //输入输出不允许拖动
  88. {
  89. GetJobTree().DoDragDrop(e.Item, DragDropEffects.Move);
  90. }
  91. else if (e.Button == MouseButtons.Left)
  92. {
  93. GetJobTree().DoDragDrop(e.Item, DragDropEffects.Move);
  94. }
  95. }
  96. }
  97. catch (Exception ex)
  98. {
  99. Logger.LoggerClass.WriteLog("拖动节点出错 ", ex);
  100. }
  101. }
  102. /// <summary>
  103. /// 节点拖动
  104. /// </summary>
  105. /// <param name="sender"></param>
  106. /// <param name="e"></param>
  107. public void TvwJob_DragEnter(object sender, DragEventArgs e)
  108. {
  109. try
  110. {
  111. if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode"))
  112. {
  113. e.Effect = DragDropEffects.Move;
  114. }
  115. else
  116. {
  117. e.Effect = DragDropEffects.None;
  118. }
  119. }
  120. catch (Exception ex)
  121. {
  122. Logger.LoggerClass.WriteLog("节点拖动出错,描述: ", ex);
  123. }
  124. }
  125. /// <summary>
  126. /// 释放被拖动的节点
  127. /// </summary>
  128. /// <param name="sender"></param>
  129. /// <param name="e"></param>
  130. public void TvwJob_DragDrop(object sender, DragEventArgs e)//拖动
  131. {
  132. try
  133. {
  134. //获得拖放中的节点
  135. TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
  136. //根据鼠标坐标确定要移动到的目标节点
  137. System.Drawing.Point pt;
  138. TreeNode targeNode; // 目标节点
  139. pt = ((TreeView)(sender)).PointToClient(new System.Drawing.Point(e.X, e.Y));
  140. targeNode = GetJobTree().GetNodeAt(pt);
  141. //如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
  142. if (moveNode == targeNode) //若是把自己拖放到自己,不可,返回
  143. return;
  144. if (targeNode == null) //目标节点为null,就是把节点拖到了空白区域,不可,直接返回
  145. return;
  146. if (moveNode.Level == 1 && targeNode.Level == 1 && moveNode.Parent == targeNode.Parent) //都是输入输出节点,内部拖动排序
  147. {
  148. moveNode.Remove();
  149. targeNode.Parent.Nodes.Insert(targeNode.Index, moveNode);
  150. return;
  151. }
  152. if (moveNode.Level == 0) // 被拖动的是子节点,也就是工具节点
  153. {
  154. if (targeNode.Level == 0) // 目标也是工具节点
  155. {
  156. moveNode.Remove();
  157. GetJobTree().Nodes.Insert(targeNode.Index, moveNode);
  158. IToolInfo temp = new IToolInfo();
  159. for (int i = 0; i < L_toolList.Count; i++)
  160. {
  161. if (L_toolList[i].toolName == moveNode.Text)
  162. {
  163. SwapDataFun(L_toolList, i, targeNode.Index-1);
  164. break;
  165. }
  166. }
  167. }
  168. else
  169. {
  170. // 目标是子节点,则移动到该子节点的父节点的下一个节点上
  171. moveNode.Remove();
  172. GetJobTree().Nodes.Insert(targeNode.Parent.Index + 1, moveNode);
  173. for (int i = 0; i < L_toolList.Count; i++)
  174. {
  175. if (L_toolList[i].toolName == moveNode.Text)
  176. {
  177. SwapDataFun(L_toolList, i, targeNode.Parent.Index);
  178. break;
  179. }
  180. }
  181. }
  182. }
  183. else //被拖动的是输入输出节点
  184. {
  185. if (targeNode.Level == 0 && GetToolInfoByToolName(targeNode.Text).toolType == ToolType.Output)
  186. {
  187. // 如果目标节点是工具节点,并且工具节点类型为可接收输入的节点,则直接将输出添加,先不考虑该情况
  188. //string result = moveNode.Parent.Text + " . -->" + moveNode.Text.Substring(3);
  189. //GetToolInfoByToolName(jobName, targeNode.Text).input.Add(new ToolIO("<--" + result, "", DataType.String));
  190. //TreeNode node = targeNode.Nodes.Add("", "<--" + result, 26, 26);
  191. //node.ForeColor = Color.DarkMagenta;
  192. //D_itemAndSource.Add(node, moveNode);
  193. //targeNode.Expand();
  194. //DrawLine();
  195. return;
  196. }
  197. else if (targeNode.Level == 0)
  198. return;
  199. //连线前首先要判断被拖动节点是否为输出项,目标节点是否为输入项
  200. if (moveNode.Text.Substring(0, 3) != "-->" || targeNode.Text.Substring(0, 3) != "<--")
  201. {
  202. Logger.LoggerClass.WriteLog("拖动类型不匹配!");
  203. return;
  204. }
  205. //连线前要判断被拖动节点和目标节点的数据类型是否一致
  206. if ((DataType)moveNode.Tag != (DataType)targeNode.Tag)
  207. {
  208. Logger.LoggerClass.WriteLog("被拖动节点和目标节点数据类型不一致,不可关联");
  209. return;
  210. }
  211. string input = targeNode.Text;
  212. if (input.Contains("《")) //表示已经连接了源
  213. input = Regex.Split(input, "《")[0];
  214. else //第一次连接源就需要添加到输入输出集合
  215. D_itemAndSource.Add(targeNode, moveNode);
  216. // GetToolInfoByToolName(targeNode.Parent.Text).GetInput(input.Substring(3)).value = "《- " + moveNode.Parent.Text + " . " + moveNode.Text.Substring(3);
  217. // targeNode.Text = input + "《- " + moveNode.Parent.Text + " . " + moveNode.Text.Substring(3);
  218. GetToolInfoByToolName(targeNode.Parent.Text).GetInput(input.Substring(3)).value = "《- " + moveNode.Parent.Text + "->" + moveNode.Text.Substring(3);
  219. targeNode.Text = input + "《- " + moveNode.Parent.Text + "->" + moveNode.Text.Substring(3);
  220. DrawLine();
  221. //移除拖放的节点
  222. if (moveNode.Level == 0)
  223. moveNode.Remove();
  224. }
  225. //更新当前拖动的节点选择
  226. GetJobTree().SelectedNode = moveNode;
  227. //展开目标节点,便于显示拖放效果
  228. targeNode.Expand();
  229. }
  230. catch (Exception ex)
  231. {
  232. Logger.LoggerClass.WriteLog("释放节点出错,原因: ", ex);
  233. }
  234. }
  235. private static Graphics graph;
  236. /// <summary>
  237. /// 绘制输入输出指向线
  238. /// </summary>
  239. /// <param name="obj"></param>
  240. public void DrawLine()
  241. {
  242. try
  243. {
  244. if (!isDrawing)
  245. {
  246. TreeView tree = GetJobTree();
  247. graph = tree.CreateGraphics();
  248. tree.CreateGraphics().Dispose();
  249. isDrawing = true;
  250. Thread th = new Thread(() =>
  251. {
  252. GetJobTree().MouseWheel += new MouseEventHandler(CancelUpDowm_MouseWheel); //划线的时候不能滚动,否则画好了线,结果已经滚到其它地方了
  253. maxLength = 150;
  254. colValueAndColor.Clear();
  255. startNodeAndColor.Clear();
  256. list.Clear();
  257. foreach (KeyValuePair<TreeNode, TreeNode> item in D_itemAndSource)
  258. {
  259. // 将此划线线程委托到JOB管理界面
  260. FormJobManage.Instance.Invoke(createLineDelegateFun, new object[] { tree, item.Key, item.Value });
  261. }
  262. Application.DoEvents();
  263. GetJobTree().MouseWheel -= new MouseEventHandler(CancelUpDowm_MouseWheel);
  264. isDrawing = false;
  265. });
  266. th.IsBackground = true;
  267. //th.ApartmentState = ApartmentState.STA;
  268. th.Start();
  269. }
  270. }
  271. catch (Exception ex)
  272. {
  273. }
  274. }
  275. public void CancelUpDowm_MouseWheel(object sender, MouseEventArgs e)
  276. {
  277. HandledMouseEventArgs h = e as HandledMouseEventArgs;
  278. if (h != null)
  279. {
  280. h.Handled = true;
  281. }
  282. }
  283. #region 绘制输入输出指向线
  284. public void tvw_job_AfterSelect(object sender, TreeViewEventArgs e)
  285. {
  286. nodeTextBeforeEdit = GetJobTree().SelectedNode.Text;
  287. }
  288. public void Draw_Line(object sender, TreeViewEventArgs e)
  289. {
  290. GetJobTree().Refresh();
  291. DrawLine();
  292. }
  293. public void tbc_jobs_SelectedIndexChanged(object sender, EventArgs e)
  294. {
  295. GetJobTree().Refresh();
  296. DrawLine();
  297. }
  298. public void DrawLineWithoutRefresh(object sender, MouseEventArgs e)
  299. {
  300. GetJobTree().Update();
  301. DrawLine();
  302. }
  303. public void MyJobTreeView_ChangeUICues(object sender, UICuesEventArgs e)
  304. {
  305. GetJobTree().Update();
  306. DrawLine();
  307. }
  308. #endregion
  309. public void tvw_job_MouseClick(object sender, MouseEventArgs e)
  310. {
  311. //判断是否在节点单击
  312. TreeViewHitTestInfo test = GetJobTree().HitTest(e.X, e.Y);
  313. // 右键 && 工具节点的输入输出项
  314. if (e.Button == MouseButtons.Right && test.Node.Level == 1)
  315. {
  316. GetJobTree().ContextMenuStrip = rightClickMenu;
  317. rightClickMenu.Items.Clear();
  318. if (test.Node.Text.Contains("《"))
  319. {
  320. rightClickMenu.Items.Add("删除连线");
  321. rightClickMenu.Items[0].Click += DeleteLine;
  322. }
  323. }
  324. // 右键 && 工具节点
  325. if (e.Button == MouseButtons.Right && test.Node.Level == 0)
  326. {
  327. GetJobTree().ContextMenuStrip = rightClickMenu;
  328. rightClickMenu.Items.Clear();
  329. rightClickMenu.Items.Add("删除工具");
  330. rightClickMenu.Items[0].Click += DeleteItem;
  331. }
  332. }
  333. /// <summary>
  334. /// 画Treeview控件两个节点之间的连线
  335. /// </summary>
  336. /// <param name="treeview">要画连线的Treeview</param>
  337. /// <param name="startNode">结束节点</param>
  338. /// <param name="endNode">开始节点</param>
  339. private void CreateLine(TreeView treeview, TreeNode endNode, TreeNode startNode)
  340. {
  341. try
  342. {
  343. //得到起始与结束节点之间所有节点的最大长度,保证画线不穿过节点
  344. int startNodeParantIndex = startNode.Parent.Index;
  345. int endNodeParantIndex = endNode.Parent.Index;
  346. int startNodeIndex = startNode.Index;
  347. int endNodeIndex = endNode.Index;
  348. int max = 0;
  349. if (!startNode.Parent.IsExpanded)
  350. {
  351. max = startNode.Parent.Bounds.X + startNode.Parent.Bounds.Width;
  352. }
  353. else
  354. {
  355. for (int i = startNodeIndex; i < startNode.Parent.Nodes.Count - 1; i++)
  356. {
  357. if (max < treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.Width)
  358. max = treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.Width;
  359. }
  360. }
  361. for (int i = startNodeParantIndex + 1; i < endNodeParantIndex; i++)
  362. {
  363. if (!treeview.Nodes[i].IsExpanded)
  364. {
  365. if (max < treeview.Nodes[i].Bounds.X + treeview.Nodes[i].Bounds.Width)
  366. max = treeview.Nodes[i].Bounds.X + treeview.Nodes[i].Bounds.Width;
  367. }
  368. else
  369. {
  370. for (int j = 0; j < treeview.Nodes[i].Nodes.Count; j++)
  371. {
  372. if (max < treeview.Nodes[i].Nodes[j].Bounds.X + treeview.Nodes[i].Nodes[j].Bounds.Width)
  373. max = treeview.Nodes[i].Nodes[j].Bounds.X + treeview.Nodes[i].Nodes[j].Bounds.Width;
  374. }
  375. }
  376. }
  377. if (!endNode.Parent.IsExpanded)
  378. {
  379. if (max < endNode.Parent.Bounds.X + endNode.Parent.Bounds.Width)
  380. max = endNode.Parent.Bounds.X + endNode.Parent.Bounds.Width;
  381. }
  382. else
  383. {
  384. for (int i = 0; i < endNode.Index; i++)
  385. {
  386. if (max < treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.Width)
  387. max = treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.Width;
  388. }
  389. }
  390. max += 10; //箭头不能连着 节点,
  391. if (!startNode.Parent.IsExpanded)
  392. startNode = startNode.Parent;
  393. if (!endNode.Parent.IsExpanded)
  394. endNode = endNode.Parent;
  395. if (endNode.Bounds.X + endNode.Bounds.Width + 20 > max)
  396. max = endNode.Bounds.X + endNode.Bounds.Width + 20;
  397. if (startNode.Bounds.X + startNode.Bounds.Width + 20 > max)
  398. max = startNode.Bounds.X + startNode.Bounds.Width + 20;
  399. //判断是否可以在当前处划线
  400. foreach (KeyValuePair<int, Dictionary<TreeNode, TreeNode>> item in list)
  401. {
  402. if (Math.Abs(max - item.Key) < 15)
  403. {
  404. foreach (KeyValuePair<TreeNode, TreeNode> item1 in item.Value)
  405. {
  406. if (startNode != item1.Value)
  407. {
  408. if ((item1.Value.Bounds.X < maxLength && item1.Key.Bounds.X < maxLength) || (item1.Value.Bounds.X < maxLength && item1.Key.Bounds.X < maxLength))
  409. {
  410. if (item1.Value.Bounds.Y > startNode.Bounds.Y || item1.Key.Bounds.Y > startNode.Bounds.Y) //20200612加
  411. max += (10 - Math.Abs(max - item.Key));
  412. }
  413. }
  414. }
  415. }
  416. }
  417. Dictionary<TreeNode, TreeNode> temp = new Dictionary<TreeNode, TreeNode>();
  418. temp.Add(endNode, startNode);
  419. if (!list.ContainsKey(max))
  420. list.Add(max, temp);
  421. else
  422. list[max].Add(endNode, startNode);
  423. if (!startNodeAndColor.ContainsKey(startNode))
  424. startNodeAndColor.Add(startNode, color[startNodeAndColor.Count]);
  425. Pen pen = new Pen(startNodeAndColor[startNode], 1);
  426. Brush brush = new SolidBrush(startNodeAndColor[startNode]);
  427. graph.DrawLine(pen, startNode.Bounds.X + startNode.Bounds.Width,
  428. startNode.Bounds.Y + startNode.Bounds.Height / 2,
  429. max,
  430. startNode.Bounds.Y + startNode.Bounds.Height / 2);
  431. graph.DrawLine(pen, max,
  432. startNode.Bounds.Y + startNode.Bounds.Height / 2,
  433. max,
  434. endNode.Bounds.Y + endNode.Bounds.Height / 2);
  435. graph.DrawLine(pen, max,
  436. endNode.Bounds.Y + endNode.Bounds.Height / 2,
  437. endNode.Bounds.X + endNode.Bounds.Width,
  438. endNode.Bounds.Y + endNode.Bounds.Height / 2);
  439. graph.DrawString("<", new Font("微软雅黑", 12F), brush, endNode.Bounds.X + endNode.Bounds.Width - 5,
  440. endNode.Bounds.Y + endNode.Bounds.Height / 2 - 12);
  441. Application.DoEvents();
  442. }
  443. catch { }
  444. }
  445. /// <summary>
  446. /// 交换List中的两个位置的值
  447. /// </summary>
  448. /// <param name="inputList">要交换的List</param>
  449. /// <param name="souceIndex">原位置索引</param>
  450. /// <param name="targetIndex">现位置索引</param>
  451. /// <returns></returns>
  452. public static List<IToolInfo> SwapDataFun(List<IToolInfo> inputList, int souceIndex, int targetIndex)
  453. {
  454. IToolInfo temp = inputList[targetIndex];
  455. inputList[targetIndex] = inputList[souceIndex];
  456. inputList[souceIndex] = temp;
  457. return inputList;
  458. }
  459. /// <summary>
  460. /// 根据工具名获取工具信息
  461. /// </summary>
  462. /// <param name="jobName">下一版本去掉该参数,流程名</param>
  463. /// <param name="toolName">工具名</param>
  464. /// <returns></returns>
  465. public IToolInfo GetToolInfoByToolName(string toolName)
  466. {
  467. try
  468. {
  469. for (int i = 0; i < L_toolList.Count; i++)
  470. {
  471. if (L_toolList[i].toolName == toolName)
  472. {
  473. return L_toolList[i];
  474. }
  475. }
  476. return new IToolInfo();
  477. }
  478. catch (Exception ex)
  479. {
  480. Logger.LoggerClass.WriteLog("根据工具名获取工具信息出错!原因: ", ex);
  481. return new IToolInfo();
  482. }
  483. }
  484. /// <summary>
  485. /// 通过TreeNode节点文本获取节点
  486. /// </summary>
  487. /// <param name="nodeText">节点文本</param>
  488. /// <returns>节点对象</returns>
  489. public TreeNode GetToolNodeByNodeText(string nodeText)
  490. {
  491. try
  492. {
  493. foreach (TreeNode toolNode in GetJobTree().Nodes)
  494. {
  495. if (((TreeNode)toolNode).Text != nodeText)
  496. {
  497. foreach (TreeNode itemNode in ((TreeNode)toolNode).Nodes)
  498. {
  499. if (((TreeNode)itemNode).Text.Substring(3) == nodeText)
  500. {
  501. return itemNode;
  502. }
  503. }
  504. }
  505. else
  506. {
  507. return toolNode;
  508. }
  509. }
  510. return null;
  511. }
  512. catch (Exception ex)
  513. {
  514. Logger.LoggerClass.WriteLog("通过TreeNode节点文本获取节点错误!", ex);
  515. return null;
  516. }
  517. }
  518. /// <summary>
  519. /// 通过TreeNode节点文本获取输入输出节点
  520. /// </summary>
  521. /// <param name="toolName">工具名称</param>
  522. /// <returns>IO名称</returns>
  523. internal TreeNode GetToolIONodeByNodeText(string toolName, string toolIOName)
  524. {
  525. try
  526. {
  527. foreach (TreeNode toolNode in GetJobTree().Nodes)
  528. {
  529. if (toolNode.Text == toolName)
  530. {
  531. foreach (TreeNode itemNode in toolNode.Nodes)
  532. {
  533. if (itemNode.Text == toolIOName)
  534. {
  535. return itemNode;
  536. }
  537. }
  538. }
  539. }
  540. return null;
  541. }
  542. catch (Exception ex)
  543. {
  544. LoggerClass.WriteLog("通过TreeNode节点文本获取输入输出节点时出错", ex);
  545. return null;
  546. }
  547. }
  548. /// <summary>
  549. /// 删除连线及值传递
  550. /// </summary>
  551. /// <param name="sender"></param>
  552. /// <param name="e"></param>
  553. private void DeleteLine(object sender, EventArgs e)
  554. {
  555. try
  556. {
  557. if (GetJobTree().SelectedNode == null)
  558. {
  559. return;
  560. }
  561. string nodeText = GetJobTree().SelectedNode.Text.ToString();
  562. int level = GetJobTree().SelectedNode.Level;
  563. string fatherNodeText = string.Empty;
  564. foreach (TreeNode toolNode in GetJobTree().Nodes)
  565. {
  566. if (level == 1)
  567. {
  568. fatherNodeText = GetJobTree().SelectedNode.Parent.Text;
  569. if (toolNode.Text == fatherNodeText)
  570. {
  571. foreach (var itemNode in toolNode.Nodes)
  572. {
  573. if (itemNode != null)
  574. {
  575. if (((TreeNode)itemNode).Text == nodeText)
  576. {
  577. // 移除连线集合中的这条连线
  578. for (int i = 0; i < D_itemAndSource.Count; i++)
  579. {
  580. if (((TreeNode)itemNode) == D_itemAndSource.Keys.ToArray()[i] || ((TreeNode)itemNode) == D_itemAndSource[D_itemAndSource.Keys.ToArray()[i]])
  581. D_itemAndSource.Remove(D_itemAndSource.Keys.ToArray()[i]);
  582. }
  583. // 修改节点的显示
  584. for (int i = 0; i < L_toolList.Count; i++)
  585. {
  586. if (L_toolList[i].toolName == fatherNodeText)
  587. {
  588. for (int j = 0; j < L_toolList[i].toolInput.Count; j++)
  589. {
  590. string last = Regex.Split(nodeText, "《")[1]; // "《"后边的部分
  591. string ConnectString = "《" + last; // 拼接后字符
  592. if (L_toolList[i].toolInput[j].value.ToString() == ConnectString)
  593. {
  594. string source = Regex.Split(nodeText, "《")[0]; // "《"之前的部分,即未连线初始部分
  595. L_toolList[i].toolInput[j].value = null; //重新置null
  596. ((TreeNode)itemNode).Text = source;
  597. }
  598. }
  599. for (int j = 0; j < L_toolList[i].toolOutput.Count; j++)
  600. {
  601. if (L_toolList[i].toolOutput[j].IOName == nodeText.Substring(3))
  602. L_toolList[i].RemoveOutputIO(nodeText.Substring(3));
  603. }
  604. }
  605. }
  606. }
  607. }
  608. }
  609. }
  610. }
  611. }
  612. }
  613. catch (Exception ex)
  614. {
  615. //LogHelper.SaveErrorInfo(ex);
  616. }
  617. }
  618. /// <summary>
  619. /// 删除项
  620. /// </summary>
  621. /// <param name="sender"></param>
  622. /// <param name="e"></param>
  623. private void DeleteItemOld(object sender, EventArgs e)
  624. {
  625. try
  626. {
  627. if (GetJobTree().SelectedNode == null)
  628. return;
  629. string nodeText = GetJobTree().SelectedNode.Text.ToString();
  630. int level = GetJobTree().SelectedNode.Level;
  631. string fatherNodeText = string.Empty;
  632. List<string> KeyValueList = new List<string>() { };
  633. List<TreeNode> D_itemAndSourceKeysList = new List<TreeNode>() { };
  634. string keyItem = string.Empty;
  635. string valueItem = string.Empty;
  636. //如果是子节点
  637. if (level == 1)
  638. {
  639. fatherNodeText = GetJobTree().SelectedNode.Parent.Text;
  640. }
  641. //如果是父节点
  642. if (level == 0)
  643. {
  644. for (int i = 0; i < L_toolList.Count; i++)
  645. {
  646. if (L_toolList[i].toolName == nodeText)
  647. {
  648. try
  649. {
  650. //移除连线集合中的这条连线
  651. for (int j = 0; j < D_itemAndSource.Count; j++ )
  652. {
  653. keyItem = D_itemAndSource.Keys.ToArray()[j].Parent.Text;
  654. valueItem = D_itemAndSource[D_itemAndSource.Keys.ToArray()[j]].Parent.Text;
  655. KeyValueList.Add(keyItem);
  656. if (nodeText == keyItem || nodeText == valueItem)
  657. {
  658. TreeNode selectNode = D_itemAndSource.Keys.ToArray()[j];
  659. D_itemAndSourceKeysList.Add(selectNode);
  660. }
  661. }
  662. foreach (var item in D_itemAndSourceKeysList)
  663. {
  664. D_itemAndSource.Remove(item);
  665. }
  666. }
  667. catch { }
  668. L_toolList.RemoveAt(i);
  669. }
  670. }
  671. // 在非该节点中,将与该节点相关的输入值删除
  672. foreach (var item in KeyValueList)
  673. {
  674. for (int j = 0; j < L_toolList.Count; j++)
  675. {
  676. for (int k = 0; k < L_toolList[j].toolInput.Count; k++)
  677. {
  678. if (L_toolList[j].toolName == item)
  679. {
  680. string sourceFrom = L_toolList[j].GetInput(L_toolList[j].toolInput[k].IOName).value.ToString();
  681. if (L_toolList[j].toolInput[k].value.ToString() == sourceFrom)
  682. {
  683. L_toolList[j].toolInput[k].value = null;
  684. }
  685. }
  686. }
  687. }
  688. }
  689. }
  690. // 将该节点在流程树中删除
  691. foreach (TreeNode toolNode in GetJobTree().Nodes)
  692. {
  693. if (toolNode.Text == nodeText)
  694. {
  695. GetJobTree().Nodes.Remove(toolNode);
  696. break;
  697. }
  698. }
  699. // 与之相关的节点进行还原
  700. foreach (TreeNode toolNode in GetJobTree().Nodes)
  701. {
  702. foreach (TreeNode itemNode in toolNode.Nodes)
  703. {
  704. foreach (var item in D_itemAndSourceKeysList)
  705. {
  706. if (itemNode.Text == item.Text)
  707. {
  708. string text = Regex.Split(itemNode.Text, "《")[0];
  709. itemNode.Text = text;
  710. }
  711. }
  712. }
  713. }
  714. }
  715. catch (Exception ex)
  716. {
  717. //LogHelper.SaveErrorInfo(ex);
  718. }
  719. }
  720. /// <summary>
  721. /// 删除项
  722. /// </summary>
  723. /// <param name="sender"></param>
  724. /// <param name="e"></param>
  725. internal void DeleteItem(object sender, EventArgs e)
  726. {
  727. try
  728. {
  729. if (GetJobTree().SelectedNode == null)
  730. return;
  731. isDrawing = true;
  732. string nodeText = GetJobTree().SelectedNode.Text.ToString();
  733. int level = GetJobTree().SelectedNode.Level;
  734. string fatherNodeText = string.Empty;
  735. //如果是子节点
  736. if (level == 1)
  737. {
  738. fatherNodeText = GetJobTree().SelectedNode.Parent.Text;
  739. }
  740. foreach (TreeNode toolNode in GetJobTree().Nodes)
  741. {
  742. if (level == 1)
  743. {
  744. if (toolNode.Text == fatherNodeText)
  745. {
  746. foreach (var itemNode in ((TreeNode)toolNode).Nodes)
  747. {
  748. if (itemNode != null)
  749. {
  750. if (((TreeNode)itemNode).Text == nodeText)
  751. {
  752. //移除连线集合中的这条连线
  753. for (int i = 0; i < D_itemAndSource.Count; i++)
  754. {
  755. if (((TreeNode)itemNode) == D_itemAndSource.Keys.ToArray()[i] || ((TreeNode)itemNode) == D_itemAndSource[D_itemAndSource.Keys.ToArray()[i]])
  756. D_itemAndSource.Remove(D_itemAndSource.Keys.ToArray()[i]);
  757. }
  758. ((TreeNode)itemNode).Remove();
  759. GetJobTree().SelectedNode = null;
  760. }
  761. }
  762. }
  763. }
  764. }
  765. else
  766. {
  767. if (((TreeNode)toolNode).Text == nodeText)
  768. {
  769. ((TreeNode)toolNode).Remove();
  770. break;
  771. }
  772. }
  773. }
  774. //如果是父节点
  775. if (level == 0)
  776. {
  777. for (int i = 0; i < L_toolList.Count; i++)
  778. {
  779. if (L_toolList[i].toolName == nodeText)
  780. {
  781. try
  782. {
  783. //移除连线集合中的这条连线
  784. for (int j = D_itemAndSource.Count - 1; j >= 0; j--)
  785. {
  786. if (nodeText == D_itemAndSource.Keys.ToArray()[j].Parent.Text || nodeText == D_itemAndSource[D_itemAndSource.Keys.ToArray()[j]].Parent.Text)
  787. D_itemAndSource.Remove(D_itemAndSource.Keys.ToArray()[j]);
  788. }
  789. }
  790. catch { }
  791. L_toolList.RemoveAt(i);
  792. }
  793. }
  794. }
  795. else
  796. {
  797. for (int i = 0; i < L_toolList.Count; i++)
  798. {
  799. if (L_toolList[i].toolName == fatherNodeText)
  800. {
  801. for (int j = 0; j < L_toolList[i].toolInput.Count; j++)
  802. {
  803. if (L_toolList[i].toolInput[j].value.ToString() == string.Empty) //未连接源
  804. {
  805. if (string.Format("<--{0}", L_toolList[i].toolInput[j].IOName) == nodeText)
  806. L_toolList[i].RemoveInputIO(nodeText);
  807. }
  808. else //已连接源
  809. {
  810. if (string.Format("<--{0}{1}", L_toolList[i].toolInput[j].IOName, L_toolList[i].toolInput[j].value.ToString()) == nodeText)
  811. L_toolList[i].RemoveInputIO(nodeText);
  812. }
  813. }
  814. for (int j = 0; j < L_toolList[i].toolOutput.Count; j++)
  815. {
  816. if (L_toolList[i].toolOutput[j].IOName == nodeText.Substring(3))
  817. L_toolList[i].RemoveOutputIO(nodeText.Substring(3));
  818. }
  819. }
  820. }
  821. }
  822. isDrawing = false;
  823. DrawLine();
  824. }
  825. catch (Exception ex)
  826. {
  827. // Log.SaveError(ex);
  828. }
  829. }
  830. public void Run()
  831. {
  832. FormImageWindow.Instance.ClearWindow();
  833. for (int i = 0; i < L_toolList.Count; i++)
  834. {
  835. TreeNode treeNode = GetToolNodeByNodeText(L_toolList[i].toolName);
  836. inputItemNum = (L_toolList[i]).toolInput.Count;
  837. outputItemNum = (L_toolList[i]).toolOutput.Count;
  838. // 通过要调用的程序集名称.类名,程序集名称 对类进行调用
  839. // FormToolName 中已存储程序集名称
  840. string assemblyName = $"{L_toolList[i].FormToolName.Split('.')[0]}.{L_toolList[i].toolType.ToString()}Run,{L_toolList[i].FormToolName.Split('.')[0]}";
  841. Type classType = Type.GetType(assemblyName);
  842. IToolRun myTool = (IToolRun)Activator.CreateInstance(classType);
  843. myTool.ToolRun(JobName, i, inputItemNum, treeNode, L_toolList, this, myHalconWindow);
  844. }
  845. }
  846. public void FormLogDisp(string mes, Color color, TreeNode treeNode, Logger.MsgLevel msgLevel = Logger.MsgLevel.Info)
  847. {
  848. LoggerClass.WriteLog(mes, msgLevel);
  849. if(treeNode != null)
  850. {
  851. treeNode.ForeColor = color;
  852. }
  853. }
  854. [NonSerialized]
  855. public FormImageWindow myHalconWindow = new FormImageWindow();
  856. public string JobDirectoryPath { get; set; } = @"D:\VisionSystem\";
  857. }
  858. }