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.
424 lines
15 KiB
C#
424 lines
15 KiB
C#
using GeoSigma.UCDraw;
|
|
using SigmaDrawerElement;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using UCDraw;
|
|
using Unplugged.Segy;
|
|
|
|
namespace GeoSigma.PcgDrawSection
|
|
{
|
|
public partial class FormSegYParse : Form
|
|
{
|
|
//int inlineMin = 0, inlineMax = 0, crosslineMin = 0, crosslineMax = 0;
|
|
//ISegyFile segy;
|
|
//ISegyOptions segyOptions;
|
|
|
|
//bool bEnableDraw = true;
|
|
|
|
//DrawViewer drawView = null;
|
|
//long sectionPtr = 0;
|
|
public FormSegYParse()
|
|
{
|
|
InitializeComponent();
|
|
|
|
//ttxtInlineNum.TextBox.Validating += ttxtInlineNum_Validating;
|
|
//ttxtCrosslineNum.TextBox.Validating += ttxtCrosslineNum_Validating;
|
|
|
|
//segyOptions = new SegyOptions();
|
|
|
|
//InitSectionViewer();
|
|
}
|
|
|
|
private void FormSegYParse_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
e.Cancel = ucSectionViewer1.CancelClosing();
|
|
}
|
|
//private void FormSegYParse_Load(object sender, EventArgs e)
|
|
//{
|
|
// Application.Idle += Application_Idle;
|
|
//}
|
|
//private void Application_Idle(object sender, EventArgs e)
|
|
//{
|
|
// bool isTraceShow = this.tsbtnInline.Checked;
|
|
|
|
// for (int i = 0; i < this.bdnavInline.Items.Count; i++)
|
|
// {
|
|
// this.bdnavInline.Items[i].Enabled = isTraceShow;
|
|
// }
|
|
// for (int i = 0; i < this.bdnavCrossline.Items.Count; i++)
|
|
// {
|
|
// this.bdnavCrossline.Items[i].Enabled = !isTraceShow;
|
|
// }
|
|
|
|
// this.tsbtnInline.Enabled = true;
|
|
// this.bindingNavigatorCountItem1.Enabled = true;
|
|
|
|
// this.tsbtnCrossline.Enabled = true;
|
|
// this.bindingNavigatorCountItem.Enabled = true;
|
|
//}
|
|
///// <summary>
|
|
///// 创建剖面绘图区
|
|
///// </summary>
|
|
//private void InitSectionViewer()
|
|
//{
|
|
// MainView viewer = new MainView();
|
|
// viewer.ToolMainVisible = false;
|
|
// viewer.DrawerGotFocus += (object drawer, EventArgs ea) =>
|
|
// {
|
|
// Trace.WriteLine("openFile:" + ea.ToString());
|
|
// };
|
|
// if (viewer.NewFile("Inline") == false)
|
|
// {
|
|
// return;
|
|
// }
|
|
// drawView = viewer.ViewControl;
|
|
|
|
// mainContainer.TopToolStripPanel.Controls.Add(viewer.ToolstripElements);
|
|
// this.tspMain.Location = new Point(0, 0);
|
|
// viewer.ToolstripElements.Location = new Point(0, this.tspMain.Height+2);
|
|
|
|
// mainContainer.ContentPanel.Controls.Add(drawView);
|
|
// viewer.ViewControl.Dock = DockStyle.Fill;
|
|
//}
|
|
///// <summary>
|
|
///// 打开文件
|
|
///// </summary>
|
|
///// <param name="sender"></param>
|
|
///// <param name="e"></param>
|
|
//private void tbtnOpenFile_Click(object sender, EventArgs e)
|
|
//{
|
|
// OpenFileDialog ofd = new OpenFileDialog();
|
|
// ofd.Filter = "Segy文件|*.segy;*.sgy|所有文件|*.*";
|
|
// ofd.RestoreDirectory = true;
|
|
// ofd.Title = "打开Segy文件";
|
|
// if(ofd.ShowDialog(this)!= DialogResult.OK)
|
|
// {
|
|
// return;
|
|
// }
|
|
// string strFile = ofd.FileName;
|
|
// var reader = new SegyReader();
|
|
// reader.Options = segyOptions;
|
|
// segy = reader.Read(strFile, new SegyReadingProgress(this.tpgbMain.ProgressBar));
|
|
// this.tpgbMain.Value = 0;
|
|
|
|
// ResetLineRange();
|
|
//}
|
|
///// <summary>
|
|
///// 重置并绑定inline、crossline
|
|
///// </summary>
|
|
//private void ResetLineRange()
|
|
//{
|
|
// // Inline、Crossline范围
|
|
// segy.GetLineRange(ref inlineMin, ref inlineMax, ref crosslineMin, ref crosslineMax);
|
|
|
|
// int nProgress = 0;
|
|
|
|
// bEnableDraw = false;
|
|
// int[] arrCrossline = new int[crosslineMax - crosslineMin + 1];
|
|
// for (int i = crosslineMin; i <= crosslineMax; i++)
|
|
// {
|
|
// arrCrossline[nProgress] = crosslineMin + nProgress;
|
|
// nProgress++;
|
|
// }
|
|
// this.bdSourceCrossline.DataSource = arrCrossline;
|
|
// this.bdnavCrossline.BindingSource = this.bdSourceCrossline;
|
|
// this.bindingNavigatorCountItem.Text = $"/{crosslineMax}";
|
|
// this.ttxtCrosslineNum.Text = $"{crosslineMin}";
|
|
|
|
// bEnableDraw = true;
|
|
// int[] arrInline = new int[inlineMax - inlineMin + 1];
|
|
// nProgress = 0;
|
|
// for (int i = inlineMin; i <= inlineMax; i++)
|
|
// {
|
|
// arrInline[nProgress] = inlineMin + nProgress;
|
|
// nProgress++;
|
|
// }
|
|
// this.bdSourceInline.DataSource = arrInline;
|
|
// this.bdnavInline.BindingSource = this.bdSourceInline;
|
|
// this.bindingNavigatorCountItem1.Text = $"/{inlineMax}";
|
|
// this.ttxtInlineNum.Text = $"{inlineMin}";
|
|
|
|
// this.tsbtnInline.Checked = true;
|
|
// this.tsbtnCrossline.Checked = false;
|
|
//}
|
|
|
|
///// <summary>
|
|
///// 打开文件头分析窗口
|
|
///// </summary>
|
|
///// <param name="sender"></param>
|
|
///// <param name="e"></param>
|
|
//private void tbtnParseHeader_Click(object sender, EventArgs e)
|
|
//{
|
|
// FormParseHeader frmParse = new FormParseHeader();
|
|
// frmParse.Segy = this.segy;
|
|
// frmParse.Options = this.segyOptions;
|
|
// frmParse.Show(this);
|
|
// frmParse.FormClosed += (object frm, FormClosedEventArgs close) =>
|
|
// {
|
|
// if(frmParse.DialogResult == DialogResult.OK)
|
|
// {
|
|
// ResetLineRange();
|
|
// }
|
|
// };
|
|
//}
|
|
|
|
//private void bdnavInline_RefreshItems(object sender, EventArgs e)
|
|
//{
|
|
|
|
//}
|
|
///// <summary>
|
|
///// 跳转到inline
|
|
///// </summary>
|
|
///// <param name="sender"></param>
|
|
///// <param name="e"></param>
|
|
//private void ttxtInlineNum_KeyPress(object sender, KeyPressEventArgs e)
|
|
//{
|
|
// postionEdit(sender, e, (int[])bdSourceInline.DataSource);
|
|
//}
|
|
///// <summary>
|
|
///// 跳转到crossline
|
|
///// </summary>
|
|
///// <param name="sender"></param>
|
|
///// <param name="e"></param>
|
|
//private void ttxtCrosslineNum_KeyPress(object sender, KeyPressEventArgs e)
|
|
//{
|
|
// postionEdit(sender, e, (int[])bdSourceCrossline.DataSource);
|
|
//}
|
|
//private void postionEdit(object sender, KeyPressEventArgs e, int[] values)
|
|
//{
|
|
// if(values == null)
|
|
// {
|
|
// return;
|
|
// }
|
|
// if (e.KeyChar == (char)Keys.Return)
|
|
// {
|
|
// string strValue = ((ToolStripTextBox)sender).Text;
|
|
// if (string.IsNullOrEmpty(strValue))
|
|
// {
|
|
// e.Handled = true;
|
|
// return;
|
|
// }
|
|
// int nValue = Convert.ToInt32(strValue);
|
|
// int nPos = Array.IndexOf(values,nValue);
|
|
// if (nPos >= 0)
|
|
// {
|
|
// this.bdSourceInline.Position = nPos;
|
|
// }
|
|
// e.Handled = true;
|
|
// }
|
|
// else
|
|
// {
|
|
// if (e.KeyChar != '\b')//这是允许输入退格键
|
|
// {
|
|
// if ((e.KeyChar < '0') || (e.KeyChar > '9'))//这是允许输入0-9数字
|
|
// {
|
|
// e.Handled = true;
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
///// <summary>
|
|
///// Inline导航事件
|
|
///// </summary>
|
|
///// <param name="sender"></param>
|
|
///// <param name="e"></param>
|
|
//private void bdSourceInline_PositionChanged(object sender, EventArgs e)
|
|
//{
|
|
// int nInlineNum = ((int[])bdSourceInline.DataSource)[bdSourceInline.Position];
|
|
// this.ttxtInlineNum.Text = nInlineNum.ToString();
|
|
// if (bEnableDraw)
|
|
// {
|
|
// ShowInline(nInlineNum);
|
|
// }
|
|
//}
|
|
///// <summary>
|
|
///// Crossline导航事件
|
|
///// </summary>
|
|
///// <param name="sender"></param>
|
|
///// <param name="e"></param>
|
|
//private void bdSourceCrossline_PositionChanged(object sender, EventArgs e)
|
|
//{
|
|
// int nlineNum = ((int[])bdSourceCrossline.DataSource)[bdSourceCrossline.Position];
|
|
// this.ttxtCrosslineNum.Text = nlineNum.ToString();
|
|
// if (bEnableDraw)
|
|
// {
|
|
// ShowCrossline(nlineNum);
|
|
// }
|
|
//}
|
|
///// <summary>
|
|
///// 切换到Inline浏览
|
|
///// </summary>
|
|
///// <param name="sender"></param>
|
|
///// <param name="e"></param>
|
|
//private void tsbtnInline_Click(object sender, EventArgs e)
|
|
//{
|
|
// this.tsbtnInline.Checked = true;
|
|
// this.tsbtnCrossline.Checked = false;
|
|
//}
|
|
|
|
//private void tsbtnCrossline_Click(object sender, EventArgs e)
|
|
//{
|
|
// this.tsbtnInline.Checked = false;
|
|
// this.tsbtnCrossline.Checked = true;
|
|
//}
|
|
|
|
//private void bdnavCrossline_RefreshItems(object sender, EventArgs e)
|
|
//{
|
|
|
|
//}
|
|
|
|
//private void ttxtInlineNum_Validating(object sender, CancelEventArgs e)
|
|
//{
|
|
// bool bValid = Regex.IsMatch(ttxtInlineNum.Text, @"^\d+$");
|
|
// if (!bValid)
|
|
// {
|
|
// e.Cancel = true;
|
|
// }
|
|
//}
|
|
//private void ttxtCrosslineNum_Validating(object sender, CancelEventArgs e)
|
|
//{
|
|
// bool bValid = Regex.IsMatch(ttxtCrosslineNum.Text, @"^\d+$");
|
|
// if (!bValid)
|
|
// {
|
|
// e.Cancel = true;
|
|
// }
|
|
//}
|
|
|
|
//private void ShowCrossline(int lineNum)
|
|
//{
|
|
// int nCount = segy.Traces.Count;
|
|
// List<int> lstTraceIndex = new List<int>();
|
|
|
|
// for (int i = 0; i < nCount; i++)
|
|
// {
|
|
// if (segy.Traces[i].Header.CrosslineNumber == lineNum)
|
|
// {
|
|
// lstTraceIndex.Add(i);
|
|
// }
|
|
// }
|
|
|
|
// DrawerSeismicSection section = new DrawerSeismicSection();
|
|
// section.Base.TraceCount = lstTraceIndex.Count;
|
|
// section.Base.SampleCount = segy.Header.SampleNumber;
|
|
// section.Base.SampleStep = segy.Header.SampleInteral;
|
|
// section.Base.FormatCode = (int)segy.Header.SampleFormat;
|
|
// section.Base.IsPC = this.segyOptions.IsLittleEndian.Value ? 1 : 0;
|
|
|
|
// DrawerElementProperty property = new DrawerElementProperty();
|
|
// property.Element = section;
|
|
// string strProperty = DrawerElementHelp.Serialize(property);
|
|
|
|
// float[] btsValus = new float[section.Base.SampleCount * section.Base.TraceCount];
|
|
// int nTraceCount = section.Base.TraceCount;
|
|
// int nSampleCount = section.Base.SampleCount;
|
|
// for (int i = 0; i < nTraceCount; i++)
|
|
// {
|
|
// for (int j = 0; j < nSampleCount; j++)
|
|
// {
|
|
// btsValus[i * nSampleCount + j] = segy.Traces[lstTraceIndex[i]].Values[j];
|
|
// }
|
|
// }
|
|
|
|
// if (sectionPtr > 0)
|
|
// {
|
|
// this.drawView.DeleteSeismicSection(sectionPtr);
|
|
// sectionPtr = this.drawView.AddSeismicSection(strProperty, btsValus);
|
|
// btsValus = null;
|
|
// this.drawView.Redraw();
|
|
// }
|
|
// else
|
|
// {
|
|
// sectionPtr = this.drawView.AddSeismicSection(strProperty, btsValus);
|
|
// btsValus = null;
|
|
// this.drawView.ViewAll();
|
|
// }
|
|
//}
|
|
|
|
//private void ShowInline(int inlineNum)
|
|
//{
|
|
// int nCount = segy.Traces.Count;
|
|
// List<int> lstTraceIndex = new List<int>();
|
|
|
|
// for (int i = 0; i < nCount; i++)
|
|
// {
|
|
// if(segy.Traces[i].Header.InlineNumber == inlineNum)
|
|
// {
|
|
// //if (segy.Traces[i].Header.CrosslineNumber > 1449
|
|
// // && segy.Traces[i].Header.CrosslineNumber < 1451)
|
|
// {
|
|
// lstTraceIndex.Add(i);
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// DrawerSeismicSection section = new DrawerSeismicSection();
|
|
// section.Base.TraceCount = lstTraceIndex.Count;
|
|
// section.Base.SampleCount = segy.Header.SampleNumber;
|
|
// section.Base.SampleStep = segy.Header.SampleInteral;
|
|
// section.Base.FormatCode = (int)segy.Header.SampleFormat;
|
|
// section.Base.IsPC = this.segyOptions.IsLittleEndian.Value ? 1 : 0;
|
|
|
|
// DrawerElementProperty property = new DrawerElementProperty();
|
|
// property.Element = section;
|
|
// string strProperty = DrawerElementHelp.Serialize(property);
|
|
|
|
// float[] btsValus = new float[section.Base.SampleCount * section.Base.TraceCount];
|
|
// int nTraceCount = section.Base.TraceCount;
|
|
// int nSampleCount = section.Base.SampleCount;
|
|
// StringBuilder strbMsg = new StringBuilder();
|
|
// for (int i=0;i< nTraceCount; i++)
|
|
// {
|
|
// // Buffer.BlockCopy(segy.Traces[lstTraceIndex[i]].Values, 0, btsValus, 0, section.Base.SampleCount);
|
|
// for(int j=0;j< nSampleCount; j++)
|
|
// {
|
|
// btsValus[i * nSampleCount + j] = segy.Traces[lstTraceIndex[i]].Values[j];
|
|
// //strbMsg.AppendLine($"{btsValus[i * nSampleCount + j]}");
|
|
// }
|
|
// }
|
|
// Trace.WriteLine(strbMsg.ToString());
|
|
|
|
// if (sectionPtr > 0)
|
|
// {
|
|
// this.drawView.DeleteSeismicSection(sectionPtr);
|
|
// sectionPtr = this.drawView.AddSeismicSection(strProperty, btsValus);
|
|
// btsValus = null;
|
|
// this.drawView.Redraw();
|
|
// }
|
|
// else
|
|
// {
|
|
// sectionPtr = this.drawView.AddSeismicSection(strProperty, btsValus);
|
|
// btsValus = null;
|
|
// this.drawView.ViewAll();
|
|
// }
|
|
//}
|
|
}
|
|
public class SegyReadingProgress : IReadingProgress
|
|
{
|
|
public ProgressBar ProgressControl { get; set; }
|
|
public bool CancellationPending { get; set; } = false;
|
|
|
|
public SegyReadingProgress(ProgressBar progressControl)
|
|
{
|
|
this.ProgressControl = progressControl;
|
|
}
|
|
|
|
public void ReportProgress(int progressPercentage)
|
|
{
|
|
if (ProgressControl != null)
|
|
{
|
|
ProgressControl.Value = progressPercentage;
|
|
}
|
|
}
|
|
}
|
|
}
|