Exemplo n.º 1
0
        internal AccelerationViewModel(Acceleration acceleration, Train train, MotorCar car)
        {
            CultureInfo culture = CultureInfo.InvariantCulture;

            Entries = acceleration.Entries
                      .ToReadOnlyReactiveCollection(x => new EntryViewModel(x))
                      .AddTo(disposable);

            SelectedEntryIndex = acceleration
                                 .ToReactivePropertyAsSynchronized(
                x => x.SelectedEntryIndex,
                ignoreValidationErrorValue: true
                )
                                 .SetValidateNotifyError(x => x < 0 ? string.Empty : null)
                                 .AddTo(disposable);

            SelectedEntry = SelectedEntryIndex
                            .Select(x => x < 0 ? null : Entries[x])
                            .ToReadOnlyReactivePropertySlim()
                            .AddTo(disposable);

            MinVelocity = acceleration
                          .ToReactivePropertyAsSynchronized(
                x => x.MinVelocity,
                x => x.ToString(culture),
                x => double.Parse(x, NumberStyles.Float, culture),
                ignoreValidationErrorValue: true
                )
                          .AddTo(disposable);

            MaxVelocity = acceleration
                          .ToReactivePropertyAsSynchronized(
                x => x.MaxVelocity,
                x => x.ToString(culture),
                x => double.Parse(x, NumberStyles.Float, culture),
                ignoreValidationErrorValue: true
                )
                          .AddTo(disposable);

            MinAcceleration = acceleration
                              .ToReactivePropertyAsSynchronized(
                x => x.MinAcceleration,
                x => x.ToString(culture),
                x => double.Parse(x, NumberStyles.Float, culture),
                ignoreValidationErrorValue: true
                )
                              .AddTo(disposable);

            MaxAcceleration = acceleration
                              .ToReactivePropertyAsSynchronized(
                x => x.MaxAcceleration,
                x => x.ToString(culture),
                x => double.Parse(x, NumberStyles.Float, culture),
                ignoreValidationErrorValue: true
                )
                              .AddTo(disposable);

            NowVelocity = acceleration
                          .ObserveProperty(x => x.NowVelocity)
                          .Select(x => $"{x} km/h")
                          .ToReadOnlyReactivePropertySlim()
                          .AddTo(disposable);

            NowAcceleration = acceleration
                              .ObserveProperty(x => x.NowAcceleration)
                              .Select(x => $"{x} km/h/s")
                              .ToReadOnlyReactivePropertySlim()
                              .AddTo(disposable);

            Resistance = acceleration
                         .ToReactivePropertyAsSynchronized(x => x.Resistance)
                         .AddTo(disposable);

            ImageWidth = acceleration
                         .ToReactivePropertyAsSynchronized(
                x => x.ImageWidth,
                ignoreValidationErrorValue: true
                )
                         .SetValidateNotifyError(x => x <= 0 ? string.Empty : null)
                         .AddTo(disposable);

            ImageHeight = acceleration
                          .ToReactivePropertyAsSynchronized(
                x => x.ImageHeight,
                ignoreValidationErrorValue: true
                )
                          .SetValidateNotifyError(x => x <= 0 ? string.Empty : null)
                          .AddTo(disposable);

            Image = acceleration
                    .ObserveProperty(x => x.Image)
                    .ToReadOnlyReactivePropertySlim()
                    .AddTo(disposable);

            new[]
            {
                acceleration
                .PropertyChangedAsObservable()
                .Where(x => x.PropertyName != nameof(acceleration.NowVelocity) &&
                       x.PropertyName != nameof(acceleration.NowAcceleration) &&
                       x.PropertyName != nameof(acceleration.Image)
                       )
                .OfType <object>(),
                acceleration.Entries.ObserveElementPropertyChanged().OfType <object>()
            }
            .Merge()
            .ToReadOnlyReactivePropertySlim()
            .Subscribe(_ => train.DrawAccelerationImage(car))
            .AddTo(disposable);

            ZoomIn = new ReactiveCommand();
            ZoomIn.Subscribe(acceleration.ZoomIn).AddTo(disposable);

            ZoomOut = new ReactiveCommand();
            ZoomOut.Subscribe(acceleration.ZoomOut).AddTo(disposable);

            Reset = new ReactiveCommand();
            Reset.Subscribe(acceleration.Reset).AddTo(disposable);

            MoveLeft = new ReactiveCommand();
            MoveLeft.Subscribe(acceleration.MoveLeft).AddTo(disposable);

            MoveRight = new ReactiveCommand();
            MoveRight.Subscribe(acceleration.MoveRight).AddTo(disposable);

            MoveBottom = new ReactiveCommand();
            MoveBottom.Subscribe(acceleration.MoveBottom).AddTo(disposable);

            MoveTop = new ReactiveCommand();
            MoveTop.Subscribe(acceleration.MoveTop).AddTo(disposable);

            MouseMove = new ReactiveCommand <InputEventModel.EventArgs>();
            MouseMove.Subscribe(acceleration.MouseMove).AddTo(disposable);

            MinVelocity
            .SetValidateNotifyError(x =>
            {
                double min;
                string message;

                if (Utilities.TryParse(x, NumberRange.NonNegative, out min, out message))
                {
                    double max;

                    if (Utilities.TryParse(MaxVelocity.Value, NumberRange.NonNegative, out max) && min >= max)
                    {
                        message = "MinはMax未満でなければなりません。";
                    }
                }

                return(message);
            })
            .Subscribe(_ => MaxVelocity.ForceValidate())
            .AddTo(disposable);

            MinVelocity.ObserveHasErrors
            .ToReadOnlyReactivePropertySlim(mode: ReactivePropertyMode.DistinctUntilChanged)
            .Where(x => !x)
            .Subscribe(_ => MinVelocity.ForceNotify())
            .AddTo(disposable);

            MaxVelocity
            .SetValidateNotifyError(x =>
            {
                double max;
                string message;

                if (Utilities.TryParse(x, NumberRange.NonNegative, out max, out message))
                {
                    double min;

                    if (Utilities.TryParse(MinVelocity.Value, NumberRange.NonNegative, out min) && max <= min)
                    {
                        message = "MinはMax未満でなければなりません。";
                    }
                }

                return(message);
            })
            .Subscribe(_ => MinVelocity.ForceValidate())
            .AddTo(disposable);

            MaxVelocity.ObserveHasErrors
            .ToReadOnlyReactivePropertySlim(mode: ReactivePropertyMode.DistinctUntilChanged)
            .Where(x => !x)
            .Subscribe(_ => MaxVelocity.ForceNotify())
            .AddTo(disposable);

            MinAcceleration
            .SetValidateNotifyError(x =>
            {
                double min;
                string message;

                if (Utilities.TryParse(x, NumberRange.NonNegative, out min, out message))
                {
                    double max;

                    if (Utilities.TryParse(MaxAcceleration.Value, NumberRange.NonNegative, out max) && min >= max)
                    {
                        message = "MinはMax未満でなければなりません。";
                    }
                }

                return(message);
            })
            .Subscribe(_ => MaxAcceleration.ForceValidate())
            .AddTo(disposable);

            MinAcceleration.ObserveHasErrors
            .ToReadOnlyReactivePropertySlim(mode: ReactivePropertyMode.DistinctUntilChanged)
            .Where(x => !x)
            .Subscribe(_ => MinAcceleration.ForceNotify())
            .AddTo(disposable);

            MaxAcceleration
            .SetValidateNotifyError(x =>
            {
                double max;
                string message;

                if (Utilities.TryParse(x, NumberRange.NonNegative, out max, out message))
                {
                    double min;

                    if (Utilities.TryParse(MinAcceleration.Value, NumberRange.NonNegative, out min) && max <= min)
                    {
                        message = "MinはMax未満でなければなりません。";
                    }
                }

                return(message);
            })
            .Subscribe(_ => MinAcceleration.ForceValidate())
            .AddTo(disposable);

            MaxAcceleration.ObserveHasErrors
            .ToReadOnlyReactivePropertySlim(mode: ReactivePropertyMode.DistinctUntilChanged)
            .Where(x => !x)
            .Subscribe(_ => MaxAcceleration.ForceNotify())
            .AddTo(disposable);
        }
Exemplo n.º 2
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (TotalPathLength != 0D)
            {
                hash ^= TotalPathLength.GetHashCode();
            }
            if (TotalTime != 0D)
            {
                hash ^= TotalTime.GetHashCode();
            }
            if (MatrixDimensionS != 0)
            {
                hash ^= MatrixDimensionS.GetHashCode();
            }
            if (MatrixDimensionT != 0)
            {
                hash ^= MatrixDimensionT.GetHashCode();
            }
            if (SpeedWeight != 0D)
            {
                hash ^= SpeedWeight.GetHashCode();
            }
            if (AccelWeight != 0D)
            {
                hash ^= AccelWeight.GetHashCode();
            }
            if (JerkWeight != 0D)
            {
                hash ^= JerkWeight.GetHashCode();
            }
            if (ObstacleWeight != 0D)
            {
                hash ^= ObstacleWeight.GetHashCode();
            }
            if (ReferenceWeight != 0D)
            {
                hash ^= ReferenceWeight.GetHashCode();
            }
            if (GoDownBuffer != 0D)
            {
                hash ^= GoDownBuffer.GetHashCode();
            }
            if (GoUpBuffer != 0D)
            {
                hash ^= GoUpBuffer.GetHashCode();
            }
            if (DefaultObstacleCost != 0D)
            {
                hash ^= DefaultObstacleCost.GetHashCode();
            }
            if (DefaultSpeedCost != 0D)
            {
                hash ^= DefaultSpeedCost.GetHashCode();
            }
            if (ExceedSpeedPenalty != 0D)
            {
                hash ^= ExceedSpeedPenalty.GetHashCode();
            }
            if (LowSpeedPenalty != 0D)
            {
                hash ^= LowSpeedPenalty.GetHashCode();
            }
            if (KeepClearLowSpeedPenalty != 0D)
            {
                hash ^= KeepClearLowSpeedPenalty.GetHashCode();
            }
            if (AccelPenalty != 0D)
            {
                hash ^= AccelPenalty.GetHashCode();
            }
            if (DecelPenalty != 0D)
            {
                hash ^= DecelPenalty.GetHashCode();
            }
            if (PositiveJerkCoeff != 0D)
            {
                hash ^= PositiveJerkCoeff.GetHashCode();
            }
            if (NegativeJerkCoeff != 0D)
            {
                hash ^= NegativeJerkCoeff.GetHashCode();
            }
            if (MaxAcceleration != 0D)
            {
                hash ^= MaxAcceleration.GetHashCode();
            }
            if (MaxDeceleration != 0D)
            {
                hash ^= MaxDeceleration.GetHashCode();
            }
            if (stBoundaryConfig_ != null)
            {
                hash ^= StBoundaryConfig.GetHashCode();
            }
            return(hash);
        }