OperateProject.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /*
  2. * ==============================================================================
  3. *
  4. * Filename: OperateJob
  5. * Description:
  6. *
  7. * Version: 1.0
  8. * Created: 2021/2/25 15:23:31
  9. *
  10. * Author: liu.wenjie
  11. *
  12. * ==============================================================================
  13. */
  14. using CommonMethods;
  15. using FormLib;
  16. using Logger;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Drawing;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Reflection;
  23. using System.Runtime.Serialization;
  24. using System.Runtime.Serialization.Formatters.Binary;
  25. using System.Text;
  26. using System.Text.RegularExpressions;
  27. using System.Threading.Tasks;
  28. using System.Windows.Forms;
  29. using WeifenLuo.WinFormsUI.Docking;
  30. namespace ToolLib.VisionJob
  31. {
  32. public class OperateProject
  33. {
  34. private static OperateProject _instance;
  35. private static readonly object lockObject = new object();
  36. private OperateProject() { }
  37. /// <summary>
  38. /// 操作者单例模式调用
  39. /// </summary>
  40. public static OperateProject Instance
  41. {
  42. get
  43. {
  44. if (_instance == null)
  45. {
  46. lock (lockObject)
  47. {
  48. if (_instance == null)
  49. {
  50. _instance = new OperateProject();
  51. }
  52. }
  53. }
  54. return _instance;
  55. }
  56. }
  57. public void CreateNewJob(string jobName = "newJob", bool newAddJob = true)
  58. {
  59. TabPage newTab = new TabPage(jobName);
  60. newTab.Controls.Add(new TreeView());
  61. FormJobManage.Instance.tabJobUnion.TabPages.Add(newTab);
  62. if(newAddJob)
  63. {
  64. VisionJobParams.pVisionProject.Project.Add(jobName, new VisionJob(jobName));
  65. FormJobManage.Instance.tabJobUnion.SelectedTab = newTab;
  66. }
  67. InitJob(VisionJobParams.pVisionProject.Project[jobName]);
  68. }
  69. public void CreateNewJob(string jobName, VisionJob newJob, bool newAddJob = true)
  70. {
  71. TabPage newTab = new TabPage(jobName);
  72. newTab.Controls.Add(new TreeView());
  73. FormJobManage.Instance.tabJobUnion.TabPages.Add(newTab);
  74. if (newAddJob)
  75. {
  76. VisionJobParams.pVisionProject.Project.Add(jobName, newJob);
  77. FormJobManage.Instance.tabJobUnion.SelectedTab = newTab;
  78. // newTab.Select();
  79. }
  80. newJob.JobName = jobName;
  81. InitJob(VisionJobParams.pVisionProject.Project[jobName]);
  82. }
  83. public void AddDispImageindow(DockPanel myPanel, DockState myState, string windowName)
  84. {
  85. if(VisionJobParams.pVisionProject.Project.ContainsKey(windowName))
  86. {
  87. FormImageWindow myImageWindow = VisionJobParams.pVisionProject.Project[windowName].myHalconWindow;
  88. if(myImageWindow == null)
  89. {
  90. myImageWindow = new FormImageWindow();
  91. }
  92. myImageWindow.Text = windowName + "-图像";
  93. myImageWindow.Show(myPanel, myState);
  94. }
  95. }
  96. public void SaveJob()
  97. {
  98. // Serialize.BinarySerialize($"{VisionJobParams.sSysConfigPath}Vision.prj" , VisionJobParams.myProject);
  99. //SaveFileDialog saveFileDialog = new SaveFileDialog();
  100. //saveFileDialog.Title = "请指定项目保存路径";
  101. //saveFileDialog.Filter = "项目文件|*.pjt";
  102. //saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
  103. //if (saveFileDialog.ShowDialog() == DialogResult.OK)
  104. //{
  105. // try
  106. // {
  107. // Serialize.BinarySerialize(saveFileDialog.FileName, VisionJobParams.myProject);
  108. // LoggerClass.WriteLog("项目保存成功");
  109. // }
  110. // catch (Exception ex)
  111. // {
  112. // LoggerClass.WriteLog("项目保存失败", ex);
  113. // }
  114. //}
  115. }
  116. public void InitJob(VisionJob myJob)
  117. {
  118. myJob.GetJobTree().ImageList = FormToolBox.Instance.imageListTool;
  119. if (myJob.L_toolList.Count > 0)
  120. {
  121. ReCoverJob(myJob);
  122. }
  123. myJob.GetJobTree().Dock = DockStyle.Fill;
  124. myJob.GetJobTree().Font = new Font("微软雅黑", 9, FontStyle.Bold);
  125. myJob.GetJobTree().Scrollable = true;
  126. myJob.GetJobTree().ItemHeight = 20;
  127. myJob.GetJobTree().ShowLines = false;
  128. myJob.GetJobTree().AllowDrop = true;
  129. // 在窗体UI出现变化时,更新画线
  130. myJob.GetJobTree().AfterSelect += myJob.tvw_job_AfterSelect;
  131. myJob.GetJobTree().ChangeUICues += myJob.MyJobTreeView_ChangeUICues;
  132. FormJobManage.Instance.SizeChanged += myJob.tbc_jobs_SelectedIndexChanged;
  133. //节点间拖拽
  134. myJob.GetJobTree().ItemDrag += new ItemDragEventHandler(myJob.TvwJob_ItemDrag);
  135. myJob.GetJobTree().DragEnter += new DragEventHandler(myJob.TvwJob_DragEnter);
  136. myJob.GetJobTree().DragDrop += new DragEventHandler(myJob.TvwJob_DragDrop);
  137. //以下事件为画线事件
  138. myJob.GetJobTree().MouseMove += myJob.DrawLineWithoutRefresh;
  139. myJob.GetJobTree().AfterExpand += myJob.Draw_Line;
  140. myJob.GetJobTree().AfterCollapse += myJob.Draw_Line;
  141. // 在流程节点上操作时
  142. myJob.GetJobTree().MouseDoubleClick += TreeViewJob_DoubleClick; ;
  143. myJob.GetJobTree().MouseClick += myJob.tvw_job_MouseClick;
  144. Application.DoEvents();
  145. if (myJob.GetJobTree().Nodes.Count > 0)
  146. {
  147. //默认选中第一个工具节点
  148. myJob.GetJobTree().SelectedNode = myJob.GetJobTree().Nodes[0];
  149. }
  150. //展开已默认添加的工具的输入输出项
  151. myJob.GetJobTree().ExpandAll();
  152. }
  153. public void InitJob(Dictionary<string, VisionJob> myProject, string jobName)
  154. {
  155. myProject[jobName].GetJobTree().Dock = DockStyle.Fill;
  156. myProject[jobName].GetJobTree().ImageList = FormToolBox.Instance.imageListTool;
  157. myProject[jobName].GetJobTree().Font = new Font("微软雅黑", 9, FontStyle.Bold);
  158. myProject[jobName].GetJobTree().Scrollable = true;
  159. myProject[jobName].GetJobTree().ItemHeight = 20;
  160. myProject[jobName].GetJobTree().ShowLines = false;
  161. myProject[jobName].GetJobTree().AllowDrop = true;
  162. //myTreeView.ImageList = Job.imageList;
  163. // 在窗体UI出现变化时,更新画线
  164. myProject[jobName].GetJobTree().AfterSelect += myProject[jobName].tvw_job_AfterSelect;
  165. myProject[jobName].GetJobTree().ChangeUICues += myProject[jobName].MyJobTreeView_ChangeUICues;
  166. FormJobManage.Instance.SizeChanged += myProject[jobName].tbc_jobs_SelectedIndexChanged;
  167. //节点间拖拽
  168. myProject[jobName].GetJobTree().ItemDrag += new ItemDragEventHandler(myProject[jobName].TvwJob_ItemDrag);
  169. myProject[jobName].GetJobTree().DragEnter += new DragEventHandler(myProject[jobName].TvwJob_DragEnter);
  170. myProject[jobName].GetJobTree().DragDrop += new DragEventHandler(myProject[jobName].TvwJob_DragDrop);
  171. //以下事件为画线事件
  172. myProject[jobName].GetJobTree().MouseMove += myProject[jobName].DrawLineWithoutRefresh;
  173. myProject[jobName].GetJobTree().AfterExpand += myProject[jobName].Draw_Line;
  174. myProject[jobName].GetJobTree().AfterCollapse += myProject[jobName].Draw_Line;
  175. // 在流程节点上操作时
  176. myProject[jobName].GetJobTree().MouseDoubleClick += TreeViewJob_DoubleClick; ;
  177. myProject[jobName].GetJobTree().MouseClick += myProject[jobName].tvw_job_MouseClick;
  178. Application.DoEvents();
  179. if(myProject[jobName].GetJobTree().Nodes.Count > 0)
  180. {
  181. //默认选中第一个工具节点
  182. myProject[jobName].GetJobTree().SelectedNode = myProject[jobName].GetJobTree().Nodes[0];
  183. }
  184. //展开已默认添加的工具的输入输出项
  185. myProject[jobName].GetJobTree().ExpandAll();
  186. }
  187. /// <summary>
  188. /// TreeView双击
  189. /// </summary>
  190. /// <param name="sender"></param>
  191. /// <param name="e"></param>
  192. public static void TreeViewJob_DoubleClick(object sender, MouseEventArgs e)
  193. {
  194. //判断是否在节点上双击
  195. object toolClass = new object();
  196. string jobName = FormJobManage.Instance.tabJobUnion.SelectedTab.Text;
  197. TreeViewHitTestInfo test = VisionJobParams.pVisionProject.Project[jobName].GetJobTree().HitTest(e.X, e.Y);
  198. TreeNode selectNode = test.Node.Level == 0 ? test.Node : test.Node.Parent;
  199. selectNode.ExpandAll();
  200. for (int i = 0; i < VisionJobParams.pVisionProject.Project[jobName].L_toolList.Count; i++)
  201. {
  202. if (selectNode.Text == VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].toolName)
  203. {
  204. string AssemblyName = VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].FormToolName.Split('.')[0];
  205. string className = VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].FormToolName;
  206. toolClass = VisionJobParams.pVisionProject.Project[jobName].L_toolList[i];
  207. VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].bingingJobName = jobName;
  208. //IToolInfo.FormTool = (Form)Assembly.Load(AssemblyName).CreateInstance(className, false, BindingFlags.Default, null, new object[] { toolClass }, null, null);
  209. //IToolInfo.FormTool.ShowDialog();
  210. VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].FormTool = (Form)Assembly.Load(AssemblyName).CreateInstance(className, false, BindingFlags.Default, null, new object[] { toolClass }, null, null);
  211. VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].FormTool.Show();
  212. }
  213. }
  214. }
  215. /// <summary>
  216. /// 恢复工具之间的关系和连线
  217. /// </summary>
  218. private void ReCoverJob(VisionJob myJob, ImageList inputImageList = null)
  219. {
  220. //反序列化各工具
  221. myJob.D_itemAndSource.Clear();
  222. for (int i = 0; i < myJob.L_toolList.Count; i++)
  223. {
  224. TreeNode node = myJob.GetJobTree().Nodes.Add(myJob.L_toolList[i].toolName);
  225. for (int j = 0; j < myJob.L_toolList[i].toolInput.Count; j++)
  226. {
  227. TreeNode treeNode;
  228. //因为OutputBox只有源,所以此处特殊处理
  229. if (myJob.L_toolList[i].toolType != ToolType.Output)
  230. treeNode = node.Nodes.Add("<--" + myJob.L_toolList[i].toolInput[j].IOName + myJob.L_toolList[i].toolInput[j].value);
  231. else
  232. treeNode = node.Nodes.Add("<--" + myJob.L_toolList[i].toolInput[j].IOName);
  233. treeNode.Tag = myJob.L_toolList[i].toolInput[j].ioType;
  234. treeNode.ForeColor = Color.DarkMagenta;
  235. //解析需要连线的节点对
  236. if (treeNode.ToString().Contains("《-"))
  237. {
  238. string toolNodeText = Regex.Split(myJob.L_toolList[i].toolInput[j].value.ToString(), "->")[0].Substring(3);
  239. string a = myJob.L_toolList[i].toolInput[j].value.ToString();
  240. string toolIONodeText = "-->" + Regex.Split(myJob.L_toolList[i].toolInput[j].value.ToString(), "->")[1];
  241. myJob.D_itemAndSource.Add(treeNode, myJob.GetToolIONodeByNodeText(toolNodeText, toolIONodeText));
  242. }
  243. if (myJob.L_toolList[i].toolType == ToolType.Output)
  244. {
  245. string toolNodeText = Regex.Split(treeNode.Text, "->")[0].Substring(3);
  246. string toolIONodeText = Regex.Split(treeNode.Text, "->")[1];
  247. myJob.D_itemAndSource.Add(treeNode, myJob.GetToolIONodeByNodeText(toolNodeText, "-->" + toolIONodeText));
  248. }
  249. }
  250. for (int k = 0; k < myJob.L_toolList[i].toolOutput.Count; k++)
  251. {
  252. TreeNode treeNode = node.Nodes.Add("-->" + myJob.L_toolList[i].toolOutput[k].IOName);
  253. treeNode.Tag = myJob.L_toolList[i].toolOutput[k].ioType;
  254. treeNode.ForeColor = Color.Blue;
  255. }
  256. }
  257. // UpdateJobTreeIcon(job.jobName);
  258. //默认选中第一个节点
  259. //if (tvw_job.Nodes.Count > 0)
  260. // tvw_job.SelectedNode = tvw_job.Nodes[0];
  261. }
  262. }
  263. }