// // Copyright (c) jindongfang. All rights reserved. // //using DfdIO; //using DfdIO.DrawModel; //using DQ.Construction.NewLook; //using DQ.Construction.NewLook.Chart; //using DQ.Construction.Util; using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using WorkData; using WorkData.Entity; //using static DQ.Construction.NewLook.CtChart; namespace WellWorkDataUI { /// /// 井位分布. /// public class WellDistribute { private static readonly object BalanceLock = new object(); /// /// 处理进度 /// /// 图层名称 public delegate void ProgressLayer(string layerName, bool isOk); // private string layerName; ///// ///// 地层 ///// // public string LayerName // { // get // { // return this.layerName; // } // set // { // this.layerName = value; // } // } /// /// Initializes a new instance of the class. /// /// 层位 public WellDistribute() { // this.layerName = layerName; } /// /// 根据测深计算井位坐标。TODO:是否与补芯有关 /// /// 井号 /// 测深 /// 坐标X /// 坐标Y /// 垂深 /// 是否计算成功 public static bool ComputedXY(string wellName, double detection, ref double x, ref double y, ref double vertical) { // 井基础数据 WellBase well = DBHelp.NewDb.Queryable() .Where(it => it.JH == wellName && it.X > 0 && it.Y > 0) .Select(it => new WellBase() { JH = it.JH, X = it.X, Y = it.Y }).First(); int nCount = DBHelp.NewDb.Queryable() .Where(it => it.JH == wellName) .Select(it => it.JH).Count(); if (nCount > 0) { var deflectionNext = DBHelp.NewDb.Queryable() .Select(it => new { it.JH, it.BZB, it.DZB, it.JS, it.CS }) .Where(it => it.JH.Equals(wellName)) .Where(it => it.JS >= detection) .OrderBy(it => it.JS, OrderByType.Asc) .First(); var deflectionBefore = DBHelp.NewDb.Queryable() .Select(it => new { it.JH, it.BZB, it.DZB, it.JS, it.CS }) .Where(it => it.JH.Equals(wellName)) .Where(it => it.JS < detection) .OrderBy(it => it.JS, OrderByType.Desc) .First(); if (deflectionNext != null && deflectionBefore != null) { // 斜井,计算层位坐标 double dBefore = deflectionBefore.JS.Value; double dNext = deflectionNext.JS.Value; double dFactor = (detection - dBefore) / (dNext - dBefore); // 东坐标 double dOffsetX = (dFactor * (deflectionNext.DZB - deflectionBefore.DZB).Value) + deflectionBefore.DZB.Value; // 北坐标 double dOffsetY = (dFactor * (deflectionNext.BZB - deflectionBefore.BZB).Value) + deflectionBefore.BZB.Value; // 坐标X x = well.X.Value + dOffsetX; // 坐标Y y = well.Y.Value + dOffsetY; // 垂深 double dLastCS = deflectionBefore.CS.Value; double dNextCS = deflectionNext.CS.Value; vertical = (dFactor * (dNextCS - dLastCS)) + dLastCS; return true; } else if (deflectionNext == null && deflectionBefore != null) { // 仅有上层数据时 // 坐标X x = well.X.Value + deflectionBefore.DZB.Value; // 坐标Y y = well.Y.Value + deflectionBefore.BZB.Value; // 垂深 double dLastCS = deflectionBefore.CS.Value; vertical = dLastCS + (detection - deflectionBefore.JS.Value); return true; } else if (deflectionNext != null && deflectionBefore == null) { // 仅有下层数据时 double dBefore = 0; double dNext = deflectionNext.JS.Value; double dFactor = (detection - dBefore) / (dNext - dBefore); // 东坐标 double dOffsetX = dFactor * deflectionNext.DZB.Value; // 北坐标 double dOffsetY = dFactor * deflectionNext.BZB.Value; // 坐标X x = well.X.Value + dOffsetX; // 坐标Y y = well.Y.Value + dOffsetY; // 垂深 double dLastCS = 0; double dNextCS = deflectionNext.CS.Value; vertical = (dFactor * (dNextCS - dLastCS)) + dLastCS; return true; } } else { if (well != null) { x = well.X.Value; y = well.Y.Value; vertical = detection; return true; } } return false; } /// /// 创建井位分布图 /// /// 层位数据字典 /// 处理的层位 /// 是否成功 //public bool CreateWellDistributes(Dictionary layers, ProgressLayer action) //{ // foreach (var layer in layers.Keys) // { // this.CreateWellDistribute(layer, layers[layer], action); // } // return true; //} /// /// 创建工区井位分布图 /// /// 保存路径 /// /// /// //public bool CreateWorkspaceDistribute(string filePath, ProgressLayer action, LeafNodeData tag) //{ // Action writeWells = (drawFile) => // { // var template = tag.Param.OtherData; // var workWells = this.GetWorkspaceWells(template); // List wells = workWells.Select(w => $@"{w.JB},{w.JH}").ToList(); // tag.Param.OtherData.Wells = wells; // tag.Param.WriteData(); // 设置默认选中井 // using (StreamWriter sw = new StreamWriter(drawFile, true, Encoding.Default)) // { // foreach (var well in workWells) // { // sw.WriteLine($"Layer M {well.JB}"); // // 3dPoint X,Y,Z,0,井号 // sw.WriteLine($"3dPoint {well.X},{well.Y},{0} 0 {well.JH}"); // } // } // }; // var wResult = this.WriteWellDistributeFile(filePath, writeWells, action); // return wResult; //} //private bool WriteWellDistributeFile(string drawFile, Action writeWells, ProgressLayer action) //{ // // 写文件头 // DfdWriter dfdWriter = new DfdWriter(drawFile); // dfdWriter.WriteHead(false); // // 写符号 // string strSymbolFile = FileHelp.GetDefaultSymbolFile(); // if (!string.IsNullOrEmpty(strSymbolFile)) // { // string strSymbolData = string.Empty; // using (StreamReader sr = new StreamReader(strSymbolFile, Encoding.Default)) // { // strSymbolData = sr.ReadToEnd(); // } // using (StreamWriter sw = new StreamWriter(drawFile, true, Encoding.Default)) // { // sw.WriteLine(strSymbolData); // } // } // // 写井 // writeWells.Invoke(drawFile); // // 回调事件 // if (action != null) // { // action(drawFile, true); // } // return true; //} /// /// 创建井位分布图 /// /// 层位 /// 层位数据 /// 完成后的事件 /// 是否成功 //public bool CreateWellDistribute(string layerName, LeafNodeData nodeData, ProgressLayer action) //{ // bool isOk = false; // string drawFile = FileHelp.GetWellDeployFile(layerName); // if (nodeData.TreeType == TreeTypeClass.WellDeploy && File.Exists(drawFile)) // { // // 图件已存在不需要写井 // isOk = true; // } // var template = nodeData.Param.OtherData; // var lstWells = this.GetWellsFromDB(layerName, template); // if (lstWells.Count > 0) // { // drawFile = FileHelp.GetWellDistributeFile(layerName); // if (nodeData.TreeType == TreeTypeClass.WellDeploy) // { // drawFile = FileHelp.GetWellDeployFile(layerName); // } // // 写文件头 // DfdWriter dfdWriter = new DfdWriter(drawFile); // dfdWriter.WriteHead(false); // // 写符号 // string strSymbolFile = FileHelp.GetDefaultSymbolFile(); // if (!string.IsNullOrEmpty(strSymbolFile)) // { // CsharpFileUtility.DecodeOverrideFile(strSymbolFile); // string strSymbolData = string.Empty; // using (StreamReader sr = new StreamReader(strSymbolFile, Encoding.Default)) // { // strSymbolData = sr.ReadToEnd(); // } // using (StreamWriter sw = new StreamWriter(drawFile, true, Encoding.Default)) // { // sw.WriteLine(strSymbolData); // } // } // template.Wells = lstWells.Select(w => $@"{w.JB},{w.JH}").ToList(); // // 写井 // using (StreamWriter sw = new StreamWriter(drawFile, true, Encoding.Default)) // { // foreach (var well in lstWells) // { // // 井号 井别 X Y 垂深 测深 // sw.WriteLine($"Layer M {well.JB}"); // sw.WriteLine($"3dPoint {well.X},{well.Y},{well.SD} 0 {well.JH}"); // } // } // isOk = true; // } // // 回调事件 // action?.Invoke(layerName, isOk); // return isOk; //} /// /// 从数据库获得井的坐标和深度 /// /// 井数据: 井号 井别 X Y 垂深 测深 //private List<(string JH, string JB, double X, double Y, double CS, double SD)> GetWellsFromDB(string layerName, MergeTemplate template) //{ // var wells = new List<(string, string, double, double, double, double)>(); // var lstWells = DBHelp.NewDb.Queryable( // (layer, well) => new JoinQueryInfos(JoinType.Left, layer.JH == well.JH)) // .Where((layer, well) => layer.CW.ToUpper().Equals(SqlFunc.ToUpper(layerName))) // .Where((layer, well) => layer.SD != null) // .Where((layer, well) => layer.X != null) // .Select((layer, well) => new { well.CXB, well.JB, well.MQJB, layer.JH, layer.SD, layer.X, layer.Y, well.BXHB }) // .ToList(); // Dictionary dictJBs = new Dictionary(); // // 获取井别数据 // DataTable tbWell = DBHelp.Db.Queryable().ToDataTable(); // foreach (DataRow dr in tbWell.Rows) // { // string strLayer = BatchChartHelper.ParseWellLayerStrByMergeGroup(template.WellGroups, dr); // dictJBs.Add(dr["JH"] + string.Empty, strLayer); // if (!template.LegendLayers.Contains(strLayer)) // { // template.LegendLayers.Add(strLayer); // } // } // foreach (var well in lstWells) // { // var strJB = dictJBs.ContainsKey(well.JH) ? dictJBs[well.JH] : well.MQJB; // var sd = well.BXHB ?? 0; // var addCxb = template.WellGroups.Contains(nameof(well.CXB)) && !string.IsNullOrEmpty(well.CXB); // wells.Add((well.JH, // addCxb ? well.CXB + "\\" + strJB : strJB, // well.X.Value, // well.Y.Value, // 0D, // 垂深 // (well.SD.Value - sd) * -1)); // 测深 // } // return wells; //} ///// ///// 获取工区井位数据 ///// ///// ///// 井数据: 井号 井别 X Y //private List<(string JH, string JB, double X, double Y)> GetWorkspaceWells(MergeTemplate template) //{ // var wells = new List<(string, string, double, double)>(); // var wellGroup = DBHelp.NewDb.Queryable().Select(well => new { well.JH, well.JB, well.MQJB, well.X, well.Y, well.BXHB }) // .ToList(); // Dictionary dictJBs = new Dictionary(); // // 获取井别数据 // DataTable tbWell = DBHelp.Db.Queryable().ToDataTable(); // foreach (DataRow dr in tbWell.Rows) // { // string strLayer = BatchChartHelper.ParseWellLayerStrByMergeGroup(template.WellGroups, dr); // dictJBs.Add(dr["JH"] + string.Empty, strLayer); // if (!template.LegendLayers.Contains(strLayer)) // { // template.LegendLayers.Add(strLayer); // } // } // foreach (var well in wellGroup) // { // var strJB = dictJBs.ContainsKey(well.JH) ? dictJBs[well.JH] : well.MQJB; // wells.Add((well.JH, strJB, well.X.Value, well.Y.Value)); // } // //var wells = new List<(string, string, double, double, double)>(); // //var wellGroup = DBHelp.NewDb.Queryable().LeftJoin((well, l) => well.JH == l.JH) // // .Select((well, l) => new { well.JH, well.JB, well.MQJB, well.X, well.Y, l.SD, well.BXHB }) // // .ToList(); // //foreach (var well in wellGroup) // //{ // // string strJB = BatchChartHelper.GetJBNameByID(well.JB ?? well.MQJB); // // double z = 0f; // // if (well.SD.HasValue && well.SD.Value > 0 && well.BXHB.HasValue) // // { // // z = (well.SD.Value - well.BXHB.Value) * -1; // // } // // wells.Add((well.JH, strJB, well.X.Value, well.Y.Value, z)); // //} // return wells; //} /// /// 生成层位井分布数据 /// /// 层位名 /// 边界文件 /// 使用斜井 /// 是否成功 //public static bool CreateLayerWells(string layerName, string borderFile = null, bool useInclined = false) //{ // NtsGeometryServices.Instance = new NtsGeometryServices( // CoordinateArraySequenceFactory.Instance, // new PrecisionModel(1d), // 4326); // GeometryFactory gf = NtsGeometryServices.Instance.CreateGeometryFactory(); // // 读取计算配置 // GlobalSetting globalSetting = GlobalSetting.ReadFromFile(); // // 排除的井 // List lstWellsExclude = new List(); // string strFileAdjustExclude = FileHelp.GetAdjustFileExclude(TreeTypeClass.Deep.Type, layerName); // if (File.Exists(strFileAdjustExclude)) // { // using (StreamReader sw = new StreamReader( // File.Open(strFileAdjustExclude, FileMode.Open, FileAccess.Read), // Encoding.Default)) // { // string strLine; // while ((strLine = sw.ReadLine()) != null) // { // if (!string.IsNullOrWhiteSpace(strLine)) // { // lstWellsExclude.Add(strLine); // } // } // } // } // List lstBorder = new List(); // if (File.Exists(borderFile)) // { // List lstLine = new List(); // Xy reader = new Xy(); // bool bEncode = CsharpFileUtility.DecodeOverrideFile(borderFile); // reader.DfdRead(borderFile); // if (bEncode) // { // CsharpFileUtility.EncodeFile(borderFile); // } // foreach (DrawerElementBase element in reader.Elements) // { // if (element is DrawerLine drawerLine) // { // List coordinates = new List(); // foreach (DrawerLineNode node in drawerLine.Nodes) // { // coordinates.Add(new Coordinate(node.X, node.Y)); // } // if (coordinates.Count > 0) // { // if (coordinates[0] != coordinates[coordinates.Count - 1]) // { // coordinates.Add(new Coordinate(coordinates[0].X, coordinates[0].Y)); // } // Polygon polygon = gf.CreatePolygon(coordinates.ToArray()); // //lstBorder.Add(polygon.Buffer(1)); // lstBorder.Add(polygon); // } // } // } // } // List> wellData = new List>(); // //if (!useInclined) // //{ // //.Where((layer, wellBase) => SqlFunc.Subqueryable().Where(s => s.JH == layer.JH).NotAny()) // var straightWells = DBHelp.NewDb.Queryable( // (layer, wellBase) => new JoinQueryInfos(JoinType.Inner, layer.JH == wellBase.JH)) // .Where((layer, wellBase) => SqlFunc.ToUpper(layer.CW) == SqlFunc.ToUpper(layerName)) // .Where((layer, wellBase) => layer.SD > 0) // .Where((layer, wellBase) => wellBase.X != null) // .Select((layer, wellBase) => new { layer.JH, layer.CW, layer.SD, wellBase.BXHB, wellBase.X, layerX = layer.X, layerY = layer.Y, wellBase.Y, layer.CS_T }) // .ToList(); // // int nIndex = 0; // foreach (var well in straightWells) // { // // nIndex++; // // Trace.WriteLine($"{nIndex}: {well.JH}, {well.X}, {well.Y}, {well.SD}, {well.BXHB}"); // if (lstWellsExclude.Contains(well.JH)) // { // continue; // } // if (well.X == null || well.Y == null || well.X.Value * well.Y.Value == 0) // { // continue; // } // // 排除边界外的井 // if (lstBorder.Count > 0) // { // bool isOut = false; // foreach (Geometry border in lstBorder) // { // Point pt = gf.CreatePoint(new Coordinate(well.X.Value, well.Y.Value)); // if (!border.Contains(pt)) // { // isOut = true; // break; // } // } // if (isOut == true) // { // continue; // } // } // bool bWithKellyBushing = WorkspaceConfig.Instance.FindConfigValue("LayerAdjust", "UseKellyBushing", true); // double sd = well.SD ?? 0; // bool is_awry = DBHelp.Db.Queryable().Any(d => d.JH == well.JH); // double x = well.X.Value; // double y = well.Y.Value; // if (is_awry) // { // sd = well.CS_T ?? 0; // x = well.layerX.Value; // y = well.layerY.Value; // } // if (bWithKellyBushing) // { // // 已考虑了补心海拔 // wellData.Add(Tuple.Create( // well.JH, // x, // y, // sd - (well.BXHB ?? 0))); // } // else // { // wellData.Add(Tuple.Create( // well.JH, // x, // y, // sd)); // } // } // if (false) // { // //} // // 如果考虑斜井 // // 获得所有斜井井号 // //List> lstDefWell = new List>(); // //var lstDef = DBHelp.NewDb.Queryable( // // (def, well) => new JoinQueryInfos(JoinType.Left, def.JH == well.JH)) // // .Select((def, well) => new { JH = def.JH, well.BXHB }) // // .GroupBy(def => def.JH).ToList(); // //lstDef = DBHelp.NewDb.Queryable( // // (def, well) => new JoinQueryInfos(JoinType.Left, def.JH == well.JH)) // // .Select((def, well) => new { JH = def.JH, well.BXHB }) // // .MergeTable() // // .GroupBy(it => it.JH).ToList(); // DataTable dtLayerWellsDef = DBHelp.NewDb.Queryable( // (layer, wellBase) => new JoinQueryInfos(JoinType.Inner, layer.JH == wellBase.JH)) // // .Where((layer, wellBase) => layer.JH.Equals(wellName)) // .Where((layer, wellBase) => SqlFunc.ToUpper(layer.CW) == SqlFunc.ToUpper(layerName)) // .Where((layer, wellBase) => layer.SD > 0) // .Where((layer, wellBase) => wellBase.X != null) // .Where((layer, wellBase) => SqlFunc.Subqueryable().Where(s => s.JH == layer.JH).Any()) // .Select((layer, wellBase) => new { layer.JH, layer.SD, wellBase.BXHB, wellBase.X, wellBase.Y }) // //.OrderBy(it=>it.JH) // //.OrderBy(it=>it.SD) // .ToDataTable(); // // var lstDefWell = DBHelp.NewDb.Queryable().Select(it => it.JH).Distinct().ToList(); // DataTable dtDrill = DBHelp.NewDb.Queryable() // .Select(it => new { it.JH, it.BZB, it.DZB, it.JS, it.CS }) // //.Where(it => it.BZB != null && it.DZB != null) // .OrderBy(it => it.JH) // .OrderBy(it => it.CS) // .ToDataTable(); // // int n = lstDefWell.Count; // DataRowCollection drs = dtLayerWellsDef.Rows; // string wellName = string.Empty; // // 获得层位上的井,包括层位、测深 // foreach (DataRow drWell in drs) // { // wellName = drWell[0].ToString(); // JH-井号 // if (lstWellsExclude.Contains(wellName)) // { // continue; // } // // 排除边界外的井 // bool isOut = false; // foreach (Geometry border in lstBorder) // { // if (!border.Contains(new Point(Convert.ToDouble(drWell["X"]) // , Convert.ToDouble(drWell["Y"])))) // { // isOut = true; // break; // } // } // if (isOut == true) // { // continue; // } // // Trace.WriteLine(wellName); // // 目的层深度 // double dLayerDeepth = Convert.ToDouble(drWell[1]); // 垂深 AND CS>{dLayerDeepth}",JS ASC" // DataRow[] drsdeflection = dtDrill.Select( // $"JH='{wellName}'", "JS ASC"); // // 前后深度 // double dCSNext = double.MinValue; // double dCSBefore = double.MinValue; // double dDzbNext = 0; // DZB - // double dBzbNext = 0; // BZB // double dDzbBefore = 0; // DZB - // double dBzbBefore = 0; // BZB // for (int i = 0; i < drsdeflection.Length; i++) // { // //dCSNext = Convert.ToDouble(drsdeflection[i][4]); // if (double.TryParse($"{drsdeflection[i][4]}", out dCSNext) == false) // { // dCSNext = 0; // } // if (dCSNext >= dLayerDeepth) // { // if (double.TryParse($"{drsdeflection[i][2]}", out dDzbNext) == false) // { // dDzbNext = 0; // } // if (double.TryParse($"{drsdeflection[i][1]}", out dBzbNext) == false) // { // dBzbNext = 0; // } // //dDzbNext = Convert.ToDouble(drsdeflection[i][2]); // DZB - // //dBzbNext = Convert.ToDouble(drsdeflection[i][1]); // BZB // if (i == 0) // { // i++; // } // if (double.TryParse($"{drsdeflection[i - 1][4]}", out dCSBefore) == false) // { // dCSBefore = 0; // } // if (double.TryParse($"{drsdeflection[i - 1][2]}", out dDzbBefore) == false) // { // dDzbBefore = 0; // } // if (double.TryParse($"{drsdeflection[i - 1][1]}", out dBzbBefore) == false) // { // dBzbBefore = 0; // } // //dCSBefore = Convert.ToDouble(drsdeflection[i - 1][4]); // //dDzbBefore = Convert.ToDouble(drsdeflection[i - 1][2]); // //dBzbBefore = Convert.ToDouble(drsdeflection[i - 1][1]); // break; // } // 未考虑补心海拔 // } // if (dCSNext == double.MinValue || dCSBefore == double.MinValue) // { // continue; // } // // 斜井,计算层位坐标 // double dFactor = (dLayerDeepth - dCSBefore) / (dCSNext - dCSBefore); // double dOffsetX = (dFactor * (dDzbNext - dDzbBefore)) + dDzbBefore; // double dOffsetY = (dFactor * (dBzbNext - dBzbBefore)) + dBzbBefore; // // double dLastCS = deflectionBefore.CS.Value; // // double dNextCS = deflectionNext.CS.Value; // // double dCS = (dFactor * (dNextCS - dLastCS)) + dLastCS; // 垂深 // // 补心海拔 // bool bWithKellyBushing = WorkspaceConfig.Instance.FindConfigValue("LayerAdjust", "UseKellyBushing", true); // if (bWithKellyBushing) // { // object objBxhb = drWell["BXHB"]; // if (objBxhb != DBNull.Value && objBxhb != null) // { // dLayerDeepth -= Convert.ToDouble(objBxhb); // } // } // wellData.Add(Tuple.Create( // wellName, // Convert.ToDouble(drWell["X"]) + dOffsetX, // Convert.ToDouble(drWell["Y"]) + dOffsetY, // dLayerDeepth)); // } // } // int nWellCount = wellData.Count; // if (nWellCount == 0) // { // return false; // } // // 写入文件 // string wellFile = FileHelp.GetWellLayerDeepthAdjustFile(layerName); // StringBuilder strbContent = new StringBuilder(); // for (int i = 0; i < wellData.Count; i++) // { // strbContent.AppendLine($"{wellData[i].Item2},{wellData[i].Item3},{-wellData[i].Item4},{wellData[i].Item1}"); // } // File.WriteAllText(wellFile, strbContent.ToString(), Encoding.Default); // return true; //} /// /// 创建井位分布图 /// /// 井列表 /// 层位 /// 是否考虑斜井 /// 是否成功 public static bool CreateLayerWells(List wells, string layerName, bool useInclined = false) { List> wellData = new List>(); // 获得层位上的井,包括层位、测深 foreach (string wellName in wells) { if (!useInclined) { // 仅考虑直井 int nCount = DBHelp.NewDb.Queryable() .Select(it => new { it.JH }) .Where(it => it.JH.Equals(wellName)) .Count(); if (nCount > 0) { continue; } var straightWell = DBHelp.NewDb.Queryable( (layer, wellBase) => new JoinQueryInfos(JoinType.Inner, layer.JH == wellBase.JH)) .Where((layer, wellBase) => layer.JH.Equals(wellName)) .Where((layer, wellBase) => SqlFunc.ToUpper(layer.CW) == SqlFunc.ToUpper(layerName)) .Where((layer, wellBase) => layer.SD > 0) .Where((layer, wellBase) => wellBase.X != null) .Select((layer, wellBase) => new { layer.JH, layer.CW, layer.SD, wellBase.BXHB, wellBase.X, wellBase.Y }) .First(); if (straightWell == null) { continue; } wellData.Add(Tuple.Create( wellName, straightWell.X.Value, straightWell.Y.Value, (straightWell.SD - straightWell.BXHB).Value)); continue; } var layerWell = DBHelp.NewDb.Queryable( (layer, wellBase) => new JoinQueryInfos(JoinType.Inner, layer.JH == wellBase.JH)) .Where((layer, wellBase) => layer.JH.Equals(wellName)) .Where((layer, wellBase) => SqlFunc.ToUpper(layer.CW) == SqlFunc.ToUpper(layerName)) .Where((layer, wellBase) => layer.SD > 0) .Where((layer, wellBase) => wellBase.X != null) .Select((layer, wellBase) => new { layer.JH, layer.CW, layer.SD, wellBase.BXHB, wellBase.X, wellBase.Y }) .First(); if (layerWell == null) { continue; } // 目的层深度 double dLayerDeepth = layerWell.SD.Value; // TODO:考虑补心海拔 var deflectionNext = DBHelp.NewDb.Queryable() .Select(it => new { it.JH, it.BZB, it.DZB, it.JS, it.CS }) .Where(it => it.JH.Equals(wellName)) .Where(it => it.JS >= dLayerDeepth) .OrderBy(it => it.JS, OrderByType.Asc) .First(); var deflectionBefore = DBHelp.NewDb.Queryable() .Select(it => new { it.JH, it.BZB, it.DZB, it.JS, it.CS }) .Where(it => it.JH.Equals(wellName)) .Where(it => it.JS < dLayerDeepth) .OrderBy(it => it.JS, OrderByType.Desc) .First(); if (deflectionNext == null || deflectionBefore == null) { // 直井 wellData.Add(Tuple.Create(wellName, layerWell.X.Value, layerWell.Y.Value, (layerWell.SD - layerWell.BXHB).Value)); continue; } // 斜井,计算层位坐标 double dBefore = deflectionBefore.JS.Value; double dNext = deflectionNext.JS.Value; double dFactor = (dLayerDeepth - dBefore) / (dNext - dBefore); double dOffsetX = (dFactor * (deflectionNext.DZB - deflectionBefore.DZB).Value) + deflectionBefore.DZB.Value; double dOffsetY = (dFactor * (deflectionNext.BZB - deflectionBefore.BZB).Value) + deflectionBefore.BZB.Value; double dLastCS = deflectionBefore.CS.Value; double dNextCS = deflectionNext.CS.Value; double dCS = (dFactor * (dNextCS - dLastCS)) + dLastCS; // 垂深 wellData.Add(Tuple.Create(wellName, layerWell.X.Value + dOffsetX, layerWell.Y.Value + dOffsetY, dCS)); } int nWellCount = wellData.Count; if (nWellCount == 0) { return false; } // 写入文件 string wellFile = FileHelp.GetWellLayerDeepthAdjustFile(layerName); StringBuilder strbContent = new StringBuilder(); for (int i = 0; i < wellData.Count; i++) { strbContent.AppendLine($"{wellData[i].Item2},{wellData[i].Item3},{-wellData[i].Item4},{wellData[i].Item1}"); } File.WriteAllText(wellFile, strbContent.ToString(), Encoding.Default); return true; } /// /// 创建储层数据 /// /// 数据类型 /// 层位名称 /// 子类型 /// 是否成功 //public static bool CreateReservoir(TreeTypeClass dataType, string layerName, int subType) //{ // List lstLayerData = CreateReservoirData(dataType, layerName, subType); // if (lstLayerData.Count > 0) // { // string inputXYZFile = FileHelp.GetTuneFileByReservoirData(dataType.GetDir(subType), layerName); // FileHelp.DeleteFile(inputXYZFile); // List noExcludeWells = new List(); // //剔除井数据获取 // var ccsjWells = DBHelp.Db.Queryable().Where(x => x.SJLX == dataType.Text && x.CW == layerName).Select(x => x.JH).ToList(); // if (ccsjWells != null) // { // noExcludeWells.AddRange(ccsjWells); // } // using (StreamWriter sw = new StreamWriter(inputXYZFile, false, Encoding.Default)) // { // foreach (ReservoirEntity dr in lstLayerData) // { // if (dr == null) // { // continue; // } // if (!noExcludeWells.Contains(dr.JH)) // { // sw.WriteLine($"{dr.X},{dr.Y},{dr.DATA},{dr.JH}"); // } // } // } // return true; // } // return false; //} /// /// 创建分层数据 /// /// 数据类型 /// 层位名称 /// 深度类型 /// 是否成功 //public static bool CreateDrillWellLayer(string dataType, string layerName, GeoLayerDepthType depthType) //{ // List lstLayerData = CreateDrillWellLayerData(layerName, depthType); // if (lstLayerData.Count > 0) // { // string inputXYZFile = FileHelp.GetMiddleFile(dataType, layerName, ".xyz"); // FileHelp.DeleteFile(inputXYZFile); // using (StreamWriter sw = new StreamWriter(inputXYZFile, false, Encoding.Default)) // { // foreach (InterpretDrillWellLayered dr in lstLayerData) // { // if (dr == null) // { // continue; // } // sw.WriteLine($"{dr.X},{dr.Y},{dr.SD},{dr.JH}"); // } // } // return true; // } // return false; //} /// /// Creates the adjust reservoir. /// /// The data type. /// The layer name. /// The inputXYZFile name. /// A bool. //public static bool CreateAdjustReservoir(TreeTypeClass dataType, string layerName, string inputXYZFile, int subType) //{ // if (string.IsNullOrWhiteSpace(inputXYZFile)) // { // inputXYZFile = FileHelp.GetAdjustFileByReservoirData(dataType.GetDir(subType), layerName); // } // var wellFile = FileHelp.GetReservoirAdjustFileByReservoirData(dataType.GetDir(subType), layerName); // List lstLayerData = CreateReservoirData(dataType, layerName, subType); // if (lstLayerData.Count > 0) // { // var strLayerAdjustFileXyzContent = new StringBuilder(); // var strLayerAdjustFileCsvContent = new StringBuilder(); // foreach (ReservoirEntity dr in lstLayerData) // { // if (dr == null) // { // continue; // } // strLayerAdjustFileXyzContent.AppendLine($"{dr.X},{dr.Y},{dr.DATA}"); // strLayerAdjustFileCsvContent.AppendLine($"{dr.X},{dr.Y},{dr.DATA},{dr.JH}"); // } // File.WriteAllText(inputXYZFile, strLayerAdjustFileXyzContent.ToString(), Encoding.Default); // File.WriteAllText(wellFile, strLayerAdjustFileCsvContent.ToString(), Encoding.Default); // return true; // } // return false; //} /// /// 通过层级获取储层分层下级所有层 /// /// 层级 /// 是否包含子层 /// 储层数据 //public static List GetReservoirChildLayers(int layerLevel, bool includeChild = false) //{ // if (!includeChild) // { // return DBHelp.NewDb.Queryable().Where(it => it.Level == layerLevel).Select(x => x.Code).ToList(); // } // List lstLayerName = new List(); // int nNodeID = DBHelp.NewDb.Queryable() // .Where(it => it.Level == layerLevel).Select(it => it.ID).First(); // List lstLayer = DBHelp.NewDb.Queryable() // .ToChildList(it => it.ParentID, nNodeID); // foreach (GeologicalStratification layer in lstLayer) // { // string strChildName = layer.Code.ToUpper(); // if (!lstLayerName.Contains(strChildName)) // { // lstLayerName.Add(strChildName); // } // } // lstLayerName = lstLayerName.Select(s => s.ToUpper()).ToList(); // return lstLayerName; //} /// /// 通过层名获取储层分层下级所有层 /// /// 层位名称 /// 储层数据 public static List GetReservoirChildLayers(string layerName) { layerName = layerName.ToUpper(); int nNodeID = DBHelp.NewDb.Queryable().Where(it => SqlFunc.ToUpper(it.Code) == layerName).Select(it => it.ID).First(); List lstLayer = DBHelp.NewDb.Queryable().ToChildList(it => it.ParentID, nNodeID); List lstLayerName = new List { layerName, }; foreach (GeologicalStratification layer in lstLayer) { string strChildName = layer.Code; if (!lstLayerName.Any(x => x.Equals(strChildName, StringComparison.CurrentCultureIgnoreCase))) { lstLayerName.Add(strChildName); } } lstLayerName = lstLayerName.Select(s => s.ToUpper()).ToList(); return lstLayerName; } /// /// 创建储层数据 /// /// 数据类型 /// 层位名称 /// 储层数据 //public static List CreateReservoirData(TreeTypeClass dataType, string layerName, int subType) //{ // List lstLayerName = GetReservoirChildLayers(layerName); // return CreateReservoirData(dataType, layerName, lstLayerName, subType); //} ///// ///// 创建储层数据 ///// ///// 数据类型 ///// 层位名称 ///// 下级层位名称 ///// 储层数据 //public static List CreateReservoirData(TreeTypeClass dataType, string layerName, List lstLayerName, int subType) //{ // GeoLayerDepthType depthType = (GeoLayerDepthType)subType; // bool isAvg = WorkspaceConfig.Instance.FindConfigValue("ReservoirSet", "KsbCalcModel", 0) == 0 ? true : false; // List lstLayerData = null; // if (dataType == TreeTypeClass.Porosity || dataType == TreeTypeClass.InterpretPorosity) // { // // 孔隙度 // var result = DBHelp.NewDb.Queryable((layer, well) => // new JoinQueryInfos(JoinType.Left, layer.JH == well.JH)) // .Where((layer, well) => lstLayerName.Contains(SqlFunc.ToUpper(layer.CW))) // .Where((layer, well) => layer.KXD != null && layer.KXD.HasValue) // .Where((layer, well) => layer.X > 0) // .Where((layer, well) => layer.Y > 0) // .Where((layer, well) => (layer.DJSD1 != null && layer.DJSD1.Value > 0)) // .OrderBy((layer, well) => new { layer.JH, layer.CW }) // .Select((layer, well) => new // { // well.CXB, // well.MQJB, // layer.JH, // layer.DJSD1, // layer.X, // layer.Y, // layer.CW, // layer.KXD, // layer.YXHD, // layer.YXHD_CS, // }).ToList(); // List lstReservoir = result.OrderBy(x => x.JH).Select(x => new ReservoirEntity() // { // CXB = x.CXB, // MQJB = x.MQJB, // JH = x.JH, // SD = x.DJSD1.Value, // X = x.X.Value, // Y = x.Y.Value, // Layer = x.CW, // DATA = x.KXD.Value, // KXD = x.KXD.Value, // YXHD = depthType == GeoLayerDepthType.测深厚度 ? x.YXHD.GetValueOrDefault(0) : x.YXHD_CS.GetValueOrDefault(0), // }).ToList(); // if (isAvg) // { // lstLayerData = AverageRows(lstReservoir); // } // else // { // lstLayerData = PorosityAverageRows(lstReservoir); // } // lstLayerData = lstLayerData.Where(x => !double.IsNaN(x.DATA)).ToList(); // } // else if (dataType == TreeTypeClass.Permeability || dataType == TreeTypeClass.InterpretPenetration) // { // // 渗透率 // var result = DBHelp.NewDb.Queryable((layer, well) => // new JoinQueryInfos(JoinType.Left, layer.JH == well.JH)) // .Where((layer, well) => lstLayerName.Contains(SqlFunc.ToUpper(layer.CW))) // .Where((layer, well) => layer.STL != null && layer.STL.HasValue) // .Where((layer, well) => layer.X > 0) // .Where((layer, well) => layer.Y > 0) // .Where((layer, well) => (layer.DJSD1 != null && layer.DJSD1.Value > 0)) // .Select((layer, well) => new // { // well.CXB, // well.MQJB, // layer.JH, // layer.DJSD1, // layer.X, // layer.Y, // layer.CW, // layer.STL, // layer.YXHD, // layer.YXHD_CS, // }).ToList(); // List lstReservoir = result.OrderBy(x => x.JH).Select(x => new ReservoirEntity() // { // CXB = x.CXB, // MQJB = x.MQJB, // JH = x.JH, // SD = x.DJSD1.Value, // X = x.X.Value, // Y = x.Y.Value, // Layer = x.CW, // DATA = x.STL.Value, // STL = x.STL.Value, // YXHD = depthType == GeoLayerDepthType.测深厚度 ? x.YXHD.GetValueOrDefault(0) : x.YXHD_CS.GetValueOrDefault(0), // }).ToList(); // if (isAvg) // { // lstLayerData = AverageRows(lstReservoir); // } // else // { // lstLayerData = PorosityAverageRows(lstReservoir); // } // lstLayerData = lstLayerData.Where(x => !double.IsNaN(x.DATA)).ToList(); // } // else if (dataType == TreeTypeClass.CcsjSyhd || dataType == TreeTypeClass.InterpretSandThickness) // { // // 砂岩厚度 // var result = DBHelp.NewDb.Queryable((layer, well) => // new JoinQueryInfos(JoinType.Left, layer.JH == well.JH)) // .Where((layer, well) => lstLayerName.Contains(SqlFunc.ToUpper(layer.CW))) // .Where((layer, well) => layer.SYHD != null) // .Where((layer, well) => layer.X > 0) // .Where((layer, well) => layer.Y > 0) // .OrderBy((layer, well) => new { layer.JH, layer.SYSD_T }) // .Select((layer, well) => new // { // well.CXB, // well.MQJB, // layer.JH, // layer.SYSD_T, // layer.X, // layer.Y, // layer.CW, // layer.SYHD, // layer.SYCS_HD, // }) // .ToList(); // List lstReservoir = result.OrderBy(x => x.JH).Select(x => new ReservoirEntity() // { // CXB = x.CXB, // MQJB = x.MQJB, // JH = x.JH, // SD = x.SYSD_T, // X = x.X.Value, // Y = x.Y.Value, // Layer = x.CW, // DATA = depthType == GeoLayerDepthType.测深厚度 ? x.SYHD.GetValueOrDefault(double.NaN) : x.SYCS_HD.GetValueOrDefault(double.NaN), // SYHD = depthType == GeoLayerDepthType.测深厚度 ? x.SYHD.GetValueOrDefault(double.NaN) : x.SYCS_HD.GetValueOrDefault(double.NaN), // }).ToList(); // lstLayerData = SumRows(lstReservoir, layerName); // } // else if (dataType == TreeTypeClass.CcsjYxhd || dataType == TreeTypeClass.InterpretVaildThickness) // { // // 有效厚度 // var result = DBHelp.NewDb.Queryable((layer, well) => // new JoinQueryInfos(JoinType.Left, layer.JH == well.JH)) // .Where((layer, well) => lstLayerName.Contains(SqlFunc.ToUpper(layer.CW))) // .Where((layer, well) => layer.YXHD != null) // .Where((layer, well) => layer.X > 0) // .Where((layer, well) => layer.Y > 0) // .OrderBy((layer, well) => new { layer.JH, layer.DJSD1 }) // .Select((layer, well) => new // { // well.CXB, // well.MQJB, // layer.JH, // layer.DJSD1, // layer.X, // layer.Y, // layer.YXHD, // layer.YXCS_HD, // layer.CW, // }).ToList(); // List lstReservoir = result.OrderBy(x => x.JH).Select(x => new ReservoirEntity() // { // CXB = x.CXB, // MQJB = x.MQJB, // JH = x.JH, // SD = x.DJSD1, // X = x.X.Value, // Y = x.Y.Value, // DATA = depthType == GeoLayerDepthType.测深厚度 ? x.YXHD.GetValueOrDefault(double.NaN) : x.YXCS_HD.GetValueOrDefault(double.NaN), // YXHD = depthType == GeoLayerDepthType.测深厚度 ? x.YXHD.GetValueOrDefault(double.NaN) : x.YXCS_HD.GetValueOrDefault(double.NaN), // Layer = x.CW, // }).ToList(); // lstLayerData = SumRows(lstReservoir, layerName); // } // else if (dataType == TreeTypeClass.WaterSaturation || dataType == TreeTypeClass.InterpretSaturation) // { // // 含水饱和度 // var q = DBHelp.NewDb.Queryable((layer, well) => new JoinQueryInfos(JoinType.Left, layer.JH == well.JH)) // .Where((layer, well) => lstLayerName.Contains(SqlFunc.ToUpper(layer.CW))) // .Where((layer, well) => layer.HSBHD != null && layer.HSBHD.HasValue) // .Where((layer, well) => layer.X > 0) // .Where((layer, well) => layer.Y > 0) // .Where((layer, well) => (layer.DJSD1 != null && layer.DJSD1.Value > 0)); // if (!isAvg) // { // q = q.Where((layer, well) => layer.KXD != null && layer.YXHD != null && layer.KXD.HasValue && layer.YXHD.HasValue); // } // var result = q.Select((layer, well) => new // { // well.CXB, // well.MQJB, // layer.JH, // layer.DJSD1, // layer.X, // layer.Y, // layer.CW, // layer.HSBHD, // layer.YXHD, // layer.YXHD_CS, // layer.KXD, // }).ToList(); // List lstReservoir = result.OrderBy(x => x.JH).Select(x => new ReservoirEntity() // { // CXB = x.CXB, // MQJB = x.MQJB, // JH = x.JH, // SD = x.DJSD1.Value, // X = x.X.Value, // Y = x.Y.Value, // Layer = x.CW, // DATA = x.HSBHD.Value, // BHD = x.HSBHD.Value, // YXHD = depthType == GeoLayerDepthType.测深厚度 ? x.YXHD.GetValueOrDefault(0) : x.YXHD_CS.GetValueOrDefault(0), // KXD = x.KXD.GetValueOrDefault(0), // }).ToList(); // if (isAvg) // { // lstLayerData = AverageRows(lstReservoir); // } // else // { // lstLayerData = SaturationAverageRows(lstReservoir); // } // lstLayerData = lstLayerData.Where(x => !double.IsNaN(x.DATA)).ToList(); // } // else if (dataType == TreeTypeClass.BeamWaterSaturation) // { // // 束水饱和度 // var result = DBHelp.NewDb.Queryable((layer, well) => new JoinQueryInfos(JoinType.Left, layer.JH == well.JH)) // .Where((layer, well) => lstLayerName.Contains(SqlFunc.ToUpper(layer.CW))) // .Where((layer, well) => layer.HSBHD != null) // .Where((layer, well) => layer.X > 0) // .Where((layer, well) => layer.Y > 0) // .Where((layer, well) => (layer.DJSD1 != null && layer.DJSD1.Value > 0)) // .Select((layer, well) => new // { // well.CXB, // well.MQJB, // layer.JH, // layer.DJSD1, // layer.X, // layer.Y, // layer.CW, // layer.HSBHD, // layer.YXHD, // layer.YXHD_CS, // layer.KXD, // }).ToList(); // List lstReservoir = result.OrderBy(x => x.JH).Select(x => new ReservoirEntity() // { // CXB = x.CXB, // MQJB = x.MQJB, // JH = x.JH, // SD = x.DJSD1.Value, // X = x.X.Value, // Y = x.Y.Value, // Layer = x.CW, // DATA = x.HSBHD.Value, // BHD = x.HSBHD.Value, // YXHD = depthType == GeoLayerDepthType.测深厚度 ? x.YXHD.GetValueOrDefault(0) : x.YXHD_CS.GetValueOrDefault(0), // KXD = x.KXD.Value, // }).ToList(); // if (isAvg) // { // lstLayerData = AverageRows(lstReservoir); // } // else // { // lstLayerData = SaturationAverageRows(lstReservoir); // } // lstLayerData = lstLayerData.Where(x => !double.IsNaN(x.DATA)).ToList(); // } // return lstLayerData; //} ///// ///// 创建井分层数据 ///// ///// 层位名称 ///// 类型名称 ///// List //public static List CreateDrillWellLayerData(string layerName, GeoLayerDepthType depthType = GeoLayerDepthType.测深厚度) //{ // // 井分层 // // 获取层 // List lstLayerName = GetReservoirChildLayers(layerName); // List lstLayerData = DBHelp.NewDb.Queryable().Where(d => lstLayerName.Contains(SqlFunc.ToUpper(d.CW)) && d.X.HasValue && d.Y.HasValue).Select(d => new InterpretDrillWellLayered // { // CW = d.CW, // X = d.X, // Y = d.Y, // DJSD = depthType == GeoLayerDepthType.测深厚度 ? (d.DJSD ?? 0) : (depthType == GeoLayerDepthType.海拔 ? d.HBSD2 ?? 0 : d.CS_B ?? 0), // SD = depthType == GeoLayerDepthType.测深厚度 ? (d.SD ?? 0) : (depthType == GeoLayerDepthType.海拔 ? d.HBSD1 ?? 0 : d.CS_T ?? 0), // JH = d.JH, // }).ToList(); // //按井分组求和 // var lstResult = lstLayerData.GroupBy(x => x.JH).Select(x => new InterpretDrillWellLayered() // { // JH = x.Key, // CW = x.First().CW, // X = x.First().X, // Y = x.First().Y, // SD = depthType == GeoLayerDepthType.海拔 ? x.Max(c => c.SD) : x.Min(c => c.SD), // }).ToList(); // return lstResult; //} /// /// 求和算法 /// /// The lst reservoir. /// The parent layer. /// A list of ReservoirEntities. private static List SumRows(List lstReservoir, string parentLayer) { List wells = lstReservoir.Select(e => e.JH).Distinct().ToList(); List lstLayerData = new List(); foreach (string well in wells) { List layerData = lstReservoir.Where(it => it.JH == well && it.Layer == parentLayer).ToList(); if (layerData.Count > 0) { ReservoirEntity entityPush = WorkData.ObjectClone.CloneFrom(layerData[0]); entityPush.DATA = 0; foreach (ReservoirEntity item in layerData) { entityPush.DATA += item.DATA; } lstLayerData.Add(entityPush); continue; } // 累加所有子层 layerData = lstReservoir.Where(it => it.JH == well && it.Layer != parentLayer).ToList(); if (layerData.Count > 0) { ReservoirEntity entityPush = WorkData.ObjectClone.CloneFrom(layerData[0]); entityPush.DATA = 0; foreach (ReservoirEntity item in layerData) { entityPush.DATA += item.DATA; } lstLayerData.Add(entityPush); } } return lstLayerData; } /// /// 平均值 /// /// The lst reservoir. /// A list of ReservoirEntities. private static List AverageRows(List lstReservoir) { List lstLayerData = new List(); if (lstReservoir.Count == 0) { return lstLayerData; } int nCount = 0; double dDataSum = 0; ReservoirEntity entityPush = WorkData.ObjectClone.CloneFrom(lstReservoir.FirstOrDefault()); foreach (ReservoirEntity item in lstReservoir) { if (!entityPush.JH.Equals(item.JH)) { entityPush.DATA = dDataSum / nCount; lstLayerData.Add(entityPush); entityPush = WorkData.ObjectClone.CloneFrom(item); nCount = 0; dDataSum = 0; } nCount++; dDataSum += item.DATA; } entityPush.DATA = Math.Round(dDataSum / nCount, 2); lstLayerData.Add(entityPush); return lstLayerData; } /// /// 孔隙度/渗透率加权算法值 /// /// The lst reservoir. /// A list of ReservoirEntities. private static List PorosityAverageRows(List lstReservoir) { List lstLayerData = new List(); if (lstReservoir.Count == 0) { return lstLayerData; } ReservoirEntity entityPush = WorkData.ObjectClone.CloneFrom(lstReservoir.FirstOrDefault()); double kxdSum = 0; double yxhdSum = 0; entityPush = lstReservoir.FirstOrDefault(); foreach (ReservoirEntity item in lstReservoir) { if (!entityPush.JH.Equals(item.JH)) { // 保存上一条数据 entityPush.DATA = kxdSum / yxhdSum; lstLayerData.Add(entityPush); // 生成新的数据 entityPush = WorkData.ObjectClone.CloneFrom(item); kxdSum = 0; yxhdSum = 0; } kxdSum += item.DATA * item.YXHD; yxhdSum += item.YXHD; } // 保存最一条数据 entityPush.DATA = Math.Round(kxdSum / yxhdSum, 2); lstLayerData.Add(entityPush); return lstLayerData; } /// /// 饱和度加权算法值 /// /// The lst reservoir. /// A list of ReservoirEntities. private static List SaturationAverageRows(List lstReservoir) { List lstLayerData = new List(); if (lstReservoir.Count == 0) { return lstLayerData; } double kxdSum = 0; double yxhdSum = 0; ReservoirEntity entityPush = WorkData.ObjectClone.CloneFrom(lstReservoir.FirstOrDefault()); foreach (ReservoirEntity item in lstReservoir) { if (!entityPush.JH.Equals(item.JH)) { // 保存上一条数据 entityPush.DATA = kxdSum / yxhdSum; lstLayerData.Add(entityPush); // 生成新的数据 entityPush = WorkData.ObjectClone.CloneFrom(item); kxdSum = 0; yxhdSum = 0; } kxdSum += item.KXD * item.YXHD * item.BHD; yxhdSum += item.KXD * item.YXHD; } entityPush.DATA = Math.Round(kxdSum / yxhdSum, 2); lstLayerData.Add(entityPush); return lstLayerData; } /// /// 储层计算临时类 /// public class ReservoirEntity { public string CXB { get; set; } public string MQJB { get; set; } public string JH { get; set; } = string.Empty; public double? SD { get; set; } public double X { get; set; } public double Y { get; set; } /// /// 数据 /// public double DATA { get; set; } /// /// 层位 /// public string Layer { get; set; } /// /// 孔隙度 /// public double KXD { get; set; } /// /// 有效厚度 /// public double YXHD { get; set; } /// /// 饱和度 /// public double BHD { get; set; } /// /// 渗透率 /// public double STL { get; set; } /// /// 砂岩厚度 /// public double SYHD { get; set; } } } }