You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

490 lines
18 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using DevExpress.CodeParser;
using InterfaceWorkAreaData;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;
//using WorkData;
//using WorkData.Entity;
//using WorkData.EntityBase;
namespace GeoSigma.UCDraw.WellAndSection
{
public partial class FrmNewWellPole : Form
{
public cWellBaseInfo mwellInfo = new cWellBaseInfo();
public string mWellName;
public string mTemplatefileNamePath;
public float mTop;
public float mBottom;
public float mRatio;
public string preSetWellName; //预先选定的井名称
string mTemplatePath;
public string mFileName;
public List<string> wellNodeNames = new List<string>();
class CTempfileInfo
{
public string fileName { get; set; }
}
List<CTempfileInfo> mTempFileList = new List<CTempfileInfo>();
class CRatioInfo
{
public string text { get; set; }
public float value { get; set; }
}
List<CRatioInfo> mRatioList = new List<CRatioInfo>();
class CLayersInfo
{
public string text { get; set; }
public int levelId { get; set; }
}
List<CLayersInfo> mLayersInfo = new List<CLayersInfo>();
class CWellLayerInfo
{
public string cw { get; set; }
public int order { get; set; }
public int id { get; set; }
}
BindingList<CWellLayerInfo> mWellTopLayersInfo = new BindingList<CWellLayerInfo>();
BindingList<CWellLayerInfo> mWellBottomLayersInfo = new BindingList<CWellLayerInfo>();
List<cWellStratification> mWellStrats = new List<cWellStratification>();
public int mWellDepthMode = 1; // =1是井段=2是分层
public FrmNewWellPole()
{
InitializeComponent();
radioButtonDepth.Checked = true;
radioButtonLayers.Checked = false;
comboBoxLayers.Enabled = false;
comboBoxTopLayer.Enabled = false;
comboBoxBottomLayer.Enabled = false;
//comboBoxTopLayer.DataSource = mWellLayersInfo;
//comboBoxTopLayer.DisplayMember = "cw";
}
private void btnOK_Click(object sender, EventArgs e)
{
if (comboxTemplate.SelectedItem is CTempfileInfo selectTemp)
{
if (selectTemp.fileName != "")
mTemplatefileNamePath = mTemplatePath + selectTemp.fileName;
else
mTemplatefileNamePath = "";
}
if (comBoxRatio.SelectedItem is CRatioInfo tratio)
{
mRatio = tratio.value;
}
if (wellNameCbx.SelectedItem is cWellBaseInfo wellInfo)
{
mWellName = wellInfo.WellName;
mwellInfo = wellInfo;
}
else
{
mWellName = wellNameCbx.Text;
mwellInfo.WellName = wellNameCbx.Text;
mwellInfo.id = -1;
}
bool bSet = false;
if (radioButtonLayers.Checked)
{
if ((comboBoxTopLayer.SelectedItem is CWellLayerInfo topLayer) && (comboBoxBottomLayer.SelectedItem is CWellLayerInfo bottomLayer))
{
if (topLayer.order > bottomLayer.order)
{
MessageBox.Show("结束层位序号应大于结束层位");
this.DialogResult = DialogResult.None;
}
List<CWellLayerInfo> selectlayers = new List<CWellLayerInfo>();
selectlayers = mWellTopLayersInfo.Where(item => (item.order >= topLayer.order && item.order <= bottomLayer.order)).ToList();
int botLevelId = mLayersInfo[mLayersInfo.Count - 1].levelId;
int levelId = -1;
if (comboBoxLayers.SelectedItem is CLayersInfo layer)
{
levelId = layer.levelId;
}
List<cWellStratification> childsNodes = new List<cWellStratification>(); //实际的井段都是最底的地层,因此搜集最底层的井段
if (levelId < botLevelId)
{
for (int i = 0; i < selectlayers.Count; i++)
{
List<cWellStratification> tchildsNodes = GetAllChildren(mWellStrats, selectlayers[i].id);
childsNodes.AddRange(tchildsNodes);
}
}
else
{
for (int i = 0; i < selectlayers.Count; i++)
{
childsNodes.AddRange(mWellStrats.Where(item => item.code == selectlayers[i].cw).ToList());
}
}
List<cWellSandSet> tWellLayers = workAreaDb.Instance.workData.getWellSandSets(mWellName);
List<cWellSandSet> selWellLayers = tWellLayers.Join(childsNodes, item => item.name, cnode => cnode.code, (item, cnode) => item).OrderBy(item => item.top).ToList();
if (selWellLayers.Count > 0)
{
mTop = (float)selWellLayers[0].top;
mBottom = (float)selWellLayers[selWellLayers.Count - 1].bottom;
bSet = true;
}
}
}
if (bSet == false)
{
float fv = 0;
if (float.TryParse(textBoxWellTop.Text, out fv))
{
mTop = fv;
}
if (float.TryParse(textBoxWellBottom.Text, out fv))
{
mBottom = fv;
}
}
mFileName = fileNameTextBox.Text;
if (wellNodeNames.Contains(mFileName + ".pcg", StringComparer.OrdinalIgnoreCase))
{
MessageBox.Show("存在同名文件,请修改名称");
this.DialogResult = DialogResult.None;
}
else
{
this.DialogResult = DialogResult.OK;
}
}
// 递归获取所有子节点(包括子孙节点)
List<cWellStratification> GetAllChildren(List<cWellStratification> allNodes, int parentId)
{
var children = new List<cWellStratification>();
// 查找直接子节点
var directChildren = allNodes.Where(n => n.parentId == parentId).ToList();
foreach (var child in directChildren)
{
children.Add(child);
// 递归获取子节点的子节点
children.AddRange(GetAllChildren(allNodes, child.id));
}
return children;
}
private void FrmNewWellPole_Shown(object sender, EventArgs e)
{
mTop = 0;
mBottom = 1000;
mRatio = 200;
this.textBoxWellTop.Text = "500";
this.textBoxWellBottom.Text = "1000";
// this.textBoxWellName.Text = "新井";
if (preSetWellName != "")
{
List<cWellBaseInfo> wellInfos = new List<cWellBaseInfo>();
cWellBaseInfo wellinfo = new cWellBaseInfo();
wellinfo.id = 0;
wellinfo.WellName = preSetWellName;
wellinfo.WellCode = preSetWellName;
wellInfos.Add(wellinfo);
this.wellNameCbx.DataSource = wellInfos;
this.wellNameCbx.DisplayMember = "WellName";
this.wellNameCbx.ValueMember = "id";
this.wellNameCbx.SelectedIndex = 0;
setWellDepth(this.wellNameCbx.Text);
}
else
{
List<cWellBaseInfo> wellInfos = workAreaDb.Instance.workData.getWellsInfo();
//wellInfos.Insert(0, new cWellBaseInfo());//插入一个空的井数据
if (wellInfos.Count > 0)
{
this.wellNameCbx.DataSource = wellInfos;
this.wellNameCbx.DisplayMember = "WellName";
this.wellNameCbx.ValueMember = "id";
this.wellNameCbx.SelectedIndex = 0;
setWellDepth(this.wellNameCbx.Text);
}
}
CRatioInfo tratioInfo = new CRatioInfo();
tratioInfo.text = "1:50"; tratioInfo.value = 50;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:100"; tratioInfo.value = 100;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:200"; tratioInfo.value = 200;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:500"; tratioInfo.value = 500;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:800"; tratioInfo.value = 800;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:1000"; tratioInfo.value = 1000;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:2000"; tratioInfo.value = 2000;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:5000"; tratioInfo.value = 5000;
mRatioList.Add(tratioInfo);
tratioInfo = new CRatioInfo();
tratioInfo.text = "1:10000"; tratioInfo.value = 10000;
mRatioList.Add(tratioInfo);
this.comBoxRatio.DataSource = mRatioList;
this.comBoxRatio.DisplayMember = "text";
this.comBoxRatio.ValueMember = "value";
this.comBoxRatio.SelectedIndex = 2;
CTempfileInfo tfile = new CTempfileInfo();
tfile.fileName = "";
mTempFileList.Add(tfile); //增加一个空的名称
mTemplatePath = AppDomain.CurrentDomain.BaseDirectory + "Templates\\WellPole\\";
if (Directory.Exists(mTemplatePath))
{
try
{
var fileNames = Directory.GetFiles(mTemplatePath)
.Select(Path.GetFileName)
.OrderBy(name => name)
.ToArray();
foreach (var fileName in fileNames)
{
string tname = fileName.ToLower();
String tstr1 = tname.Length > 4 ? tname.Substring(tname.Length - 4) : "";
if (tstr1 == ".pcg")
{
CTempfileInfo tfile1 = new CTempfileInfo();
tfile1.fileName = fileName;
mTempFileList.Add(tfile1);
}
}
}
catch (Exception ex)
{
}
}
this.comboxTemplate.DataSource = mTempFileList;
this.comboxTemplate.DisplayMember = "fileName";
this.comboxTemplate.SelectedIndex = 0;
mWellStrats = workAreaDb.Instance.workData.getWellStratification();
List<cWellStratification> distinctByLevel = mWellStrats
.GroupBy(item => item.level)
.Select(g => g.First()) // 或 g.Last()、g.OrderBy(...).First() 等
.ToList();
for (int i = 0; i < distinctByLevel.Count; i++)
{
CLayersInfo tinfo = new CLayersInfo();
string str = (i + 1).ToString() + "级";
tinfo.levelId = distinctByLevel[i].level;
tinfo.text = str;
mLayersInfo.Add(tinfo);
}
this.comboBoxTopLayer.DataSource = mWellTopLayersInfo;
this.comboBoxTopLayer.DisplayMember = "cw";
this.comboBoxBottomLayer.DataSource = mWellBottomLayersInfo;
this.comboBoxBottomLayer.DisplayMember = "cw";
this.comboBoxLayers.DataSource = mLayersInfo;
this.comboBoxLayers.DisplayMember = "text";
this.comboBoxLayers.ValueMember = "levelId";
}
void setWellDepth(string wellName)
{
//string wellName = this.wellNameCbx.Text;
if (wellName != "")
{
List<cWellSandSet> wellSandSets = workAreaDb.Instance.workData.getWellSandSets(wellName);
double top, bottom;
top = 500; bottom = 1000;
if (wellSandSets.Count > 0)
{
top = wellSandSets[0].top;
bottom = wellSandSets[wellSandSets.Count - 1].bottom;
}
DataTable curvesTable = new DataTable();
workAreaDb.Instance.workData.getCurvesData(wellName, ref curvesTable);
if (curvesTable.Columns.Count > 0 && curvesTable.Rows.Count > 0)
{
string topstr = curvesTable.Rows[0][0].ToString();
int rownum = curvesTable.Rows.Count - 1;
string bottomstr = curvesTable.Rows[rownum][0].ToString();
if (double.TryParse(topstr, out double ttop))
{
top = ttop;
}
if (double.TryParse(bottomstr, out double tbottom))
{
bottom = tbottom;
}
}
textBoxWellTop.Text = top.ToString();
textBoxWellBottom.Text = bottom.ToString();
}
}
private void wellNameCbx_SelectedIndexChanged(object sender, EventArgs e)
{
setWellDepth(this.wellNameCbx.Text);
fileNameTextBox.Text = GetWellName();
// SelectWellLayersInfo();
}
private void wellNameCbx_TextChanged(object sender, EventArgs e)
{
string template = comboxTemplate.Text;
fileNameTextBox.Text = wellNameCbx.Text + "井" + template;
}
string GetWellName()
{
string wellName = this.wellNameCbx.Text;
string template = comboxTemplate.Text;
int dotPos = template.LastIndexOf('.');
if (dotPos > 0)
{
template = template.Substring(0, dotPos);
}
wellName = wellNameCbx.Text + "井" + template;
return wellName;
}
private void comboxTemplate_SelectedIndexChanged(object sender, EventArgs e)
{
fileNameTextBox.Text = GetWellName();
}
private void radioButtonDepth_CheckedChanged(object sender, EventArgs e)
{
if (radioButtonDepth.Checked)
{
textBoxWellTop.Enabled = true;
textBoxWellBottom.Enabled = true;
}
else
{
textBoxWellTop.Enabled = false;
textBoxWellBottom.Enabled = false;
}
}
private void radioButtonLayers_CheckedChanged(object sender, EventArgs e)
{
if (radioButtonLayers.Checked)
{
comboBoxLayers.Enabled = true;
comboBoxTopLayer.Enabled = true;
comboBoxBottomLayer.Enabled = true;
}
else
{
comboBoxLayers.Enabled = false;
comboBoxTopLayer.Enabled = false;
comboBoxBottomLayer.Enabled = false;
}
}
void SelectWellLayersInfo()
{
int levelId = -1;
if (comboBoxLayers.SelectedItem is CLayersInfo layer)
{
levelId = layer.levelId;
}
if (levelId < 0)
return;
mWellTopLayersInfo.Clear();
mWellBottomLayersInfo.Clear();
List<cWellStratification> layersByLevel = mWellStrats.Where(item => item.level == levelId).ToList();
for (int i = 0; i < layersByLevel.Count; i++)
{
CWellLayerInfo twellLayer = new CWellLayerInfo();
twellLayer.cw = layersByLevel[i].code;
twellLayer.order = layersByLevel[i].order;
twellLayer.id = layersByLevel[i].id;
mWellTopLayersInfo.Add(twellLayer);
CWellLayerInfo twellLayer1 = new CWellLayerInfo();
twellLayer1.cw = layersByLevel[i].code;
twellLayer1.order = layersByLevel[i].order;
twellLayer1.id = layersByLevel[i].id;
mWellBottomLayersInfo.Add(twellLayer1);
}
if (layersByLevel.Count > 0)
{
// this.comboBoxTopLayer.DataSource = mWellTopLayersInfo;
// this.comboBoxTopLayer.DisplayMember = "cw";
comboBoxTopLayer.SelectedIndex = 0;
// this.comboBoxBottomLayer.DataSource = mWellBottomLayersInfo;
// this.comboBoxBottomLayer.DisplayMember = "cw";
comboBoxBottomLayer.SelectedIndex = mWellBottomLayersInfo.Count - 1;
}
//string wellName = this.wellNameCbx.Text;
//List<cWellSandSet> wellLayers = workAreaDb.Instance.workData.getWellSandSets(wellName);
//mWellLayersInfo.Clear();
//for (int i = 0; i< wellLayers.Count;i++)
//{
// CWellLayerInfo twellLayer = new CWellLayerInfo();
// twellLayer.cw = wellLayers[i].name;
// twellLayer.top = wellLayers[i].top;
// twellLayer.bottom = wellLayers[i].bottom;
//}
}
private void comboBoxLayers_SelectedValueChanged(object sender, EventArgs e)
{
SelectWellLayersInfo();
}
}
}