using Bro.Common.Base; using Bro.Common.ImageCanvas.Shapes; using Bro.Common.Interface; using Bro.Common.Model; using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Ioc; using MahApps.Metro.Controls.Dialogs; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Drawing; using System.Linq; namespace Bro.UI.ViewModel { public class RunningViewModel : ViewModelBase { #region IDialogService public IDialogCoordinator Dialog { get { return SimpleIoc.Default.GetInstance("Main"); } } #endregion #region Properties private IProcess processControl = null; public IProcess ProcessControl { get => processControl; set { if (processControl?.ProductionCode != value.ProductionCode) { processControl = value; ResetProcessControl(); } } } private void ResetProcessControl() { Images.Clear(); Indicators.Clear(); ProcessControl.DeviceCollection.ForEach(d => { if (d is CameraBase camera) { ImageModel imgModel = new ImageModel(); imgModel.CameraId = camera.Id; imgModel.CameraName = camera.Name; Images.Add(imgModel); BoxIndicatorModel biModel = new BoxIndicatorModel(); biModel.CameraId = camera.Id; biModel.Results = new ObservableCollection() { new { Status = (bool?)null, CodeStr = "NA" }, new { Status = (bool?)null, CodeStr = "NA" } }; Indicators.Add(biModel); camera.OnImageUpdated -= Camera_OnImageUpdated; camera.OnElementsUpdated -= Camera_OnElementsUpdated; camera.OnImageUpdated += Camera_OnImageUpdated; camera.OnElementsUpdated += Camera_OnElementsUpdated; } }); //ProcessControl.OnBitmapOutput -= OnBitmapUpdate; //ProcessControl.OnBitmapOutput += OnBitmapUpdate; //ProcessControl.OnIndicatorResultUpdated -= OnIndicatorResultUpdated; //ProcessControl.OnIndicatorResultUpdated += OnIndicatorResultUpdated; } private ObservableCollection images = new ObservableCollection(); public ObservableCollection Images { get => images; set => Set(ref images, value); } private ObservableCollection indicators = new ObservableCollection(); public ObservableCollection Indicators { get => indicators; set => Set(ref indicators, value); } #endregion public RunningViewModel(IProcess process) { ProcessControl = process; #region 测试使用 //ShapeElementBase shape1 = new ComplexPointIndicator() //{ // PointInfo = new ComplexPoint() // { // ImagePoint = new DirectionAidPoint() { X = 400, Y = 500 }, // PlatPoint = new DirectionAidPoint() { X = 300, Y = 200, IsAvailable = true, }, // }, // Angle = 30, // Index = 10 //}; //ShapeElementBase shape2 = new PointIndicator(300, 400, 50); //ShapeElementBase shape3 = new ComplexPointIndicator() //{ // PointInfo = new ComplexPoint() // { // ImagePoint = new DirectionAidPoint() { X = 500, Y = 600 }, // PlatPoint = new DirectionAidPoint() { X = 300, Y = 200, IsAvailable = false, }, // }, // Angle = 30, // Index = 10, //}; //Images[0].Shapes.Add(shape1); //Images[0].Shapes.Add(shape2); //Images[0].Shapes.Add(shape3); #endregion } private void Camera_OnElementsUpdated(CameraBase camera, List eleList, string imgSet) { App.Current.Dispatcher.Invoke(() => { var imgModel = Images.FirstOrDefault(u => u.CameraId == camera.Id); var biModel = Indicators.FirstOrDefault(u => u.CameraId == camera.Id); if (imgModel != null) { while (imgModel.Shapes.Count > 0) { imgModel.Shapes.RemoveAt(0); } } }); } private void Camera_OnImageUpdated(CameraBase camera, Bitmap bmp, string imgSetId) { var model = Images.FirstOrDefault(u => u.CameraId == camera.Id); if (model != null) { model.Image = bmp; } } private void OnPointsCalculated(string cameraId, List complexPoints) { //App.Current.Dispatcher.Invoke(() => //{ // var imgModel = Images.FirstOrDefault(u => u.CameraId == cameraId); // if (imgModel != null) // { // //imgModel.Shapes.Clear(); // for (int i = imgModel.Shapes.Count - 1; i >= 0; i--) // { // imgModel.Shapes.RemoveAt(i); // } // if (complexPoints != null) // { // for (int i = 0; i < complexPoints.Count; i++) // { // if (complexPoints[i].ImagePoint != null) // { // ComplexPointIndicator indicator = new ComplexPointIndicator(); // indicator.PointInfo = complexPoints[i]; // indicator.Index = i + 1; // imgModel.Shapes.Add(indicator); // } // } // } // //if (imagePoints != null) // //{ // // for (int i = 0; i < imagePoints.Count; i++) // // { // // PointIndicator indicator = new PointIndicator(imagePoints[i].X, imagePoints[i].Y); // // imgModel.Shapes.Add(indicator); // // } // //} // } //}); //var pModel = Points.FirstOrDefault(p => p.CameraId == cameraId); //if (pModel != null && complexPoints != null) //{ // IEnumerable temp = pModel.PointsSource.Union(complexPoints); // if (temp.Count() > 200) // { // temp = temp.Skip(100); // } // pModel.PointsSource = new ObservableCollection(temp); //} } private void OnIndicatorResultUpdated(string cameraId, int indicatorIndex, bool indicatorResult, bool isLTR) { App.Current.Dispatcher.Invoke(() => { var indicator = Indicators.FirstOrDefault(u => u.CameraId == cameraId); if (indicator != null) { if (indicatorIndex >= 0 && indicatorIndex < indicator.Results.Count) { if (isLTR) { if (indicatorIndex == 0) { indicator.Results.ToList().ForEach(u => u = null); } indicator.Results[indicatorIndex] = indicatorResult; } else { if (indicatorIndex == indicator.Results.Count - 1) { indicator.Results.ToList().ForEach(u => u = null); } indicator.Results[indicator.Results.Count - 1 - indicatorIndex] = indicatorResult; } } } }); } } public class ImageModel : INotifyPropertyChanged { public string CameraId { get; set; } public string CameraName { get; set; } private Bitmap image = null; public Bitmap Image { get => image; set { if (image != value) { image = value; PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("Image"), null, null); } } } private ObservableCollection shapes = null; public ObservableCollection Shapes { get { if (shapes == null) { shapes = new ObservableCollection(); shapes.CollectionChanged -= Shapes_CollectionChanged; shapes.CollectionChanged += Shapes_CollectionChanged; } return shapes; } set { if (shapes != value) { shapes = value; PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("Shapes"), null, null); shapes.CollectionChanged -= Shapes_CollectionChanged; shapes.CollectionChanged += Shapes_CollectionChanged; } } } //static object shapeChangeLock = new object(); private void Shapes_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { //App.Current.Dispatcher.Invoke(() => //{ // PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Shapes")); //}); PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("Shapes"), null, null); //lock (shapeChangeLock) //{ // App.Current.Dispatcher.Invoke(() => // { // PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Shapes")); // }); //} } public event PropertyChangedEventHandler PropertyChanged; } public class BoxIndicatorModel : INotifyPropertyChanged { public string CameraId { get; set; } private ObservableCollection results = new ObservableCollection(); public event PropertyChangedEventHandler PropertyChanged; public ObservableCollection Results { get => results; set { if (results != value) { results = value; PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("Results"), null, null); results.CollectionChanged -= Results_CollectionChanged; results.CollectionChanged += Results_CollectionChanged; } } } private void Results_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { PropertyChanged?.BeginInvoke(this, new PropertyChangedEventArgs("Results"), null, null); } } }