using ErrorAnalysis.Repository;
|
using ErrorAnalysis.Repository.Entity;
|
using ErrorAnalysis.Service;
|
using ErrorAnalysis.Service.Model;
|
using ErrorAnalysis.UI.Utility;
|
using OxyPlot;
|
using OxyPlot.Axes;
|
using OxyPlot.Legends;
|
using OxyPlot.Series;
|
using OxyPlot.WindowsForms;
|
using System.ComponentModel.DataAnnotations;
|
using System.Security.Cryptography;
|
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<COModelTable> _models;
|
private Dictionary<string, string> _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};";
|
RepositoryInstance.Instance.ReLoad(_connectionString);
|
|
pbLoadDB.Value = 50;
|
_filters = new Dictionary<string, string>();
|
Task.Run(() =>
|
{
|
_models = RepositoryInstance.Instance.COModelRepository.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 (!double.TryParse(nudSoPrecisionRequired.Value.ToString(), out double targetErrorRatio) || nudSoPrecisionRequired.Value <= 0)
|
{
|
MessageBox.Show("Please enter a reasonable so precision required");
|
return;
|
}
|
|
if (cmbLithology.SelectedIndex == -1)
|
{
|
MessageBox.Show("Please select a lithology");
|
return;
|
}
|
if (curModels.Count == 0)
|
{
|
MessageBox.Show("Parameters error!");
|
return;
|
}
|
|
if (curModels.Count == 1)
|
_model = curModels[0];
|
_model = curModels.FirstOrDefault(m => m.GravelFillPercent == nudGravelFIllPercent.Value.ToString());
|
if (_model == null)
|
_model = curModels.First();
|
|
if (rdoLockSpeed.Checked)
|
{
|
if (!double.TryParse(nudSpeed.Value.ToString(), out double speed) || nudSpeed.Value <= 0)
|
{
|
MessageBox.Show("Please enter a reasonable speed");
|
return;
|
}
|
var calcSpeed = cmbSpeedUnit.Text == "ft/hr" ? UnitConvert.FtHr2MMin(speed) : UnitConvert.MHR2MMin(speed);
|
|
var result = ErrorRatioCalc.GetErrorRatioResult(_model.ModelID, porosity, sw, depth, true, calcSpeed, targetErrorRatio / 100);
|
Plot(result);
|
|
}
|
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<Control>().Where(c => c is ComboBox).Select(c => c as ComboBox).ToList();
|
switch (control.Name)
|
{
|
case "cmbBit":
|
cmbCasingOD.Items.Clear();
|
_filters.Remove("CasingOD");
|
goto case "cmbCasingOD";
|
case "cmbCasingOD":
|
cmbCasingID.Items.Clear();
|
_filters.Remove("CasingID");
|
goto case "cmbCasingID";
|
case "cmbCasingID":
|
cmbScreenOD.Items.Clear();
|
_filters.Remove("ScreenOD");
|
goto case "cmbScreenOD";
|
case "cmbScreenOD":
|
cmbScreenID.Items.Clear();
|
_filters.Remove("ScreenID");
|
goto case "cmbScreenID";
|
case "cmbScreenID":
|
cmbTubeOD.Items.Clear();
|
_filters.Remove("TubeOD");
|
goto case "cmbTubeOD";
|
case "cmbTubeOD":
|
cmbTubeID.Items.Clear();
|
_filters.Remove("TubeID");
|
break;
|
case "cmbTubeID":
|
break;
|
default:
|
break;
|
}
|
cmbCasingHoldUp.Items.Clear();
|
_filters.Remove("CasingFluid");
|
cmbScreenHoldUp.Items.Clear();
|
_filters.Remove("ScreenFluid");
|
cmbTubeHoldUp.Items.Clear();
|
_filters.Remove("TubeFluid");
|
cmbLithology.Items.Clear();
|
_filters.Remove("Lithology");
|
|
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 allCmb = parentControl.Controls.OfType<Control>().Where(c => c is ComboBox).Select(c => c as ComboBox).ToList();
|
switch (control.Name)
|
{
|
case "cmbCasingHoldUp":
|
cmbScreenHoldUp.Items.Clear();
|
_filters.Remove("ScreenFluid");
|
goto case "cmbScreenHoldUp";
|
case "cmbScreenHoldUp":
|
cmbTubeHoldUp.Items.Clear();
|
_filters.Remove("TubeFluid");
|
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 cmbProperty = modelType.GetProperty(cmb.Tag.ToString());
|
var currentItems = curModels.Select(c => cmbProperty.GetValue(c).ToString() == "0" ? "water" : cmbProperty.GetValue(c).ToString() == "100" ? "oil" : cmbProperty.GetValue(c).ToString() == "200" ? "gas" : "none").Distinct().ToArray();
|
if (currentItems.Length == 0)
|
cmb.Enabled = false;
|
|
cmb.Items.AddRange(currentItems);
|
if (_filters.ContainsKey(cmb.Tag.ToString()) && currentItems.Contains(_filters[cmb.Tag.ToString()]))
|
cmb.Text = _filters[cmb.Tag.ToString()];
|
else
|
{
|
_filters.Remove(cmb.Tag.ToString());
|
if (currentItems.Length == 1)
|
cmb.SelectedIndex = 0;
|
}
|
|
}
|
//foreach (var cmb in allCmb)
|
//{
|
// if (cmb.Name != control.Name)
|
// {
|
// var curItems = cmb.Items.OfType<string>().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();
|
cmbLithology.Items.Clear();
|
cmbLithology.Items.AddRange(lithology);
|
|
if (_filters.ContainsKey("Lithology") && lithology.Contains(_filters["Lithology"]))
|
cmbLithology.Text = _filters["Lithology"];
|
else
|
_filters.Remove("Lithology");
|
}
|
|
private void LinkageModelProperty()
|
{
|
cmbCasingHoldUp.Items.Clear();
|
_filters.Remove("CasingFluid");
|
cmbScreenHoldUp.Items.Clear();
|
_filters.Remove("ScreenFluid");
|
cmbTubeHoldUp.Items.Clear();
|
_filters.Remove("TubeFluid");
|
cmbLithology.Items.Clear();
|
_filters.Remove("Lithology");
|
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.Enabled = false;
|
nudCasingHoldUp.Enabled = false;
|
}
|
else
|
{
|
cmbCasingHoldUp.Enabled = true;
|
nudCasingHoldUp.Enabled = true;
|
|
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.Enabled = false;
|
nudScreenHoldUp.Enabled = false;
|
}
|
else
|
{
|
cmbScreenHoldUp.Enabled = true;
|
nudScreenHoldUp.Enabled = true;
|
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.Enabled = false;
|
nudTubeHoldUp.Enabled = false;
|
}
|
else
|
{
|
cmbTubeHoldUp.Enabled = true;
|
nudTubeHoldUp.Enabled = true;
|
cmbTubeHoldUp.Items.AddRange(tubeFluids);
|
}
|
|
var lithology = curModels.Select(x => x.Lithology).Distinct().ToArray();
|
var curLithology = cmbLithology.Text;
|
cmbLithology.Items.AddRange(lithology);
|
cmbLithology.Text = curLithology;
|
|
if (lithology.Length == 1)
|
cmbLithology.SelectedIndex = 0;
|
}
|
|
private List<COModelTable> 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);
|
}
|
|
private void Plot(ErrorRatioResult errorResult)
|
{
|
pnlCOPic.Controls.Clear();
|
var plotModel = new PlotModel();
|
|
var xAxis = new LinearAxis { Position = AxisPosition.Bottom, Title = "Porosity(%)" };
|
var yAxis = new LinearAxis { Position = AxisPosition.Left, Title = "C/O" };
|
|
plotModel.Axes.Add(xAxis);
|
plotModel.Axes.Add(yAxis);
|
|
// ´´½¨ÇúÏßϵÁÐ
|
var oSeries = new LineSeries { Title = "Water Line", Color = OxyColors.MediumBlue };
|
var cSeries = new LineSeries { Title = "Oil Line", Color = OxyColors.DarkRed };
|
|
foreach (var o in errorResult.OWOL)
|
oSeries.Points.Add(new DataPoint(o[0], o[1]));
|
foreach (var c in errorResult.CWOL)
|
cSeries.Points.Add(new DataPoint(c[0], c[1]));
|
|
plotModel.Legends.Add(new Legend { LegendPosition = LegendPosition.TopLeft });
|
// Ìí¼ÓÇúÏßµ½Í¼±íÄ£ÐÍ
|
plotModel.Series.Add(oSeries);
|
plotModel.Series.Add(cSeries);
|
|
// ¿ÉÊÓ»¯´úÂë
|
// ´´½¨ Windows ´°ÌåÒÔÏÔʾͼ±í
|
var plotView = new PlotView { Model = plotModel };
|
|
plotView.Width = 600;
|
plotView.Height = 450;
|
var bitmap = new Bitmap(plotView.Width, plotView.Height);
|
plotView.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
|
bitmap.Save(AppDomain.CurrentDomain.BaseDirectory + "co.png", System.Drawing.Imaging.ImageFormat.Png);
|
|
plotView.Dock = DockStyle.Fill;
|
pnlCOPic.Controls.Add(plotView);
|
|
}
|
}
|
}
|