private void btnCalResult_Click(object sender, EventArgs e) { sSelectedLayer = cbbSelectedLayerName.SelectedItem.ToString(); List <ItemDicLayerDataStatic> listDicLayer = cIODicLayerDataStatic.readDicLayerData2struct(); ItemDicLayerDataStatic wellInjectLayerdata = listDicLayer.Find(p => p.sJH == this.cbbWellInject.SelectedItem.ToString() && p.sXCM == sSelectedLayer); for (int i = 0; i < dgvInj2Pro.RowCount - 1; i++) { string sJHProdcut = dgvInj2Pro.Rows[i].Cells[1].Value.ToString(); ItemDicLayerDataStatic wellProductLayerdata = listDicLayer.Find(p => p.sJH == sJHProdcut && p.sXCM == sSelectedLayer); //计算井距 double distance = cCalDistance.calDistance2D(wellInjectLayerdata.dbX, wellInjectLayerdata.dbY, wellProductLayerdata.dbX, wellProductLayerdata.dbY); dgvInj2Pro.Rows[i].Cells[2].Value = distance.ToString("0.0"); //根据井号和小层名查累积射开厚度 ItemDicPerforation performItem = cIOinputWellPerforation.getItemByJHandXCM(sJHProdcut, sSelectedLayer); dgvInj2Pro.Rows[i].Cells[3].Value = performItem.fSKHD.ToString("0.0"); //根据井号和小层名查吸水比例 ItemDicInjectProfile profileItem = cIOinputInjectProfile.getItemByJHandXCM(sJHProdcut, sSelectedLayer); dgvInj2Pro.Rows[i].Cells[4].Value = profileItem.fPercentZR.ToString("0.0"); dgvInj2Pro.Rows[i].Cells[5].Value = profileItem.fXSHD.ToString("0.0"); //小层数据表选项 dgvInj2Pro.Rows[i].Cells[6].Value = wellProductLayerdata.fKXD.ToString("0.0"); dgvInj2Pro.Rows[i].Cells[7].Value = wellProductLayerdata.fSTL.ToString("0.0"); dgvInj2Pro.Rows[i].Cells[8].Value = sSelectedLayer; } // cCalDistance.calWellHeadWellDistance(sInjectWellSelected, ltStrSelectedJH, fileName); //cPublicMethodForm.read2DataGridViewByTextFile(fileName, this.dgvInj2Pro); }
public static List <ItemDicLayerDataStatic> readDicLayerData2struct() { List <ItemDicLayerDataStatic> ltStrReturn = new List <ItemDicLayerDataStatic>(); int iLineIndex = 0; if (File.Exists(cProjectManager.filePathLayerDataDic)) { using (StreamReader sr = new StreamReader(cProjectManager.filePathLayerDataDic)) { String line; while ((line = sr.ReadLine()) != null) //delete the line whose legth is 0 { iLineIndex++; if (iLineIndex > 1) { ltStrReturn.Add(ItemDicLayerDataStatic.parseLine(line)); } } } } else { MessageBox.Show("请先计算小层数据表。"); } return(ltStrReturn); }
private void btnCalResult_Click(object sender, EventArgs e) { string sInjectWellSelected = this.cbbJH.SelectedItem.ToString(); List <string> ltSelectedJH = cPublicMethodForm.ltStrSelectedItemsReturnFromListBox(listBoxJH); string fileName = Path.Combine(cProjectManager.dirPathTemp, sInjectWellSelected + "-WellDistance.txt"); string sXCM = cbbXCM.SelectedItem.ToString(); string sJH = cbbJH.SelectedItem.ToString(); List <ItemDicLayerDataStatic> listCurrentLayerData = cIODicLayerDataStatic.readDicLayerData2struct().FindAll(p => p.sXCM == sXCM); ItemDicLayerDataStatic currentItem = listCurrentLayerData.Find(p => p.sJH == sJH); StreamWriter sw = new StreamWriter(fileName, false, Encoding.UTF8); if (listCurrentLayerData.Count > 0) { foreach (ItemDicLayerDataStatic goalItem in listCurrentLayerData.FindAll(p => ltSelectedJH.Contains(p.sJH))) { List <string> ltStrWrited = new List <string>(); double distance = cCalDistance.calDistance2D(currentItem.dbX, currentItem.dbY, goalItem.dbX, goalItem.dbY); ltStrWrited.Add(sXCM); ltStrWrited.Add(sJH); ltStrWrited.Add(goalItem.sJH); ltStrWrited.Add(distance.ToString("0.00")); sw.WriteLine(string.Join("\t", ltStrWrited.ToArray())); } } sw.Close(); cPublicMethodForm.read2DataGridViewByTextFile(fileName, this.dgvWellDistance); }
public ItemWellMapPosition(ItemDicLayerDataStatic item) { this.sJH = item.sJH; this.sXCM = item.sXCM; this.dbX = item.dbX; this.dbY = item.dbY; this.dbTop = item.fDS1_md; this.dbBot = item.fDS2_md; this.iWellType = cProjectData.ltProjectWell.Find(p => p.sJH == item.sJH).iWellType; }
void initialDataFromXMLfile() { XmlDocument xmlLayerMap = new XmlDocument(); xmlLayerMap.Load(filePathLayerCss); XmlNode xnLayer = xmlLayerMap.SelectSingleNode("/LayerMapConfig/BaseInfor/XCM"); if (xnLayer != null) { sSelectLayer = xnLayer.InnerText; } XmlNode xnYM = xmlLayerMap.SelectSingleNode("/LayerMapConfig/BaseInfor/YM"); if (xnYM != null) { sSelectYM = xnYM.InnerText; } //如果存在 静态数据节点 赋值 XmlNode xnStatic = xmlLayerMap.SelectSingleNode("/LayerMapConfig/DataDicStatic"); if (xnStatic != null && xnStatic.Attributes["XCM"].Value == sSelectLayer) { XmlNodeList xnlist = xnStatic.SelectNodes("data/item"); //解析进List listLayersDataCurrentLayerStatic.Clear(); foreach (XmlNode xn in xnlist) { listLayersDataCurrentLayerStatic.Add(ItemDicLayerDataStatic.parseLine(xn.InnerText)); } } //如果存在 存在动态数据节点 赋值 XmlNode xnDynamic = xmlLayerMap.SelectSingleNode("/LayerMapConfig/DataDicDynamic"); if (xnDynamic != null && xnDynamic.Attributes["XCM"].Value == sSelectLayer && xnDynamic.Attributes["YM"].Value == sSelectYM) { XmlNodeList xnlist = xnStatic.SelectNodes("item"); //解析进List //listLayersDataCurrentLayerDynamic.Clear(); //foreach (XmlNode xn in xnlist) //{ // listLayersDataCurrentLayerDynamic.Add(ItemDicLayerDataDynamic.parseLine(xn.InnerText)); //} } }
public static List <ItemDicLayerDataStatic> getListLayerDataDicItemFromLayerDataDicByXCM(string sXCM) { List <ItemDicLayerDataStatic> ltStrReturn = new List <ItemDicLayerDataStatic>(); string[] split; int iLineIndex = 0; using (StreamReader sr = new StreamReader(cProjectManager.filePathLayerDataDic)) { String line; while ((line = sr.ReadLine()) != null) //delete the line whose legth is 0 { iLineIndex++; ItemDicLayerDataStatic sttLayerDataDicItem = new ItemDicLayerDataStatic(); split = line.Trim().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (iLineIndex > 1 && split.Count() >= 12 && split[1] == sXCM) { sttLayerDataDicItem.sJH = split[0]; sttLayerDataDicItem.sXCM = split[1]; sttLayerDataDicItem.dbX = double.Parse(split[2]); sttLayerDataDicItem.dbY = double.Parse(split[3]); sttLayerDataDicItem.dbZ = double.Parse(split[4]); sttLayerDataDicItem.fSH = float.Parse(split[5]); sttLayerDataDicItem.fYXHD = float.Parse(split[6]); sttLayerDataDicItem.fKXD = float.Parse(split[7]); sttLayerDataDicItem.fSTL = float.Parse(split[8]); sttLayerDataDicItem.fBHD = float.Parse(split[9]); sttLayerDataDicItem.fDS1_md = float.Parse(split[10]); sttLayerDataDicItem.fDS2_md = float.Parse(split[11]); sttLayerDataDicItem.fDS1_TVD = float.Parse(split[12]); } } } return(ltStrReturn); }
public static string item2string(ItemDicLayerDataStatic item) { List <string> ltStrWrited = new List <string>(); ltStrWrited.Add(item.sJH); ltStrWrited.Add(item.sXCM); ltStrWrited.Add(item.dbX.ToString()); ltStrWrited.Add(item.dbY.ToString()); ltStrWrited.Add(item.dbZ.ToString()); ltStrWrited.Add(item.fDCHD.ToString()); ltStrWrited.Add(item.fSH.ToString()); ltStrWrited.Add(item.fYXHD.ToString()); ltStrWrited.Add(item.fKXD.ToString()); ltStrWrited.Add(item.fSTL.ToString()); ltStrWrited.Add(item.fBHD.ToString()); ltStrWrited.Add(item.fDS1_md.ToString()); ltStrWrited.Add(item.fDS2_md.ToString()); ltStrWrited.Add(item.fDS1_TVD.ToString()); return(string.Join("\t", ltStrWrited.ToArray())); }
private void btnSelectWorkWells_Click(object sender, EventArgs e) { if (rdbALLayer.Checked == true) { listLayersDataCurrentLayerDynamic = cIODicLayerDataDynamic.readDicLayerData2struct(sSelectYM, cProjectData.sAllLayer); } else { listLayersDataCurrentLayerDynamic = cIODicLayerDataDynamic.readDicLayerData2struct(sSelectYM, sSelectLayer); } //增加当前动态字典数据 cXMLLayerMapDynamic.addWellDynamicDataDic2XML(filePathOperate, sSelectYM, sSelectLayer, listLayersDataCurrentLayerDynamic); List <ItemWellMapPosition> listWellsDynamic = new List <ItemWellMapPosition>(); foreach (ItemDicLayerDataDynamic itemDynamicLayerData in listLayersDataCurrentLayerDynamic) { ItemWellMapPosition itemWellDynamic = new ItemWellMapPosition(); if (itemDynamicLayerData.iWellType != 0) //remove well not work { itemWellDynamic.sJH = itemDynamicLayerData.sJH; itemWellDynamic.sXCM = sSelectLayer; //here use globe sSelectLayer because user may select ALLLayerData ItemDicLayerDataStatic itemStaitic = listLayersDataCurrentLayerStatic.Find(p => p.sJH == itemWellDynamic.sJH && p.sXCM == sSelectLayer); itemWellDynamic.dbX = itemStaitic.dbX; itemWellDynamic.dbY = itemStaitic.dbY; itemWellDynamic.iWellType = itemDynamicLayerData.iWellType; listWellsDynamic.Add(itemWellDynamic); } } ////增加当前生产井井位图层 //cXMLLayerMapStatic.addLayerWellPosition2XML(filePathOperate, sSelectLayer + "_" + sSelectYM, listWellsDynamic); ////增加日产日注分析 //if (listLayersDataCurrentLayerDynamic.Count > 0) // cPublicMethodForm.setListBoxwithltStr(lbxSelectDynamicJH, listWellsDynamic.Select(p => p.sJH).ToList()); }
private void 查看剖面ToolStripMenuItem_Click(object sender, EventArgs e) { sSelectJH = sCurrentID; ItemDicLayerDataStatic curItem = listLayersDataCurrentLayerStatic.SingleOrDefault(p => p.sJH == sSelectJH && p.sXCM == sSelectLayer); float fTop = 0; float fBot = 5000; if (curItem != null) { fTop = curItem.fDS1_md; fBot = curItem.fDS2_md; } string filePathOper = Path.Combine(cProjectManager.dirPathWellDir, sSelectJH, sSelectJH + cProjectManager.fileExtensionSectionWell); if (File.Exists(filePathOper)) { FormSectionWell newSectionWeb = new FormSectionWell(filePathOper, fTop, fBot); newSectionWeb.WindowState = FormWindowState.Normal; newSectionWeb.Size = new Size(300, 300); //newSectionWeb.StartPosition = FormStartPosition.Manual; newSectionWeb.Location = pXY.ToPoint(); newSectionWeb.setViewMode(); newSectionWeb.FormBorderStyle = FormBorderStyle.SizableToolWindow; newSectionWeb.TopLevel = true; newSectionWeb.wellPanelMain.webBrowserHead.Visible = false; newSectionWeb.wellPanelMain.lblCrossV.Visible = false; newSectionWeb.wellPanelMain.lblCrossH.Visible = false; newSectionWeb.wellPanelMain.lblmarker.Visible = false; newSectionWeb.wellPanelMain.statusStripWellPanel.Visible = false; newSectionWeb.Show(); } else { MessageBox.Show("单井综合图不存在。"); } }
public static ItemDicLayerDataStatic parseLine(string line) { string[] split = line.Trim().Split(new char[] { ' ', '\t', ',' }, StringSplitOptions.RemoveEmptyEntries); ItemDicLayerDataStatic item = new ItemDicLayerDataStatic(); if (split.Count() >= 12) { item.sJH = split[0]; item.sXCM = split[1]; item.dbX = 0.0; double.TryParse(split[2], out item.dbX); item.dbY = 0; double.TryParse(split[3], out item.dbY); item.dbZ = 0; double.TryParse(split[4], out item.dbZ); item.fDCHD = 0.0f; float.TryParse(split[5], out item.fDCHD); item.fSH = 0.0f; float.TryParse(split[6], out item.fSH); item.fYXHD = 0.0f; float.TryParse(split[7], out item.fYXHD); item.fKXD = 0.0f; float.TryParse(split[8], out item.fKXD); item.fSTL = 0.0f; float.TryParse(split[9], out item.fSTL); item.fBHD = 0.0f; float.TryParse(split[10], out item.fBHD); item.fDS1_md = 0.0f; float.TryParse(split[11], out item.fDS1_md); item.fDS2_md = 0.0f; float.TryParse(split[12], out item.fDS2_md); item.fDS1_TVD = 0.0f; float.TryParse(split[13], out item.fDS1_TVD); } return(item); }
public void generateLayerData() { //更新算法,保证计算后的数据字典完善: //如果这口井有有效厚度而没有孔隙度,渗透率,饱和度,那么找临近的几口井,根据厚度相近的原则,取孔隙度,渗透率 //数据缺失的先用地层厚度为-999填充标记,然后正着扫一遍,再反着扫一遍 把所有的值填充合理 List <ItemDicLayerDataStatic> listLayerDataDic = new List <ItemDicLayerDataStatic>(); if (cProjectData.ltStrProjectJH.Count > 0 && cProjectData.ltStrProjectXCM.Count > 0) { for (int i = 0; i < cProjectData.ltStrProjectJH.Count; i++) { for (int j = 0; j < cProjectData.ltStrProjectXCM.Count; j++) { string sCurrentJH = cProjectData.ltStrProjectJH[i].ToString(); string sCurrentXCM = cProjectData.ltStrProjectXCM[j].ToString(); ItemWellHead currentWellHead = cIOinputWellHead.getWellHeadByJH(sCurrentJH); List <ItemDicLayerDepth> listLayerDepth = cIOinputLayerDepth.readLayerDepth2Struct(sCurrentJH); List <ItemJSJL> listJSJL = cIOinputJSJL.readJSJL2Struct(sCurrentJH); double dfCurrentLayerX = 0; double dfCurrentLayerY = 0; double dfCurrentLayerZ = 0; float fCurrentLayerDS1 = 0; //当前层位的顶面测深 float fCurrentLayerDS2 = 0; //当前层位的底面测深 float fCurrentLayerTVD = 0; //顶面TVD float fCurrentLayerDCHD = -999; //当前层位的地层测深 需要测算 -999代表缺失 float fCurrentLayerSandThickness = -999; //当前层位的砂岩厚度 float fCurrentLayerYXHD = 0; //当前层位的有效厚度 float fCurrentLayerKXD = 0; //当前层位的厚度加权孔隙度 float fCurrentLayerSTL = 0; //当前层位的厚度加权渗透率 float fCurrentLayerBHD = 0; //当前层位的厚度加权饱和度 //读取层位顶底深,获取fCurrentLayerDS1,fCurrentLayerDS2 //没找到的情况要重新考虑下! bool bFoundInLayerDepth = false; ItemDicLayerDepth currentLayerDepth = listLayerDepth.Find(p => p.sJH == sCurrentJH && p.sXCM == sCurrentXCM); if (currentLayerDepth.sJH != null && currentLayerDepth.fDS1 <= currentLayerDepth.fDS2) { fCurrentLayerDS1 = currentLayerDepth.fDS1; ItemDicWellPath currentDS1WellPathItem = cIOinputWellPath.getWellPathItemByJHAndMD(sCurrentJH, fCurrentLayerDS1); ItemDicWellPath currentDS2WellPathItem = cIOinputWellPath.getWellPathItemByJHAndMD(sCurrentJH, fCurrentLayerDS2); fCurrentLayerDS2 = currentLayerDepth.fDS2; dfCurrentLayerX = currentDS1WellPathItem.dbX; dfCurrentLayerY = currentDS1WellPathItem.dbY; dfCurrentLayerZ = currentDS1WellPathItem.dfZ; fCurrentLayerTVD = currentDS1WellPathItem.f_TVD; fCurrentLayerDCHD = currentDS2WellPathItem.f_TVD - currentDS1WellPathItem.f_TVD; bFoundInLayerDepth = true; } //读取JSJL结果链表,获取fCurrentLayerKXD,fCurrentLayerSTL,fCurrentLayerBHD if (bFoundInLayerDepth == true) //找到小层顶底深,才处理,否则直接跳过 { List <ItemJSJL> listCurrentWellJSJL = listJSJL.Where(p => p.sJH == sCurrentJH && p.fDS1 >= fCurrentLayerDS1 && p.fDS2 <= fCurrentLayerDS2).ToList(); List <float> fListSH_temp = new List <float>(); List <float> fListYXHD_temp = new List <float>(); List <float> fListKXD_temp = new List <float>(); List <float> fListSTL_temp = new List <float>(); List <float> fListBHD_temp = new List <float>(); foreach (ItemJSJL item in listCurrentWellJSJL) { fListSH_temp.Add(item.fSandThickness); fListYXHD_temp.Add(item.fNetPaySand); fListKXD_temp.Add(item.fKXD); fListSTL_temp.Add(item.fSTL); fListBHD_temp.Add(item.fBHD); } { fCurrentLayerDCHD = fCurrentLayerDS2 - fCurrentLayerDS1; //地层厚度 fCurrentLayerSandThickness = fListSH_temp.Sum(); //当前层位的砂岩厚度 fCurrentLayerYXHD = fListYXHD_temp.Sum(); //当前层位的有效厚度 fCurrentLayerKXD = weightedBYThickNessWithourInvalidValue(fListKXD_temp, fListSH_temp); //当前层位的厚度加权孔隙度 fCurrentLayerSTL = weightedBYThickNessWithourInvalidValue(fListSTL_temp, fListSH_temp); //当前层位的厚度加权渗透率 fCurrentLayerBHD = weightedBYThickNessWithourInvalidValue(fListBHD_temp, fListSH_temp); //当前层位的厚度加权饱和度 } } //写小层数据表 ItemDicLayerDataStatic itemLayerData = new ItemDicLayerDataStatic(); itemLayerData.sJH = sCurrentJH; itemLayerData.sXCM = sCurrentXCM; //在LayerDepth表中找到数据层段的顶底 if (bFoundInLayerDepth == true) { itemLayerData.dbX = dfCurrentLayerX; itemLayerData.dbY = dfCurrentLayerY; itemLayerData.dbZ = dfCurrentLayerZ; itemLayerData.fDCHD = fCurrentLayerDCHD; itemLayerData.fSH = fCurrentLayerSandThickness; itemLayerData.fYXHD = fCurrentLayerYXHD; itemLayerData.fKXD = fCurrentLayerKXD; itemLayerData.fSTL = fCurrentLayerSTL; itemLayerData.fBHD = fCurrentLayerBHD; itemLayerData.fDS1_md = fCurrentLayerDS1; itemLayerData.fDS2_md = fCurrentLayerDS2; itemLayerData.fDS1_TVD = fCurrentLayerTVD; } else //未在LayerDepth表中找到数据 代表本井本层位缺失 { itemLayerData.dbX = 0.0; itemLayerData.dbY = 0.0; itemLayerData.dbZ = 0.0; itemLayerData.fDCHD = -999; itemLayerData.fSH = -999; itemLayerData.fYXHD = 0; itemLayerData.fKXD = -999; itemLayerData.fSTL = -999; itemLayerData.fBHD = -999; itemLayerData.fDS1_md = -999; itemLayerData.fDS2_md = -999; itemLayerData.fDS1_TVD = -999; } listLayerDataDic.Add(itemLayerData); } } } //正一遍 倒一遍,完善小层数据表 for (int i = 0; i < listLayerDataDic.Count - 1; i++) { ItemDicLayerDataStatic currentItem = listLayerDataDic[i]; if (currentItem.fDCHD < 0 && currentItem.sJH == listLayerDataDic[i + 1].sJH) { ItemDicLayerDataStatic nextItem = listLayerDataDic[i + 1]; currentItem.dbX = nextItem.dbX; currentItem.dbY = nextItem.dbY; currentItem.dbZ = nextItem.dbZ + nextItem.fDCHD; currentItem.fDS1_md = nextItem.fDS1_md; currentItem.fDS2_md = nextItem.fDS2_md; currentItem.fDS1_TVD = nextItem.fDS1_TVD; currentItem.fDCHD = 0; currentItem.fSH = 0; } listLayerDataDic[i] = currentItem; } //完善 小层 孔渗为无效值的情况 for (int i = 0; i < listLayerDataDic.Count - 1; i++) { ItemDicLayerDataStatic currentItem = listLayerDataDic[i]; if (currentItem.fDCHD < 0 && currentItem.sJH == listLayerDataDic[i + 1].sJH) { ItemDicLayerDataStatic nextItem = listLayerDataDic[i + 1]; currentItem.dbX = nextItem.dbX; currentItem.dbY = nextItem.dbY; currentItem.dbZ = nextItem.dbZ + nextItem.fDCHD; currentItem.fDS1_md = nextItem.fDS1_md; currentItem.fDS2_md = nextItem.fDS2_md; currentItem.fDS1_TVD = nextItem.fDS1_TVD; currentItem.fDCHD = 0; currentItem.fSH = 0; } listLayerDataDic[i] = currentItem; } for (int i = listLayerDataDic.Count - 1; i > 0; i--) { ItemDicLayerDataStatic currentItem = listLayerDataDic[i]; if (currentItem.fSH > 0 && (currentItem.fKXD <= 0 || currentItem.fSTL <= 0)) //有砂厚,砂厚大于0的必须有孔隙度和渗透率,用于产量劈分,储量计算 { //从 listLayerDataDic中选择,无值的取层段平均值 List <ItemDicLayerDataStatic> listCurrentLayer = listLayerDataDic.FindAll(p => p.sXCM == currentItem.sXCM).ToList(); if (listCurrentLayer.Count > 0) { if (currentItem.fKXD <= 0 && listCurrentLayer.FindAll(p => p.fKXD > 0).Count > 0) { currentItem.fKXD = listCurrentLayer.FindAll(p => p.fKXD > 0).Select(p => p.fKXD).Average(); } if (currentItem.fSTL <= 0 && listCurrentLayer.FindAll(p => p.fSTL > 0).Count > 0) { currentItem.fSTL = listCurrentLayer.FindAll(p => p.fSTL > 0).Select(p => p.fSTL).Average(); } } } listLayerDataDic[i] = currentItem; } write2File(cProjectManager.filePathLayerDataDic, listLayerDataDic); // Format and display the TimeSpan value. }
public static void updateWellConnect() { //读入生产和注入数据 List <ItemInputWellProduct> productItem = cIOinputWellProduct.readProjectFile2Struct(); List <ItemInputWellInject> injectItem = cIOInputWellInject.readProjectFile2Struct(); //读入小层数据字典 List <ItemDicLayerDataStatic> listLayerData = cIODicLayerDataStatic.readDicLayerData2struct(); //读入射孔字典 //获得年月 string minYM = productItem.Select(p => p.sYM).Min(); string maxYM = productItem.Select(p => p.sYM).Max(); cProjectData.setProjectYM(minYM, maxYM); foreach (string sYM in cProjectData.ltStrProjectYM) { //按年月获得水井号,油井号 List <ItemConnectInjPro> listItemConnect = new List <ItemConnectInjPro>(); List <string> ltJHCurrentYMinj = injectItem.FindAll(p => p.sYM == sYM).Select(p => p.sJH).ToList(); List <string> ltJHCurrentYMpro = productItem.FindAll(p => p.sYM == sYM).Select(p => p.sJH).ToList(); if (ltJHCurrentYMinj.Count > 0) { // 分析在不同层注入井和生产井的连接关系 foreach (string _sxcm in cProjectData.ltStrProjectXCM) { List <GraphEdge> listCurrentGE = cIOVoronoi.readLayerGE(_sxcm); foreach (string sJHinj in ltJHCurrentYMinj) { //找到sJHinj的相邻井 int indexInjWell = cProjectData.ltStrProjectJH.IndexOf(sJHinj); List <int> ltIndexProWell = new List <int>(); foreach (GraphEdge ge in listCurrentGE) { if (ge.site1 == indexInjWell) { ltIndexProWell.Add(ge.site2); } if (ge.site2 == indexInjWell) { ltIndexProWell.Add(ge.site1); } } foreach (string sJHpro in ltJHCurrentYMpro) { ItemConnectInjPro newItem = new ItemConnectInjPro(); newItem.sYM = sYM; newItem.sXCM = _sxcm; newItem.sJHinj = sJHinj; newItem.sJHpro = sJHpro; newItem.factorSplit = 0.0f; int indexProWell = cProjectData.ltStrProjectJH.IndexOf(sJHpro); // 是否临井,voronoi图中分析,找出共边的井号 if (ltIndexProWell.IndexOf(indexProWell) >= 0) { // 是否地质同层,在小层数据表中查找 ItemDicLayerDataStatic layerDataInj = listLayerData.Find(p => p.sJH == sJHinj && p.sXCM == _sxcm); ItemDicLayerDataStatic layerDataPro = listLayerData.Find(p => p.sJH == sJHpro && p.sXCM == _sxcm); if (layerDataInj.fSH > 0 && layerDataPro.fSH > 0) { newItem.factorSplit = 1.0f; } // 是否同层射开 //连线是否过断层 } if (newItem.factorSplit == 1.0f) { listItemConnect.Add(newItem); //只写有值的 } } } } } List <string> listLine = new List <string>(); listLine.Add("年月 注入井号 生产井号 分配系数"); foreach (ItemConnectInjPro item in listItemConnect) { listLine.Add(ItemConnectInjPro.item2string(item)); } string fileOut = Path.Combine(cProjectManager.dirPathUsedProjectData, sYM + cProjectManager.fileExtensionConnect); cIOBase.write2file(listLine, fileOut); //输入文件 } }