using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DevExpress.XtraBars; using DevExpress.XtraEditors; using DevExpress.XtraEditors.Controls; using DevExpress.XtraEditors.Repository; using DevExpress.XtraVerticalGrid.Native; using DevExpress.XtraVerticalGrid.Rows; using GeoSigma; using GeoSigmaDrawLib; using MeshProcess; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace KepGridEditor { public delegate void EditorMouseMoveEventHandler(double mouseX, double mouseY); /// /// The form main. /// public partial class FormMain : DevExpress.XtraEditors.XtraForm { /// /// 鼠标移动事件 /// public EditorMouseMoveEventHandler EditorMouseMoveEvent; /// /// 模块进程名称 /// public static string ProcessName{get;set;}="智能等网交互系统"; public EventHandler PushDataClick; private GeoSigmaXY geo; private IntPtr pxy = IntPtr.Zero; private FormWellAdjustSetting formWellAdjustSetting; private FormFilterMeshSetting formFilterMeshSetting; private CalculateZDialog calculateZDialog; /// /// Initializes a new instance of the class. /// public FormMain() { InitializeComponent(); this.KeyPreview = true; this.Text = ProcessName; this.trvLayer.ExpandAll(); this.barEditItem1.EditValue = false; this.ppgParameter.SelectedObject = meshEditor.EditorParameter; //RepositoryItemColorEdit riColorEditor = new RepositoryItemColorEdit(); //RepositoryItemPopupContainerEdit riColorEditor = new RepositoryItemPopupContainerEdit(); //PopupContainerControl popupContainer = new PopupContainerControl(); //UCColorDialog uCColor = new UCColorDialog(); //popupContainer.Controls.Add(uCColor); ////popupContainer.Size = new System.Drawing.Size(424, 474); //popupContainer.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; //popupContainer.AutoSizeMode = AutoSizeMode.GrowAndShrink; //popupContainer.AutoSize = true; //riColorEditor.PopupControl = popupContainer; //this.ppgParameter.DefaultEditors.Add(typeof(Color), riColorEditor); // Create a repository item which represents an in-place CheckEdit control. RepositoryItemCheckEdit riCheckEdit = new RepositoryItemCheckEdit(); // Represent check boxes as radio buttons. riCheckEdit.CheckStyle = DevExpress.XtraEditors.Controls.CheckStyles.Standard; // Associate the Boolean data type with the created repository item. this.ppgParameter.DefaultEditors.Add(typeof(Boolean), riCheckEdit); } /// /// Initializes a new instance of the class. /// /// The p xy. public FormMain(GeoSigmaXY geo, string contourLayer, string faultLayer, string pointLayer, string otherLineLayer) :this() { this.geo = geo; this.pxy = this.geo.GetDrawerXy(); if (!string.IsNullOrEmpty(contourLayer)) { this.meshEditor.ContourLayerName = string.Copy(contourLayer); } else { this.meshEditor.ContourLayerName = string.Empty; } if (!string.IsNullOrEmpty(faultLayer)) { this.meshEditor.FaultLayerName = string.Copy(faultLayer); } else { this.meshEditor.FaultLayerName = string.Empty; } if (!string.IsNullOrEmpty(pointLayer)) { this.meshEditor.PointLayerName = string.Copy(pointLayer); } else { this.meshEditor.PointLayerName = string.Empty; } if(!string.IsNullOrEmpty(otherLineLayer)) { this.meshEditor.OtherLineLayerName = otherLineLayer; } else { this.meshEditor.OtherLineLayerName = string.Empty; } } /// /// 打开文件 /// /// /// private void bbtnOpenFile_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.OpenFile(); this.ppgParameter.SelectedObject = null; this.ppgParameter.SelectedObject = meshEditor.EditorParameter; } /// /// Form1_S the load. /// /// The sender. /// The e. private void Form1_Load(object sender, EventArgs e) { if(pxy != IntPtr.Zero) { meshEditor.InitEditor(); meshEditor.OpenDraw(pxy); // 打开时启用 “断层填充” 和 “断层边缘优化”,使得打开等网系统即呈现最佳显示效果 meshEditor.EnableFillFault(true); meshEditor.OffsetFault(); this.ppgParameter.SelectedObject = null; this.ppgParameter.SelectedObject = meshEditor.EditorParameter; } meshEditor.SetMouseMoveEvent(EditorMouseMoveEvent); Application.Idle += Application_Idle; // 只允许输入正整数或小数(可根据需要调整正则) this.repositoryItemTextEdit2.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.RegEx; this.repositoryItemTextEdit2.Mask.EditMask = @"\d+([.]\d+)?"; this.repositoryItemTextEdit2.Mask.ShowPlaceHolders = false; } /// /// Application_S the idle. /// /// The sender. /// The e. private void Application_Idle(object sender, EventArgs e) { if (meshEditor != null) { this.bbtnUndo.Enabled = meshEditor.CanUndo(); this.bbtnRedo.Enabled = meshEditor.CanRedo(); this.btxtOptimize.Enabled = bbtnOptimizeMesh.Down; this.bbtnDragUpPolygon.Enabled = bbtnPolygonOperator.Down; this.bbtnDragDownPolygon.Enabled = bbtnPolygonOperator.Down; this.bbtnSmoothPolygon.Enabled = bbtnPolygonOperator.Down; } } /// /// btns the view all_ item click. /// /// The sender. /// The e. private void btnViewAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.Editor?.ZoomView(); } /// /// bbtns the undo_ item click. /// /// The sender. /// The e. private void bbtnUndo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.Undo(); ppgParameter.Refresh(); } /// /// bbtns the redo_ item click. /// /// The sender. /// The e. private void bbtnRedo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.Redo(); ppgParameter.Refresh(); } /// /// bbtns the drag up_ item click. /// /// The sender. /// The e. private void bbtnDragUp_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.StartDragUp(); } /// /// bbtns the drag down_ item click. /// /// The sender. /// The e. private void bbtnDragDown_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.StartDragDown(); } /// /// bbtns the draw away_ item click. /// /// The sender. /// The e. private void bbtnDrawAway_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.StartDragAway(); } /// /// 平滑按钮点击事件 /// /// 事件按钮 /// 事件参数 private void bbtnSmooth_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor.StartSmooth(); } /// /// 数据回传事件 /// /// 事件按钮 /// 事件参数 private void bbtnSendBackData_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { WriteBack(); PushDataClick?.Invoke(sender, e); } private void WriteBack() { List destroyPositions = new List(); List insertedPositions = new List(); meshEditor.PushbackData(meshEditor.ContourLayerName, destroyPositions, insertedPositions, meshEditor.LineLayerName, meshEditor.LineLayerNoName); geo.DestroyAndInsertElement(destroyPositions.ToArray(), insertedPositions.ToArray()); } /// /// 关闭按钮单击事件 /// /// /// private void bbtnClose_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.Close(); } /// /// 参数修改事件 /// /// 属性控件 /// 事件参数 private void ppgParameter_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e) { GridEditorParameter editorParameter = this.ppgParameter.SelectedObject as GridEditorParameter; if (editorParameter == null) { return; } if (e.Row.Properties.Caption == "井点小数位") { int num = editorParameter.DecimalNumber; if(num > 0 && num < 10) { int oldNum = meshEditor.GetDecimalNumber(); if (num != oldNum) { meshEditor.SetDecimalNumber(num); ppgParameter.Refresh(); } } } if (e.Row.Properties.Caption == "井点颜色") { meshEditor.SetWellColor(editorParameter.WellPointColor); } if (e.Row.Properties.Caption == "文字尺寸") { meshEditor.SetWellTxtSize((float)editorParameter.FontSize); } else if(e.Row.Properties.Caption.Equals( "查看z值", StringComparison.CurrentCultureIgnoreCase)) { meshEditor.EnablePickMeshZ(editorParameter.EnablePickMeshZ); } else if (e.Row.Properties.Caption == "断层充填") { meshEditor.EnableFillFault(editorParameter.EnableFillFault); } else if (e.Row.Properties.Caption != "井约束半径" && e.Row.Properties.Caption != "影响半径" && e.Row.Properties.Caption != "力度" && e.Row.Properties.Caption != "运算方式") { meshEditor.SetProperty( editorParameter.ContourSpace, editorParameter.MarkStep , editorParameter.ContourMinValue, editorParameter.ContourMaxValue , editorParameter.ZMin, editorParameter.ZMax); } } /// /// 图层选中变化事件 /// /// 图层树 /// 事件参数 private void trvLayer_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) { string strText = e.Node.GetDisplayText(0); bool bShow = e.Node.Checked; switch (strText) { case "网格": meshEditor.ShowMesh(bShow); //Trace.WriteLine(bShow.ToString()); break; case "等值线": meshEditor.ShowIsopleth(bShow); break; case "断层": meshEditor.ShowFault(bShow); break; case "控制点": meshEditor.ShowControlPoint(bShow); break; case "边界": meshEditor.ShowBound(bShow); break; case "附加线": meshEditor.ShowOtherLines(bShow); break; case "网格点": meshEditor.ShowMeshVertex(bShow); break; } } /// /// ppgs the parameter_ custom property descriptors. /// /// The sender. /// The e. private void ppgParameter_CustomPropertyDescriptors(object sender, DevExpress.XtraVerticalGrid.Events.CustomPropertyDescriptorsEventArgs e) { if (e.Context.PropertyDescriptor == null) { e.Properties = e.Properties.Sort(new string[] { "OperatorRadius" ,"Strength" ,"ComputeType" ,"ContourSpace" , "MarkStep" , "ContourMinValue" , "ContourMaxValue" ,"ZMin" ,"ZMax"}); } } /// /// 窗体关闭事件 /// /// 窗体 /// 事件参数 private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { if(meshEditor.IsSaved == false && meshEditor?.CanUndo() == true) { DialogResult result = MessageBox.Show(this, "文件已经修改,是否保存?" , "退出", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if(result == DialogResult.Yes) { WriteBack(); PushDataClick?.Invoke(sender, e); } else if(result == DialogResult.Cancel) { e.Cancel = true; } } } private void meshEditor_Load(object sender, EventArgs e) { } private void bbtnOffsetFault_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor?.OffsetFault(); } #region 二期功能 /// /// 井点匹配点击事件. /// /// The sender. /// The e. private void bbtnPointAdapt_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (formWellAdjustSetting == null) { formWellAdjustSetting = new FormWellAdjustSetting(100, 10, 0); } if(formWellAdjustSetting.ShowDialog() == DialogResult.OK) { string selected = formWellAdjustSetting.SelectedMode; string method = "井点校正"; int methodType = 1; switch (selected) { case "默认": { meshEditor.WellAdaptiveAdjust( (float)formWellAdjustSetting.WellRadius , (float)formWellAdjustSetting.ValueRange , (float)formWellAdjustSetting.DecreasingFactor); } return; //case "克里金": method = "克里金井点校正"; methodType = 1; break; case "RFB": method = "RFB井点校正"; methodType = 2; break; case "IDW": method = "IDW井点校正"; methodType = 3; break; } double valueRange = formWellAdjustSetting.ValueRange; double lastValidFactor = formWellAdjustSetting.DilutionFactor; bool state = meshEditor.RectificationMeshWellCompute(valueRange, methodType, lastValidFactor); if (!state) { return; } using (var dlg = new FrmRectificationProgress(() => meshEditor.GetWellRectificationProgress(), () => meshEditor.MeshWellThreadStop(), method)) { var result = dlg.ShowDialog(this); if (result != DialogResult.Cancel) { meshEditor.OSGUpdateObjectView(); ppgParameter.Refresh(); } } } } /// /// 过滤等值线点击事件. /// /// The sender. /// The e. private void bbtnFilterMesh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (formFilterMeshSetting == null) { formFilterMeshSetting = new FormFilterMeshSetting(30); } if(formFilterMeshSetting.ShowDialog() == DialogResult.OK) { meshEditor.FilterMesh((float)formFilterMeshSetting.FilterValue); } } private float optimizeMeshRadius = 50; /// /// bbtns the optimize mesh_ item click. /// /// The sender. /// The e. private void bbtnOptimizeMesh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { optimizeMeshRadius = Convert.ToSingle(btxtOptimize.EditValue); meshEditor.StartOptimizeMesh(optimizeMeshRadius); } /// /// btxts the optimize_ edit value changed. /// /// The sender. /// The e. private void btxtOptimize_EditValueChanged(object sender, EventArgs e) { optimizeMeshRadius = Convert.ToSingle(btxtOptimize.EditValue); meshEditor.OptimizeMeshRadius = optimizeMeshRadius; } /// /// 区域控制. /// /// The sender. /// The e. private void bbtnPolygonOperator_DownChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { meshEditor?.EnableDrawPolygon(bbtnPolygonOperator.Down); } private void bbtnDragUpPolygon_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { bool isChecked = Convert.ToBoolean(barEditItem1.EditValue); meshEditor?.StretchUpPolygon(isChecked); } private void bbtnDragDownPolygon_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { bool isChecked = Convert.ToBoolean(barEditItem1.EditValue); meshEditor?.PushDownPolygon(isChecked); } private void bbtnSmoothPolygon_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { bool isChecked = Convert.ToBoolean(barEditItem1.EditValue); meshEditor?.SmoothPolygon(isChecked); } #endregion private int influenceRadius = 30; //初始影响半径 private int strengthPercentage = 10; //初始力度百分比 private bool isAltPressed = false; //是否按下 ALT 键 /// /// 设置控件节点value /// /// 控件名 /// 值 private void SetEditorValue(string targetName, int value) { foreach (BaseRow row in ppgParameter.Rows) { if (row is CategoryRow categoryRow) { foreach (BaseRow childRow in categoryRow.ChildRows) { if(childRow.Properties.Caption == targetName) { childRow.Properties.Value = value; } } } } } /// /// 设置控件节点value /// /// 控件名 /// 值 private void SetEditorValue(string targetName, double value) { foreach (BaseRow row in ppgParameter.Rows) { if (row is CategoryRow categoryRow) { foreach (BaseRow childRow in categoryRow.ChildRows) { if (childRow.Properties.Caption == targetName) { childRow.Properties.Value = value; } } } } } private void OnRadiusUp() { influenceRadius += 5; if (influenceRadius > 300) { influenceRadius = 300; } SetEditorValue("影响半径", influenceRadius); meshEditor?.SetDrawCircle(); } private void OnRadiusDown() { influenceRadius -= 5; if (influenceRadius < 1) { influenceRadius = 1; } SetEditorValue("影响半径", influenceRadius); meshEditor?.SetDrawCircle(); } private void OnPressureUp() { strengthPercentage += 5; if (strengthPercentage > 100) { strengthPercentage = 100; } SetEditorValue("力度", strengthPercentage); } private void OnPressureDown() { strengthPercentage -= 5; if (strengthPercentage < 1) { strengthPercentage = 0; } SetEditorValue("力度", strengthPercentage); } private void UpdateStatus(bool state) { if (state) { this.bbtnDragDown.Down = true; isAltPressed = true; meshEditor?.StartDragDown(); } else { this.bbtnDragUp.Down = true; isAltPressed = false; meshEditor?.StartDragUp(); } meshEditor?.SetDrawCircle(); } protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); // 按下“]”键放大影响半径 if (e.KeyCode == Keys.OemCloseBrackets) { OnRadiusUp(); } // 按下“[”键缩小影响半径 if (e.KeyCode == Keys.OemOpenBrackets) { OnRadiusDown(); } if (e.Shift) { // 按下“>”增加力度百分比 if (e.KeyCode == Keys.OemPeriod) { OnPressureUp(); } // 按下“<”减少力度百分比 if (e.KeyCode == Keys.Oemcomma) { OnPressureDown(); } } if (e.KeyCode == Keys.Menu) { if(!isAltPressed) { UpdateStatus(true); } } } protected override void OnKeyUp(KeyEventArgs e) { base.OnKeyUp(e); if (e.KeyCode == Keys.Menu) { if(isAltPressed) { UpdateStatus(false); } } } private void bbtnCalculateZ_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (calculateZDialog == null) { calculateZDialog = new CalculateZDialog() { StartPosition = FormStartPosition.CenterScreen, }; } if (calculateZDialog.ShowDialog(this) == DialogResult.OK) { //运算 传入z值表达式 string zExpression = calculateZDialog.GetZExpression().ToLower(); bool state = meshEditor.CalculateZByExpression(zExpression); if(state) { ppgParameter.Refresh(); } } } private void barEditItem1_ItemClick(object sender, ItemClickEventArgs e) { } private void bbtnFaultControl_CheckedChanged(object sender, ItemClickEventArgs e) { var item = sender as BarCheckItem; if (item.Checked) { // 处理按下(选中)状态 meshEditor?.SetFaultControlState(true); } else { // 处理释放(未选中)状态 meshEditor?.SetFaultControlState(false); } } //private void RepositoryItemComboBox_SelectedIndexChanged(object sender, EventArgs e) //{ // // 获取当前选中的项 // var selectedItem = this.numbarEditItem.EditValue?.ToString(); // int num = int.Parse(selectedItem); // meshEditor.Editor?.SetDecimalNumber(num); // ppgParameter.Refresh(); //} } }