CameraParamsViewModel.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  1. using Cognex.VisionPro;
  2. using MaterialDesignThemes.Wpf;
  3. using Prism.Commands;
  4. using Prism.Events;
  5. using Prism.Ioc;
  6. using Prism.Mvvm;
  7. using Prism.Regions;
  8. using Prism.Services.Dialogs;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Collections.ObjectModel;
  12. using System.Drawing;
  13. using System.Linq;
  14. using System.Threading;
  15. using System.Threading.Channels;
  16. using System.Threading.Tasks;
  17. using System.Windows;
  18. using System.Windows.Threading;
  19. using Team.FFFeederService.Interfaces;
  20. using TeamAAS_VP;
  21. using TeamAAS_VP.Controls;
  22. using TeamAAS_VP.Core;
  23. using TeamAAS_VP.Data;
  24. using TeamAAS_VP.Enums;
  25. using TeamAAS_VP.Events;
  26. using TeamAAS_VP.Interfaces;
  27. using TeamAAS_VP.Models;
  28. using TeamAAS_VP.Models.Lights;
  29. using TeamAAS_VP.Resources.Languages;
  30. using TeamAAS_VP.Services;
  31. using static NPOI.HSSF.Util.HSSFColor;
  32. namespace TeamAAS_VP.ViewModels.Product
  33. {
  34. public class CameraParamsViewModel : BindableBase, IConfirmNavigationRequest
  35. {
  36. IRegionManager _regionManager;
  37. IEventAggregator _eventAggregator;
  38. IContainerProvider _container;
  39. IDialogService _dialogService;
  40. IConfigService _configService;
  41. IRobotService _robotService;
  42. ICameraService _cameraService;
  43. IFeederService _feederService;
  44. IProductService _productService;
  45. IRemoteCommandService _remoteCommandService;
  46. ISystemDatabaseService _systemDatabaseService;
  47. ILightManagerService _lightManagerService;
  48. // 创建Channel
  49. private readonly Channel<(int channel, int brightness)> _brightnessChannel;
  50. private CancellationTokenSource _cancellationTokenSource;
  51. #region 属性
  52. private bool _IsPhotosUse = false;
  53. public bool IsPhotosUse
  54. {
  55. get { return _IsPhotosUse; }
  56. set { SetProperty(ref _IsPhotosUse, value); }
  57. }
  58. private ProductModel _SelectProduct;
  59. /// <summary>
  60. /// 选中的产品
  61. /// </summary>
  62. public ProductModel SelectProduct
  63. {
  64. get { return _SelectProduct; }
  65. set { SetProperty(ref _SelectProduct, value); }
  66. }
  67. private ProcedureModel _SelectProcedure;
  68. /// <summary>
  69. /// 选中的流程
  70. /// </summary>
  71. public ProcedureModel SelectProcedure
  72. {
  73. get { return _SelectProcedure; }
  74. set { SetProperty(ref _SelectProcedure, value); }
  75. }
  76. private bool _IsHaveFeeder=false;
  77. public bool IsHaveFeeder
  78. {
  79. get { return _IsHaveFeeder; }
  80. set { SetProperty(ref _IsHaveFeeder, value); }
  81. }
  82. private bool _IsHaveRobot = false;
  83. public bool IsHaveRobot
  84. {
  85. get { return _IsHaveRobot; }
  86. set { SetProperty(ref _IsHaveRobot, value); }
  87. }
  88. private IRobot _Robot;
  89. public IRobot Robot
  90. {
  91. get { return _Robot; }
  92. set { SetProperty(ref _Robot, value); }
  93. }
  94. private ICamera _Camera;
  95. public ICamera Camera
  96. {
  97. get { return _Camera; }
  98. set { SetProperty(ref _Camera, value); }
  99. }
  100. public IVoiceCoilMotorFeeder Feeder { get; set; }
  101. private ICogImage _Image;
  102. public ICogImage Image
  103. {
  104. get { return _Image; }
  105. set { SetProperty(ref _Image, value); }
  106. }
  107. private string _Message;
  108. public string Message
  109. {
  110. get { return _Message; }
  111. set { SetProperty(ref _Message, value); }
  112. }
  113. private float _ExposureTime;
  114. /// <summary>
  115. /// 相机曝光时间
  116. /// </summary>
  117. public float ExposureTime
  118. {
  119. get { return _ExposureTime; }
  120. set { SetProperty(ref _ExposureTime, value);
  121. SelectProcedure.ExposureTime = value;
  122. if (Camera != null)
  123. {
  124. try
  125. {
  126. Camera.SetExposureTime(value);
  127. }
  128. catch (Exception)
  129. {
  130. }
  131. }
  132. }
  133. }
  134. private float _ExposureTime2;
  135. /// <summary>
  136. /// 相机曝光2时间
  137. /// </summary>
  138. public float ExposureTime2
  139. {
  140. get { return _ExposureTime2; }
  141. set
  142. {
  143. SetProperty(ref _ExposureTime2, value);
  144. SelectProcedure.ExposureTime2 = value;
  145. }
  146. }
  147. private float _Gain;
  148. /// <summary>
  149. /// 相机增益
  150. /// </summary>
  151. public float Gain
  152. {
  153. get { return _Gain; }
  154. set { SetProperty(ref _Gain, value);
  155. SelectProcedure.Gain=value;
  156. if (Camera != null)
  157. {
  158. try
  159. {
  160. Camera.SetGain(value);
  161. }
  162. catch (Exception)
  163. {
  164. }
  165. }
  166. }
  167. }
  168. private float _Gain2;
  169. /// <summary>
  170. /// 相机增益2
  171. /// </summary>
  172. public float Gain2
  173. {
  174. get { return _Gain2; }
  175. set
  176. {
  177. SetProperty(ref _Gain2, value);
  178. SelectProcedure.Gain2 = value;
  179. }
  180. }
  181. private int _Photo1Light1;
  182. /// <summary>
  183. /// 第一次拍照光源1亮度
  184. /// </summary>
  185. public int Photo1Light1
  186. {
  187. get { return _Photo1Light1; }
  188. set
  189. {
  190. SetProperty(ref _Photo1Light1, value);
  191. SelectProcedure.Photo1Light1 = value;
  192. }
  193. }
  194. private int _Photo1Light2;
  195. /// <summary>
  196. /// 第一次拍照光源2亮度
  197. /// </summary>
  198. public int Photo1Light2
  199. {
  200. get { return _Photo1Light2; }
  201. set
  202. {
  203. SetProperty(ref _Photo1Light2, value);
  204. SelectProcedure.Photo1Light2 = value;
  205. }
  206. }
  207. private int _Photo1Light3;
  208. /// <summary>
  209. /// 第一次拍照光源3亮度
  210. /// </summary>
  211. public int Photo1Light3
  212. {
  213. get { return _Photo1Light3; }
  214. set
  215. {
  216. SetProperty(ref _Photo1Light3, value);
  217. SelectProcedure.Photo1Light3 = value;
  218. }
  219. }
  220. private int _Photo1Light4;
  221. /// <summary>
  222. /// 第一次拍照光源4亮度
  223. /// </summary>
  224. public int Photo1Light4
  225. {
  226. get { return _Photo1Light4; }
  227. set
  228. {
  229. SetProperty(ref _Photo1Light4, value);
  230. SelectProcedure.Photo1Light4 = value;
  231. }
  232. }
  233. private int _Photo1Light5;
  234. /// <summary>
  235. /// 第一次拍照光源5亮度
  236. /// </summary>
  237. public int Photo1Light5
  238. {
  239. get { return _Photo1Light5; }
  240. set
  241. {
  242. SetProperty(ref _Photo1Light5, value);
  243. SelectProcedure.Photo1Light5 = value;
  244. }
  245. }
  246. private int _Photo1Light6;
  247. /// <summary>
  248. /// 第一次拍照光源6亮度
  249. /// </summary>
  250. public int Photo1Light6
  251. {
  252. get { return _Photo1Light6; }
  253. set
  254. {
  255. SetProperty(ref _Photo1Light6, value);
  256. SelectProcedure.Photo1Light6 = value;
  257. }
  258. }
  259. private int _Photo1Light7;
  260. /// <summary>
  261. /// 第一次拍照光源7亮度
  262. /// </summary>
  263. public int Photo1Light7
  264. {
  265. get { return _Photo1Light7; }
  266. set
  267. {
  268. SetProperty(ref _Photo1Light7, value);
  269. SelectProcedure.Photo1Light7 = value;
  270. }
  271. }
  272. private int _Photo2Light1;
  273. /// <summary>
  274. /// 第二次拍照光源1亮度
  275. /// </summary>
  276. public int Photo2Light1
  277. {
  278. get { return _Photo2Light1; }
  279. set
  280. {
  281. SetProperty(ref _Photo2Light1, value);
  282. SelectProcedure.Photo2Light1 = value;
  283. }
  284. }
  285. private int _Photo2Light2;
  286. /// <summary>
  287. /// 第二次拍照光源2亮度
  288. /// </summary>
  289. public int Photo2Light2
  290. {
  291. get { return _Photo2Light2; }
  292. set
  293. {
  294. SetProperty(ref _Photo2Light2, value);
  295. SelectProcedure.Photo2Light2 = value;
  296. }
  297. }
  298. private int _Photo2Light3;
  299. /// <summary>
  300. /// 第二次拍照光源3亮度
  301. /// </summary>
  302. public int Photo2Light3
  303. {
  304. get { return _Photo2Light3; }
  305. set
  306. {
  307. SetProperty(ref _Photo2Light3, value);
  308. SelectProcedure.Photo2Light3 = value;
  309. }
  310. }
  311. private int _Photo2Light4;
  312. /// <summary>
  313. /// 第二次拍照光源4亮度
  314. /// </summary>
  315. public int Photo2Light4
  316. {
  317. get { return _Photo2Light4; }
  318. set
  319. {
  320. SetProperty(ref _Photo2Light4, value);
  321. SelectProcedure.Photo2Light4 = value;
  322. }
  323. }
  324. private int _Photo2Light5;
  325. /// <summary>
  326. /// 第二次拍照光源5亮度
  327. /// </summary>
  328. public int Photo2Light5
  329. {
  330. get { return _Photo2Light5; }
  331. set
  332. {
  333. SetProperty(ref _Photo2Light5, value);
  334. SelectProcedure.Photo2Light5 = value;
  335. }
  336. }
  337. private int _Photo2Light6;
  338. /// <summary>
  339. /// 第二次拍照光源6亮度
  340. /// </summary>
  341. public int Photo2Light6
  342. {
  343. get { return _Photo2Light6; }
  344. set
  345. {
  346. SetProperty(ref _Photo2Light6, value);
  347. SelectProcedure.Photo2Light6 = value;
  348. }
  349. }
  350. private int _Photo2Light7;
  351. /// <summary>
  352. /// 第二次拍照光源7亮度
  353. /// </summary>
  354. public int Photo2Light7
  355. {
  356. get { return _Photo2Light7; }
  357. set
  358. {
  359. SetProperty(ref _Photo2Light7, value);
  360. SelectProcedure.Photo2Light7 = value;
  361. }
  362. }
  363. private int _PhotoCount;
  364. /// <summary>
  365. /// 拍照次数
  366. /// </summary>
  367. public int PhotoCount
  368. {
  369. get { return _PhotoCount; }
  370. set
  371. {
  372. SetProperty(ref _PhotoCount, value);
  373. SelectProcedure.PhotoCount = value;
  374. }
  375. }
  376. private bool _IsGrap=true;
  377. public bool IsGrap
  378. {
  379. get { return _IsGrap; }
  380. set { SetProperty(ref _IsGrap, value); }
  381. }
  382. #endregion
  383. #region 命令
  384. private DelegateCommand _NextCommand;
  385. public DelegateCommand NextCommand =>
  386. _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand));
  387. private DelegateCommand _BackCommand;
  388. public DelegateCommand BackCommand =>
  389. _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand));
  390. private DelegateCommand _LoadedCommand;
  391. public DelegateCommand LoadedCommand =>
  392. _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
  393. private DelegateCommand<double?> _LightValueChangedCommand;
  394. public DelegateCommand<double?> LightValueChangedCommand =>
  395. _LightValueChangedCommand ?? (_LightValueChangedCommand = new DelegateCommand<double?>(ExecuteLightValueChangedCommand));
  396. private DelegateCommand _StartGrabbingCommand;
  397. public DelegateCommand StartGrabbingCommand =>
  398. _StartGrabbingCommand ?? (_StartGrabbingCommand = new DelegateCommand(ExecuteStartGrabbingCommand).ObservesProperty(() => IsGrap));
  399. private DelegateCommand _StopGrabbingCommand;
  400. public DelegateCommand StopGrabbingCommand =>
  401. _StopGrabbingCommand ?? (_StopGrabbingCommand = new DelegateCommand(ExecuteStopGrabbingCommand).ObservesProperty(() => IsGrap));
  402. private DelegateCommand _LightValueAddCommand;
  403. public DelegateCommand LightValueAddCommand =>
  404. _LightValueAddCommand ?? (_LightValueAddCommand = new DelegateCommand(ExecuteLightValueAddCommand));
  405. private DelegateCommand _LightValueSubCommand;
  406. public DelegateCommand LightValueSubCommand =>
  407. _LightValueSubCommand ?? (_LightValueSubCommand = new DelegateCommand(ExecuteLightValueSubCommand));
  408. private DelegateCommand<object> _SetChannelBrightnessCommand;
  409. public DelegateCommand<object> SetChannelBrightnessCommand =>
  410. _SetChannelBrightnessCommand ?? (_SetChannelBrightnessCommand = new DelegateCommand<object>(ExecuteSetChannelBrightnessCommand));
  411. private DelegateCommand<object> _TurnOnCommand;
  412. public DelegateCommand<object> TurnOnCommand =>
  413. _TurnOnCommand ?? (_TurnOnCommand = new DelegateCommand<object>(ExecuteTurnOnCommand));
  414. private DelegateCommand<object> _TurnOffCommand;
  415. public DelegateCommand<object> TurnOffCommand =>
  416. _TurnOffCommand ?? (_TurnOffCommand = new DelegateCommand<object>(ExecuteTurnOffCommand));
  417. #endregion
  418. #region 事件
  419. #endregion
  420. public CameraParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService,
  421. IConfigService configService, IRobotService robotService, ICameraService cameraService, IFeederService feederService, IProductService productService,
  422. IRemoteCommandService remoteCommandService, ISystemDatabaseService systemDatabaseService, ILightManagerService lightManagerService)
  423. {
  424. _regionManager = regionManager;
  425. _eventAggregator = ea;
  426. _container = container;
  427. _dialogService = dialogService;
  428. _configService = configService;
  429. _robotService = robotService;
  430. _cameraService = cameraService;
  431. _feederService = feederService;
  432. _systemDatabaseService = systemDatabaseService;
  433. //订阅权限登录事件
  434. _eventAggregator.GetEvent<UserLoginNotification>().Subscribe(LoginChange);
  435. _productService = productService;
  436. _remoteCommandService = remoteCommandService;
  437. _lightManagerService = lightManagerService;
  438. // 创建有界Channel,容量为1,只保留最新的亮度值
  439. _brightnessChannel = Channel.CreateBounded<(int channel, int brightness)>(
  440. new BoundedChannelOptions(1) // 容量为1
  441. {
  442. // 当Channel满时,丢弃最旧的值,写入新的值
  443. FullMode = BoundedChannelFullMode.DropOldest,
  444. // 允许多个UI线程写入(虽然通常只有一个)
  445. SingleWriter = false,
  446. // 只有一个消费者读取并发送到设备
  447. SingleReader = true
  448. });
  449. _cancellationTokenSource = new CancellationTokenSource();
  450. // 启动消费者任务
  451. StartDeviceConsumer();
  452. }
  453. #region 方法
  454. // 消费者:从Channel读取并发送到设备
  455. private async void StartDeviceConsumer()
  456. {
  457. try
  458. {
  459. while (await _brightnessChannel.Reader.WaitToReadAsync(_cancellationTokenSource.Token))
  460. {
  461. while (_brightnessChannel.Reader.TryRead(out var obj))
  462. {
  463. // 实际写入(底层方法可能不支持取消)
  464. var success = await _lightManagerService.SetGlobalChannelBrightnessAsync(obj.channel, obj.brightness);
  465. }
  466. }
  467. }
  468. catch (OperationCanceledException)
  469. {
  470. // 正常结束
  471. }
  472. finally
  473. {
  474. _brightnessChannel.Writer.Complete();
  475. }
  476. }
  477. /// <summary>
  478. /// 下一步
  479. /// </summary>
  480. async void ExecuteNextCommand()
  481. {
  482. SelectProcedure.ExposureTime = ExposureTime;
  483. SelectProcedure.Gain = Gain;
  484. if (Camera != null)
  485. {
  486. Camera.StopGrabbing();
  487. Camera.ImageCallbackEvent -= Camera_ImageCallbackEvent;
  488. }
  489. //判断Toolblock是否存在
  490. if (SelectProcedure.ToolBlock==null)
  491. {
  492. var view = new WaitingControl();
  493. //show the dialog
  494. var task = DialogHost.Show(view, "RootDialog", null, null,null);
  495. await _productService.LoadProcedureVisionToolsAsync(SelectProduct.ID, SelectProcedure.CameraId, SelectProcedure.Name);
  496. if (DialogHost.IsDialogOpen("RootDialog"))
  497. {
  498. DialogHost.Close("RootDialog");
  499. }
  500. await task;
  501. }
  502. NavigationParameters param = new NavigationParameters();
  503. param.Add("SelectProduct", SelectProduct);
  504. param.Add("SelectedProcedure", SelectProcedure);
  505. if (SelectProcedure.VisionModel == Enums.VisionModel.Simple)
  506. {
  507. _regionManager.RequestNavigate("ProductRegionContext", "SimpleProcedure", param);
  508. }
  509. else
  510. {
  511. _regionManager.RequestNavigate("ProductRegionContext", "AdvancedProcedure", param);
  512. }
  513. }
  514. /// <summary>
  515. /// 上一步
  516. /// </summary>
  517. void ExecuteBackCommand()
  518. {
  519. if (Camera != null)
  520. {
  521. Camera.StopGrabbing();
  522. Camera.ImageCallbackEvent -= Camera_ImageCallbackEvent;
  523. }
  524. NavigationParameters param = new NavigationParameters();
  525. param.Add("SelectProduct", SelectProduct);
  526. param.Add("SelectedProcedure", SelectProcedure);
  527. _regionManager.RequestNavigate("ProductRegionContext", "ProcessBasics", param);
  528. }
  529. async void ExecuteLoadedCommand()
  530. {
  531. if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator)
  532. {
  533. IsAllowEdit = false;
  534. }
  535. else
  536. {
  537. IsAllowEdit = true;
  538. }
  539. var sysConfig = _configService.GetSystemConfiguration();
  540. if (sysConfig.PhotosUse == true)
  541. {
  542. IsPhotosUse = true;
  543. }
  544. else
  545. {
  546. IsPhotosUse = false;
  547. }
  548. }
  549. private void Camera_ImageCallbackEvent(ICogImage image,TimeSpan totaltime,string errormessage, Guid id)
  550. {
  551. Image = image;
  552. App.Current.Dispatcher.Invoke(new
  553. Action(() =>
  554. {
  555. if (errormessage != null && !string.IsNullOrEmpty(errormessage))
  556. {
  557. Message = $"{Lang.耗时}:{totaltime.TotalMilliseconds.ToString("F1")} ms Error:{errormessage}";
  558. }
  559. else
  560. {
  561. Message = $"{Lang.耗时}:{totaltime.TotalMilliseconds.ToString("F1")} ms";
  562. }
  563. }));
  564. }
  565. /// <summary>
  566. /// 光源亮度调整时
  567. /// </summary>
  568. async void ExecuteLightValueChangedCommand(double? lightvalue)
  569. {
  570. try
  571. {
  572. if (lightvalue == null) return;
  573. if (Feeder == null || !Feeder.IsConnected) return;
  574. await Feeder.SetLightValueAsync((ushort)lightvalue);
  575. }
  576. catch (Exception ex)
  577. {
  578. LogHelper.WriteLogError("产品实时图像界面-Feeder光源亮度更改时出错!", ex);
  579. }
  580. }
  581. /// <summary>
  582. /// 为指定通道应用亮度设置(仅更新模型并在可能时尝试通知硬件)。
  583. /// </summary>
  584. /// <param name="channel">要设置的通道配置。</param>
  585. async void ExecuteSetChannelBrightnessCommand(object obj)
  586. {
  587. try
  588. {
  589. if (!(obj is Tuple<object, double, double> parameter)) return;
  590. if (!(parameter.Item1 is ChannelConfig channel)) return;
  591. int newValue = (int)parameter.Item2;
  592. // 尝试写入Channel(非阻塞)
  593. try
  594. {
  595. // 如果Channel满了(有旧值),DropOldest策略会自动丢弃旧值
  596. await _brightnessChannel.Writer.WriteAsync(
  597. (channel.GlobalIndex, newValue),
  598. _cancellationTokenSource.Token);
  599. }
  600. catch (OperationCanceledException)
  601. {
  602. // 正常取消,无需处理
  603. }
  604. catch (ChannelClosedException)
  605. {
  606. // Channel已关闭
  607. }
  608. }
  609. catch (Exception ex)
  610. {
  611. LogHelper.WriteLogError("产品实时图像界面-设置光源通道亮度时出错!", ex);
  612. }
  613. }
  614. /// <summary>
  615. /// 关闭光源
  616. /// </summary>
  617. /// <param name="parameter"></param>
  618. async void ExecuteTurnOffCommand(object parameter)
  619. {
  620. try
  621. {
  622. if (!(parameter is ChannelConfig channel)) return;
  623. await _lightManagerService.TurnOffGlobalChannelAsync(channel.GlobalIndex);
  624. }
  625. catch (Exception ex)
  626. {
  627. LogHelper.WriteLogError("关闭通道光源时出错!", ex);
  628. }
  629. }
  630. /// <summary>
  631. /// 打开光源
  632. /// </summary>
  633. /// <param name="parameter"></param>
  634. async void ExecuteTurnOnCommand(object parameter)
  635. {
  636. try
  637. {
  638. if (!(parameter is ChannelConfig channel)) return;
  639. await _lightManagerService.TurnOnGlobalChannelAsync(channel.GlobalIndex);
  640. }
  641. catch (Exception ex)
  642. {
  643. LogHelper.WriteLogError("打开通道光源时出错!", ex);
  644. }
  645. }
  646. void ExecuteLightValueSubCommand()
  647. {
  648. SelectProcedure.LightValue--;
  649. }
  650. void ExecuteLightValueAddCommand()
  651. {
  652. SelectProcedure.LightValue++;
  653. }
  654. /// <summary>
  655. /// 停止采集
  656. /// </summary>
  657. void ExecuteStopGrabbingCommand()
  658. {
  659. IsGrap = false;
  660. if (Camera != null)
  661. Camera.StopGrabbing();
  662. IsGrap = true;
  663. }
  664. /// <summary>
  665. /// 开始采集
  666. /// </summary>
  667. void ExecuteStartGrabbingCommand()
  668. {
  669. IsGrap = false;
  670. if (Camera != null)
  671. Camera.StartGrabbing();
  672. IsGrap = true;
  673. }
  674. #endregion
  675. #region 继承
  676. /// <summary>
  677. /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。
  678. /// </summary>
  679. /// <param name="navigationContext"></param>
  680. /// <param name="continuationCallback"></param>
  681. public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
  682. {
  683. continuationCallback(true);
  684. }
  685. /// <summary>
  686. /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。
  687. /// </summary>
  688. /// <param name="navigationContext"></param>
  689. /// <exception cref="NotImplementedException"></exception>
  690. public async void OnNavigatedTo(NavigationContext navigationContext)
  691. {
  692. try
  693. {
  694. SelectProduct = navigationContext.Parameters.GetValue<ProductModel>("SelectProduct");
  695. SelectProcedure = navigationContext.Parameters.GetValue<ProcedureModel>("SelectedProcedure");
  696. if (SelectProcedure.RobotId != Guid.Empty)
  697. {
  698. IsHaveRobot = true;
  699. Robot = _robotService.GetRobot(SelectProcedure.RobotId);
  700. if (Robot != null)
  701. {
  702. Robot.EnterDebugMode = true;
  703. }
  704. }
  705. else
  706. {
  707. IsHaveRobot = false;
  708. }
  709. if (SelectProcedure.FeederId != Guid.Empty)
  710. {
  711. IsHaveFeeder = true;
  712. Feeder = _feederService.GetFeeder(SelectProcedure.FeederId);
  713. if (Feeder.IsConnected && !_remoteCommandService.IsExecuting)
  714. {
  715. await Feeder.OpenLightAsync();
  716. await Feeder.SetLightValueAsync((ushort)SelectProcedure.LightValue);
  717. }
  718. }
  719. else
  720. {
  721. IsHaveFeeder = false;
  722. }
  723. Camera = _cameraService.GetCamera(SelectProcedure.CameraId);
  724. if (SelectProcedure.ExposureTime == 0)
  725. {
  726. SelectProcedure.ExposureTime = 5000;
  727. }
  728. ExposureTime = SelectProcedure.ExposureTime;
  729. ExposureTime2 = SelectProcedure.ExposureTime2;
  730. Gain = SelectProcedure.Gain;
  731. Gain2 = SelectProcedure.Gain2;
  732. Photo1Light1 = SelectProcedure.Photo1Light1;
  733. Photo1Light2 = SelectProcedure.Photo1Light2;
  734. Photo1Light3 = SelectProcedure.Photo1Light3;
  735. Photo1Light4 = SelectProcedure.Photo1Light4;
  736. Photo1Light5 = SelectProcedure.Photo1Light5;
  737. Photo1Light6 = SelectProcedure.Photo1Light6;
  738. Photo1Light7 = SelectProcedure.Photo1Light7;
  739. Photo2Light1 = SelectProcedure.Photo2Light1;
  740. Photo2Light2 = SelectProcedure.Photo2Light2;
  741. Photo2Light3 = SelectProcedure.Photo2Light3;
  742. Photo2Light4 = SelectProcedure.Photo2Light4;
  743. Photo2Light5 = SelectProcedure.Photo2Light5;
  744. Photo2Light6 = SelectProcedure.Photo2Light6;
  745. Photo2Light7 = SelectProcedure.Photo2Light7;
  746. PhotoCount = SelectProcedure.PhotoCount;
  747. if (Camera != null && !_remoteCommandService.IsExecuting)
  748. {
  749. Camera.SetExposureTime(ExposureTime);
  750. Camera.SetGain(Gain);
  751. Camera.ImageCallbackEvent += Camera_ImageCallbackEvent;
  752. //Camera.Grab();
  753. }
  754. }
  755. catch (Exception ex)
  756. {
  757. LogHelper.WriteLogError("相机流程界面进入时出错!", ex);
  758. }
  759. }
  760. /// <summary>
  761. /// 是否允许导航到此视图模型。
  762. /// </summary>
  763. /// <param name="navigationContext"></param>
  764. /// <returns></returns>
  765. public bool IsNavigationTarget(NavigationContext navigationContext)
  766. {
  767. return true;
  768. }
  769. /// <summary>
  770. /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。
  771. /// </summary>
  772. /// <param name="navigationContext"></param>
  773. public void OnNavigatedFrom(NavigationContext navigationContext)
  774. {
  775. if (Robot!=null)
  776. {
  777. Robot.EnterDebugMode = false;
  778. }
  779. ExecuteStopGrabbingCommand();
  780. }
  781. #endregion
  782. private bool _IsAllowEdit = false;
  783. public bool IsAllowEdit
  784. {
  785. get { return _IsAllowEdit; }
  786. set { SetProperty(ref _IsAllowEdit, value); }
  787. }
  788. private void LoginChange(Models.User user)
  789. {
  790. if (user.userPart == Enums.UserPart.Operator)
  791. {
  792. IsAllowEdit = false;
  793. }
  794. else
  795. {
  796. IsAllowEdit = true;
  797. }
  798. }
  799. }
  800. }