ProcedureModel.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  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. private int _CameraNo;
  30. /// <summary>
  31. /// 相机编号
  32. /// </summary>
  33. public int CameraNo
  34. {
  35. get { return _CameraNo; }
  36. set { SetProperty(ref _CameraNo, value); }
  37. }
  38. /// <summary>
  39. /// AI Train 文件夹名称
  40. /// </summary>
  41. private string _CameraTrainFolder;
  42. public string CameraTrainFolder
  43. {
  44. get { return _CameraTrainFolder; }
  45. set
  46. {
  47. if (value == null)
  48. {
  49. return;
  50. }
  51. if (value=="Null")
  52. {
  53. SetProperty(ref _CameraTrainFolder, null);
  54. }
  55. else
  56. {
  57. SetProperty(ref _CameraTrainFolder, value);
  58. }
  59. }
  60. }
  61. /// <summary>
  62. /// 视觉图像处理模式
  63. /// </summary>
  64. public VisionModel VisionModel { get; set; }
  65. /// <summary>
  66. /// 触发相机命令
  67. /// </summary>
  68. public string TriggerCommand { get; set; }
  69. /// <summary>
  70. /// 机器人
  71. /// </summary>
  72. public Guid RobotId { get; set; }
  73. /// <summary>
  74. /// Feeder
  75. /// </summary>
  76. public Guid FeederId { get; set; }
  77. /// <summary>
  78. /// Camera
  79. /// </summary>
  80. public Guid CameraId { get; set; }
  81. /// <summary>
  82. /// 校准
  83. /// </summary>
  84. public Guid CalibrationId { get; set; }
  85. private ObservableCollection<ProcedureOutput> _ProcedureOutputs;
  86. /// <summary>
  87. /// 主页图像显示窗口的ID
  88. /// </summary>
  89. public Guid DisplayId { get; set; }
  90. /// <summary>
  91. /// 主页图像显示窗口的名称
  92. /// </summary>
  93. public string DisplayName { get; set; }
  94. /// <summary>
  95. /// 视觉流程输出集合
  96. /// </summary>
  97. public ObservableCollection<ProcedureOutput> ProcedureOutputs
  98. {
  99. get { return _ProcedureOutputs; }
  100. set { SetProperty(ref _ProcedureOutputs, value); }
  101. }
  102. private string _OutputSeparator = ";";
  103. /// <summary>
  104. /// 视觉流程输出项之间的分割符
  105. /// </summary>
  106. public string OutputSeparator
  107. {
  108. get { return _OutputSeparator; }
  109. set { SetProperty(ref _OutputSeparator, value); }
  110. }
  111. private FeederWorks _FeederWorks;
  112. /// <summary>
  113. /// Feeder振动集合
  114. /// </summary>
  115. public FeederWorks FeederWorks
  116. {
  117. get { return _FeederWorks; }
  118. set { SetProperty(ref _FeederWorks, value); }
  119. }
  120. private FeederStockWorks _FeederStockWorks;
  121. /// <summary>
  122. /// Feeder料仓振动集合
  123. /// </summary>
  124. public FeederStockWorks FeederStockWorks
  125. {
  126. get { return _FeederStockWorks; }
  127. set { SetProperty(ref _FeederStockWorks, value); }
  128. }
  129. private double _MinArea;
  130. /// <summary>
  131. /// Blob最小面积
  132. /// </summary>
  133. public double MinArea
  134. {
  135. get { return _MinArea; }
  136. set { SetProperty(ref _MinArea, value); }
  137. }
  138. private int _LightValue;
  139. /// <summary>
  140. /// 亮度
  141. /// </summary>
  142. public int LightValue
  143. {
  144. get { return _LightValue; }
  145. set { SetProperty(ref _LightValue, value); }
  146. }
  147. private float _ExposureTime;
  148. /// <summary>
  149. /// 相机曝光时间
  150. /// </summary>
  151. public float ExposureTime
  152. {
  153. get { return _ExposureTime; }
  154. set { SetProperty(ref _ExposureTime, value); }
  155. }
  156. private float _ExposureTime2;
  157. /// <summary>
  158. /// 相机曝光2时间
  159. /// </summary>
  160. public float ExposureTime2
  161. {
  162. get { return _ExposureTime2; }
  163. set { SetProperty(ref _ExposureTime2, value); }
  164. }
  165. private float _Gain;
  166. /// <summary>
  167. /// 相机增益
  168. /// </summary>
  169. public float Gain
  170. {
  171. get { return _Gain; }
  172. set { SetProperty(ref _Gain, value); }
  173. }
  174. private float _Gain2;
  175. /// <summary>
  176. /// 相机增益2
  177. /// </summary>
  178. public float Gain2
  179. {
  180. get { return _Gain2; }
  181. set { SetProperty(ref _Gain2, value); }
  182. }
  183. private int _Photo1Light1;
  184. /// <summary>
  185. /// 第一次拍照光源1亮度
  186. /// </summary>
  187. public int Photo1Light1
  188. {
  189. get { return _Photo1Light1; }
  190. set { SetProperty(ref _Photo1Light1, value); }
  191. }
  192. private int _Photo1Light2;
  193. /// <summary>
  194. /// 第一次拍照光源2亮度
  195. /// </summary>
  196. public int Photo1Light2
  197. {
  198. get { return _Photo1Light2; }
  199. set { SetProperty(ref _Photo1Light2, value); }
  200. }
  201. private int _Photo1Light3;
  202. /// <summary>
  203. /// 第一次拍照光源3亮度
  204. /// </summary>
  205. public int Photo1Light3
  206. {
  207. get { return _Photo1Light3; }
  208. set { SetProperty(ref _Photo1Light3, value); }
  209. }
  210. private int _Photo2Light1;
  211. /// <summary>
  212. /// 第二次拍照光源1亮度
  213. /// </summary>
  214. public int Photo2Light1
  215. {
  216. get { return _Photo2Light1; }
  217. set { SetProperty(ref _Photo2Light1, value); }
  218. }
  219. private int _Photo2Light2;
  220. /// <summary>
  221. /// 第二次拍照光源2亮度
  222. /// </summary>
  223. public int Photo2Light2
  224. {
  225. get { return _Photo2Light2; }
  226. set { SetProperty(ref _Photo2Light2, value); }
  227. }
  228. private int _Photo2Light3;
  229. /// <summary>
  230. /// 第二次拍照光源3亮度
  231. /// </summary>
  232. public int Photo2Light3
  233. {
  234. get { return _Photo2Light3; }
  235. set { SetProperty(ref _Photo2Light3, value); }
  236. }
  237. private int _PhotoCount;
  238. /// <summary>
  239. /// 拍照次数
  240. /// </summary>
  241. public int PhotoCount
  242. {
  243. get { return _PhotoCount; }
  244. set { SetProperty(ref _PhotoCount, value); }
  245. }
  246. private CogToolBlock _ToolBlock;
  247. /// <summary>
  248. /// 工具组
  249. /// </summary>
  250. [JsonIgnore]
  251. public CogToolBlock ToolBlock
  252. {
  253. get { return _ToolBlock; }
  254. set { SetProperty(ref _ToolBlock, value); }
  255. }
  256. private ObservableCollection<ToolInfo> _ToolInfo = new ObservableCollection<ToolInfo>();
  257. /// <summary>
  258. /// 工具末端的补偿
  259. /// </summary>
  260. public ObservableCollection<ToolInfo> ToolInfo
  261. {
  262. get { return _ToolInfo; }
  263. set { SetProperty(ref _ToolInfo, value); }
  264. }
  265. private int _WaitPhoto;
  266. /// <summary>
  267. /// 延时拍照时长(ms)
  268. /// </summary>
  269. public int WaitPhoto
  270. {
  271. get { return _WaitPhoto; }
  272. set { SetProperty(ref _WaitPhoto, value); }
  273. }
  274. private int _WaitFeederStop;
  275. /// <summary>
  276. /// 等待震动盘静止时长(ms)
  277. /// </summary>
  278. public int WaitFeederStop
  279. {
  280. get { return _WaitFeederStop; }
  281. set { SetProperty(ref _WaitFeederStop, value); }
  282. }
  283. private VibrationModel _VibrationModel;
  284. /// <summary>
  285. /// 振动模式
  286. /// </summary>
  287. public VibrationModel VibrationModel
  288. {
  289. get { return _VibrationModel; }
  290. set { SetProperty(ref _VibrationModel, value); }
  291. }
  292. private int _FeederFailLimit;
  293. /// <summary>
  294. /// 拍照失败Feeder振动最大次数
  295. /// </summary>
  296. public int FeederFailLimit
  297. {
  298. get { return _FeederFailLimit; }
  299. set { SetProperty(ref _FeederFailLimit, value); }
  300. }
  301. private OutputPointMode _OutputPointMode;
  302. /// <summary>
  303. /// 点位发送的模式
  304. /// </summary>
  305. public OutputPointMode OutputPointMode
  306. {
  307. get { return _OutputPointMode; }
  308. set { SetProperty(ref _OutputPointMode, value); }
  309. }
  310. private int _OutputPointCountMax = 100;
  311. /// <summary>
  312. /// 每次发送给机器人的点数最大值
  313. /// </summary>
  314. public int OutputPointCountMax
  315. {
  316. get { return _OutputPointCountMax; }
  317. set { SetProperty(ref _OutputPointCountMax, value); }
  318. }
  319. private bool _IsExcludeNearPoint;
  320. /// <summary>
  321. /// 是否剔除本次识别到的物料与上一次识别到的物料位置过近的点
  322. /// </summary>
  323. public bool IsExcludeNearPoint
  324. {
  325. get { return _IsExcludeNearPoint; }
  326. set { SetProperty(ref _IsExcludeNearPoint, value); }
  327. }
  328. private double _ExcludeNearPointThreshol = 1;
  329. /// <summary>
  330. /// 物料位置过近阈值
  331. /// </summary>
  332. public double ExcludeNearPointThreshol
  333. {
  334. get { return _ExcludeNearPointThreshol; }
  335. set { SetProperty(ref _ExcludeNearPointThreshol, value); }
  336. }
  337. private bool _IsSaveImage;
  338. /// <summary>
  339. /// 保存图像
  340. /// </summary>
  341. public bool IsSaveImage
  342. {
  343. get { return _IsSaveImage; }
  344. set { SetProperty(ref _IsSaveImage, value); }
  345. }
  346. private ProcedureSaveImageModel _SaveImageModel;
  347. /// <summary>
  348. /// 存图模式
  349. /// </summary>
  350. public ProcedureSaveImageModel SaveImageModel
  351. {
  352. get { return _SaveImageModel; }
  353. set { SetProperty(ref _SaveImageModel, value); }
  354. }
  355. private ProcedureSaveImagePathModel _SaveImagePathModel;
  356. /// <summary>
  357. /// 存图路径模式
  358. /// </summary>
  359. public ProcedureSaveImagePathModel SaveImagePathModel
  360. {
  361. get { return _SaveImagePathModel; }
  362. set { SetProperty(ref _SaveImagePathModel, value); }
  363. }
  364. private string _SavePath;
  365. /// <summary>
  366. /// 存图路径
  367. /// </summary>
  368. public string SavePath
  369. {
  370. get { return _SavePath; }
  371. set { SetProperty(ref _SavePath, value); }
  372. }
  373. //用户定义的图片文件名格式,例如:{ProductSN}_Daisy_KB Screw _01 _{CameraName}-Locate_{ShotCount}_WhiteRingLight_{Result}_{DateTime:yyyy-MM-dd_HH-mm-ss}.png
  374. private string _ImageFileNameFormat;
  375. /// <summary>
  376. /// 用户定义的图片文件名格式,例如:{ProductSN}_Daisy_KB Screw _01 _{CameraName}-Locate_{ShotCount}_WhiteRingLight_{Result}_{DateTime:yyyy-MM-dd_HH-mm-ss}.png
  377. /// </summary>
  378. public string ImageFileNameFormat
  379. {
  380. get { return _ImageFileNameFormat; }
  381. set { SetProperty(ref _ImageFileNameFormat, value); }
  382. }
  383. private bool _IsCompress;
  384. /// <summary>
  385. /// 是否压缩图片
  386. /// </summary>
  387. public bool IsCompress
  388. {
  389. get { return _IsCompress; }
  390. set { SetProperty(ref _IsCompress, value); }
  391. }
  392. private FeederFrequencyModel _FeederFindFrequency;
  393. /// <summary>
  394. /// Feeder自动寻频配置
  395. /// </summary>
  396. public FeederFrequencyModel FeederFindFrequency
  397. {
  398. get { return _FeederFindFrequency; }
  399. set { SetProperty(ref _FeederFindFrequency, value); }
  400. }
  401. private ObservableCollection<ProcedureUserDefineParam> _UserDefineParameters;
  402. /// <summary>
  403. /// 用户自定义参数
  404. /// </summary>
  405. public ObservableCollection<ProcedureUserDefineParam> UserDefineParameters
  406. {
  407. get { return _UserDefineParameters; }
  408. set { SetProperty(ref _UserDefineParameters, value); }
  409. }
  410. private bool _IsControlLightChannels;
  411. /// <summary>
  412. /// 是否控制光源通道亮灭
  413. /// </summary>
  414. public bool IsControlLightChannels
  415. {
  416. get { return _IsControlLightChannels; }
  417. set { SetProperty(ref _IsControlLightChannels, value); }
  418. }
  419. private ObservableCollection<ChannelConfig> _LightChannels;
  420. /// <summary>
  421. /// 光源通道配置集合。每个流程可配置多个光源通道及其默认亮度。
  422. /// </summary>
  423. public ObservableCollection<ChannelConfig> LightChannels
  424. {
  425. get { return _LightChannels; }
  426. set { SetProperty(ref _LightChannels, value); }
  427. }
  428. #region 运行时的一些临时记忆
  429. /// <summary>
  430. /// 最后一次的Blob面积值
  431. /// </summary>
  432. [JsonIgnore]
  433. public double LastBlobArea { get; set; } = 0;
  434. /// <summary>
  435. /// 最后一次运行的点数据
  436. /// </summary>
  437. [JsonIgnore]
  438. public List<double[]> LastRunPoints { get; set; } = new List<double[]>();
  439. #endregion
  440. public ProcedureModel()
  441. {
  442. Id = Guid.NewGuid();
  443. ProcedureOutputs = new ObservableCollection<ProcedureOutput>();
  444. ToolInfo = new ObservableCollection<ToolInfo>();
  445. FeederFindFrequency = new FeederFrequencyModel();
  446. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>();
  447. FeederWorks = new FeederWorks();
  448. FeederStockWorks = new FeederStockWorks();
  449. LightChannels = new ObservableCollection<ChannelConfig>();
  450. }
  451. public ProcedureModel(string name, string cameraName, Guid cameraId, int camerano)
  452. {
  453. Id = Guid.NewGuid();
  454. Name = name;
  455. CameraName = cameraName;
  456. CameraNo = camerano;
  457. CameraId = cameraId;
  458. ProcedureOutputs = new ObservableCollection<ProcedureOutput>();
  459. ToolInfo = new ObservableCollection<ToolInfo>();
  460. FeederFindFrequency = new FeederFrequencyModel();
  461. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>();
  462. FeederWorks = new FeederWorks();
  463. FeederStockWorks = new FeederStockWorks();
  464. LightChannels = new ObservableCollection<ChannelConfig>();
  465. }
  466. public ProcedureModel Clone()
  467. {
  468. return new ProcedureModel
  469. {
  470. Id = this.Id,
  471. Name = this.Name,
  472. CameraName = this.CameraName,
  473. CameraNo = this.CameraNo,
  474. VisionModel = this.VisionModel,
  475. CameraTrainFolder = this.CameraTrainFolder,
  476. TriggerCommand = this.TriggerCommand,
  477. RobotId = this.RobotId,
  478. FeederId = this.FeederId,
  479. CameraId = this.CameraId,
  480. CalibrationId = this.CalibrationId,
  481. DisplayId = this.DisplayId,
  482. DisplayName = this.DisplayName,
  483. ProcedureOutputs = new ObservableCollection<ProcedureOutput>(this.ProcedureOutputs.Select(po => po.Copy())),
  484. FeederWorks = this.FeederWorks?.Copy(),
  485. FeederStockWorks = this.FeederStockWorks?.Copy(),
  486. MinArea = this.MinArea,
  487. LightValue = this.LightValue,
  488. ExposureTime = this.ExposureTime,
  489. Gain = this.Gain,
  490. // ToolBlock不克隆
  491. ToolInfo = new ObservableCollection<ToolInfo>(this.ToolInfo.Select(ti => ti.Copy())),
  492. WaitPhoto = this.WaitPhoto,
  493. WaitFeederStop = this.WaitFeederStop,
  494. VibrationModel = this.VibrationModel,
  495. FeederFailLimit = this.FeederFailLimit,
  496. OutputPointCountMax = this.OutputPointCountMax,
  497. IsSaveImage = this.IsSaveImage,
  498. SaveImageModel = this.SaveImageModel,
  499. SaveImagePathModel = this.SaveImagePathModel,
  500. SavePath = this.SavePath,
  501. ImageFileNameFormat = this.ImageFileNameFormat,
  502. IsCompress = this.IsCompress,
  503. FeederFindFrequency = this.FeederFindFrequency?.Copy(),
  504. IsExcludeNearPoint = this.IsExcludeNearPoint,
  505. ExcludeNearPointThreshol = this.ExcludeNearPointThreshol,
  506. OutputPointMode = this.OutputPointMode,
  507. OutputSeparator = this.OutputSeparator,
  508. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>(this.UserDefineParameters.Select(udp => udp.Copy())),
  509. LightChannels = this.LightChannels == null ? new ObservableCollection<ChannelConfig>() : new ObservableCollection<ChannelConfig>(this.LightChannels.Select(ch => new ChannelConfig
  510. {
  511. Name = ch.Name,
  512. Description = ch.Description,
  513. LocalIndex = ch.LocalIndex,
  514. GlobalIndex = ch.GlobalIndex,
  515. DefaultBrightness = ch.DefaultBrightness
  516. })),
  517. };
  518. }
  519. }
  520. }