using ErrorAnalysis.Repository; using ErrorAnalysis.Repository.Entity; using ErrorAnalysis.Service; using System.ComponentModel.DataAnnotations; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Menu; namespace ErrorAnalysis.UI { public partial class FrmMain : Form { private string? _connectionString; private List _models; private Dictionary _filters; private COModelTable _model; public FrmMain() { InitializeComponent(); } private void rdoMode_CheckedChanged(object sender, EventArgs e) { if (rdoLockSpeed.Checked) { pnlLockPass.Visible = false; pnlLockSpeed.Visible = true; } else { pnlLockPass.Visible = true; pnlLockSpeed.Visible = false; } } private void btnSelectDataSource_Click(object sender, EventArgs e) { var fileDlg = new OpenFileDialog(); fileDlg.Filter = "Data source|*.db"; fileDlg.InitialDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Projects"); fileDlg.FilterIndex = 0; var result = fileDlg.ShowDialog(); if (result == DialogResult.OK) { pbLoadDB.Show(); pbLoadDB.Value = 0; txtDataPath.Text = fileDlg.FileName; txtToolType.Text = fileDlg.SafeFileName.Substring(0, fileDlg.SafeFileName.IndexOf("Mcnp")); _connectionString = $"Data Source={fileDlg.FileName};"; var modelRepository = new COModelRepository(_connectionString); pbLoadDB.Value = 50; _filters = new Dictionary(); Task.Run(() => { _models = modelRepository.GetCOModels(); BeginInvoke(new System.Action(() => { pbLoadDB.Value = 80; InitInputControl(); })); BeginInvoke(new System.Action(() => { pbLoadDB.Value = 100; })); Thread.Sleep(1000); BeginInvoke(new System.Action(() => { pbLoadDB.Hide(); })); }); } } private void btnAnalysis_Click(object sender, EventArgs e) { var curModels = GetFilterResult(); if (curModels == null || curModels.Count == 0) { MessageBox.Show("Please enter info!"); return; } if (!double.TryParse(nudPorosity.Value.ToString(), out double porosity) || nudPorosity.Value < 5) { MessageBox.Show("Please enter a reasonable porosity"); return; } if (!double.TryParse(nudSw.Value.ToString(), out double sw)) { MessageBox.Show("Please enter a reasonable water saturation!"); return; } if (!double.TryParse(nudDepth.Value.ToString(), out double depth) || nudDepth.Value <= 0) { MessageBox.Show("Please enter a reasonable depth"); return; } if (cmbLithology.SelectedIndex == -1) { MessageBox.Show("Please select a lithology"); return; } if (curModels.Count == 1) _model = curModels[0]; _model = curModels.FirstOrDefault(m => m.GravelFillPercent == nudGravelFIllPercent.Value.ToString()); if (_model == null) { } if (rdoLockSpeed.Checked) { if (!double.TryParse(nudSpeed.Value.ToString(), out double speed) || nudSpeed.Value <= 0) { MessageBox.Show("Please enter a reasonable speed"); return; } } else { if (!int.TryParse(nudPass.Value.ToString(), out int pass) || nudPass.Value <= 1) { MessageBox.Show("Please enter a reasonable pass"); return; } } } private void FrmMain_Load(object sender, EventArgs e) { cmbSpeedUnit.SelectedIndex = 0; cmbTargetLoggingIntervalUnit.SelectedIndex = 0; } private void InitInputControl() { foreach (var item in gpBorehole.Controls) if (item is ComboBox cmb) cmb.Items.Clear(); if (_models != null) { cmbBit.Items.AddRange(_models.Select(m => m.BIT).Distinct().ToArray()); } } private void borehole_cmb_SelectedIndexChanged(object sender, EventArgs e) { var control = (sender as ComboBox); var property = control.Tag.ToString(); var filterVal = control.Text == "none" ? "0" : control.Text; if (_filters.ContainsKey(property)) _filters[property] = filterVal; else _filters.Add(property, filterVal); var parentControl = control.Parent; var allCmb = parentControl.Controls.OfType().Where(c => c is ComboBox).Select(c => c as ComboBox).ToList(); switch (control.Name) { case "cmbBit": cmbCasingOD.Items.Clear(); goto case "cmbCasingOD"; case "cmbCasingOD": cmbCasingID.Items.Clear(); goto case "cmbCasingID"; case "cmbCasingID": cmbScreenOD.Items.Clear(); goto case "cmbScreenOD"; case "cmbScreenOD": cmbScreenID.Items.Clear(); goto case "cmbScreenID"; case "cmbScreenID": cmbTubeOD.Items.Clear(); goto case "cmbTubeOD"; case "cmbTubeOD": cmbTubeID.Items.Clear(); break; case "cmbTubeID": break; default: break; } var unSelectedCmbs = allCmb.Where(c => c.SelectedIndex == -1).ToList(); var curModels = GetFilterResult(); var modelType = typeof(COModelTable); foreach (var cmb in unSelectedCmbs) { cmb.Items.Clear(); cmb.Enabled = true; var currentItems = curModels.Select(c => modelType.GetProperty(cmb.Tag.ToString()).GetValue(c).ToString() == "0" ? "none" : modelType.GetProperty(cmb.Tag.ToString()).GetValue(c).ToString()).Distinct().ToArray(); if (currentItems.Length == 0) cmb.Enabled = false; cmb.Items.AddRange(currentItems); if (currentItems.Length == 1) cmb.Text = currentItems[0]; } LinkageModelProperty(); } private void holdUp_cmb_SelectedIndexChanged(object sender, EventArgs e) { var control = (sender as ComboBox); var parentControl = control.Parent; var property = control.Tag.ToString(); var filterVal = control.Text == "water" ? "0" : control.Text == "oil" ? "100" : control.Text == "gas" ? "200" : "999"; if (_filters.ContainsKey(property)) _filters[property] = filterVal; else _filters.Add(property, filterVal); var curModels = GetFilterResult(); var allCmb = parentControl.Controls.OfType().Where(c => c is ComboBox).Select(c => c as ComboBox).ToList(); var modelType = typeof(COModelTable); //foreach (var cmb in allCmb) //{ // if (cmb.Name != control.Name) // { // var curItems = cmb.Items.OfType().ToList(); // var cmbProperty = modelType.GetProperty(cmb.Tag.ToString()); // var curFluids = curModels.Select(x => cmbProperty.GetValue(x).ToString() == "0" ? "water" : cmbProperty.GetValue(x).ToString() == "100" ? "oil" : cmbProperty.GetValue(x).ToString() == "200" ? "gas" : "none").Distinct().ToArray(); // var minusFluids = curItems.Where(i => !curFluids.Contains(i)).ToArray(); // foreach (var item in minusFluids) // cmb.Items.Remove(item); // var addFluids = curFluids.Where(i => !curItems.Contains(i)).ToArray(); // cmb.Items.AddRange(addFluids); // } //} var lithology = curModels.Select(x => x.Lithology).Distinct().ToArray(); var curLithology = cmbLithology.Text; cmbLithology.Items.Clear(); cmbLithology.Items.AddRange(lithology); cmbLithology.Text = curLithology; if (lithology.Length == 1) cmbLithology.Text = lithology[0]; } private void LinkageModelProperty() { var curModels = GetFilterResult(); if (curModels.Count == 0) return; var gravelFills = curModels.Select(x => x.GravelFillPercent).Distinct().ToArray(); if (gravelFills.Length == 1) nudGravelFIllPercent.Value = Convert.ToDecimal(gravelFills[0]); var cementBonds = curModels.Select(x => x.CementBond).Distinct().ToArray(); if (cementBonds.Length == 1) nudCementBond.Value = Convert.ToDecimal(cementBonds[0]); var bhSalinities = curModels.Select(x => x.BHSalinity).Distinct().ToArray(); if (bhSalinities.Length == 1) nudBHSalinity.Value = Convert.ToDecimal(bhSalinities[0]); var oilDensities = curModels.Select(x => x.OilDensity).Distinct().ToArray(); if (oilDensities.Length == 1) nudOilDensity.Value = Convert.ToDecimal(oilDensities[0]); var reservoirSalinities = curModels.Select(x => x.ReservoirSalinity).Distinct().ToArray(); if (reservoirSalinities.Length == 1) nudReservoirSalinity.Value = Convert.ToDecimal(reservoirSalinities[0]); var vshs = curModels.Select(x => x.VSH).Distinct().ToArray(); if (vshs.Length == 1) nudVSH.Value = Convert.ToDecimal(vshs[0]); var casingFulids = curModels.Select(x => x.CasingFluid == "0" ? "water" : x.CasingFluid == "100" ? "oil" : x.CasingFluid == "200" ? "gas" : "none").Distinct().ToArray(); if (casingFulids.Length == 1 && casingFulids[0] == "999") { cmbCasingHoldUp.Items.Clear(); cmbCasingHoldUp.Enabled = false; nudCasingHoldUp.Enabled = false; } else { cmbCasingHoldUp.Enabled = true; nudCasingHoldUp.Enabled = true; cmbCasingHoldUp.Items.Clear(); cmbCasingHoldUp.Items.AddRange(casingFulids); } var screenFulids = curModels.Select(x => x.ScreenFluid == "0" ? "water" : x.ScreenFluid == "100" ? "oil" : x.ScreenFluid == "200" ? "gas" : "none").Distinct().ToArray(); if (screenFulids.Length == 1 && screenFulids[0] == "none") { cmbScreenHoldUp.Items.Clear(); cmbScreenHoldUp.Enabled = false; nudScreenHoldUp.Enabled = false; } else { cmbScreenHoldUp.Enabled = true; nudScreenHoldUp.Enabled = true; cmbScreenHoldUp.Items.Clear(); cmbScreenHoldUp.Items.AddRange(screenFulids); } var tubeFluids = curModels.Select(x => x.TubeFluid == "0" ? "water" : x.TubeFluid == "100" ? "oil" : x.TubeFluid == "200" ? "gas" : "none").Distinct().ToArray(); if (tubeFluids.Length == 1 && tubeFluids[0] == "none") { cmbTubeHoldUp.Items.Clear(); cmbTubeHoldUp.Enabled = false; nudTubeHoldUp.Enabled = false; } else { cmbTubeHoldUp.Enabled = true; nudTubeHoldUp.Enabled = true; cmbTubeHoldUp.Items.Clear(); cmbTubeHoldUp.Items.AddRange(tubeFluids); } var lithology = curModels.Select(x => x.Lithology).Distinct().ToArray(); var curLithology = cmbLithology.Text; cmbLithology.Items.Clear(); cmbLithology.Items.AddRange(lithology); cmbLithology.Text = curLithology; if (lithology.Length == 1) cmbLithology.Text = lithology[0]; } private List GetFilterResult() { var type = typeof(COModelTable); var result = _models; foreach (var filter in _filters) result = result.Where(c => type.GetProperty(filter.Key).GetValue(c).ToString() == filter.Value).ToList(); return result; } private void cmbLithology_SelectedIndexChanged(object sender, EventArgs e) { var control = (sender as ComboBox); var property = control.Tag.ToString(); var filterVal = control.Text == "none" ? "0" : control.Text; if (_filters.ContainsKey(property)) _filters[property] = filterVal; else _filters.Add(property, filterVal); } } }