using DevExpress.Dialogs.Core.Base.ComInterfaces;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraVerticalGrid.Rows;
using DevExpress.XtraWaitForm;
using GeoSigmaDrawLib;
using MeshProcess;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Forms;
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 CalculateZDialog calculateZDialog;
private FormVolumeStats volumeStatsForm;
private FormTrend trendForm;
///
/// 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);
//this.bttonFitting.Enabled = false;
this.bttnTrend.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
this.meshEditor.UpdateVolumeChanged += UpdateVolumeChanged;
this.meshEditor.UpdateTrendPtChanged += UpdateTrendPtChanged;
}
///
/// 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, 0);
// 打开时启用 “断层填充” 和 “断层边缘优化”,使得打开等网系统即呈现最佳显示效果
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;
// 直接根据状态指挥最大化按钮的启用情况
bool isCloning = (meshEditor.CommandStatus == OperaCommandType.GridCloneStamp ||
meshEditor.CommandStatus == OperaCommandType.GridCloneStampCircle);
// 只有在状态不一致时才赋值,防止不必要的界面重绘
if (this.MaximizeBox == isCloning)
{
this.MaximizeBox = !isCloning;
}
}
}
///
/// btns the view all_ item click.
///
/// The sender.
/// The e.
private void btnViewAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
meshEditor?.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)
{
var editorParameter = this.ppgParameter.SelectedObject as GridEditorParameter;
if (editorParameter == null)
return;
string propName = e.Row.Properties.FieldName; // 用字段名匹配而不是 Caption
switch (propName)
{
case nameof(GridEditorParameter.DecimalNumber):
{
int num = editorParameter.DecimalNumber;
if (num > 0 && num < 10)
{
int oldNum = meshEditor.GetDecimalNumber();
if (num != oldNum)
{
meshEditor.SetDecimalNumber(num);
ppgParameter.Refresh();
}
}
break;
}
case nameof(GridEditorParameter.WellPointColor):
meshEditor.SetWellColor(editorParameter.WellPointColor);
break;
case nameof(GridEditorParameter.FontSize):
meshEditor.SetWellTxtSize((float)editorParameter.FontSize);
break;
case nameof(GridEditorParameter.EnablePickMeshZ):
meshEditor.EnablePickMeshZ(editorParameter.EnablePickMeshZ);
break;
case nameof(GridEditorParameter.EnableFillFault):
meshEditor.EnableFillFault(editorParameter.EnableFillFault);
break;
case nameof(GridEditorParameter.OperatorRadius):
case nameof(GridEditorParameter.Strength):
case nameof(GridEditorParameter.ComputeType):
// 这几个属于画刷相关参数,不需要立即调用 SetProperty
break;
default:
meshEditor.SetProperty(
editorParameter.ContourSpace,
editorParameter.MarkStep,
editorParameter.ContourMinValue,
editorParameter.ContourMaxValue,
editorParameter.ZMin,
editorParameter.ZMax);
break;
}
}
///
/// 图层选中变化事件
///
/// 图层树
/// 事件参数
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)
{
var points = meshEditor.GetPointList();
var validPoints = points
.Where(p => !double.IsNaN(p.Z) && p.Z > -1e100)
.ToArray();
if (validPoints.Length <= 1)
{
XtraMessageBox.Show(this, "合法数据点必须大于1个", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
List dataForX = validPoints.Select(p => p.X).ToList();
List dataForY = validPoints.Select(p => p.Y).ToList();
List dataForZ = validPoints.Select(p => p.Z).ToList();
List dataForTZ = validPoints.Select(p => p.TZ).ToList();
List nameList = validPoints.Select(p => p.Name).ToList();
FormWellAdjustSetting formWellAdjustSetting = new FormWellAdjustSetting(100, 10, 0);
formWellAdjustSetting.LoadData(dataForX, dataForY, dataForZ, dataForTZ, nameList);
if (formWellAdjustSetting.ShowDialog() == DialogResult.OK)
{
string selected = formWellAdjustSetting.SelectedMode;
string method = "井点校正";
int methodType = 1;
//传入控制点
if (formWellAdjustSetting.SelectedWellPoints.Count > 1)
{
meshEditor.SetWellPointList(
formWellAdjustSetting.SelectedWellPoints.ToArray(),
formWellAdjustSetting.SelectedWellPoints.Count
);
}
else
{
XtraMessageBox.Show(this, "参与运算的控制点过少,至少大于两个!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
int gridNum = formWellAdjustSetting.FeatherWidth;
int correctionType = formWellAdjustSetting.SmoothRegionIndex;
switch (selected)
{
case "默认":
{
meshEditor.WellAdaptiveAdjust(
correctionType,
gridNum,
(float)formWellAdjustSetting.WellRadius
, (float)formWellAdjustSetting.ValueRange
, (float)formWellAdjustSetting.DecreasingFactor);
UpdateVolumeDate();
}
return;
//case "克里金": method = "克里金井点校正"; methodType = 1; break;
case "RBF": method = "RBF井点校正"; methodType = 2; break;
case "IDW": method = "IDW井点校正"; methodType = 3; break;
}
double valueRange = formWellAdjustSetting.ValueRange;
double lastValidFactor = formWellAdjustSetting.DilutionFactor;
bool state = meshEditor.RectificationMeshWellCompute(valueRange, correctionType, gridNum, 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();
UpdateVolumeDate();
}
}
}
}
///
/// 过滤等值线点击事件.
///
/// The sender.
/// The e.
private void bbtnFilterMesh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
FormFilterMeshSetting 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;
}
}
}
}
}
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.Oemtilde)
{
this.bbtnCloneStamp.Down = true;
//开始抓取仿制图章标本
meshEditor.CloneStampCircle();
}
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.CompileExpressionZ(zExpression);
if (!state)
{
MessageBox.Show(this, "公式输入不正确,请检查语法、变量名和括号匹配。", "公式错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
state = meshEditor.CalculateZByExpression(zExpression);
if (state)
{
ppgParameter.Refresh();
UpdateVolumeDate();
}
}
}
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 bbtnCloneStamp_ItemClick(object sender, ItemClickEventArgs e)
{
meshEditor.CloneStampCircle();
}
private void bttonFitting_ItemClick(object sender, ItemClickEventArgs e)
{
var points = meshEditor.GetPointList();
if (points == null || points.Length <= 1)
{
XtraMessageBox.Show(this, "数据点必须大于1个", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
var validPoints = points
.Where(p => !double.IsNaN(p.Z) && p.Z > -1e100)
.ToArray();
if (validPoints.Length <= 1)
{
XtraMessageBox.Show(this, "合法数据点必须大于1个", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
FormFittingTool fittingForm = new FormFittingTool();
List dataForY = validPoints.Select(p => p.TZ).ToList();
List dataForZ = validPoints.Select(p => p.Z).ToList();
List nameList = validPoints.Select(p => p.Name).ToList();
fittingForm.LoadData(dataForY, dataForZ, nameList, meshEditor.GetZMin(), meshEditor.GetZMax());
// 获取校正后的公式
fittingForm.OnCalibrationComplete += (k, b, formulaStr) =>
{
bool state = meshEditor.FittingCorrectionOperation(formulaStr);
if (state)
{
ppgParameter.Refresh();
UpdateVolumeDate();
}
};
fittingForm.OnRestore += (s, args) =>
{
meshEditor.Undo();
};
fittingForm.Show(this);
}
private void bttonEntireSmooth_ItemClick(object sender, ItemClickEventArgs e)
{
FormSmoothSetting formSmoothSetting = new FormSmoothSetting();
if (formSmoothSetting.ShowDialog(this) == DialogResult.OK)
{
if (formSmoothSetting.SelectedAlgorithmIndex == 0)
{
int smoothType = formSmoothSetting.SmoothRegionIndex;
double sigma = formSmoothSetting.GaussianRadius;
int iter = formSmoothSetting.IterationCount;
int gridNum = formSmoothSetting.FeatherWidth;
meshEditor.FullSmoothGridGaussian(smoothType, sigma, iter, gridNum);
}
else
{
int smoothType = formSmoothSetting.SmoothRegionIndex;
double smooth = formSmoothSetting.SmoothCoefficient;
int smoothCount = formSmoothSetting.SmoothTimes;
int gridNum = formSmoothSetting.FeatherWidth;
meshEditor.FullSmoothIDWMesh(smoothType, smooth, smoothCount, gridNum);
}
}
UpdateVolumeDate();
}
private void RefreshVolumeData()
{
if (volumeStatsForm == null || volumeStatsForm.IsDisposed) return;
int method = volumeStatsForm.GetCurrentMethod(); // 0:容积法, 1:等值线法
int mode = volumeStatsForm.GetCurrentMode(); // 0:构造图, 1:等厚图
LineVolumnData[] dataList = null;
// 根据方式获取数据
if (method == 0)
{
// --- 容积法 ---
dataList = meshEditor.GetStatisVolumn(mode);
}
else
{
// --- 等值线法 ---
dataList = meshEditor.GetContourStatisVolumn();
}
volumeStatsForm.SetDataSource(dataList);
}
private void bttonVolume_ItemClick(object sender, ItemClickEventArgs e)
{
if (volumeStatsForm == null || volumeStatsForm.IsDisposed)
{
volumeStatsForm = new FormVolumeStats();
volumeStatsForm.StartPosition = FormStartPosition.CenterScreen;
// 绑定事件
volumeStatsForm.ModeChanged += (s, idx) => RefreshVolumeData();
volumeStatsForm.MethodChanged += (s, idx) => RefreshVolumeData();
// 初始加载数据
RefreshVolumeData();
volumeStatsForm.Show(this);
}
else
{
volumeStatsForm.Activate();
volumeStatsForm.Visible = true;
RefreshVolumeData();
}
}
///
/// 更新面积权衡实时查看器 数据
///
private void UpdateVolumeDate()
{
if (volumeStatsForm != null && volumeStatsForm.Visible && !volumeStatsForm.IsDisposed)
{
RefreshVolumeData();
}
}
private void UpdateVolumeChanged(object sender, EventArgs e)
{
if (volumeStatsForm != null && volumeStatsForm.Visible && !volumeStatsForm.IsDisposed)
{
RefreshVolumeData();
}
}
private void bttonDragShape_ItemClick(object sender, ItemClickEventArgs e)
{
meshEditor.DragShape();
}
private void UpdateTrendPtChanged(object sender, EventArgs e)
{
if (trendForm != null && !trendForm.IsDisposed)
{
trendForm.ReleasePickButton();
return;
}
}
private void bttnTrend_ItemClick(object sender, ItemClickEventArgs e)
{
if (trendForm != null && !trendForm.IsDisposed)
{
trendForm.Activate(); // 如果已打开,直接置顶显示
return;
}
trendForm = new FormTrend();
trendForm.Owner = this;
trendForm.StartPosition = FormStartPosition.CenterParent;
// 这里的 ipx, ipy 建议在事件内部实时获取,否则窗口缩放后中心点就变了
trendForm.TrendDataChanged += (s, args) =>
{
// 实时获取当前中心点
int currentIpx = this.meshEditor.Width / 2;
int currentIpy = this.meshEditor.Height / 2;
switch (args.OperateType)
{
case TrendOperateType.Update:
if (args.ActiveTrend != null)
{
// 只有当主界面处于“拾取模式”且确实点了一下时,才覆盖模型坐标
if (this.meshEditor.CommandStatus == OperaCommandType.PickTrendLocation &&
(this.meshEditor.mouseTrendPt.X > 0 || this.meshEditor.mouseTrendPt.Y > 0))
{
args.ActiveTrend.Cx = this.meshEditor.mouseTrendPt.X;
args.ActiveTrend.Cy = this.meshEditor.mouseTrendPt.Y;
// 拾取存入模型后,立刻清空临时点,防止后续其他项 Update 时误用
this.meshEditor.mouseTrendPt.X = 0;
this.meshEditor.mouseTrendPt.Y = 0;
}
int tx = args.ActiveTrend.Cx > 0 ? (int)args.ActiveTrend.Cx : currentIpx;
int ty = args.ActiveTrend.Cy > 0 ? (int)args.ActiveTrend.Cy : currentIpy;
meshEditor.DrawTrendArrowOnWindow(args.ActiveTrend.Name, tx, ty,
(float)args.ActiveTrend.Angle, (float)args.ActiveTrend.Ratio);
}
break;
case TrendOperateType.Delete:
meshEditor.ClearTrendArrow(args.DeletedName);
break;
case TrendOperateType.Close:
meshEditor.ClearAllTrendArrows();
// 窗口关闭时,主界面状态也应重置
this.meshEditor.CommandStatus = OperaCommandType.Unknown;
this.meshEditor.mouseTrendPt.X = 0;
this.meshEditor.mouseTrendPt.Y = 0;
break;
case TrendOperateType.PickLocation:
meshEditor.StartTrendPt();
break;
}
};
trendForm.Show();
}
}
}