ProcedureModel.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. using Cognex.VisionPro.ToolBlock;
  2. using Newtonsoft.Json;
  3. using Prism.Mvvm;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Collections.ObjectModel;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using TeamAAS_VP.Enums;
  12. using TeamAAS_VP.Models.Feeder;
  13. using TeamAAS_VP.Models.Lights;
  14. using TeamAAS_VP.Models.Product;
  15. namespace TeamAAS_VP.Models
  16. {
  17. /// <summary>
  18. /// 流程模型
  19. /// </summary>
  20. [JsonObject(MemberSerialization.OptOut)]
  21. public class ProcedureModel : BindableBase
  22. {
  23. public Guid Id { get; set; }
  24. /// <summary>
  25. /// 流程名称
  26. /// </summary>
  27. public string Name { get; set; }
  28. public string CameraName { get; set; }
  29. /// <summary>
  30. /// 视觉图像处理模式
  31. /// </summary>
  32. public VisionModel VisionModel { get; set; }
  33. /// <summary>
  34. /// 触发相机命令
  35. /// </summary>
  36. public string TriggerCommand { get; set; }
  37. /// <summary>
  38. /// 机器人
  39. /// </summary>
  40. public Guid RobotId { get; set; }
  41. /// <summary>
  42. /// Feeder
  43. /// </summary>
  44. public Guid FeederId { get; set; }
  45. /// <summary>
  46. /// Camera
  47. /// </summary>
  48. public Guid CameraId { get; set; }
  49. /// <summary>
  50. /// 校准
  51. /// </summary>
  52. public Guid CalibrationId { get; set; }
  53. private ObservableCollection<ProcedureOutput> _ProcedureOutputs;
  54. /// <summary>
  55. /// 视觉流程输出集合
  56. /// </summary>
  57. public ObservableCollection<ProcedureOutput> ProcedureOutputs
  58. {
  59. get { return _ProcedureOutputs; }
  60. set { SetProperty(ref _ProcedureOutputs, value); }
  61. }
  62. private string _OutputSeparator = ";";
  63. /// <summary>
  64. /// 视觉流程输出项之间的分割符
  65. /// </summary>
  66. public string OutputSeparator
  67. {
  68. get { return _OutputSeparator; }
  69. set { SetProperty(ref _OutputSeparator, value); }
  70. }
  71. private FeederWorks _FeederWorks;
  72. /// <summary>
  73. /// Feeder振动集合
  74. /// </summary>
  75. public FeederWorks FeederWorks
  76. {
  77. get { return _FeederWorks; }
  78. set { SetProperty(ref _FeederWorks, value); }
  79. }
  80. private FeederStockWorks _FeederStockWorks;
  81. /// <summary>
  82. /// Feeder料仓振动集合
  83. /// </summary>
  84. public FeederStockWorks FeederStockWorks
  85. {
  86. get { return _FeederStockWorks; }
  87. set { SetProperty(ref _FeederStockWorks, value); }
  88. }
  89. private double _MinArea;
  90. /// <summary>
  91. /// Blob最小面积
  92. /// </summary>
  93. public double MinArea
  94. {
  95. get { return _MinArea; }
  96. set { SetProperty(ref _MinArea, value); }
  97. }
  98. private int _LightValue;
  99. /// <summary>
  100. /// 亮度
  101. /// </summary>
  102. public int LightValue
  103. {
  104. get { return _LightValue; }
  105. set { SetProperty(ref _LightValue, value); }
  106. }
  107. private float _ExposureTime;
  108. /// <summary>
  109. /// 相机曝光时间
  110. /// </summary>
  111. public float ExposureTime
  112. {
  113. get { return _ExposureTime; }
  114. set { SetProperty(ref _ExposureTime, value); }
  115. }
  116. private float _Gain;
  117. /// <summary>
  118. /// 相机增益
  119. /// </summary>
  120. public float Gain
  121. {
  122. get { return _Gain; }
  123. set { SetProperty(ref _Gain, value); }
  124. }
  125. private CogToolBlock _ToolBlock;
  126. /// <summary>
  127. /// 工具组
  128. /// </summary>
  129. [JsonIgnore]
  130. public CogToolBlock ToolBlock
  131. {
  132. get { return _ToolBlock; }
  133. set { SetProperty(ref _ToolBlock, value); }
  134. }
  135. private ObservableCollection<ToolInfo> _ToolInfo = new ObservableCollection<ToolInfo>();
  136. /// <summary>
  137. /// 工具末端的补偿
  138. /// </summary>
  139. public ObservableCollection<ToolInfo> ToolInfo
  140. {
  141. get { return _ToolInfo; }
  142. set { SetProperty(ref _ToolInfo, value); }
  143. }
  144. private int _WaitPhoto;
  145. /// <summary>
  146. /// 延时拍照时长(ms)
  147. /// </summary>
  148. public int WaitPhoto
  149. {
  150. get { return _WaitPhoto; }
  151. set { SetProperty(ref _WaitPhoto, value); }
  152. }
  153. private int _WaitFeederStop;
  154. /// <summary>
  155. /// 等待震动盘静止时长(ms)
  156. /// </summary>
  157. public int WaitFeederStop
  158. {
  159. get { return _WaitFeederStop; }
  160. set { SetProperty(ref _WaitFeederStop, value); }
  161. }
  162. private VibrationModel _VibrationModel;
  163. /// <summary>
  164. /// 振动模式
  165. /// </summary>
  166. public VibrationModel VibrationModel
  167. {
  168. get { return _VibrationModel; }
  169. set { SetProperty(ref _VibrationModel, value); }
  170. }
  171. private int _FeederFailLimit;
  172. /// <summary>
  173. /// 拍照失败Feeder振动最大次数
  174. /// </summary>
  175. public int FeederFailLimit
  176. {
  177. get { return _FeederFailLimit; }
  178. set { SetProperty(ref _FeederFailLimit, value); }
  179. }
  180. private OutputPointMode _OutputPointMode;
  181. /// <summary>
  182. /// 点位发送的模式
  183. /// </summary>
  184. public OutputPointMode OutputPointMode
  185. {
  186. get { return _OutputPointMode; }
  187. set { SetProperty(ref _OutputPointMode, value); }
  188. }
  189. private int _OutputPointCountMax = 100;
  190. /// <summary>
  191. /// 每次发送给机器人的点数最大值
  192. /// </summary>
  193. public int OutputPointCountMax
  194. {
  195. get { return _OutputPointCountMax; }
  196. set { SetProperty(ref _OutputPointCountMax, value); }
  197. }
  198. private bool _IsExcludeNearPoint;
  199. /// <summary>
  200. /// 是否剔除本次识别到的物料与上一次识别到的物料位置过近的点
  201. /// </summary>
  202. public bool IsExcludeNearPoint
  203. {
  204. get { return _IsExcludeNearPoint; }
  205. set { SetProperty(ref _IsExcludeNearPoint, value); }
  206. }
  207. private bool _IsImageVisibility = true;
  208. /// <summary>
  209. /// 是否剔除本次识别到的物料与上一次识别到的物料位置过近的点
  210. /// </summary>
  211. public bool IsImageVisibility
  212. {
  213. get { return _IsImageVisibility; }
  214. set { SetProperty(ref _IsImageVisibility, value); }
  215. }
  216. private double _ExcludeNearPointThreshol = 1;
  217. /// <summary>
  218. /// 物料位置过近阈值
  219. /// </summary>
  220. public double ExcludeNearPointThreshol
  221. {
  222. get { return _ExcludeNearPointThreshol; }
  223. set { SetProperty(ref _ExcludeNearPointThreshol, value); }
  224. }
  225. private bool _IsSaveImage;
  226. /// <summary>
  227. /// 保存图像
  228. /// </summary>
  229. public bool IsSaveImage
  230. {
  231. get { return _IsSaveImage; }
  232. set { SetProperty(ref _IsSaveImage, value); }
  233. }
  234. private ProcedureSaveImageModel _SaveImageModel;
  235. /// <summary>
  236. /// 存图模式
  237. /// </summary>
  238. public ProcedureSaveImageModel SaveImageModel
  239. {
  240. get { return _SaveImageModel; }
  241. set { SetProperty(ref _SaveImageModel, value); }
  242. }
  243. private ProcedureSaveImagePathModel _SaveImagePathModel;
  244. /// <summary>
  245. /// 存图路径模式
  246. /// </summary>
  247. public ProcedureSaveImagePathModel SaveImagePathModel
  248. {
  249. get { return _SaveImagePathModel; }
  250. set { SetProperty(ref _SaveImagePathModel, value); }
  251. }
  252. private string _SavePath;
  253. /// <summary>
  254. /// 存图路径
  255. /// </summary>
  256. public string SavePath
  257. {
  258. get { return _SavePath; }
  259. set { SetProperty(ref _SavePath, value); }
  260. }
  261. //用户定义的图片文件名格式,例如:{ProductSN}_Daisy_KB Screw _01 _{CameraName}-Locate_{ShotCount}_WhiteRingLight_{Result}_{DateTime:yyyy-MM-dd_HH-mm-ss}.png
  262. private string _ImageFileNameFormat;
  263. /// <summary>
  264. /// 用户定义的图片文件名格式,例如:{ProductSN}_Daisy_KB Screw _01 _{CameraName}-Locate_{ShotCount}_WhiteRingLight_{Result}_{DateTime:yyyy-MM-dd_HH-mm-ss}.png
  265. /// </summary>
  266. public string ImageFileNameFormat
  267. {
  268. get { return _ImageFileNameFormat; }
  269. set { SetProperty(ref _ImageFileNameFormat, value); }
  270. }
  271. private bool _IsCompress;
  272. /// <summary>
  273. /// 是否压缩图片
  274. /// </summary>
  275. public bool IsCompress
  276. {
  277. get { return _IsCompress; }
  278. set { SetProperty(ref _IsCompress, value); }
  279. }
  280. private bool _IsDelaySaveImage;
  281. /// <summary>
  282. /// 是否延迟保存图片
  283. /// </summary>
  284. public bool IsDelaySaveImage
  285. {
  286. get { return _IsDelaySaveImage; }
  287. set { SetProperty(ref _IsDelaySaveImage, value); }
  288. }
  289. private FeederFrequencyModel _FeederFindFrequency;
  290. /// <summary>
  291. /// Feeder自动寻频配置
  292. /// </summary>
  293. public FeederFrequencyModel FeederFindFrequency
  294. {
  295. get { return _FeederFindFrequency; }
  296. set { SetProperty(ref _FeederFindFrequency, value); }
  297. }
  298. private ObservableCollection<ProcedureUserDefineParam> _UserDefineParameters;
  299. /// <summary>
  300. /// 用户自定义参数
  301. /// </summary>
  302. public ObservableCollection<ProcedureUserDefineParam> UserDefineParameters
  303. {
  304. get { return _UserDefineParameters; }
  305. set { SetProperty(ref _UserDefineParameters, value); }
  306. }
  307. private bool _IsControlLightChannels;
  308. /// <summary>
  309. /// 是否控制光源通道亮灭
  310. /// </summary>
  311. public bool IsControlLightChannels
  312. {
  313. get { return _IsControlLightChannels; }
  314. set { SetProperty(ref _IsControlLightChannels, value); }
  315. }
  316. private ObservableCollection<ChannelConfig> _LightChannels;
  317. /// <summary>
  318. /// 光源通道配置集合。每个流程可配置多个光源通道及其默认亮度。
  319. /// </summary>
  320. public ObservableCollection<ChannelConfig> LightChannels
  321. {
  322. get { return _LightChannels; }
  323. set { SetProperty(ref _LightChannels, value); }
  324. }
  325. #region 运行时的一些临时记忆
  326. /// <summary>
  327. /// 最后一次的Blob面积值
  328. /// </summary>
  329. [JsonIgnore]
  330. public double LastBlobArea { get; set; } = 0;
  331. /// <summary>
  332. /// 最后一次运行的点数据
  333. /// </summary>
  334. [JsonIgnore]
  335. public List<double[]> LastRunPoints { get; set; } = new List<double[]>();
  336. #endregion
  337. public ProcedureModel()
  338. {
  339. Id = Guid.NewGuid();
  340. ProcedureOutputs = new ObservableCollection<ProcedureOutput>();
  341. ToolInfo = new ObservableCollection<ToolInfo>();
  342. FeederFindFrequency = new FeederFrequencyModel();
  343. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>();
  344. FeederWorks = new FeederWorks();
  345. FeederStockWorks = new FeederStockWorks();
  346. LightChannels = new ObservableCollection<ChannelConfig>();
  347. IsImageVisibility = true;
  348. }
  349. public ProcedureModel(string name, string cameraName, Guid cameraId)
  350. {
  351. Id = Guid.NewGuid();
  352. Name = name;
  353. CameraName = cameraName;
  354. CameraId = cameraId;
  355. ProcedureOutputs = new ObservableCollection<ProcedureOutput>();
  356. ToolInfo = new ObservableCollection<ToolInfo>();
  357. FeederFindFrequency = new FeederFrequencyModel();
  358. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>();
  359. FeederWorks = new FeederWorks();
  360. FeederStockWorks = new FeederStockWorks();
  361. LightChannels = new ObservableCollection<ChannelConfig>();
  362. IsImageVisibility = true;
  363. }
  364. public ProcedureModel Clone()
  365. {
  366. return new ProcedureModel
  367. {
  368. Id = this.Id,
  369. Name = this.Name,
  370. CameraName = this.CameraName,
  371. VisionModel = this.VisionModel,
  372. TriggerCommand = this.TriggerCommand,
  373. RobotId = this.RobotId,
  374. FeederId = this.FeederId,
  375. CameraId = this.CameraId,
  376. CalibrationId = this.CalibrationId,
  377. ProcedureOutputs = new ObservableCollection<ProcedureOutput>(this.ProcedureOutputs.Select(po => po.Copy())),
  378. FeederWorks = this.FeederWorks?.Copy(),
  379. FeederStockWorks = this.FeederStockWorks?.Copy(),
  380. MinArea = this.MinArea,
  381. LightValue = this.LightValue,
  382. ExposureTime = this.ExposureTime,
  383. Gain = this.Gain,
  384. // ToolBlock不克隆
  385. ToolInfo = new ObservableCollection<ToolInfo>(this.ToolInfo.Select(ti => ti.Copy())),
  386. WaitPhoto = this.WaitPhoto,
  387. WaitFeederStop = this.WaitFeederStop,
  388. VibrationModel = this.VibrationModel,
  389. FeederFailLimit = this.FeederFailLimit,
  390. OutputPointCountMax = this.OutputPointCountMax,
  391. IsSaveImage = this.IsSaveImage,
  392. SaveImageModel = this.SaveImageModel,
  393. SaveImagePathModel = this.SaveImagePathModel,
  394. SavePath = this.SavePath,
  395. ImageFileNameFormat = this.ImageFileNameFormat,
  396. IsCompress = this.IsCompress,
  397. IsDelaySaveImage = this.IsDelaySaveImage,
  398. FeederFindFrequency = this.FeederFindFrequency?.Copy(),
  399. IsExcludeNearPoint = this.IsExcludeNearPoint,
  400. ExcludeNearPointThreshol = this.ExcludeNearPointThreshol,
  401. OutputPointMode = this.OutputPointMode,
  402. IsImageVisibility = this.IsImageVisibility,
  403. OutputSeparator = this.OutputSeparator,
  404. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>(this.UserDefineParameters.Select(udp => udp.Copy())),
  405. LightChannels = this.LightChannels == null ? new ObservableCollection<ChannelConfig>() : new ObservableCollection<ChannelConfig>(this.LightChannels.Select(ch => new ChannelConfig
  406. {
  407. Name = ch.Name,
  408. Description = ch.Description,
  409. LocalIndex = ch.LocalIndex,
  410. GlobalIndex = ch.GlobalIndex,
  411. DefaultBrightness = ch.DefaultBrightness
  412. })),
  413. };
  414. }
  415. }
  416. }