CameraParamsViewModel.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  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 _Photo2Light1;
  221. /// <summary>
  222. /// 第二次拍照光源1亮度
  223. /// </summary>
  224. public int Photo2Light1
  225. {
  226. get { return _Photo2Light1; }
  227. set
  228. {
  229. SetProperty(ref _Photo2Light1, value);
  230. SelectProcedure.Photo2Light1 = value;
  231. }
  232. }
  233. private int _Photo2Light2;
  234. /// <summary>
  235. /// 第二次拍照光源2亮度
  236. /// </summary>
  237. public int Photo2Light2
  238. {
  239. get { return _Photo2Light2; }
  240. set
  241. {
  242. SetProperty(ref _Photo2Light2, value);
  243. SelectProcedure.Photo2Light2 = value;
  244. }
  245. }
  246. private int _Photo2Light3;
  247. /// <summary>
  248. /// 第二次拍照光源3亮度
  249. /// </summary>
  250. public int Photo2Light3
  251. {
  252. get { return _Photo2Light3; }
  253. set
  254. {
  255. SetProperty(ref _Photo2Light3, value);
  256. SelectProcedure.Photo2Light3 = value;
  257. }
  258. }
  259. private int _PhotoCount;
  260. /// <summary>
  261. /// 拍照次数
  262. /// </summary>
  263. public int PhotoCount
  264. {
  265. get { return _PhotoCount; }
  266. set
  267. {
  268. SetProperty(ref _PhotoCount, value);
  269. SelectProcedure.PhotoCount = value;
  270. }
  271. }
  272. private bool _IsGrap=true;
  273. public bool IsGrap
  274. {
  275. get { return _IsGrap; }
  276. set { SetProperty(ref _IsGrap, value); }
  277. }
  278. #endregion
  279. #region 命令
  280. private DelegateCommand _NextCommand;
  281. public DelegateCommand NextCommand =>
  282. _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand));
  283. private DelegateCommand _BackCommand;
  284. public DelegateCommand BackCommand =>
  285. _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand));
  286. private DelegateCommand _LoadedCommand;
  287. public DelegateCommand LoadedCommand =>
  288. _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
  289. private DelegateCommand<double?> _LightValueChangedCommand;
  290. public DelegateCommand<double?> LightValueChangedCommand =>
  291. _LightValueChangedCommand ?? (_LightValueChangedCommand = new DelegateCommand<double?>(ExecuteLightValueChangedCommand));
  292. private DelegateCommand _StartGrabbingCommand;
  293. public DelegateCommand StartGrabbingCommand =>
  294. _StartGrabbingCommand ?? (_StartGrabbingCommand = new DelegateCommand(ExecuteStartGrabbingCommand).ObservesProperty(() => IsGrap));
  295. private DelegateCommand _StopGrabbingCommand;
  296. public DelegateCommand StopGrabbingCommand =>
  297. _StopGrabbingCommand ?? (_StopGrabbingCommand = new DelegateCommand(ExecuteStopGrabbingCommand).ObservesProperty(() => IsGrap));
  298. private DelegateCommand _LightValueAddCommand;
  299. public DelegateCommand LightValueAddCommand =>
  300. _LightValueAddCommand ?? (_LightValueAddCommand = new DelegateCommand(ExecuteLightValueAddCommand));
  301. private DelegateCommand _LightValueSubCommand;
  302. public DelegateCommand LightValueSubCommand =>
  303. _LightValueSubCommand ?? (_LightValueSubCommand = new DelegateCommand(ExecuteLightValueSubCommand));
  304. private DelegateCommand<object> _SetChannelBrightnessCommand;
  305. public DelegateCommand<object> SetChannelBrightnessCommand =>
  306. _SetChannelBrightnessCommand ?? (_SetChannelBrightnessCommand = new DelegateCommand<object>(ExecuteSetChannelBrightnessCommand));
  307. private DelegateCommand<object> _TurnOnCommand;
  308. public DelegateCommand<object> TurnOnCommand =>
  309. _TurnOnCommand ?? (_TurnOnCommand = new DelegateCommand<object>(ExecuteTurnOnCommand));
  310. private DelegateCommand<object> _TurnOffCommand;
  311. public DelegateCommand<object> TurnOffCommand =>
  312. _TurnOffCommand ?? (_TurnOffCommand = new DelegateCommand<object>(ExecuteTurnOffCommand));
  313. #endregion
  314. #region 事件
  315. #endregion
  316. public CameraParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService,
  317. IConfigService configService, IRobotService robotService, ICameraService cameraService, IFeederService feederService, IProductService productService,
  318. IRemoteCommandService remoteCommandService, ISystemDatabaseService systemDatabaseService, ILightManagerService lightManagerService)
  319. {
  320. _regionManager = regionManager;
  321. _eventAggregator = ea;
  322. _container = container;
  323. _dialogService = dialogService;
  324. _configService = configService;
  325. _robotService = robotService;
  326. _cameraService = cameraService;
  327. _feederService = feederService;
  328. _systemDatabaseService = systemDatabaseService;
  329. //订阅权限登录事件
  330. _eventAggregator.GetEvent<UserLoginNotification>().Subscribe(LoginChange);
  331. _productService = productService;
  332. _remoteCommandService = remoteCommandService;
  333. _lightManagerService = lightManagerService;
  334. // 创建有界Channel,容量为1,只保留最新的亮度值
  335. _brightnessChannel = Channel.CreateBounded<(int channel, int brightness)>(
  336. new BoundedChannelOptions(1) // 容量为1
  337. {
  338. // 当Channel满时,丢弃最旧的值,写入新的值
  339. FullMode = BoundedChannelFullMode.DropOldest,
  340. // 允许多个UI线程写入(虽然通常只有一个)
  341. SingleWriter = false,
  342. // 只有一个消费者读取并发送到设备
  343. SingleReader = true
  344. });
  345. _cancellationTokenSource = new CancellationTokenSource();
  346. // 启动消费者任务
  347. StartDeviceConsumer();
  348. }
  349. #region 方法
  350. // 消费者:从Channel读取并发送到设备
  351. private async void StartDeviceConsumer()
  352. {
  353. try
  354. {
  355. while (await _brightnessChannel.Reader.WaitToReadAsync(_cancellationTokenSource.Token))
  356. {
  357. while (_brightnessChannel.Reader.TryRead(out var obj))
  358. {
  359. // 实际写入(底层方法可能不支持取消)
  360. var success = await _lightManagerService.SetGlobalChannelBrightnessAsync(obj.channel, obj.brightness);
  361. }
  362. }
  363. }
  364. catch (OperationCanceledException)
  365. {
  366. // 正常结束
  367. }
  368. finally
  369. {
  370. _brightnessChannel.Writer.Complete();
  371. }
  372. }
  373. /// <summary>
  374. /// 下一步
  375. /// </summary>
  376. async void ExecuteNextCommand()
  377. {
  378. SelectProcedure.ExposureTime = ExposureTime;
  379. SelectProcedure.Gain = Gain;
  380. if (Camera != null)
  381. {
  382. Camera.StopGrabbing();
  383. Camera.ImageCallbackEvent -= Camera_ImageCallbackEvent;
  384. }
  385. //判断Toolblock是否存在
  386. if (SelectProcedure.ToolBlock==null)
  387. {
  388. var view = new WaitingControl();
  389. //show the dialog
  390. var task = DialogHost.Show(view, "RootDialog", null, null,null);
  391. await _productService.LoadProcedureVisionToolsAsync(SelectProduct.ID, SelectProcedure.CameraId, SelectProcedure.Name);
  392. if (DialogHost.IsDialogOpen("RootDialog"))
  393. {
  394. DialogHost.Close("RootDialog");
  395. }
  396. await task;
  397. }
  398. NavigationParameters param = new NavigationParameters();
  399. param.Add("SelectProduct", SelectProduct);
  400. param.Add("SelectedProcedure", SelectProcedure);
  401. if (SelectProcedure.VisionModel == Enums.VisionModel.Simple)
  402. {
  403. _regionManager.RequestNavigate("ProductRegionContext", "SimpleProcedure", param);
  404. }
  405. else
  406. {
  407. _regionManager.RequestNavigate("ProductRegionContext", "AdvancedProcedure", param);
  408. }
  409. }
  410. /// <summary>
  411. /// 上一步
  412. /// </summary>
  413. void ExecuteBackCommand()
  414. {
  415. if (Camera != null)
  416. {
  417. Camera.StopGrabbing();
  418. Camera.ImageCallbackEvent -= Camera_ImageCallbackEvent;
  419. }
  420. NavigationParameters param = new NavigationParameters();
  421. param.Add("SelectProduct", SelectProduct);
  422. param.Add("SelectedProcedure", SelectProcedure);
  423. _regionManager.RequestNavigate("ProductRegionContext", "ProcessBasics", param);
  424. }
  425. async void ExecuteLoadedCommand()
  426. {
  427. if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator)
  428. {
  429. IsAllowEdit = false;
  430. }
  431. else
  432. {
  433. IsAllowEdit = true;
  434. }
  435. var sysConfig = _configService.GetSystemConfiguration();
  436. if (sysConfig.PhotosUse == true)
  437. {
  438. IsPhotosUse = true;
  439. }
  440. else
  441. {
  442. IsPhotosUse = false;
  443. }
  444. }
  445. private void Camera_ImageCallbackEvent(ICogImage image,TimeSpan totaltime,string errormessage, Guid id)
  446. {
  447. Image = image;
  448. App.Current.Dispatcher.Invoke(new
  449. Action(() =>
  450. {
  451. if (errormessage != null && !string.IsNullOrEmpty(errormessage))
  452. {
  453. Message = $"{Lang.耗时}:{totaltime.TotalMilliseconds.ToString("F1")} ms Error:{errormessage}";
  454. }
  455. else
  456. {
  457. Message = $"{Lang.耗时}:{totaltime.TotalMilliseconds.ToString("F1")} ms";
  458. }
  459. }));
  460. }
  461. /// <summary>
  462. /// 光源亮度调整时
  463. /// </summary>
  464. async void ExecuteLightValueChangedCommand(double? lightvalue)
  465. {
  466. try
  467. {
  468. if (lightvalue == null) return;
  469. if (Feeder == null || !Feeder.IsConnected) return;
  470. await Feeder.SetLightValueAsync((ushort)lightvalue);
  471. }
  472. catch (Exception ex)
  473. {
  474. LogHelper.WriteLogError("产品实时图像界面-Feeder光源亮度更改时出错!", ex);
  475. }
  476. }
  477. /// <summary>
  478. /// 为指定通道应用亮度设置(仅更新模型并在可能时尝试通知硬件)。
  479. /// </summary>
  480. /// <param name="channel">要设置的通道配置。</param>
  481. async void ExecuteSetChannelBrightnessCommand(object obj)
  482. {
  483. try
  484. {
  485. if (!(obj is Tuple<object, double, double> parameter)) return;
  486. if (!(parameter.Item1 is ChannelConfig channel)) return;
  487. int newValue = (int)parameter.Item2;
  488. // 尝试写入Channel(非阻塞)
  489. try
  490. {
  491. // 如果Channel满了(有旧值),DropOldest策略会自动丢弃旧值
  492. await _brightnessChannel.Writer.WriteAsync(
  493. (channel.GlobalIndex, newValue),
  494. _cancellationTokenSource.Token);
  495. }
  496. catch (OperationCanceledException)
  497. {
  498. // 正常取消,无需处理
  499. }
  500. catch (ChannelClosedException)
  501. {
  502. // Channel已关闭
  503. }
  504. }
  505. catch (Exception ex)
  506. {
  507. LogHelper.WriteLogError("产品实时图像界面-设置光源通道亮度时出错!", ex);
  508. }
  509. }
  510. /// <summary>
  511. /// 关闭光源
  512. /// </summary>
  513. /// <param name="parameter"></param>
  514. async void ExecuteTurnOffCommand(object parameter)
  515. {
  516. try
  517. {
  518. if (!(parameter is ChannelConfig channel)) return;
  519. await _lightManagerService.TurnOffGlobalChannelAsync(channel.GlobalIndex);
  520. }
  521. catch (Exception ex)
  522. {
  523. LogHelper.WriteLogError("关闭通道光源时出错!", ex);
  524. }
  525. }
  526. /// <summary>
  527. /// 打开光源
  528. /// </summary>
  529. /// <param name="parameter"></param>
  530. async void ExecuteTurnOnCommand(object parameter)
  531. {
  532. try
  533. {
  534. if (!(parameter is ChannelConfig channel)) return;
  535. await _lightManagerService.TurnOnGlobalChannelAsync(channel.GlobalIndex);
  536. }
  537. catch (Exception ex)
  538. {
  539. LogHelper.WriteLogError("打开通道光源时出错!", ex);
  540. }
  541. }
  542. void ExecuteLightValueSubCommand()
  543. {
  544. SelectProcedure.LightValue--;
  545. }
  546. void ExecuteLightValueAddCommand()
  547. {
  548. SelectProcedure.LightValue++;
  549. }
  550. /// <summary>
  551. /// 停止采集
  552. /// </summary>
  553. void ExecuteStopGrabbingCommand()
  554. {
  555. IsGrap = false;
  556. if (Camera != null)
  557. Camera.StopGrabbing();
  558. IsGrap = true;
  559. }
  560. /// <summary>
  561. /// 开始采集
  562. /// </summary>
  563. void ExecuteStartGrabbingCommand()
  564. {
  565. IsGrap = false;
  566. if (Camera != null)
  567. Camera.StartGrabbing();
  568. IsGrap = true;
  569. }
  570. #endregion
  571. #region 继承
  572. /// <summary>
  573. /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。
  574. /// </summary>
  575. /// <param name="navigationContext"></param>
  576. /// <param name="continuationCallback"></param>
  577. public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
  578. {
  579. continuationCallback(true);
  580. }
  581. /// <summary>
  582. /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。
  583. /// </summary>
  584. /// <param name="navigationContext"></param>
  585. /// <exception cref="NotImplementedException"></exception>
  586. public async void OnNavigatedTo(NavigationContext navigationContext)
  587. {
  588. try
  589. {
  590. SelectProduct = navigationContext.Parameters.GetValue<ProductModel>("SelectProduct");
  591. SelectProcedure = navigationContext.Parameters.GetValue<ProcedureModel>("SelectedProcedure");
  592. if (SelectProcedure.RobotId != Guid.Empty)
  593. {
  594. IsHaveRobot = true;
  595. Robot = _robotService.GetRobot(SelectProcedure.RobotId);
  596. if (Robot != null)
  597. {
  598. Robot.EnterDebugMode = true;
  599. }
  600. }
  601. else
  602. {
  603. IsHaveRobot = false;
  604. }
  605. if (SelectProcedure.FeederId != Guid.Empty)
  606. {
  607. IsHaveFeeder = true;
  608. Feeder = _feederService.GetFeeder(SelectProcedure.FeederId);
  609. if (Feeder.IsConnected && !_remoteCommandService.IsExecuting)
  610. {
  611. await Feeder.OpenLightAsync();
  612. await Feeder.SetLightValueAsync((ushort)SelectProcedure.LightValue);
  613. }
  614. }
  615. else
  616. {
  617. IsHaveFeeder = false;
  618. }
  619. Camera = _cameraService.GetCamera(SelectProcedure.CameraId);
  620. if (SelectProcedure.ExposureTime == 0)
  621. {
  622. SelectProcedure.ExposureTime = 5000;
  623. }
  624. ExposureTime = SelectProcedure.ExposureTime;
  625. ExposureTime2 = SelectProcedure.ExposureTime2;
  626. Gain = SelectProcedure.Gain;
  627. Gain2 = SelectProcedure.Gain2;
  628. Photo1Light1 = SelectProcedure.Photo1Light1;
  629. Photo1Light2 = SelectProcedure.Photo1Light2;
  630. Photo1Light3 = SelectProcedure.Photo1Light3;
  631. Photo2Light1 = SelectProcedure.Photo2Light1;
  632. Photo2Light2 = SelectProcedure.Photo2Light2;
  633. Photo2Light3 = SelectProcedure.Photo2Light3;
  634. PhotoCount = SelectProcedure.PhotoCount;
  635. if (Camera != null && !_remoteCommandService.IsExecuting)
  636. {
  637. Camera.SetExposureTime(ExposureTime);
  638. Camera.SetGain(Gain);
  639. Camera.ImageCallbackEvent += Camera_ImageCallbackEvent;
  640. //Camera.Grab();
  641. }
  642. }
  643. catch (Exception ex)
  644. {
  645. LogHelper.WriteLogError("相机流程界面进入时出错!", ex);
  646. }
  647. }
  648. /// <summary>
  649. /// 是否允许导航到此视图模型。
  650. /// </summary>
  651. /// <param name="navigationContext"></param>
  652. /// <returns></returns>
  653. public bool IsNavigationTarget(NavigationContext navigationContext)
  654. {
  655. return true;
  656. }
  657. /// <summary>
  658. /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。
  659. /// </summary>
  660. /// <param name="navigationContext"></param>
  661. public void OnNavigatedFrom(NavigationContext navigationContext)
  662. {
  663. if (Robot!=null)
  664. {
  665. Robot.EnterDebugMode = false;
  666. }
  667. ExecuteStopGrabbingCommand();
  668. }
  669. #endregion
  670. private bool _IsAllowEdit = false;
  671. public bool IsAllowEdit
  672. {
  673. get { return _IsAllowEdit; }
  674. set { SetProperty(ref _IsAllowEdit, value); }
  675. }
  676. private void LoginChange(Models.User user)
  677. {
  678. if (user.userPart == Enums.UserPart.Operator)
  679. {
  680. IsAllowEdit = false;
  681. }
  682. else
  683. {
  684. IsAllowEdit = true;
  685. }
  686. }
  687. }
  688. }