using DevExpress.CodeParser; using DevExpress.Spreadsheet.Charts; using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.WinExplorer; using DevExpress.XtraReports.Wizards; using GeoSigmaDrawLib; using InterfaceWorkAreaData; using Raffinert.FuzzySharp.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Security.RightsManagement; using System.Threading; using System.Windows.Forms; namespace GeoSigma.UCDraw.WellAndSection { public partial class FrmNewWellSection : CResizeForm { public List preSetWells = new List(); public class selectWellInfo { public string name { get; set; } public int posid { get; set; } } BindingList selectWells = new BindingList(); Dictionary wellTrackTypeNames;//井道类型字典 public class trackTypeAndRefCol { //保存道的类及其关联的地层数据级别 public int typeId { get; set; } public string strRefCol { get; set; } } Dictionary wellTrackIds; //存放已经读取的井模板中的道信息 string mTemplatePath; //模板路径 class CTempfileInfo { public string fileName { get; set; } } List mTempFileList = new List(); DataTable dataWellTable; public List retWellInfos = new List();// 选中的井 public string mTemplatefileNamePath; //选中的模板文件 public List retLayers = new List(); public string m_fileName; public List sectionNodeNames = new List(); public List m_SelectedLayers; public List m_SelectLayersName = new List(); BindingList mWellTopLayersInfo = new BindingList(); BindingList mWellBottomLayersInfo = new BindingList(); public double m_topExtent = 0; public double m_bottomExtent = 0; class CLayersInfo { public string text { get; set; } public int levelId { get; set; } } List mLayersInfo = new List(); List mWellStrats = new List(); class CWellLayerInfo { public string cw { get; set; } public int order { get; set; } public int id { get; set; } } BindingList mWellLayersInfo = new BindingList(); public FrmNewWellSection() { InitializeComponent(); _designSize = new Size(this.Size.Width, this.Size.Height); StoreOriginalStates(this.Controls); // this.cardView1.OptionsView.ShowCardCaption = false; //隐藏 // this.cardView1.OptionsView.ShowQuickCustomizeButton = false; //隐藏 wellListBox.SelectionMode = SelectionMode.MultiExtended; this.wellListBox.DataSource = selectWells; this.wellListBox.DisplayMember = "name"; this.wellListBox.ValueMember = "posid"; this.textBoxTopExtent.Text = "0"; this.textBoxbottomExtent.Text = "0"; } private void btnOK_Click(object sender, EventArgs e) { if (wellTempComboBox.SelectedItem is CTempfileInfo selectTemp) { if (selectTemp.fileName != "") mTemplatefileNamePath = mTemplatePath + selectTemp.fileName; else mTemplatefileNamePath = ""; } retWellInfos.Clear(); for (int i = 0; i < selectWells.Count; i++) { DataRow[] trs = dataWellTable.Select($"井名 = '{selectWells[i].name}'"); for (int j = 0; j < trs.Length; j++) { cWellBaseInfo wellInfo = new cWellBaseInfo(); DataRow trow = trs[j]; wellInfo.WellName = trow["井名"].ToString(); wellInfo.x = Convert.ToDouble(trow["X"]); wellInfo.y = Convert.ToDouble(trow["Y"]); wellInfo.BushingLevel = Convert.ToDouble(trow["BXHB"]); retWellInfos.Add(wellInfo); } } for (int i = 0; i < this.LayercheckedListBox.Items.Count; i++) { CheckState state = this.LayercheckedListBox.GetItemCheckState(i); if (state == CheckState.Checked) { string strlayer = this.LayercheckedListBox.Items[i].ToString(); if (retLayers.Contains(strlayer) == false) { retLayers.Add(strlayer); } } } if (retWellInfos.Count < 1) { MessageBox.Show("请选择井"); this.DialogResult = DialogResult.None; } m_fileName = textBoxFileName.Text; if (sectionNodeNames.Contains(m_fileName + ".pcg", StringComparer.OrdinalIgnoreCase)) { MessageBox.Show("存在同名文件,请修改名称"); this.DialogResult = DialogResult.None; } else { this.DialogResult = DialogResult.OK; } if(retWellInfos.Count <1) { MessageBox.Show("请选择井"); this.DialogResult = DialogResult.None; } if ((comboBoxTopLayer.SelectedItem is CWellLayerInfo topLayer) && (comboBoxBottomLayer.SelectedItem is CWellLayerInfo bottomLayer)) { if (topLayer.order > bottomLayer.order) { MessageBox.Show("结束层位序号应大于结束层位"); this.DialogResult = DialogResult.None; } List selectlayers = new List(); selectlayers = mWellTopLayersInfo.Where(item => (item.order >= topLayer.order && item.order <= bottomLayer.order)).ToList(); int botLevelId = mLayersInfo[mLayersInfo.Count - 1].levelId; int levelId = -1; if (comboBoxLayers.SelectedItem is CLayersInfo layer) { levelId = layer.levelId; } m_SelectedLayers = new List(); //实际的井段都是最底的地层,因此搜集最底层的井段 if (levelId < botLevelId) { for (int i = 0; i < selectlayers.Count; i++) { List tchildsNodes = GetAllChildren(mWellStrats, selectlayers[i].id); m_SelectedLayers.AddRange(tchildsNodes); } } else { for (int i = 0; i < selectlayers.Count; i++) { m_SelectedLayers.AddRange(mWellStrats.Where(item => item.code == selectlayers[i].cw).ToList()); } } } m_SelectLayersName.Clear(); for (int i = 0; i < m_SelectedLayers.Count; i++) { m_SelectLayersName.Add(m_SelectedLayers[i].code); } if(Double.TryParse(textBoxTopExtent.Text,out double topExtent)) { if (topExtent > 0) m_topExtent = topExtent; } if (Double.TryParse(textBoxbottomExtent.Text, out double botExtent)) { if (topExtent > 0) m_bottomExtent = botExtent; } } // 递归获取所有子节点(包括子孙节点) List GetAllChildren(List allNodes, int parentId) { var children = new List(); // 查找直接子节点 var directChildren = allNodes.Where(n => n.parentId == parentId).ToList(); foreach (var child in directChildren) { children.Add(child); // 递归获取子节点的子节点 children.AddRange(GetAllChildren(allNodes, child.id)); } return children; } private void FrmNewWellSection_Shown(object sender, EventArgs e) { string[] typeNames = new string[0]; int[] typeIds = new int[0]; GeoSigmaWellSectionXY.GetWellTrackTypeInfo(ref typeIds, ref typeNames); wellTrackTypeNames = new Dictionary(); for (int i = 0; i < typeIds.Length; i++) { wellTrackTypeNames.Add(typeIds[i], typeNames[i]); } wellTrackIds = new Dictionary(); dataWellTable = new DataTable(); dataWellTable.Columns.Add("井名", typeof(string)); dataWellTable.Columns.Add("选择", typeof(bool)); dataWellTable.Columns.Add("X", typeof(double)); dataWellTable.Columns.Add("Y", typeof(double)); dataWellTable.Columns.Add("BXHB", typeof(double)); List wellInfos = workAreaDb.Instance.workData.getWellsInfo(); if (wellInfos.Count > 0) { for (int i = 0; i < wellInfos.Count; i++) { DataRow trow = dataWellTable.NewRow(); trow["井名"] = wellInfos[i].WellName; trow["X"] = wellInfos[i].x; trow["Y"] = wellInfos[i].y; trow["BXHB"] = wellInfos[i].BushingLevel ?? 0; trow["选择"] = false; dataWellTable.Rows.Add(trow); } // this.cardView1.MaximumCardColumns = 6; // this.cardView1.MaximumCardRows = wellInfos.Count / 6 + 1; } this.gridControl1.BindingContext = new BindingContext(); this.gridControl1.DataSource = dataWellTable; this.winExplorerView1.Columns.Clear(); this.winExplorerView1.Columns.Add(new GridColumn() { FieldName = "井名" }); this.winExplorerView1.Columns.Add(new GridColumn() { FieldName = "选择" }); //this.winExplorerView1.Columns.Add(new GridColumn() { FieldName = "X" }); //this.winExplorerView1.Columns.Add(new GridColumn() { FieldName = "Y" }); //this.winExplorerView1.Columns.Add(new GridColumn() { FieldName = "BXHB" }); this.winExplorerView1.ColumnSet.TextColumn = this.winExplorerView1.Columns["井名"]; this.winExplorerView1.ColumnSet.CheckBoxColumn = this.winExplorerView1.Columns["选择"]; //this.winExplorerView1.ColumnSet.TextColumn = this.winExplorerView1.Columns["X"]; //this.winExplorerView1.ColumnSet.TextColumn = this.winExplorerView1.Columns["Y"]; //this.winExplorerView1.ColumnSet.TextColumn = this.winExplorerView1.Columns["BXHB"]; this.winExplorerView1.OptionsView.Style = WinExplorerViewStyle.List; this.winExplorerView1.OptionsViewStyles.List.ItemWidth = 130; this.winExplorerView1.OptionsViewStyles.List.ContentMargins = new System.Windows.Forms.Padding(5, 5, 5, 5); //this.winExplorerView1.OptionsViewStyles.Small.ItemWidth = 100; this.winExplorerView1.OptionsView.ShowCheckBoxes = true; this.winExplorerView1.OptionsSelection.ItemSelectionMode = DevExpress.XtraGrid.Views.WinExplorer.IconItemSelectionMode.Click; this.winExplorerView1.OptionsSelection.MultiSelect = false; //this.winExplorerView1.CellValueChanging += cardView1_CellValueChanging; this.winExplorerView1.ItemClick += new DevExpress.XtraGrid.Views.WinExplorer.WinExplorerViewItemClickEventHandler(this.winExplorerView1_ItemClick); this.winExplorerView1.ItemDoubleClick += new DevExpress.XtraGrid.Views.WinExplorer.WinExplorerViewItemDoubleClickEventHandler(this.winExplorerView1_ItemDoubleClick); //this.cardView1.Columns["X"].Visible = false; // this.cardView1.Columns["Y"].Visible = false; // this.cardView1.Columns["BXHB"].Visible = false; // this.cardView1.ActiveFilterString = "Contains([井名],'DD')"; this.gridControl1.ForceInitialize(); CTempfileInfo tfile = new CTempfileInfo(); tfile.fileName = ""; // mTempFileList.Add(tfile); //增加一个空的名称 mTemplatePath = AppDomain.CurrentDomain.BaseDirectory + "Templates\\WellsSection\\"; if (Directory.Exists(mTemplatePath)) { try { var fileNames = Directory.GetFiles(mTemplatePath) .Select(Path.GetFileName) .OrderBy(name => name) .ToArray(); foreach (var fileName in fileNames) { string tname = fileName.ToLower(); String tstr1 = tname.Length > 4 ? tname.Substring(tname.Length - 4) : ""; if (tstr1 == ".pcg") { CTempfileInfo tfile1 = new CTempfileInfo(); tfile1.fileName = fileName; mTempFileList.Add(tfile1); } } } catch (Exception ex) { } } this.wellTempComboBox.DataSource = mTempFileList; this.wellTempComboBox.DisplayMember = "fileName"; if (mTempFileList.Count > 0) this.wellTempComboBox.SelectedIndex = 0; // mWellStrats = workAreaDb.Instance.workData.getWellStratification(); List distinctByLevel = mWellStrats .GroupBy(item => item.level) .Select(g => g.First()) // 或 g.Last()、g.OrderBy(...).First() 等 .ToList(); for (int i = 0; i < distinctByLevel.Count; i++) { CLayersInfo tinfo = new CLayersInfo(); string str = (i + 1).ToString() + "级"; tinfo.levelId = distinctByLevel[i].level; tinfo.text = str; mLayersInfo.Add(tinfo); } this.comboBoxTopLayer.DataSource = mWellTopLayersInfo; this.comboBoxTopLayer.DisplayMember = "cw"; this.comboBoxBottomLayer.DataSource = mWellBottomLayersInfo; this.comboBoxBottomLayer.DisplayMember = "cw"; this.comboBoxLayers.DataSource = mLayersInfo; this.comboBoxLayers.DisplayMember = "text"; this.comboBoxLayers.ValueMember = "levelId"; if(preSetWells.Count >0) { for(int i = 0; i< preSetWells.Count; i++) { for(int j = 0; j < dataWellTable.Rows.Count; j++) { DataRow dr = dataWellTable.Rows[j]; string str = dr[0].ToString(); if (preSetWells[i] == str) { dr[1] = true; selectWellInfo twinfo = new selectWellInfo(); twinfo.name = preSetWells[i]; twinfo.posid = j; this.selectWells.Add(twinfo); //winExplorerView1.RefreshRow(j); winExplorerView1.SetRowCellValue(j, "选择", true); break; } } } this.wellListBox.Refresh(); textBoxFileName.Text = getFileNameFromWellList(); } } string getFileNameFromWellList() { string strName = ""; for (int i = 0; i < selectWells.Count; i++) { if (i < 3) { strName = strName + '+' + selectWells[i].name; } else { break; } } strName = strName.TrimStart('+'); if (selectWells.Count > 3) { strName = strName + '+' + selectWells[selectWells.Count - 1].name; } textBoxFileName.Text = strName; return strName; } bool isLayerType(int type) { if (type == (int)GeoSigmaWellSectionXY.eWellExtType.Track_Result || type == (int)GeoSigmaWellSectionXY.eWellExtType.Track_Stratum || type == (int)GeoSigmaWellSectionXY.eWellExtType.Track_SandLayer || type == (int)GeoSigmaWellSectionXY.eWellExtType.Track_OilLayerGroup) return true; else return false; } private void wellTempComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (wellTempComboBox.SelectedItem is CTempfileInfo selectTemp) { if (selectTemp.fileName != "") mTemplatefileNamePath = mTemplatePath + selectTemp.fileName; else mTemplatefileNamePath = ""; } this.LayercheckedListBox.Items.Clear(); if (mTemplatefileNamePath != "") { if (wellTrackIds.TryGetValue(mTemplatefileNamePath, out trackTypeAndRefCol[] ttypes)) {//如果本模板数据已经读取了,就使用保存过的 for (int i = 0; i < ttypes.Length; i++) { if (isLayerType(ttypes[i].typeId) == false) continue; if (wellTrackTypeNames.TryGetValue(ttypes[i].typeId, out string type)) { int id = this.LayercheckedListBox.Items.Add(type); this.LayercheckedListBox.SetItemChecked(id, true); } } } else { if (GeoSigmaWellSectionXY.WellTempateGetTracksType(mTemplatefileNamePath, out int[] types1, out string[] refCols)) { trackTypeAndRefCol[] tracks = new trackTypeAndRefCol[types1.Length]; for (int i = 0; i < types1.Length; i++)//将读取的道id及数据层级保存下来 { tracks[i] = new trackTypeAndRefCol(); tracks[i].typeId = types1[i]; tracks[i].strRefCol = refCols[i]; } wellTrackIds.Add(mTemplatefileNamePath, tracks); for (int i = 0; i < types1.Length; i++) { if (isLayerType(types1[i]) == false) continue; if (wellTrackTypeNames.TryGetValue(types1[i], out string type)) { int id = this.LayercheckedListBox.Items.Add(type); this.LayercheckedListBox.SetItemChecked(id, true); } } } } } } private void btnDelSelectWells_Click(object sender, EventArgs e) { for (int i = 0; i < selectWells.Count; i++) { DataRow[] trs = dataWellTable.Select($"井名 = '{selectWells[i].name}'"); for (int j = 0; j < trs.Length; j++) { trs[j]["选择"] = false; } // DataRow trow = dataWellTable.Rows[selectWells[i].posid]; // trow["选择"] = false; } selectWells.Clear(); this.gridControl1.RefreshDataSource(); textBoxFileName.Text = ""; } private void textBoxFilter_TextChanged(object sender, EventArgs e) { string text = this.textBoxFilter.Text; if (text == "") this.winExplorerView1.ActiveFilterString = ""; else; this.winExplorerView1.ActiveFilterString = $"Contains([井名], '{text}')"; // this.cardView1.RefreshData(); } private void ScaleControls(Control.ControlCollection controls, float scaleX, float scaleY) { foreach (Control ctrl in controls) { if (_originalStates.TryGetValue(ctrl, out var state)) { // 缩放位置和大小 ctrl.Left = (int)(state.location.X * scaleX); ctrl.Top = (int)(state.location.Y * scaleY); ctrl.Width = (int)(state.size.Width * scaleX); ctrl.Height = (int)(state.size.Height * scaleY); // 可选:缩放字体(注意:字体缩放可能影响清晰度) // if (ctrl.Font != null) // { // ctrl.Font = new Font(ctrl.Font.FontFamily, state.fontSize * scale, ctrl.Font.Style); // } } // 递归子控件 if (ctrl.Controls.Count > 0) ScaleControls(ctrl.Controls, scaleX, scaleY); } } private void FrmNewWellSection_Resize(object sender, EventArgs e) { FrmResize(sender, e); // if (_isScaling || DesignMode || WindowState == FormWindowState.Minimized) // { // base.OnResize(e); // return; // } // _isScaling = true; // try // { // // 计算缩放比例(X 和 Y 方向分别计算,也可取平均或最小值) // float scaleX = (float)ClientSize.Width / _designSize.Width; // float scaleY = (float)ClientSize.Height / _designSize.Height; // // 可选策略: // // 1. 等比例(保持宽高比)→ 取 min(scaleX, scaleY) // // 2. 非等比例拉伸 → 分别使用 scaleX, scaleY // // 这里我们实现**真正的等比例缩放**(内容不变形),取最小比例 // float scale = Math.Min(scaleX, scaleY); // ScaleControls(this.Controls, scaleX,scaleY); // } // finally // { // _isScaling = false; // // base.OnResize(e); // } //} } private void winExplorerView1_ItemDoubleClick(object sender, WinExplorerViewItemDoubleClickEventArgs e) { } private void winExplorerView1_ItemClick(object sender, WinExplorerViewItemClickEventArgs e) { if (e.MouseInfo.X < e.ItemInfo.CheckBoxBounds.Left || e.MouseInfo.X > (e.ItemInfo.CheckBoxBounds.Left + e.ItemInfo.CheckBoxBounds.Width) || e.MouseInfo.Y < e.ItemInfo.CheckBoxBounds.Top || e.MouseInfo.Y > (e.ItemInfo.CheckBoxBounds.Top + e.ItemInfo.CheckBoxBounds.Height)) { return; } DataRow trow = this.winExplorerView1.GetDataRow(e.ItemInfo.Row.RowHandle);//dataWellTable.Rows[e.RowHandle]; if (trow.ItemArray.Length > 2) { var val = trow.ItemArray[1]; bool b = !Convert.ToBoolean(val); //这个控件checkbox点击后,bool值才起作用 if (b) { selectWellInfo twinfo = new selectWellInfo(); twinfo.name = trow[0].ToString(); twinfo.posid = e.ItemInfo.Row.RowHandle; int i = 0; for (i = 0; i < selectWells.Count; i++) { if (selectWells[i].name == twinfo.name) { break; } } if (i == selectWells.Count) { this.selectWells.Add(twinfo); this.wellListBox.Refresh(); } //this.wellListBox.Items.Add(trow[0].ToString()); } else { string name = trow[0].ToString(); //this.wellListBox.Items.Remove(name); for (int i = selectWells.Count - 1; i > -1; i--) { if (selectWells[i].name == name) { selectWells.RemoveAt(i); } } this.wellListBox.Refresh(); } textBoxFileName.Text = getFileNameFromWellList(); } } private void comboBoxLayers_SelectedValueChanged(object sender, EventArgs e) { int levelId = -1; if (comboBoxLayers.SelectedItem is CLayersInfo layer) { levelId = layer.levelId; } if (levelId < 0) return; mWellTopLayersInfo.Clear(); mWellBottomLayersInfo.Clear(); List layersByLevel = mWellStrats.Where(item => item.level == levelId).ToList(); for (int i = 0; i < layersByLevel.Count; i++) { CWellLayerInfo twellLayer = new CWellLayerInfo(); twellLayer.cw = layersByLevel[i].code; twellLayer.order = layersByLevel[i].order; twellLayer.id = layersByLevel[i].id; mWellTopLayersInfo.Add(twellLayer); CWellLayerInfo twellLayer1 = new CWellLayerInfo(); twellLayer1.cw = layersByLevel[i].code; twellLayer1.order = layersByLevel[i].order; twellLayer1.id = layersByLevel[i].id; mWellBottomLayersInfo.Add(twellLayer1); } if (layersByLevel.Count > 0) { // this.comboBoxTopLayer.DataSource = mWellTopLayersInfo; // this.comboBoxTopLayer.DisplayMember = "cw"; comboBoxTopLayer.SelectedIndex = 0; // this.comboBoxBottomLayer.DataSource = mWellBottomLayersInfo; // this.comboBoxBottomLayer.DisplayMember = "cw"; comboBoxBottomLayer.SelectedIndex = mWellBottomLayersInfo.Count - 1; } } } }