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); } }
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(); } }
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(); }
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(); }
/// <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; } }
/// <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(); }
/// <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; } }
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; } }
/// <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; } }
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; } }