using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using GeoSigma.UCDraw;
using System.Diagnostics;
using UCDraw;
using Unplugged.Segy;
using System.Text.RegularExpressions;
using SigmaDrawerElement;
using GeoSigma.SigmaDrawerStyle;
using GeoSigmaDrawLib;
namespace GeoSigma.PcgDrawSection
{
public delegate void ShowSectionEventHandler(int sectionType, int sectionNum);
public partial class UCSectionViewer : UserControl
{
public ShowSectionEventHandler ShowSectionEvent = null;
///
/// 剖面类型,1-Inline;2-Xline.
///
public int SectionType { get; set; }
public int SectionNum { get; set; }
public ISegyFile Segy { get; set; }
public ISegyOptions SegyOptions { get; set; }
private int startInline = 0;
private int startXline = 0;
public MainView ViewController { get; set; }
public DrawViewer Viewer { get; set; }
long sectionPtr = 0;
int inlineMin = 0, inlineMax = 0, crosslineMin = 0, crosslineMax = 0;
bool bEnableDraw = true;
///
/// 打开按钮是否显示
///
public bool ShowToolButtonOpen
{
get
{
return tbtnOpenFile.Visible;
}
set
{
tbtnOpenFile.Visible = value;
}
}
///
/// 格式分析按钮是否可见
///
public bool ShowToolParse
{
get
{
return tbtnParseHeader.Visible;
}
set
{
tbtnParseHeader.Visible = value;
}
}
private PanelProperty propertyControl;
public PanelProperty PropertyControl
{
get
{
return propertyControl;
}
private set
{
propertyControl = value;
}
}
public UCSectionViewer()
{
InitializeComponent();
ttxtInlineNum.TextBox.Validating += ttxtInlineNum_Validating;
ttxtCrosslineNum.TextBox.Validating += ttxtCrosslineNum_Validating;
SegyOptions = new SegyOptions();
InitSectionViewer();
}
///
/// 添加线
///
/// 图层
/// 线名
/// 坐标点
public void AddDrawCurve(string layerName, string name, List pts)
{
Viewer.AddDrawCurve(layerName, name, pts);
}
///
/// 添加剖面上的线
///
///
///
///
public void AddSectionCurve(string layerName, string name, List pts)
{
Viewer.DeleteElement(layerName, name);
List lstPt = new List();
if (this.SectionType == 1)
{
for(int i= 0; i < pts.Count; i++)
{
if(pts[i].X>= crosslineMin && pts[i].X<= crosslineMax)
{
lstPt.Add(new PointD((pts[i].X - crosslineMin) * 10, pts[i].Y));
}
}
}
else
{
for (int i = 0; i < pts.Count; i++)
{
if (pts[i].X >= inlineMin && pts[i].X <= inlineMax)
{
lstPt.Add(new PointD((pts[i].X - inlineMin) * 10, pts[i].Y));
}
}
}
this.AddDrawCurve(layerName, name, lstPt);
}
public int DeleteSectionCurve(string layerName, string name)
{
return Viewer.DeleteElement(layerName, name);
}
public void Redraw()
{
this.Viewer.Redraw();
}
private void btnTest_Click(object sender, EventArgs e)
{
string strCurveName = "P1";
string strLayerName = "层位";
// 测试添加解释成果
List pts = new List();
pts.Add(new PointD(0, -967.0000));
pts.Add(new PointD(100, -966.6250));
pts.Add(new PointD(200, -966.2500));
pts.Add(new PointD(300, -965.8750));
pts.Add(new PointD(400, -965.5000));
pts.Add(new PointD(500, -965.1250));
this.AddDrawCurve(strLayerName, strCurveName, pts);
// 测试样式设置 ResetCurveStyle
CurveProperty curveProperty = new CurveProperty();
curveProperty.CurveType = (int)LineType.PLINE_TRANSPARENT;
curveProperty.Width = 3;
curveProperty.LineColor = Color.Green;
int nCount = Viewer.ResetCurveStyle(strCurveName, strLayerName, curveProperty);
Viewer.Redraw();
}
///
/// 启动播放Inline
///
///
public void PlayInline(int lineNo)
{
this.Viewer.DeleteSectionAll();
sectionPtr = 0;
bool isTraceShow = true;
for (int i = 0; i < this.bdnavInline.Items.Count; i++)
{
this.bdnavInline.Items[i].Enabled = isTraceShow;
}
this.tsbtnCrossline.Checked = false;
this.tsbtnInline.Checked = true;
this.tsbtnInline.Visible = false;
this.bdnavInline.Visible = true;
this.bdnavCrossline.Visible = false;
ShowInline(lineNo);
// 设置导航位置
ttxtInlineNum.Text = lineNo.ToString();
int[] values = (int[])this.bdSourceInline.DataSource;
if (values == null)
{
return;
}
int nPos = Array.IndexOf(values, lineNo);
if (nPos >= 0)
{
bEnableDraw = false;
this.bdSourceInline.Position = nPos;
bEnableDraw = true;
}
//ShowInline(lineNo);
}
///
/// 启动播放Crossline
///
///
public void PlayCrossline(int lineNo)
{
this.Viewer.DeleteSectionAll();
sectionPtr = 0;
bool isTraceShow = true;
for (int i = 0; i < this.bdnavCrossline.Items.Count; i++)
{
this.bdnavCrossline.Items[i].Enabled = isTraceShow;
}
this.tsbtnInline.Checked = false;
this.tsbtnCrossline.Checked = true;
this.tsbtnCrossline.Visible = false;
this.bdnavInline.Visible = false;
this.bdnavCrossline.Visible = true;
ShowCrossline(lineNo);
// 设置导航位置
ttxtCrosslineNum.Text = lineNo.ToString();
int[] values = (int[])this.bdSourceCrossline.DataSource;
if (values == null)
{
return;
}
int nPos = Array.IndexOf(values, lineNo);
if (nPos >= 0)
{
bEnableDraw = false;
this.bdSourceCrossline.Position = nPos;
bEnableDraw = true;
}
//ShowCrossline(lineNo);
}
private void UCSectionViewer_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;
}
///
/// 创建剖面绘图区
///
private void InitSectionViewer()
{
ViewController = new MainView();
ViewController.ToolMainVisible = false;
ViewController.DrawerGotFocus += (object drawer, EventArgs ea) =>
{
//Trace.WriteLine("openFile:" + ea.ToString());
};
if (ViewController.NewFile("Inline") == false)
{
return;
}
Viewer = ViewController.ViewControl;
propertyControl = ViewController.PropertyControl;
mainContainer.TopToolStripPanel.Controls.Add(ViewController.ToolstripElements);
this.tspMain.Location = new Point(0, 0);
ViewController.ToolstripElements.Location = new Point(0, this.tspMain.Height + 2);
//mainContainer.ContentPanel.Controls.Add(drawView);
this.splitContainer1.Panel1.Controls.Add(Viewer);
ViewController.ViewControl.Dock = DockStyle.Fill;
this.splitContainer1.Panel2Collapsed = true;
//this.splitContainer1.Panel2.Controls.Add(propertyControl);
//propertyControl.Dock = DockStyle.Fill;
}
///
/// 保存文件
///
/// 是否成功
public bool SaveFile()
{
if (ViewController.IsNewDocument)
{
return SaveAs();
}
if (ViewController.SaveFile())
{
this.Text = ViewController.Text;
}
return true;
}
///
/// 另存为
///
/// 是否成功
public bool SaveAs()
{
if (ViewController.SaveAs())
{
this.Text = ViewController.Text;
//NewFileSavedEvent?.Invoke(mainView.FileFullName);
return true;
}
return false;
}
public bool SaveTo(string fileNew)
{
return ViewController.SaveTo(fileNew);
}
///
/// 是否需要取消操作,文件已经修改,阻止关闭
///
///
public bool CancelClosing()
{
if (this.ViewController != null && this.ViewController.IsDocumentModified())
{
switch (MessageBox.Show("文件已修改,是否保存?", "保存",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question))
{
case DialogResult.Cancel:
return true;
case DialogResult.Yes:
if (SaveFile() == false)
{
return true;
}
else
{
return false;
}
case DialogResult.No:
return false;
}
}
return false;
}
///
/// 打开文件
///
/// 文件路径
/// 是否以方块方式显示散点数据
public void OpenFile(string strFile)
{
try
{
this.SuspendLayout();
MainView mainView = new MainView();
mainView.ToolMainVisible = false;
if (mainView.OpenFile(strFile) == false)
{
return;
}
//mainView.DrawerGotFocus += (object drawer, EventArgs ea) =>
//{
// //Trace.WriteLine("openFile:" + ea.ToString());
//};
Viewer = mainView.ViewControl;
propertyControl = mainView.PropertyControl;
mainContainer.TopToolStripPanel.Controls.Remove(ViewController.ToolstripElements);
mainContainer.TopToolStripPanel.Controls.Add(mainView.ToolstripElements);
this.tspMain.Location = new Point(0, 0);
mainView.ToolstripElements.Location = new Point(0, this.tspMain.Height + 2);
this.splitContainer1.Panel1.Controls.Clear();
this.splitContainer1.Panel1.Controls.Add(Viewer);
mainView.ViewControl.Dock = DockStyle.Fill;
ViewController = mainView;
sectionPtr = 0;
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
finally
{
this.ResumeLayout();
}
}
///
/// 保存文件
///
/// 按钮
/// 事件参数
private void tsbtnSave_Click(object sender, EventArgs e)
{
SaveFile();
}
///
/// 打开文件
///
///
///
private void tbtnOpenFile_Click(object sender, EventArgs e)
{
if(CancelClosing() == true)
{
return;
}
string strFile = DocHelper.OpenDialog();
if (strFile == null)
{
return;
}
OpenFile(strFile);
}
private void tsbtnSetSegy_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;
}
Segy = OpenSegyFile(ofd.FileName);
ResetLineRange();
}
public ISegyFile OpenSegyFile(string segyFileName, IReadingProgress progress = null)
{
var reader = new SegyReader();
reader.Options = SegyOptions;
ISegyFile segyFile = reader.Read(segyFileName, progress);
// segy = reader.Read(strFile, new SegyReadingProgress(this.tpgbMain.ProgressBar));
// this.tpgbMain.Value = 0;
//ResetLineRange();
return segyFile;
}
///
/// 打开文件头分析窗口
///
///
///
private void tbtnParseHeader_Click(object sender, EventArgs e)
{
ShowParseDialog();
}
private void ShowParseDialog()
{
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();
}
};
}
///
/// 切换到Inline浏览
///
///
///
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 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;
}
}
///
/// 跳转到inline
///
///
///
private void ttxtInlineNum_KeyPress(object sender, KeyPressEventArgs e)
{
postionEdit(sender, e, bdSourceInline);
}
///
/// 跳转到crossline
///
///
///
private void ttxtCrosslineNum_KeyPress(object sender, KeyPressEventArgs e)
{
postionEdit(sender, e, bdSourceCrossline);
}
private void postionEdit(object sender, KeyPressEventArgs e, BindingSource binding)
{
int[] values = (int[])binding.DataSource;
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)
{
binding.Position = nPos;
}
e.Handled = true;
}
else
{
if (e.KeyChar != '\b')//这是允许输入退格键
{
if ((e.KeyChar < '0') || (e.KeyChar > '9'))//这是允许输入0-9数字
{
e.Handled = true;
}
}
}
}
///
/// Inline导航事件
///
///
///
private void bdSourceInline_PositionChanged(object sender, EventArgs e)
{
int nInlineNum = ((int[])bdSourceInline.DataSource)[bdSourceInline.Position];
this.ttxtInlineNum.Text = nInlineNum.ToString();
if (bEnableDraw)
{
ShowInline(nInlineNum);
}
}
///
/// Crossline导航事件
///
///
///
private void bdSourceCrossline_PositionChanged(object sender, EventArgs e)
{
int nlineNum = ((int[])bdSourceCrossline.DataSource)[bdSourceCrossline.Position];
this.ttxtCrosslineNum.Text = nlineNum.ToString();
if (bEnableDraw)
{
ShowCrossline(nlineNum);
}
}
public void SetRange(int inlineMin, int inlineMax, int xlineMin, int xlineMax)
{
this.inlineMin = inlineMin;
this.inlineMax = inlineMax;
this.crosslineMin = xlineMin;
this.crosslineMax = xlineMax;
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}";
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}";
bEnableDraw = true;
}
///
/// 重置并绑定inline、crossline
///
private void ResetLineRange()
{
int nDelay = 0;
// Inline、Crossline范围
Segy.GetLineRange(ref inlineMin, ref inlineMax, ref crosslineMin, ref crosslineMax, ref nDelay);
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;
}
private void ShowCrossline(int lineNum)
{
SectionType = 2;
// 另一方向线的线号
List lstInlineNum = new List();
List lstXlineNum = new List();
int nOtherNum = -1;
int nCount = Segy.Traces.Count;
List lstTraceIndex = new List();
for (int i = 0; i < nCount; i++)
{
if (Segy.Traces[i].Header.CrosslineNumber == lineNum)
{
lstTraceIndex.Add(i);
if (nOtherNum != Segy.Traces[i].Header.InlineNumber)
{
nOtherNum = Segy.Traces[i].Header.InlineNumber;
lstInlineNum.Add(nOtherNum);
}
}
}
for (int i = 0; i < lstInlineNum.Count; i++)
{
lstXlineNum.Add(lineNum);
}
int nDelay = -Segy.Traces[lstTraceIndex[0]].Header.Delay;
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;
section.Coordinate.Y = nDelay;
this.DrawAxis(0, nDelay, lstInlineNum, lstXlineNum, (Segy.Header.SampleNumber-1) * Segy.Header.SampleInteral * 0.001);
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.Viewer.DeleteSeismicSection(sectionPtr);
sectionPtr = this.Viewer.AddSeismicSection(strProperty, btsValus);
btsValus = null;
// 添加其它数据
ShowSectionEvent?.Invoke(2, lineNum);
this.Viewer.Redraw();
}
else
{
//this.Viewer.ClearGeo();
sectionPtr = this.Viewer.AddSeismicSection(strProperty, btsValus);
btsValus = null;
// 添加其它数据
ShowSectionEvent?.Invoke(2, lineNum);
this.Viewer.ViewAll();
}
SectionNum = lineNum;
}
private void ShowInline(int inlineNum)
{
SectionType = 1;
// 另一方向线的线号
List lstInlineNum = new List();
List lstXlineNum = new List();
int nOtherNum = -1;
int nCount = Segy.Traces.Count;
List lstTraceIndex = new List();
for (int i = 0; i < nCount; i++)
{
if (Segy.Traces[i].Header.InlineNumber == inlineNum)
{
lstTraceIndex.Add(i);
if (nOtherNum != Segy.Traces[i].Header.CrosslineNumber)
{
nOtherNum = Segy.Traces[i].Header.CrosslineNumber;
lstXlineNum.Add(nOtherNum);
}
}
}
for(int i=0;i< lstXlineNum.Count; i++)
{
lstInlineNum.Add(inlineNum);
}
int nDelay = -Segy.Traces[lstTraceIndex[0]].Header.Delay;
this.startInline = Segy.Traces[lstTraceIndex[0]].Header.InlineNumber;
this.startXline = Segy.Traces[lstTraceIndex[0]].Header.CrosslineNumber;
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;
section.Coordinate.Y = nDelay;
// 绘制坐标信息
this.DrawAxis(0, nDelay, lstInlineNum, lstXlineNum, (Segy.Header.SampleNumber-1) * Segy.Header.SampleInteral * 0.001);
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++)
{
// 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];
}
}
if (sectionPtr > 0)
{
this.Viewer.DeleteSeismicSection(sectionPtr);
sectionPtr = this.Viewer.AddSeismicSection(strProperty, btsValus);
btsValus = null;
ShowSectionEvent?.Invoke(1, inlineNum);
this.Viewer.Redraw();
}
else
{
sectionPtr = this.Viewer.AddSeismicSection(strProperty, btsValus);
btsValus = null;
ShowSectionEvent?.Invoke(1, inlineNum);
this.Viewer.ViewAll();
}
SectionNum = inlineNum;
}
///
/// 绘制坐标信息
///
///
///
///
///
///
private void DrawAxis(int offsetX, int offsetY, List lstInlineNum, List lstXlineNum, double deepth)
{
this.Viewer.DeleteLayer(new List { "坐标" });
this.Viewer.DeleteLayer(new List { "坐标\\Axis" });
this.Viewer.DeleteLayer(new List { "坐标\\Scale" });
this.Viewer.DeleteLayer(new List { "坐标\\ScaleX" });
this.Viewer.DeleteLayer(new List { "坐标\\ScaleY" });
this.Viewer.DeleteLayer(new List { "坐标\\Grid" });
string strLayerName = string.Empty;
string strCurveName = string.Empty;
double dYMin = offsetY - deepth;
double dXMax = offsetX + (lstInlineNum.Count-1) * 10;
List pts = new List();
// 横向网格线
pts.Clear();
strLayerName = "坐标\\Grid";
List lstScaleY = new List();
int nStepY = 100;
double dCooY = offsetY;
int nDeepth = (int)(Math.Floor(dCooY / nStepY));
while (nDeepth * nStepY > dYMin)
{
double dScaleY = nDeepth * nStepY;
// 横向网格线
pts.Add(new PointD(offsetX, dScaleY));
pts.Add(new PointD(dXMax, dScaleY));
this.AddDrawCurve(strLayerName, $"{dScaleY}", pts);
pts.Clear();
// 纵向刻度线
pts.Add(new PointD(offsetX - 5, dScaleY));
pts.Add(new PointD(offsetX, dScaleY));
this.AddDrawCurve("坐标\\Scale", $"{dScaleY}", pts);
pts.Clear();
// 纵向标注
DrawerPoint drawPt = new DrawerPoint();
drawPt.X = offsetX;
drawPt.Y = dScaleY;
drawPt.Name = $"{dScaleY}";
lstScaleY.Add(drawPt);
nDeepth -= 1;
}
// 横向网格线
pts.Clear();
pts.Add(new PointD(offsetX, dYMin));
pts.Add(new PointD(dXMax, dYMin));
this.AddDrawCurve(strLayerName, $"{nDeepth * nStepY}", pts);
// 纵向刻度线
pts.Clear();
pts.Add(new PointD(offsetX - 5, dYMin));
pts.Add(new PointD(offsetX, dYMin));
this.AddDrawCurve("坐标\\Scale", $"{nDeepth * nStepY}", pts);
// 纵向标注
DrawerPoint drawPtY = new DrawerPoint();
drawPtY.X = offsetX;
drawPtY.Y = nDeepth * nStepY;
drawPtY.Name = $"{nDeepth * nStepY}";
lstScaleY.Add(drawPtY);
strLayerName = "坐标\\ScaleY";
this.Viewer.AddDrawPoints(strLayerName, lstScaleY);
DrawerPointStyle styleScaleY = new DrawerPointStyle();
styleScaleY.SymbolSize = new SizeF(0, 0);
PointText ptTextY = new PointText();
ptTextY.Height = 12;
ptTextY.Width = ptTextY.Height * 0.4;
ptTextY.DeltY = 0;
ptTextY.DeltX = -6;
ptTextY.Style = (int)TextStyleFlags.alignLeft | (int)TextStyleFlags.alignCenterV;
styleScaleY.Text = ptTextY;
styleScaleY.ForeColor = Color.FromArgb(0, 0, 0);
Viewer.SetLayerHowtoViewPoint(strLayerName, styleScaleY.SerialXml(), true);
// 设置网格虚线样式
strLayerName = "坐标\\Grid";
CurveProperty curveProperty = new CurveProperty();
curveProperty.VirtureValues = "4 4";
curveProperty.LineColor = Color.FromArgb(127, 127, 127);
this.Viewer.CreateLayerCurveStyle(strLayerName, curveProperty.StyleType, curveProperty.SerialXml());
// 横向坐标轴和刻度线
strLayerName = "坐标\\Scale";
//this.Viewer.DeleteLayer(new List { strLayerName });
List lstScaleX = new List();
DrawerPoint ptLableInline = new DrawerPoint();
ptLableInline.X = offsetX - 30;
ptLableInline.Y = offsetY;
ptLableInline.Name = "Xline";
lstScaleX.Add(ptLableInline);
DrawerPoint ptLableXline = new DrawerPoint();
ptLableXline.X = offsetX - 30;
ptLableXline.Y = offsetY + 8;
ptLableXline.Name = "Inline";
lstScaleX.Add(ptLableXline);
pts.Clear();
double dScaleX = 0;
for (int i = 0; i < lstInlineNum.Count; i++)
{
if (SectionType == 2)
{
dScaleX = offsetX + (lstInlineNum[i] - lstInlineNum[0]) * 10;
}
else
{
dScaleX = offsetX + (lstXlineNum[i] - lstXlineNum[0]) * 10;
}
pts.Add(new PointD(dScaleX, offsetY));
// 横向刻度线
if (i % 10 == 0 || i == lstInlineNum.Count - 1)
{
List ptsScale = new List();
ptsScale.Add(new PointD(dScaleX, offsetY + 5));
ptsScale.Add(new PointD(dScaleX, offsetY));
this.AddDrawCurve(strLayerName, $"X{i}", ptsScale);
DrawerPoint ptScaleXline = new DrawerPoint();
ptScaleXline.X = dScaleX;
ptScaleXline.Y = offsetY;
ptScaleXline.Name = lstXlineNum[i].ToString();
lstScaleX.Add(ptScaleXline);
DrawerPoint ptScaleInline = new DrawerPoint();
ptScaleInline.X = dScaleX;
ptScaleInline.Y = offsetY+8;
ptScaleInline.Name = lstInlineNum[i].ToString();
lstScaleX.Add(ptScaleInline);
}
}
strLayerName = "坐标\\Axis";
strCurveName = "AxisX";
this.AddDrawCurve(strLayerName, strCurveName, pts);
strLayerName = "坐标\\ScaleX";
this.Viewer.AddDrawPoints(strLayerName, lstScaleX);
DrawerPointStyle styleScale = new DrawerPointStyle();
styleScale.SymbolSize = new SizeF(0, 0);
PointText ptText = new PointText();
ptText.Height = 12;
ptText.Width = ptText.Height*0.4;
ptText.DeltY = 4;
ptText.Style = (int)TextStyleFlags.alignCenterH | (int)TextStyleFlags.alignTop;
styleScale.Text = ptText;
styleScale.ForeColor = Color.FromArgb(0, 0, 0);
Viewer.SetLayerHowtoViewPoint(strLayerName, styleScale.SerialXml(), true);
strLayerName = "坐标\\Axis";
// 纵向坐标
pts.Clear();
pts.Add(new PointD(offsetX, offsetY));
pts.Add(new PointD(offsetX, dYMin));
strCurveName = "AxisY";
this.AddDrawCurve(strLayerName, strCurveName, pts);
// 绘制刻度线
LayerStatus status = LayerStatus.VIEW_NOT_EDIT;
this.Viewer.SetLayerState( "坐标", status);
this.Viewer.SetLayerState("坐标\\Axis", status);
this.Viewer.SetLayerState("坐标\\Scale", status);
this.Viewer.SetLayerState("坐标\\ScaleX", status);
this.Viewer.SetLayerState("坐标\\ScaleY", status);
this.Viewer.SetLayerState("坐标\\Grid", status);
}
}
}