/// <summary>
        /// Initializes the acquisition module.
        /// </summary>
        /// <param name="manager">The manager.</param>
        private void InitializeAcquireAcquisitionModule(ViewROIManager manager)
        {
            this.MainViewModel.AcquireAcquisitionVM.GetFileName.RegisterHandler(
                async interaction =>
            {
                string filename = await this.utilities.GetFileName();
                interaction.SetOutput(filename);
            });

            this.MainViewModel.AcquireAcquisitionVM.GetSaveFileName.RegisterHandler(
                async interaction =>
            {
                string filename = await this.utilities.GetFileNameToSave();
                interaction.SetOutput(filename);
            });

            RibbonMenuItem acquisitionMenuItem = new RibbonMenuItem()
            {
                Name   = "AcquireAcquisitionItem",
                Header = "Acquire Acquisition"
            };

            acquisitionMenuItem.Click += this.AcquireAcquisitionRibbonItem_Click;
            this.UtilitiesTab.Items.Add(acquisitionMenuItem);

            this.BindAcquireAcquisitionControls(manager);

            this.InitializeAcquireCalibrationModule(manager);
        }
Example #2
0
        /// <summary>
        /// Sets up the reactive bindings for all Ocr controls.
        /// </summary>
        /// <param name="manager">The ViewROIManager instance to use.</param>
        private void BindOcrControls(ViewROIManager manager)
        {
            // Bind image aspect for acquired images.
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.OcrVM.ImageHeight)
                                       .Subscribe(x => manager.ImageHeight = x));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.OcrVM.ImageWidth)
                                       .Subscribe(x => manager.ImageWidth = x));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.OcrVM.Display)
                                       .Where(x => x.DisplayList.Count > 0)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => manager.ShowDisplayCollection(x)));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.OcrVM.DebugDisplay)
                                       .Where(x => x.DisplayList.Count > 0)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => manager.ShowDisplayCollection(x)));
        }
Example #3
0
 /// <summary>
 /// Initializes the new module.
 /// </summary>
 /// <param name="manager">The ViewROIManager instance to use.</param>
 private void InitializeOcrModule(ViewROIManager manager)
 {
     this.BindOcrControls(manager);
 }
Example #4
0
        /// <summary>
        /// Binds a Halcon window to a View Roi Manager.
        /// </summary>
        /// <param name="manager">The View Roi Manager.</param>
        /// <param name="halconWindow">The Halcon window.</param>
        /// <param name="imageBorderName">The name of the Border Control containing the Halcon window control.</param>
        /// <param name="loadImageViewModelName">The name of the load image view model to use.</param>
        /// <param name="windowClass">The main window class instance. (Pass "this")</param>
        public static void BindHalconWindow(
            ViewROIManager manager,
            HWindowControlWPF halconWindow,
            string imageBorderName,
            string loadImageViewModelName,
            MainWindow windowClass)
        {
            windowClass.DisposeCollection.Add(windowClass.Events().ContentRendered.Subscribe(_ =>
            {
                manager.LocHWindowControl = halconWindow;

                manager.LocHWindowControl.ContextMenu.ItemsSource = windowClass.MainViewModel.MenuItems;

                // Set the data template.
                manager.LocHWindowControl.ContextMenu.ItemTemplate = windowClass.ContextMenuDataTemplate;

                // Set the ItemsPanelTemplate.
                manager.LocHWindowControl.ContextMenu.ItemsPanel = windowClass.ContextMenuItemsPanelTemplate;
            }));

            windowClass.DisposeCollection.Add(windowClass.MainViewModel.MenuItems.ItemsAdded
                                              .Where(_ => manager.LocHWindowControl != null)
                                              .Subscribe(
                                                  _ =>
            {
                manager.LocHWindowControl.ContextMenu.ItemsSource = windowClass.MainViewModel.MenuItems;

                // Set the data template.
                manager.LocHWindowControl.ContextMenu.ItemTemplate = windowClass.ContextMenuDataTemplate;

                // Set the ItemsPanelTemplate.
                manager.LocHWindowControl.ContextMenu.ItemsPanel = windowClass.ContextMenuItemsPanelTemplate;
            }));

            windowClass.DisposeCollection.Add(windowClass.Events().LayoutUpdated
                                              .Select(_ => System.Reactive.Unit.Default)
                                              .InvokeCommand(manager.AdjustAspectCommand));

            ParameterExpression targetParameter = LExpression.Parameter(typeof(MainWindow), "x");
            MemberExpression    mainVMExp       = LExpression.Property(targetParameter, "MainViewModel");
            MemberExpression    viewModelExp    = LExpression.Property(mainVMExp, loadImageViewModelName);
            MemberExpression    imageHeightExp  = LExpression.Property(viewModelExp, "ImageHeight");
            MemberExpression    imageWidthExp   = LExpression.Property(viewModelExp, "ImageWidth");
            Expression <Func <MainWindow, int> > imageHeightTargetExp = LExpression.Lambda <Func <MainWindow, int> >(imageHeightExp, new ParameterExpression[] { targetParameter });
            Expression <Func <MainWindow, int> > imageWidthTargetExp  = LExpression.Lambda <Func <MainWindow, int> >(imageWidthExp, new ParameterExpression[] { targetParameter });

            // Using Subscribe here because BindTo sets up a two-way binding which is not wanted.
            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(imageHeightTargetExp)
                                              .Subscribe(x => manager.ImageHeight = x));
            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(imageWidthTargetExp)
                                              .Subscribe(x => manager.ImageWidth = x));

            MemberExpression borderExp       = LExpression.PropertyOrField(targetParameter, imageBorderName);
            MemberExpression actualHeightExp = LExpression.Property(borderExp, "ActualHeight");
            MemberExpression actualWidthExp  = LExpression.Property(borderExp, "ActualWidth");
            Expression <Func <MainWindow, double> > actualHeightTargetExp = LExpression.Lambda <Func <MainWindow, double> >(actualHeightExp, new ParameterExpression[] { targetParameter });
            Expression <Func <MainWindow, double> > actualWidthTargetExp  = LExpression.Lambda <Func <MainWindow, double> >(actualWidthExp, new ParameterExpression[] { targetParameter });

            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(actualHeightTargetExp)
                                              .Subscribe(x => manager.ContainerHeight = x));
            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(actualWidthTargetExp)
                                              .Subscribe(x => manager.ContainerWidth = x));
        }
        /// <summary>
        /// Sets up the reactive bindings for all Acquire Acquisition controls.
        /// </summary>
        /// <param name="manager">The manager.</param>
        private void BindAcquireAcquisitionControls(ViewROIManager manager)
        {
            // buttonLiveVideo
            this.BindCommand(this.MainViewModel, vm => vm.AcquireAcquisitionVM.LiveVideoCommand, x => x.acquisitionAcquirePage.buttonLiveVideo);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireAcquisitionVM.SelectFileCommand, x => x.acquisitionAcquirePage.buttonSelectFile);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireAcquisitionVM.SaveImageCommand, x => x.acquisitionAcquirePage.buttonSave);

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.LiveVideoMode)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x =>
            {
                if (x)
                {
                    this.acquisitionAcquirePage.buttonLiveVideo.Content = "Stop Live Video";
                }
                else
                {
                    this.acquisitionAcquirePage.buttonLiveVideo.Content = "Start Live Video";
                }
            }));

            // buttonInitializeCamera
            this.BindCommand(this.MainViewModel, vm => vm.AcquireAcquisitionVM.InitializeCommand, x => x.acquisitionAcquirePage.buttonInitializeCamera);

            // buttonAcquire
            this.BindCommand(this.MainViewModel, vm => vm.AcquireAcquisitionVM.Command, x => x.acquisitionAcquirePage.buttonAcquire);

            // Bind the buttonSelectFile visibility to SelectFileVisibility property.
            this.OneWayBind(this.MainViewModel, vm => vm.AcquireAcquisitionVM.SelectFileVisibility, y => y.acquisitionAcquirePage.buttonSelectFile.Visibility);

            // Bind image aspect for acquired images.
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.AcquiredImageHeight)
                                       .Subscribe(x => manager.ImageHeight = x));
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.AcquiredImageWidth)
                                       .Subscribe(x => manager.ImageWidth = x));

            // Display collection.
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.Display)
                                       .Where(x => x.DisplayList.Count > 0)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x =>
            {
                try
                {
                    manager.ShowDisplayCollection(x);
                }
                finally
                {
                    this.MainViewModel.AcquireAcquisitionVM.IsProcessing = false;
                }
            }));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.DebugDisplay)
                                       .Where(x => x.DisplayList.Count > 0)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => manager.ShowDisplayCollection(x)));

            // comboBoxAcquisitionInterfaceName
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.AcquisitionInterfaces)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxAcquisitionInterfaceName.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.AcquisitionInterfaces.ToList()));
            this.acquisitionAcquirePage.comboBoxAcquisitionInterfaceName.SelectedIndex = 1;

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxAcquisitionInterfaceName.SelectedItem)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.CurrentAcquisitionInterfaceName));

            // comboBoxHorizontalResolution
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.HorizontalResolutionParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxHorizontalResolution.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.HorizontalResolutionParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxHorizontalResolution.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.HorizontalResolution));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxHorizontalResolution.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.HorizontalResolution));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.HorizontalResolution)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxHorizontalResolution.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxHorizontalResolution.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.HorizontalResolution)));

            // comboBoxVerticalResolution
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.VerticalResolutionParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxVerticalResolution.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.VerticalResolutionParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxVerticalResolution.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.VerticalResolution));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxVerticalResolution.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.VerticalResolution));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.VerticalResolution)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxVerticalResolution.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxVerticalResolution.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.VerticalResolution)));

            // comboBoxImageWidth
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ImageWidthParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxImageWidth.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.ImageWidthParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxImageWidth.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ImageWidth));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxImageWidth.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ImageWidth));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ImageWidth)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxImageWidth.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxImageWidth.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.ImageWidth)));

            // comboBoxImageHeight
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ImageHeightParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxImageHeight.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.ImageHeightParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxImageHeight.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ImageHeight));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxImageHeight.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ImageHeight));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ImageHeight)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxImageHeight.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxImageHeight.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.ImageHeight)));

            // comboBoxStartRow
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.StartRowParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxStartRow.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.StartRowParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxStartRow.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.StartRow));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxStartRow.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.StartRow));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.StartRow)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxStartRow.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxStartRow.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.StartRow)));

            // comboBoxStartColumn
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.StartColumnParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxStartColumn.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.StartColumnParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxStartColumn.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.StartColumn));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxStartColumn.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.StartColumn));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.StartColumn)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxStartColumn.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxStartColumn.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.StartColumn)));

            // comboBoxField
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.FieldParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxField.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.FieldParameters.ToSArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxField.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Field));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxField.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Field));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.Field)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxField.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxField.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.Field)));

            // comboBitsPerChannel
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.BitsPerChannelParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBitsPerChannel.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.BitsPerChannelParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBitsPerChannel.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.BitsPerChannel));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBitsPerChannel.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.BitsPerChannel));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.BitsPerChannel)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBitsPerChannel.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBitsPerChannel.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.BitsPerChannel)));

            // comboBoxColorSpace
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ColorSpaceParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxColorSpace.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.ColorSpaceParameters.ToSArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxColorSpace.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ColorSpace));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxColorSpace.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ColorSpace));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ColorSpace)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxColorSpace.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxColorSpace.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.ColorSpace)));

            // comboBoxGeneric
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.GenericParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxGeneric.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.GenericParameters.ToSArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxGeneric.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Generic));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxGeneric.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Generic));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.Generic)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxGeneric.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxGeneric.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.Generic)));

            // comboBoxExternalTrigger
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ExternalTriggerParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxExternalTrigger.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.ExternalTriggerParameters.ToSArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxExternalTrigger.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ExternalTrigger));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxExternalTrigger.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.ExternalTrigger));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.ExternalTrigger)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxExternalTrigger.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxExternalTrigger.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.ExternalTrigger)));

            // comboBoxCameraType
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.CameraTypeParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxCameraType.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.CameraTypeParameters.ToSArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxCameraType.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.CameraType));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxCameraType.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.CameraType));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.CameraType)
                                       .Where(_ => this.MainViewModel.AcquireAcquisitionVM.CurrentAcquisitionInterfaceName != "File")
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxCameraType.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxCameraType.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.CameraType)));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.CameraType)
                                       .Where(_ => this.MainViewModel.AcquireAcquisitionVM.CurrentAcquisitionInterfaceName == "File")
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxCameraType.Text = MainViewModel.AcquireAcquisitionVM.CameraType));

            // comboBoxDevice
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.DeviceParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxDevice.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.DeviceParameters.ToSArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxDevice.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Device));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxDevice.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Device));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.Device)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxDevice.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxDevice.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.Device)));

            // comboBoxPort
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.PortParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxPort.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.PortParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxPort.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Port));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxPort.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.Port));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.Port)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxPort.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxPort.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.Port)));

            // comboBoxLineIn
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.LineInParameters)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxLineIn.ItemsSource = this.MainViewModel.AcquireAcquisitionVM.LineInParameters.ToIArr()));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxLineIn.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.LineIn));

            this.disposeCollection.Add(this.acquisitionAcquirePage.WhenAnyValue(x => x.comboBoxLineIn.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"^-?\d+$") == true)
                                       .BindTo(this.MainViewModel.AcquireAcquisitionVM, vm => vm.LineIn));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireAcquisitionVM.LineIn)
                                       .Subscribe(_ => this.acquisitionAcquirePage.comboBoxLineIn.SelectedIndex =
                                                      this.acquisitionAcquirePage.comboBoxLineIn.Items.IndexOf(MainViewModel.AcquireAcquisitionVM.LineIn)));
        }
        /// <summary>
        /// Sets up the reactive bindings for all Acquire camera calibration controls.
        /// </summary>
        /// <param name="manager">The manager.</param>
        private void BindAcquireCalibrationControls(ViewROIManager manager)
        {
            string RegexFloat   = @"^-?\d+\.?\d*$";
            string RegexInteger = @"^-?\d+$";

            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.SetParametersCommand, x => x.calibrationAcquirePage.ButtonSetInitialParameters);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.AcquireCalibrationImagesCommand, x => x.calibrationAcquirePage.ButtonAcquireCalibrationImages);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.CalibrateCommand, x => x.calibrationAcquirePage.ButtonCalibrate);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.RectifyImageCommand, x => x.calibrationAcquirePage.ButtonRectifyTestImage);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.LoadCalibrationMapCommand, x => x.calibrationAcquirePage.ButtonLoadCalibrationMap);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.LoadTestCalibrationImageCommand, x => x.calibrationAcquirePage.ButtonLoadTestCalibrationImage);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.SaveRectifiedImageCommand, x => x.calibrationAcquirePage.ButtonSaveRectifiedTestImage);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.LoadCalibImagesFromFileCommand, x => x.calibrationAcquirePage.ButtonLoadCalibrationImages);
            this.BindCommand(this.MainViewModel, vm => vm.AcquireCalibrationVM.SaveCalibrationMapCommand, x => x.calibrationAcquirePage.ButtonSaveCalibrationMap);

            // ButtonLoadCalibrationImages enabled bound to LoadCalibImagesFromFileCanExecute observable.
            this.disposeCollection.Add(this.WhenAnyObservable(x => x.MainViewModel.AcquireCalibrationVM.LoadCalibImagesFromFileCanExecute)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => this.calibrationAcquirePage.ButtonLoadCalibrationImages.IsEnabled = x));

            // ButtonAcquireCalibrationImages enabled bound to LoadCalibImagesFromFileCanExecute observable.
            this.disposeCollection.Add(this.WhenAnyObservable(x => x.MainViewModel.AcquireCalibrationVM.LoadCalibImagesFromFileCanExecute)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => this.calibrationAcquirePage.ButtonAcquireCalibrationImages.IsEnabled = x));

            // ButtonResetCalibrationImages enabled bound to LoadCalibImagesFromFileCanExecute observable.
            this.disposeCollection.Add(this.WhenAnyObservable(x => x.MainViewModel.AcquireCalibrationVM.LoadCalibImagesFromFileCanExecute)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => this.calibrationAcquirePage.ButtonResetCalibrationImages.IsEnabled = x));

            // ButtonSaveCalibrationMap enabled bound to SaveCalibrationCanExecute observable.
            this.disposeCollection.Add(this.WhenAnyObservable(x => x.MainViewModel.AcquireCalibrationVM.SaveCalibrationMapCanExecute)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => this.calibrationAcquirePage.ButtonSaveCalibrationMap.IsEnabled = x));

            // ButtonLoadTestCalibrationImage enabled bound to LoadTestImageCanExecute observable.
            this.disposeCollection.Add(this.WhenAnyObservable(x => x.MainViewModel.AcquireCalibrationVM.LoadTestCalibrationImageCanExecute)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => this.calibrationAcquirePage.ButtonLoadTestCalibrationImage.IsEnabled = x));

            // ButtonSaveRectifiedTestImage enabled bound to SaveRectifyImageCanExecute observable.
            this.disposeCollection.Add(this.WhenAnyObservable(x => x.MainViewModel.AcquireCalibrationVM.SaveRectifiedImageCanExecute)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x =>
            {
                this.calibrationAcquirePage.ButtonSaveRectifiedTestImage.IsEnabled = x;
            }));

            // CheckBoxCorrectImages enabled bound to LoadTestImageCanExecute observable.
            this.disposeCollection.Add(this.WhenAnyObservable(x => x.MainViewModel.AcquireCalibrationVM.LoadTestCalibrationImageCanExecute)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => this.calibrationAcquirePage.CheckBoxCorrectImages.IsEnabled = x));

            this.Bind(this.MainViewModel, vm => vm.AcquireCalibrationVM.CorrectNewImages, x => x.calibrationAcquirePage.CheckBoxCorrectImages.IsChecked);

            // Set cursor to wait while calibration processes are busy.  Does not affect HalconWindow. ??
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.IsBusy)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x =>
            {
                if (x)
                {
                    System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
                }
                else
                {
                    System.Windows.Input.Mouse.OverrideCursor = null;
                }
            }));

            // ComboBoxFocalLength
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.FocalLengthParameters)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxFocalLength.ItemsSource = this.MainViewModel.AcquireCalibrationVM.FocalLengthParameters.ToDArr()));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxFocalLength.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.FocalLength));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxFocalLength.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexFloat) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.FocalLength));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.FocalLength)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxFocalLength.SelectedIndex =
                                                      this.calibrationAcquirePage.ComboBoxFocalLength.Items.IndexOf(MainViewModel.AcquireCalibrationVM.FocalLength)));

            // ComboBoxSensorSizeX
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.SensorSizeXParameters)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxSensorSizeX.ItemsSource = this.MainViewModel.AcquireCalibrationVM.SensorSizeXParameters.ToDArr()));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxSensorSizeX.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.SensorSizeX));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxSensorSizeX.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexFloat) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.SensorSizeX));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.SensorSizeX)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxSensorSizeX.SelectedIndex =
                                                      this.calibrationAcquirePage.ComboBoxSensorSizeX.Items.IndexOf(MainViewModel.AcquireCalibrationVM.SensorSizeX)));

            // ComboBoxSensorSizeY
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.SensorSizeYParameters)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxSensorSizeY.ItemsSource = this.MainViewModel.AcquireCalibrationVM.SensorSizeYParameters.ToDArr()));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxSensorSizeY.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.SensorSizeY));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxSensorSizeY.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexFloat) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.SensorSizeY));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.SensorSizeY)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxSensorSizeY.SelectedIndex =
                                                      this.calibrationAcquirePage.ComboBoxSensorSizeY.Items.IndexOf(MainViewModel.AcquireCalibrationVM.SensorSizeY)));

            // ComboBoxCalibrationImageWidth
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.ImageWidthParameters)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationImageWidth.ItemsSource = this.MainViewModel.AcquireCalibrationVM.ImageWidthParameters.ToIArr()));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationImageWidth.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.ImageWidth));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationImageWidth.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexInteger) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.ImageWidth));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.ImageWidth)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationImageWidth.SelectedIndex =
                                                      this.calibrationAcquirePage.ComboBoxCalibrationImageWidth.Items.IndexOf(MainViewModel.AcquireCalibrationVM.ImageWidth)));

            // ComboBoxCalibrationImageHeight
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.ImageHeightParameters)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationImageHeight.ItemsSource = this.MainViewModel.AcquireCalibrationVM.ImageHeightParameters.ToIArr()));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationImageHeight.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.ImageHeight));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationImageHeight.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexInteger) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.ImageHeight));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.ImageHeight)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationImageHeight.SelectedIndex =
                                                      this.calibrationAcquirePage.ComboBoxCalibrationImageHeight.Items.IndexOf(MainViewModel.AcquireCalibrationVM.ImageHeight)));

            // ComboBoxCalibrationCameraType
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.CameraTypeParameters)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationCameraType.ItemsSource = this.MainViewModel.AcquireCalibrationVM.CameraTypeParameters.ToSArr()));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationCameraType.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.CameraType));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationCameraType.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.CameraType));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.CameraType)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationCameraType.SelectedIndex =
                                                      this.calibrationAcquirePage.ComboBoxCalibrationCameraType.Items.IndexOf(MainViewModel.AcquireCalibrationVM.CameraType)));

            // ComboBoxCalibrationPlateName
            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.HalconCalibrationPlateParameters)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationPlateName.ItemsSource = this.MainViewModel.AcquireCalibrationVM.HalconCalibrationPlateParameters.ToSArr()));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationPlateName.SelectedItem)
                                       .Where(x => x != null)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.HalconCalibrationPlateName));

            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.ComboBoxCalibrationPlateName.Text)
                                       .Where(x => x != string.Empty)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.HalconCalibrationPlateName));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.HalconCalibrationPlateName)
                                       .Subscribe(_ => this.calibrationAcquirePage.ComboBoxCalibrationPlateName.SelectedIndex =
                                                      this.calibrationAcquirePage.ComboBoxCalibrationPlateName.Items.IndexOf(MainViewModel.AcquireCalibrationVM.HalconCalibrationPlateName)));

            // TextBoxRectifiedImageWidth
            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.TextBoxRectifiedImageWidth.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexInteger) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.RectifiedImageWidth));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.RectifiedImageWidth)
                                       .Subscribe(x => this.calibrationAcquirePage.TextBoxRectifiedImageWidth.Text = this.MainViewModel.AcquireCalibrationVM.RectifiedImageWidth.ToString()));

            // TextBoxRectifiedImageHeight
            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.TextBoxRectifiedImageHeight.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexInteger) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.RectifiedImageHeight));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.RectifiedImageHeight)
                                       .Subscribe(x => this.calibrationAcquirePage.TextBoxRectifiedImageHeight.Text = this.MainViewModel.AcquireCalibrationVM.RectifiedImageHeight.ToString()));

            // TextBoxCalibratedScale
            this.disposeCollection.Add(this.calibrationAcquirePage.WhenAnyValue(x => x.TextBoxCalibratedScale.Text)
                                       .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, RegexFloat) == true)
                                       .BindTo(this.MainViewModel.AcquireCalibrationVM, vm => vm.CalibratedScale));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.CalibratedScale)
                                       .Subscribe(x => this.calibrationAcquirePage.TextBoxCalibratedScale.Text = this.MainViewModel.AcquireCalibrationVM.CalibratedScale.ToString("0.0######")));

            // IntegerUpDownWorldPoseIndex
            this.Bind(this.MainViewModel, x => x.AcquireCalibrationVM.WorldPoseIndex, x => x.calibrationAcquirePage.IntegerUpDownWorldPoseIndex.Value);

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.Display)
                                       .Where(x => x.DisplayList.Count > 0)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => manager.ShowDisplayCollection(x)));

            this.disposeCollection.Add(this.WhenAnyValue(x => x.MainViewModel.AcquireCalibrationVM.DebugDisplay)
                                       .Where(x => x.DisplayList.Count > 0)
                                       .ObserveOn(RxApp.MainThreadScheduler)
                                       .Subscribe(x => manager.ShowDisplayCollection(x)));
        }
Example #7
0
        /// <summary>
        /// Binds a Halcon window to a View Roi Manager.
        /// </summary>
        /// <param name="manager">The View Roi Manager.</param>
        /// <param name="halconWindow">The Halcon window.</param>
        /// <param name="imageBorderName">
        /// The name of the Border Control containing the Halcon window control.
        /// </param>
        /// <param name="loadImageViewModelName">The name of the load image view model to use.</param>
        /// <param name="windowClass">The main window class instance. (Pass "this")</param>
        public static void BindHalconWindow(
            ViewROIManager manager,
            HSmartWindowControlWPF halconWindow,
            string imageBorderName,
            string loadImageViewModelName,
            MainWindow windowClass)
        {
            windowClass.DisposeCollection.Add(windowClass.Events().ContentRendered.Subscribe(_ =>
            {
                // At initialization, the HSmartWindowWPF sometimes shows Width and Height = NaN
                // until reset with second image or a zoom.
                // This code sets them to actual size before the first use.
                halconWindow.Width  = halconWindow.ActualWidth;
                halconWindow.Height = halconWindow.ActualHeight;

                manager.LocHWindowControl = halconWindow;
                manager.LocHWindowControl.HZoomContent = HSmartWindowControlWPF.ZoomContent.Off;

                manager.LocHWindowControl.ContextMenu.ItemsSource = windowClass.MainViewModel.MenuItems;

                // Set the data template.
                manager.LocHWindowControl.ContextMenu.ItemTemplate = windowClass.ContextMenuDataTemplate;

                // Set the ItemsPanelTemplate.
                manager.LocHWindowControl.ContextMenu.ItemsPanel = windowClass.ContextMenuItemsPanelTemplate;

                windowClass.DisposeCollection.Add(Observable.FromEventPattern <HSmartWindowControlWPF.HMouseEventArgsWPF>(manager.LocHWindowControl, "HMouseDoubleClick")
                                                  .Subscribe(a =>
                {
                    manager.ZoomScale = 0;
                    windowClass.comboboxZoom.SelectedIndex =
                        windowClass.comboboxZoom.Items.IndexOf(
                            windowClass.comboboxZoom.Items.OfType <ComboBoxItem>()
                            .FirstOrDefault(x => x.Content.ToString() == "Fit"));
                }));
            }));

            windowClass.DisposeCollection.Add(windowClass.MainViewModel.MenuItems.ItemsAdded
                                              .Where(_ => manager.LocHWindowControl != null)
                                              .Subscribe(
                                                  _ =>
            {
                manager.LocHWindowControl.ContextMenu.ItemsSource = windowClass.MainViewModel.MenuItems;

                // Set the data template.
                manager.LocHWindowControl.ContextMenu.ItemTemplate = windowClass.ContextMenuDataTemplate;

                // Set the ItemsPanelTemplate.
                manager.LocHWindowControl.ContextMenu.ItemsPanel = windowClass.ContextMenuItemsPanelTemplate;
            }));

            windowClass.DisposeCollection.Add(windowClass.Events().LayoutUpdated
                                              .Select(_ => System.Reactive.Unit.Default)
                                              .InvokeCommand(manager.AdjustAspectCommand));

            ParameterExpression targetParameter = LExpression.Parameter(typeof(MainWindow), "x");
            MemberExpression    mainVMExp       = LExpression.Property(targetParameter, "MainViewModel");
            MemberExpression    viewModelExp    = LExpression.Property(mainVMExp, loadImageViewModelName);
            MemberExpression    imageHeightExp  = LExpression.Property(viewModelExp, "ImageHeight");
            MemberExpression    imageWidthExp   = LExpression.Property(viewModelExp, "ImageWidth");
            Expression <Func <MainWindow, int> > imageHeightTargetExp = LExpression.Lambda <Func <MainWindow, int> >(imageHeightExp, new ParameterExpression[] { targetParameter });
            Expression <Func <MainWindow, int> > imageWidthTargetExp  = LExpression.Lambda <Func <MainWindow, int> >(imageWidthExp, new ParameterExpression[] { targetParameter });

            // Using Subscribe here because BindTo sets up a two-way binding which is not wanted.
            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(imageHeightTargetExp)
                                              .Subscribe(x => manager.ImageHeight = x));
            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(imageWidthTargetExp)
                                              .Subscribe(x => manager.ImageWidth = x));

            MemberExpression borderExp       = LExpression.PropertyOrField(targetParameter, imageBorderName);
            MemberExpression actualHeightExp = LExpression.Property(borderExp, "ActualHeight");
            MemberExpression actualWidthExp  = LExpression.Property(borderExp, "ActualWidth");
            Expression <Func <MainWindow, double> > actualHeightTargetExp = LExpression.Lambda <Func <MainWindow, double> >(actualHeightExp, new ParameterExpression[] { targetParameter });
            Expression <Func <MainWindow, double> > actualWidthTargetExp  = LExpression.Lambda <Func <MainWindow, double> >(actualWidthExp, new ParameterExpression[] { targetParameter });

            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(actualHeightTargetExp)
                                              .Subscribe(x => manager.ContainerHeight = x));
            windowClass.DisposeCollection.Add(windowClass.WhenAnyValue(actualWidthTargetExp)
                                              .Subscribe(x => manager.ContainerWidth = x));
        }