private void buttonSelectCoordinates_Click(object sender, EventArgs e)
        {
            FormSelectMapPointDialog fsmpd = new FormSelectMapPointDialog("Выберите место, где проводились наблюдения", PointLatLng.Empty, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);

            if (fsmpd.ShowDialog(this) == DialogResult.OK)
            {
                this.selectedPosition        = fsmpd.Result;
                buttonSelectCoordinates.Text = selectedPosition.ToString(3);
            }
        }
Example #2
0
        private void buttonSelectPoint_Click(object sender, EventArgs e)
        {
            FormSelectMapPointDialog fsmp = new FormSelectMapPointDialog("Выберите точку на карте", PointLatLng.Empty, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);

            if (fsmp.ShowDialog(this) == DialogResult.OK)
            {
                point = fsmp.Result;
                updateUI();
            }
        }
Example #3
0
        private void buttonSelectPointCoordinates_Click(object sender, EventArgs e)
        {
            FormSelectMapPointDialog fsp = new FormSelectMapPointDialog("Выберите точку ВЭС", pointCoordinates, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);

            if (fsp.ShowDialog(this) == DialogResult.OK)
            {
                pointCoordinates = fsp.Result;
            }
            setStatuses();
        }
Example #4
0
        private void buttonSelectMSCoordinates_Click(object sender, EventArgs e)
        {
            FormSelectMapPointDialog fsp = new FormSelectMapPointDialog("Выберите точку метеостанции", range.Position, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);

            if (fsp.ShowDialog(this) == DialogResult.OK)
            {
                range.Position = fsp.Result;
            }
            tryGetMSClasses(); //при изменении точки МС заново ищем классы открытости из Классы открытости МС
            setStatuses();
        }
Example #5
0
        /// <summary>
        /// выбор точки на карте
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonSelectPoint_Click(object sender, EventArgs e)
        {
            FormSelectMapPointDialog spt = new FormSelectMapPointDialog("Выберите точку на карте", PointLatLng.Empty, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);

            if (spt.ShowDialog(this) == DialogResult.OK)
            {
                labelPointCoordinates.Text = $"Широта: {spt.Result.Lat:0.000} Долгота: {spt.Result.Lng:0.000}";
                loadAddressAsync(spt.Result);
                toolTip1.SetToolTip(labelPointAddress, labelPointAddress.Text);
                checkPoint = spt.Result;
            }
        }
Example #6
0
        /// <summary>
        /// выбор координат ряда
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ButtonSelectCoordinates_Click(object sender, EventArgs e)
        {
            FormSelectMapPointDialog spt = new FormSelectMapPointDialog("Выберите точку на карте", PointLatLng.Empty, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);

            if (spt.ShowDialog(this) == DialogResult.OK)
            {
                labelCoordinates.Text = $"Широта: {spt.Result.Lat:0.000} Долгота: {spt.Result.Lng:0.000}";
                toolTip1.SetToolTip(labelCoordinates, labelCoordinates.Text);
                importer.Coordinates = spt.Result;
                updateUI();
            }
            spt.Dispose();
        }
Example #7
0
        /// <summary>
        /// кнопка выбора точки на карте
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonSelectPoint_Click(object sender, EventArgs e)
        {
            FormSelectMapPointDialog spt = new FormSelectMapPointDialog("Выберите точку на карте", point, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);

            if (spt.ShowDialog(this) == DialogResult.OK)
            {
                point                      = spt.Result;
                spoint                     = new RP5MeteostationInfo();
                spoint.Position            = point;
                labelPointCoordinates.Text = $"Широта: {point.Lat:0.000} Долгота: {point.Lng:0.000}";

                loadAddressAsync(point);

                buttonDownload.Enabled         = true;
                dateTimePickerFromDate.Enabled = true;
                dateTimePickerToDate.Enabled   = true;
            }
        }
Example #8
0
        private void buttonCalculate_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            Action <int> action = new Action <int>((percent) =>
            {
                try
                {
                    if (this.InvokeRequired)
                    {
                        _ = Invoke(new Action(() => { progressBar1.Value = percent; }));
                    }
                    else
                    {
                        progressBar1.Value = percent;
                    }
                }
                catch (Exception) { }
            });

            Action <RawRange, FlugerMeteostationInfo> actionAfter = new Action <RawRange, FlugerMeteostationInfo>((rawRange, fluger_MS) =>
            {
                _ = this.Invoke(new Action(() =>
                {
                    string text = fluger_MS != null ? $"\r\nпо данным МС {fluger_MS.Name} ({fluger_MS.Position}) с учетом изменения классов открытости площадок" : "";
                    _           = MessageBox.Show(this, $"Скорости ветра пересчитаны в точку ВЭС ({pointCoordinates.ToString(3)}){((!string.IsNullOrWhiteSpace(text)) ? text : "")}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);

                    rawRange.Name = $"Ряд в точке {pointCoordinates.ToString(3)}";
                    if (rawRange == null)
                    {
                        DialogResult = DialogResult.Cancel;
                    }
                    else
                    {
                        DialogResult = DialogResult.OK;
                        Result       = rawRange;
                    }
                    Cursor = Cursors.Arrow;
                    Result = rawRange;
                    Close();
                }));
            });

            try
            {
                if (range.Position.IsEmpty)
                {
                    FormSelectMapPointDialog fsp = new FormSelectMapPointDialog("Выберите координаты ряда " + range.Name, PointLatLng.Empty, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);
                    if (fsp.ShowDialog(this) == DialogResult.OK)
                    {
                        range.Position = fsp.Result;
                    }
                    else
                    {
                        return;
                    }
                }

                RangeTerrain.ProcessRange(range, new TerrainParameters()
                {
                    MSClasses                = msClasses,
                    PointClasses             = pointClasses,
                    TerrainType              = terrainType,
                    PointCoordinates         = pointCoordinates,
                    FlugerMeteostation       = flugerMeteostation,
                    AtmosphereStratification = stratification,
                    MicroclimateCoefficient  = microclimateCoeff,
                    MesoclimateCoefficient   = mesoclimateCoeff,
                }, action, actionAfter);;
            }
            catch (WebException exc)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, exc.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
            catch (WindEnergyException wex)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, wex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
            catch (ApplicationException exc)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, exc.Message + "\r\nПопробуйте уменьшить длину ряда", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
            catch (Exception ex)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, "Произошла ошибка:\r\n" + ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
        }
Example #9
0
        /// <summary>
        /// кнопка восстановить ряд
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonRepairRange_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
            InterpolateMethods   method   = (InterpolateMethods)(new EnumTypeConverter <InterpolateMethods>().ConvertFrom(comboBoxInterpolateMethod.SelectedItem));
            StandartIntervals    interval = (StandartIntervals)(new EnumTypeConverter <StandartIntervals>().ConvertFrom(comboBoxRepairInterval.SelectedItem));
            Action <int, string> action   = new Action <int, string>((percent, text) =>
            {
                try
                {
                    if (this.InvokeRequired)
                    {
                        _ = Invoke(new Action(() =>
                        {
                            progressBarStatus.Value = percent;
                        }));
                    }
                    else
                    {
                        progressBarStatus.Value = percent;
                    }
                }
                catch (Exception) { }
            });

            Action <RawRange, RawRange, double> actionAfter = new Action <RawRange, RawRange, double>((resultRange, baseRange, r) =>
            {
                _ = this.Invoke(new Action(() =>
                {
                    string additionalText = "";

                    if (method == InterpolateMethods.NearestMeteostation)     //для восстановления ряда выводим доп. информацию
                    {
                        //Информация о коэфф корреляции и базовом ряде
                        if (double.IsNaN(r))
                        {
                            additionalText += "Восстановление проводилось на основе ряда наблюдений, заданного пользователем\r\n";
                        }
                        else
                        {
                            additionalText += $"Восстановление проводилось на основе ряда наблюдений {(baseRange.Meteostation != null ? $" на МС {baseRange.Meteostation.Name} " : "")}с коэффициентом корреляции {r:0.00} \r\n";
                        }
                        //предупреждение, что не все данные восстановлены
                        RangeInterval baseInterval = baseRange.Quality.Intervals.OrderByDescending((i) => i.LengthMinutes).First(); //выбираем самый длинный интервал наблюдений в базовом ряде
                        if (baseInterval.LengthMinutes > (int)interval)                                                             //если максимальный интервал базового ряда больше, чем требуемый интервал восстановления
                        {
                            additionalText += $"\r\nВнимание!! Интервал наблюдений ряда, на основе которого производилось восстановление ({baseInterval.Interval.Description()}), больше, чем требуемый интервал. Поэтому не удалось восстановить все значения ряда до {interval.Description()}\r\n";
                        }
                    }

                    resultRange.Name = "Восстановленный ряд до интервала" + interval.Description();
                    _ = MessageBox.Show(this, $"Ряд восстановлен до интервала {interval.Description()}\r\n{additionalText}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);

                    if (resultRange == null)
                    {
                        DialogResult = DialogResult.Cancel;
                    }
                    else
                    {
                        DialogResult = DialogResult.OK;
                        Result       = resultRange;
                    }
                    Cursor = Cursors.Arrow;
                    Result = resultRange;
                    Close();
                }));
            });

            try
            {
                //если выбрана ступенчатый метод или линейная интерполяция и в ряде есть пропуски больше, чем 1 интервал, то надо уточнить у пользователя
                if ((method == InterpolateMethods.Linear || method == InterpolateMethods.Stepwise) && rangeQuality.MaxEmptySpace.TotalMinutes > ((int)interval))
                {
                    if (MessageBox.Show(this, "Ряд содержит пропуски данных больше, чем один выбранный интервал наблюдений.\r\nВ таком случае не рекомендуется использовать линейную интерполяцию и ступенчатое восстановление.\r\nВы уверены, что хотите продолжить восстановление?", "Восстановление ряда", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                    {
                        return;
                    }
                }

                RawRange baseRange = null;
                if (method == InterpolateMethods.NearestMeteostation)
                {
                    if (radioButtonSelPoint.Checked)
                    {
                        if (range.Position.IsEmpty)
                        {
                            FormSelectMapPointDialog fsp = new FormSelectMapPointDialog("Выберите координаты ряда " + range.Name, PointLatLng.Empty, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);
                            if (fsp.ShowDialog(this) == DialogResult.OK)
                            {
                                range.Position = fsp.Result;
                            }
                            else
                            {
                                Cursor = Cursors.Arrow;
                                return;
                            }
                        }
                    }
                    else
                    {
                        baseRange = Program.winMain.mainHelper.OpenFile(this);
                        if (baseRange == null)
                        {
                            Cursor = Cursors.Arrow;
                            return;
                        }
                    }
                }
                _ = new Restorer().ProcessRange(range, new RestorerParameters()
                {
                    Interval    = interval,
                    Method      = method,
                    Coordinates = range.Position,
                    BaseRange   = baseRange,
                    ReplaceExistMeasurements = checkBoxReplaceExist.Checked
                }, action, actionAfter);
            }
            catch (WebException exc)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, exc.Message, "Восстановление ряда", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
            catch (WindEnergyException wex)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, wex.Message, "Восстановление ряда", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
            catch (ApplicationException exc)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, exc.Message + "\r\nПопробуйте уменьшить длину ряда", "Восстановление ряда", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
        }
Example #10
0
        private void buttonElevate_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            if (!double.TryParse(textBoxToHeight.Text.Trim().Replace('.', Constants.DecimalSeparator), out double new_height))
            {
                _ = MessageBox.Show(this, $"Не удалось распознать {textBoxToHeight.Text} как число", "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }
            if (!double.TryParse(textBoxFromHeight.Text.Trim().Replace('.', Constants.DecimalSeparator), out double old_height))
            {
                _ = MessageBox.Show(this, $"Не удалось распознать {textBoxFromHeight.Text} как число", "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }
            if (!double.TryParse(textBoxRadius.Text.Trim().Replace('.', Constants.DecimalSeparator), out double radius))
            {
                _ = MessageBox.Show(this, $"Не удалось распознать {textBoxRadius.Text} как число", "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }
            if (!double.TryParse(textBoxCoeffM.Text.Trim().Replace('.', Constants.DecimalSeparator), out double m))
            {
                _ = MessageBox.Show(this, $"Не удалось распознать {textBoxCoeffM.Text} как число", "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }

            radius *= 1000; //перевод км в метры

            if (hellmanCoeffSource == HellmanCoefficientSource.None)
            {
                _ = MessageBox.Show(this, "Что-то пошло не так, попробуйте другие настройки", "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            Action <int> action = new Action <int>((percent) =>
            {
                try
                {
                    if (this.InvokeRequired)
                    {
                        _ = Invoke(new Action(() => { progressBar1.Value = percent; }));
                    }
                    else
                    {
                        progressBar1.Value = percent;
                    }
                }
                catch (Exception) { }
            });

            Action <RawRange, SuitAMSResultItem> actionAfter = new Action <RawRange, SuitAMSResultItem>((rawRange, selectedAMS) =>
            {
                _ = this.Invoke(new Action(() =>
                {
                    string AMStext = selectedAMS != null ? $"На основе данных АМС {selectedAMS.AMS.Name} {selectedAMS.AMS.Position}\r\nОтклонение среднемесячных скоростей: {selectedAMS.Deviation:0.000} {(selectedAMS.AllMonthInRange ? "" : "\r\nВНИМАНИЕ!! В исходном ряде представлены не все месяцы. Поэтому подбор подходящей АМС может быть неточным")}" : "";
                    rawRange.Name  = "Ряд на высоте " + new_height + " м";
                    _ = MessageBox.Show(this, $"Скорости ветра пересчитаны на высоту {new_height} м\r\n{((!string.IsNullOrWhiteSpace(AMStext)) ? AMStext : "")}", "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    if (rawRange == null)
                    {
                        DialogResult = DialogResult.Cancel;
                    }
                    else
                    {
                        DialogResult = DialogResult.OK;
                        Result       = rawRange;
                    }
                    Cursor = Cursors.Arrow;
                    Result = rawRange;
                    Close();
                }));
            });

            try
            {
                //если в ряде нет координат и надо искать АМС-аналог, то выбираем (для подбора подходящей АМС)
                if (range.Position.IsEmpty && hellmanCoeffSource == HellmanCoefficientSource.AMSAnalog)
                {
                    FormSelectMapPointDialog fsp = new FormSelectMapPointDialog("Выберите координаты ряда " + range.Name, PointLatLng.Empty, Vars.Options.CacheFolder, Resources.rp5_marker, Vars.Options.MapProvider);
                    if (fsp.ShowDialog(this) == DialogResult.OK)
                    {
                        range.Position = fsp.Result;
                    }
                    else
                    {
                        Cursor = Cursors.Arrow;
                        return;
                    }
                }

                //основные параметры пересчета ряда на высоту
                ElevatorParameters parameters = new ElevatorParameters()
                {
                    FromHeight   = old_height,
                    ToHeight     = new_height,
                    Coordinates  = range.Position,
                    SearchRaduis = checkBoxUseRadius.Checked ? radius : double.NaN,
                    MaximalRelativeSpeedDeviation = Vars.Options.UseSuitAMSMaximalRelativeSpeedDeviation ? Vars.Options.SuitAMSMaximalRelativeSpeedDeviation : double.NaN,
                    CustomMCoefficient            = checkBoxCustomCoeffM.Checked ? m : double.NaN,
                    CustomMCoefficientMonths      = MonthsHellmanValues,
                    HellmanCoefficientSource      = hellmanCoeffSource
                };

                //если способ пересчета АМС-аналог, то надо предоставить выбор АМС для расчетов
                if (hellmanCoeffSource == HellmanCoefficientSource.AMSAnalog)
                {
                    //находим все подходящие АМС
                    SuitAMSResult suitAMSList = AMSSupport.GetSuitAMS(
                        range,
                        range.Position,
                        Vars.AMSMeteostations,
                        checkBoxUseRadius.Checked ? radius : double.NaN,
                        Vars.Options.UseSuitAMSMaximalRelativeSpeedDeviation ? Vars.Options.SuitAMSMaximalRelativeSpeedDeviation : double.NaN
                        );

                    //открывам диалоговое окно списка АМС
                    FormRangeElevatorConfirmation frec = new FormRangeElevatorConfirmation(suitAMSList);
                    if (frec.ShowDialog(this) == DialogResult.OK)
                    {
                        parameters.SelectedAMS = frec.Result;
                    }
                    else //если ничего не выбрали, то выходим
                    {
                        Cursor = Cursors.Arrow;
                        return;
                    }
                }

                RangeElevator.ProcessRange(range, parameters, action, actionAfter); //запускаем обработку ряда
            }
            catch (WebException exc)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, exc.Message, "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
            catch (WindEnergyException wex)
            {
                Cursor = Cursors.Arrow;
                _      = MessageBox.Show(this, wex.Message, "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            catch (ApplicationException exc)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, exc.Message + "\r\nПопробуйте уменьшить длину ряда", "Расчет скорости ветра на высоте башни ВЭУ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
            catch (Exception ex)
            {
                Cursor       = Cursors.Arrow;
                _            = MessageBox.Show(this, "Произошла ошибка:\r\n" + ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                DialogResult = DialogResult.Cancel;
            }
        }