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#

1 month ago
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();
}
}
}