⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stratumline.cs

📁 剖面生成器
💻 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 + -