📄 stratumline.cs
字号:
using System;
using SuperMapLib;
namespace ProfileCtrl
{
/// <summary>
/// 地层线类
/// </summary>
public class StratumLine
{
public StratumLine(Bore[] bores)
{
//
// TODO: 在此处添加构造函数逻辑
//
this.scaleX=PublicValue.scaleX;
this.scaleY=PublicValue.scaleY;
this.bores=bores;
zkCount=bores.Length;
this.space=PublicValue.space;
}
float scaleX, scaleY, scaleT=0.005f;//文本缩放比例因子
private Bore[] bores;//钻孔数据的集合
private int zkCount;//钻孔个数
private int space;
/// <summary>
/// 文本缩放比例因子
/// </summary>
public float ScaleT
{
get{return scaleT;}
set{scaleT=value;}
}
public void Draw(soRecordset objRs)
{
DrawTB(objRs);
DrawSumLine(objRs);
}
#region "自动生成概化地质界线"
/// <summary>
/// 概化地质界线方法
/// </summary>
/// <param name="objRs">存放剖面的数据集</param>
private void DrawSumLine(soRecordset objRs)
{
soPoint objPoint;//存放地质线的临时点
soPoints objPointsT,objPointsB; //顶、底板点集
soGeoLine objGeoLine;//地层线
bool[][] isPop = new bool[zkCount][]; //设一临时变量,判断此地层是否取出
for(int i=0;i<zkCount;i++)
{
isPop[i] = new bool[bores[i].GetHSCDM().Length];
}
for(int i=0;i<zkCount;i++) //循环所有钻孔
{
#region
for(int j=1;j<bores[i].GetHSCDM().Length;j++) //循环所有含水层
{
if(bores[i].GetHSCDM()[j] != "隔水层" && !isPop[i][j]) //画现所有的含水层
{
objPoint = new soPoint();
objPointsT = new soPoints();
objPointsB = new soPoints();
if(i==0) //第一个钻孔和高程标尺连线
{
objPoint.x = -(float)space/this.scaleX;
objPoint.y = bores[i].GetCDBG()[j-1]/scaleY;
objPointsT.Add(objPoint);
objPoint.y = bores[i].GetCDBG()[j]/scaleY;
objPointsB.Add(objPoint);
}
//??????????
if(i != 0) //不是第一个钻孔,前一钻孔缺失此地层
{
float gene = 1f/3f; //运用地质规则,算出尖灭位置
float depth = bores[i].GetCDBG()[j-1] - bores[i].GetCDBG()[j];
if(depth > 5) gene = 0.5f;
if(depth > 8) gene = 2f/3f;
objPoint.x = (bores[i].X - (bores[i].X - bores[i-1].X) * gene)/scaleX;
// objPoint.x = (bores[i-1].X + bores[i].X) * 0.5/scaleX; //暂时取中点
objPoint.y = (bores[i].GetCDBG()[j-1] + bores[i].GetCDBG()[j]) * 0.5/scaleY; //暂时取中点
objPointsT.Add(objPoint);
objPointsB.Add(objPoint);
}
objPoint.x = bores[i].X/scaleX;
objPoint.y = bores[i].GetCDBG()[j-1]/scaleY;
objPointsT.Add(objPoint);
objPoint.y = bores[i].GetCDBG()[j]/scaleY;
objPointsB.Add(objPoint);
#region
int forNum = j;
for(int n = i+1;n<zkCount;n++) //循环此钻孔后所有钻孔及地层
{
#region
bool isFind = false; //是否找到地层
for(int k=1;k<bores[n].GetHSCDM().Length;k++)
{
if(!isPop[n][k] && bores[i].GetHSCDM()[j] == bores[n].GetHSCDM()[k])
{
objPoint.x = bores[n].X/scaleX;
objPoint.y = bores[n].GetCDBG()[k-1]/scaleY;
objPointsT.Add(objPoint);
objPoint.y = bores[n].GetCDBG()[k]/scaleY;
objPointsB.Add(objPoint);
isPop[n][k] = true;
if( n == (zkCount-1)) //最后一个钻孔和高程标尺连线
{
objPoint.x = (bores[zkCount-1].X + space)/this.scaleX;
objPoint.y = bores[zkCount-1].GetCDBG()[k-1]/scaleY;
objPointsT.Add(objPoint);
objPoint.y = bores[zkCount-1].GetCDBG()[k]/scaleY;
objPointsB.Add(objPoint);
}
isFind = true;
forNum = k;
break;
}
}
#endregion
if(!isFind) //后一钻孔缺失此地层
{
float gene = 1f/3f; //运用地质规则,算出尖灭位置
float depth = bores[i].GetCDBG()[j-1] - bores[i].GetCDBG()[j];
if(depth > 5) gene = 0.5f;
if(depth > 8) gene = 2f/3f;
objPoint = new soPoint();
objPoint.x = (bores[n-1].X + (bores[n].X - bores[n-1].X) * gene)/scaleX;
// objPoint.x = (bores[n-1].X + bores[n].X) * 0.5/scaleX; //暂时取中点
objPoint.y = (bores[n-1].GetCDBG()[forNum-1] + bores[n-1].GetCDBG()[forNum]) * 0.5/scaleY; //暂时取中点
objPointsT.Add(objPoint);
objPointsB.Add(objPoint);
break;
}
}
#endregion
objGeoLine = new soGeoLine();
objGeoLine.AddPart(objPointsT);
objRs.AddNew((soGeometry)objGeoLine);
objRs.Update();
objGeoLine = new soGeoLine();
objGeoLine.AddPart(objPointsB);
objRs.AddNew((soGeometry)objGeoLine);
objRs.Update();
}
}
#endregion
}
objPoint = null;
objPointsT = null;
objPointsB = null;
objGeoLine = null;
}
#endregion
#region 画地面和层底连线
/// <summary>
/// 连接每个探孔的地表和底部,生产地表起伏线和层底连线
/// </summary>
/// <param name="objRs">存放剖面线的数据集</param>
private void DrawTB(soRecordset objRs)
{
//地面线、孔底线
soPoints objPointsT = new soPoints();
soPoints objPointsB = new soPoints();
soPoint objPoint = new soPoint();
objPoint.x = -(float)space/scaleX;
objPoint.y = bores[0].GetCDBG()[0]/scaleY;
objPointsT.Add(objPoint);
objPoint.y = bores[0].GetCDBG()[bores[0].GetCDBG().Length-1]/scaleY;
objPointsB.Add(objPoint);
for(int i=0;i<bores.Length;i++)
{
objPoint.x = bores[i].X/scaleX;
objPoint.y = bores[i].GetCDBG()[0]/scaleY;
objPointsT.Add(objPoint);
objPoint.y = bores[i].GetCDBG()[bores[i].GetCDBG().Length-1]/scaleY;
objPointsB.Add(objPoint);
}
objPoint.x = (bores[zkCount-1].X + space)/this.scaleX;
objPoint.y = bores[zkCount-1].GetCDBG()[0]/scaleY;
objPointsT.Add(objPoint);
objPoint.y = bores[zkCount-1].GetCDBG()[bores[zkCount-1].GetCDBG().Length-1]/scaleY;
objPointsB.Add(objPoint);
soGeoLine objGeoLine = new soGeoLine();
objGeoLine.AddPart(objPointsT);
objRs.AddNew((soGeometry)objGeoLine);
objRs.Update();
objGeoLine = new soGeoLine();
objGeoLine.AddPart(objPointsB);
objRs.AddNew((soGeometry)objGeoLine);
objRs.Update();
objPoint = null;
objPointsT = null;
objPointsB = null;
objGeoLine = null;
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -