//
// Copyright (c) PlaceholderCompany. All rights reserved.
//
using GeoSigma.SigmaDrawerStyle;
using GeoSigma.SigmaDrawerUtil;
using GeoSigma.UCDraw.Drawtool;
using GeoSigmaDrawLib;
using SigmaDrawerElement;
using StyleLibManager;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace UCDraw
{
public delegate void SymbolSigma(GeoSigmaDrawLib.GeoSigmaXY geoSigma);
///
/// 属性面板
///
public partial class PanelEleProperty : UserControl
{
public WellBaseDrawView Viewer { get; set; }
public string LayerName { get; set; }
private int propertyType = 0; // 0-层位属性;1-元素属性
private int propertyIndex = -1;
private int elementPropertyIndex = -1;
public SymbolSigma GetSigmaEvent { get; set; } = null;
///
/// 图元属性发生了变化
///
public event EventHandler ElementChanged;
///
/// 图层属性发生了变化
///
public event EventHandler LayerChanged;
public PanelEleProperty()
{
this.InitializeComponent();
}
///
/// 属性控件绘制事件.
///
/// The sender.
/// The e.
private void propertyGrid_Paint(object sender, PaintEventArgs e)
{
PropertyGrid propertyGrid = sender as PropertyGrid;
Type objectType = propertyGrid.SelectedObject?.GetType();
FieldInfo categorysinfo = objectType?.GetField("categorys", BindingFlags.NonPublic | BindingFlags.Instance);
if (categorysinfo != null)
{
List categorys = categorysinfo.GetValue(propertyGrid.SelectedObject) as List;
propertyGrid.CollapseAllGridItems();
GridItemCollection currentPropEntries = typeof(PropertyGrid).GetField("currentPropEntries", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(propertyGrid) as GridItemCollection;
GridItem[] newarray = currentPropEntries.Cast().OrderBy((t) => categorys.IndexOf(t.Label)).ToArray();
currentPropEntries.GetType().GetField("entries", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(currentPropEntries, newarray);
propertyGrid.ExpandAllGridItems();
// 获取顶层分类节点
GridItem rootItem = propertyGrid.SelectedGridItem;
while (rootItem?.Parent != null)
{
rootItem = rootItem.Parent;
}
// 展开第一级分类
foreach (GridItem item in rootItem?.GridItems)
{
item.Expanded = true;
}
}
propertyGrid.Paint -= this.propertyGrid_Paint;
}
private DrawerStyle currentStyle;
///
/// 图层属性
///
public DrawerStyle CurrentStyle
{
get => this.currentStyle;
set
{
this.currentStyle = value;
this.ppgLayer.SelectedObject = null;
this.lsvLayer.Items.Clear();
// lsvElement.Items.Clear();
if (this.currentStyle == null)
{
this.SetElementUI();
return;
}
if (this.currentStyle.CurveStyle != null)
{
List lstCurve = this.currentStyle.CurveStyle.Properties;
if (lstCurve != null && lstCurve.Count > 0)
{
int nIndex = 0;
foreach (CurveView curve in lstCurve)
{
if (curve is CurveStyleBase)
{
continue;
}
nIndex++;
ListViewItem lvi = new ListViewItem(string.Empty + nIndex);
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, curve.TypeName));
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, GeoSigma.UCDraw.Properties.Resources.PanelProperty_Curve_TypeName));
lvi.Tag = curve;
this.lsvLayer.Items.Add(lvi);
}
}
}
if (this.currentStyle.PontStyle != null)
{
AddPointStyleItem(this.currentStyle.PontStyle, this.lsvLayer);
}
if (this.lsvLayer.Items.Count > 0)
{
// CurveProperty property = lsvCurve.Items[0].Tag as CurveProperty;
this.lsvLayer.Items[0].Selected = true;
// propertyGrid.SelectedObject = lsvLayer.Items[0].Tag;
}
this.lsvLayer.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
this.SetElementUI();
}
}
private DrawerElementProperty elementProperty;
///
/// 图元属性
///
public DrawerElementProperty ElementProperty
{
get
{
return this.elementProperty;
}
set
{
this.elementProperty = value;
this.ppgElement.SelectedObject = null;
this.ppgData.SelectedObject = null;
this.lsvElement.Items.Clear();
if (this.elementProperty == null || this.elementProperty.Element == null)
{
this.SetElementUI();
return;
}
if (this.Viewer.SelectGetLayerName(out string layer))
{
this.elementProperty.Element.Layer = layer;
}
this.ppgData.SelectedObject = this.elementProperty.Element;
if (this.IsPointType(this.elementProperty.Element.ElementType))
{
if (this.elementProperty.PointStyle != null)
{
AddPointStyleItem(this.elementProperty.PointStyle, this.lsvElement);
}
}
else if (this.elementProperty.Element.ElementType == DrawElementType.ELEMENT_CURVE)
{
this.lsvElement.Visible = true;
this.ppgElement.Visible = true;
if (this.elementProperty.CurveStyle != null)
{
List lstCurve = this.elementProperty.CurveStyle.Properties;
if (lstCurve != null && lstCurve.Count > 0)
{
int nIndex = 1;
foreach (CurveView curve in lstCurve)
{
if (curve is CurveStyleBase)
{
continue;
}
ListViewItem lvi = new ListViewItem(string.Empty + nIndex);
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, curve.TypeName));
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, GeoSigma.UCDraw.Properties.Resources.PanelProperty_Curve_TypeName));
lvi.Tag = curve;
this.lsvElement.Items.Add(lvi);
nIndex++;
}
}
}
}
else if (this.elementProperty.Element.ElementType == DrawElementType.ELEMENT_MESH)
{
DrawerSurface surface = this.elementProperty.Element as DrawerSurface;
// surface.Items.DrawerUpdateEvent +=new DrawerUpdateEventHandler( Items_DrawerUpdateEvent);
if (surface.Items.DrawerUpdateEvent == null)
{
surface.Items.DrawerUpdateEvent += (GradientColors colors) =>
{
surface.SetColors(colors);
string strData = DrawerElementHelp.Serialize(this.elementProperty);
if (this.Viewer.SetElementProperty(strData) == true) //ggff
{
this.Viewer.Redraw();
}
// MessageBox.Show("Need Redraw");
// Viewer.Redraw();
};
}
}
if (this.lsvElement.Items.Count > 0)
{
this.lsvElement.Items[0].Selected = true;
}
this.lsvElement.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
this.SetElementUI();
this.SetDataPropertyStatus(this.ppgData);
}
}
public long ElementPosition { get; set; } = 0;
///
protected override void OnHandleCreated(EventArgs e)
{
float fDpixRatio = AutoResizeForm.GetWindowsZoomRatio(this.CreateGraphics());
if (fDpixRatio != 1.0f)
{
this.tsElementToolBar.ImageScalingSize = new Size(
(int)(this.tsElementToolBar.ImageScalingSize.Width * fDpixRatio)
, (int)(this.tsElementToolBar.ImageScalingSize.Height * fDpixRatio));
foreach (ToolStripItem item in this.tsElementToolBar.Items)
{
if (item.Image != null)
{
Image imgDest = AutoResizeForm.ImageBicubicResize(
item.Image, fDpixRatio);
item.Image.Dispose();
item.Image = imgDest;
}
}
this.tsLayerToolBar.ImageScalingSize = new Size(
(int)(this.tsLayerToolBar.ImageScalingSize.Width * fDpixRatio)
, (int)(this.tsLayerToolBar.ImageScalingSize.Height * fDpixRatio));
foreach (ToolStripItem item in this.tsLayerToolBar.Items)
{
if (item.Image != null)
{
Image imgDest = AutoResizeForm.ImageBicubicResize(
item.Image, fDpixRatio);
item.Image.Dispose();
item.Image = imgDest;
}
}
}
}
///
/// 设置属性的状态
///
/// 图元属性
private void SetPropertyStatus(PropertyGrid ppg)
{
object varElement = ppg.SelectedObject;
if (varElement is CurveProperty curveProperty)
{
bool bReadOnly = !IsWaveCurve(curveProperty);
{
PropertyHelp.SetPropertyReadOnly(ppg.SelectedObject, "WaveT", bReadOnly);
PropertyHelp.SetPropertyReadOnly(varElement, "WaveA", bReadOnly);
PropertyHelp.SetPropertyReadOnly(curveProperty, "WaveNum", bReadOnly);
}
PropertyHelp.SetPropertyReadOnly(curveProperty, nameof(CurveProperty.Alpha), (curveProperty.Base.Style & (int)LineType.PLINE_HS) != 0);
}
}
///
/// Sets 数据属性的只读或可视状态.
///
/// The PPG.
private void SetDataPropertyStatus(PropertyGrid ppg)
{
object varElement = ppg.SelectedObject;
if (varElement is SigmaDrawerElement.DrawerSurface surface)
{
PropertyHelp.SetPropertyReadOnly(varElement, "Point", surface.AutoUpdate);
PropertyHelp.SetPropertyReadOnly(varElement, "RulerSize", surface.AutoUpdate);
PropertyHelp.SetPropertyReadOnly(varElement, "RulerTextHeight", surface.AutoUpdate);
PropertyHelp.SetPropertyReadOnly(varElement, "RulerNumber", surface.AutoUpdate);
PropertyHelp.SetPropertyReadOnly(varElement, "RulerDF", surface.AutoUpdate);
PropertyHelp.SetPropertyReadOnly(varElement, "RulerStyleReverse", surface.AutoUpdate);
PropertyHelp.SetPropertyReadOnly(varElement, "RulerRangeZ", surface.AutoUpdate);
}
ppg.Refresh();
}
// 图元变更后, UI处理逻辑
///
/// Sets the element u i.
///
private void SetElementUI()
{
this.tsbLayerPropAddPoint.Enabled = !this.lsvLayer.Items.OfType()
.Any(r => this.IsPointStyle(r.Tag));
if (this.elementProperty != null && this.elementProperty.Element != null)
{
bool isCurve = this.elementProperty.Element.ElementType == DrawElementType.ELEMENT_CURVE;
bool isPoint = this.IsPointType(this.elementProperty.Element.ElementType);
this.tsbElementPropAddLine.Enabled = isCurve;
this.tsbElementPropAddPoint.Enabled = isPoint && (!this.ElementHasPointItems() || this.elementProperty.PointStyle == null);
this.tsbtnElementStyleLibrary.Enabled = this.tsbElementPropAddPoint.Enabled | this.tsbElementPropAddLine.Enabled;
this.tsbElementPropMoveUp.Enabled = isCurve;
this.tsbElementPropMoveDown.Enabled = isCurve;
this.tsbElementPropDel.Enabled = isCurve;
if (isPoint)
{
this.splitElement.Panel1Collapsed = false;
this.splitElementGrid.Panel1Collapsed = false;
// this.splitElement.Panel1Collapsed = true;
// this.splitElementGrid.Panel1Collapsed = this.elementProperty.PointStyle == null;
// this.tsbElementPropDel.Enabled = this.elementProperty.PointStyle != null;
}
else if (isCurve)
{
this.splitElement.Panel1Collapsed = false;
this.splitElementGrid.Panel1Collapsed = false;
}
else
{
this.splitElement.Panel1Collapsed = true;
this.splitElementGrid.Panel1Collapsed = true;
}
}
else
{
this.splitElement.Panel1Collapsed = true;
this.splitElementGrid.Panel1Collapsed = true;
this.tsbElementPropAddLine.Enabled = false;
this.tsbElementPropAddPoint.Enabled = false;
this.tsbtnElementStyleLibrary.Enabled = false;
this.tsbElementPropMoveUp.Enabled = false;
this.tsbElementPropMoveDown.Enabled = false;
this.tsbElementPropDel.Enabled = false;
}
this.OnClipboardChanged();
}
private bool ElementHasPointItems()
{
return this.lsvElement.Items.OfType().Any(r => this.IsPointStyle(r.Tag));
}
///
/// 是否是点类数据
///
/// 数据类型
/// 是否点类数据
private bool IsPointType(DrawElementType elementType)
{
return (elementType == DrawElementType.ELEMENT_POINT
|| elementType == DrawElementType.ELEMENT_XYZ
|| elementType == DrawElementType.ELEMENT_TWOPOINT
|| elementType == DrawElementType.ELEMENT_CROSSPOINT);
}
///
/// 显示图层属性
///
/// 图层属性
public void ShowLayerProperty(DrawerStyle layerStyle)
{
this.CurrentStyle = layerStyle;
this.tabControl1.SelectTab(0);
this.LayerChanged?.Invoke(this, new EventArgs());
}
///
/// Shows the element property.
///
/// The element property.
/// The position.
public void ShowElementProperty(DrawerElementProperty elementProperty, long position)
{
this.ElementPosition = position;
this.ElementProperty = elementProperty;
this.tabControl1.SelectTab(1);
this.ElementChanged?.Invoke(this, new EventArgs());
}
///
/// 选择图层属性
///
/// sender
/// e
private void lsvCurve_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.lsvLayer.SelectedItems.Count > 0)
{
this.ppgLayer.SelectedObject = this.lsvLayer.SelectedItems[0].Tag;
this.propertyType = 0;
this.propertyIndex = this.lsvLayer.SelectedItems[0].Index;
}
}
///
/// 选择图元属性
///
/// sender
/// e
private void lsvElement_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.lsvElement.SelectedItems.Count > 0)
{
this.ppgElement.SelectedObject = this.lsvElement.SelectedItems[0].Tag;
// propertyType=0;
this.elementPropertyIndex = this.lsvElement.SelectedItems[0].Index;
}
}
///
/// 属性修改事件
///
/// sender
/// e
private void ppgLayer_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
object varStyle = this.ppgLayer.SelectedObject;
if (varStyle is DrawerPointStyle)
{
if (!this.needResetDraw(e.ChangedItem))
{
return;
}
string strPointStyle = ((DrawerPointStyle)varStyle).SerialXml();
if (this.Viewer.SetLayerHowtoViewPoint(this.LayerName, strPointStyle, true) == true)
{
this.Viewer.Redraw();
}
}
else
{
if (e.ChangedItem.Label.IndexOf("步长|数目") >= 0)
{
this.ppgLayer.SelectedObject = varStyle;
}
string strCurveStyle = ((CurveView)varStyle).SerialXml();
// Console.WriteLine(strCurveStyle);
strCurveStyle = strCurveStyle.Replace("true", "1");
strCurveStyle = strCurveStyle.Replace("false", "0");
if (this.Viewer.SetLayerHowtoViewCurve(this.LayerName, strCurveStyle, this.propertyIndex) == true)
{
this.Viewer.Redraw();
}
this.SetPropertyStatus(s as PropertyGrid);
}
}
///
/// needs the reset draw.
///
/// The item.
/// A bool.
private bool needResetDraw(GridItem item)
{
if (item.Label.IndexOf("固定比例") >= 0)
{
return false;
}
return true;
}
///
/// ppgs the element_ property value changed.
///
/// The s.
/// The e.
private void ppgElement_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
if (this.elementProperty == null || this.elementProperty.Element == null)
{
return;
}
object varElement = this.ppgData.SelectedObject;
if (varElement is DrawerWellGroup)
{
DrawerWellGroup wellGroup = varElement as DrawerWellGroup;
WellGroupParameter groupPara = wellGroup.Parameter;
WellGroupCreateParameter drawerPara = new WellGroupCreateParameter(groupPara);
drawerPara.WellX = wellGroup.X;
drawerPara.WellY = wellGroup.Y;
drawerPara.WellName = wellGroup.Name;
WellGroupCaculator caculator = new WellGroupCaculator();
DrawerWellGroup wellGroupNew = caculator.CreateWellGroup(drawerPara);
this.elementProperty.Element = wellGroupNew;
// ppgElement.SelectedObject = elementProperty.Element;
}
bool state = true;
if (varElement is DrawerSurface)
{
DrawerSurface surfaces = varElement as DrawerSurface;
state = surfaces.AutoUpdate;
}
string strData = DrawerElementHelp.Serialize(this.elementProperty);
if (this.Viewer.SetElementProperty(strData/*, state*/) == true) //ggff
{
this.Viewer.Redraw();
}
else
{
return;
}
if (varElement is DrawerFrame)
{
this.ppgData.SelectedObject = this.elementProperty.Element;
}
if (e.ChangedItem.Label.IndexOf("步长|数目") >= 0)
{
this.ppgElement.SelectedObject = this.ppgElement.SelectedObject;
}
this.SetDataPropertyStatus(this.ppgData);
this.SetPropertyStatus(s as PropertyGrid);
// (s as PropertyGrid).Refresh();
}
public class ReadOnlyPropertyDescriptor : PropertyDescriptor
{
private PropertyDescriptor innerDescriptor;
private bool isReadOnly = true;
public ReadOnlyPropertyDescriptor(PropertyDescriptor innerDescriptor, bool isReadOnly)
: base(innerDescriptor)
{
this.innerDescriptor = innerDescriptor;
this.isReadOnly = isReadOnly;
}
public override bool IsReadOnly
{
get { return true; }
}
public override Type ComponentType => this.innerDescriptor.ComponentType;
public override Type PropertyType => this.innerDescriptor.PropertyType;
///
/// Cans the reset value.
///
/// The component.
/// A bool.
public override bool CanResetValue(object component)
{
return this.innerDescriptor.CanResetValue(component);
}
///
/// Gets the value.
///
/// The component.
/// An object.
public override object GetValue(object component)
{
return this.innerDescriptor.GetValue(component);
}
///
/// Resets the value.
///
/// The component.
public override void ResetValue(object component)
{
this.innerDescriptor.ResetValue(component);
}
///
/// Sets the value.
///
/// The component.
/// The value.
public override void SetValue(object component, object value)
{
if (!this.isReadOnly)
{
this.innerDescriptor.SetValue(component, value);
}
}
///
/// Shoulds the serialize value.
///
/// The component.
/// A bool.
public override bool ShouldSerializeValue(object component)
{
return this.innerDescriptor.ShouldSerializeValue(component);
}
}
///
/// 向上移动曲线样式
///
/// ppg
/// lsv
/// pred
private void MoveUpCurveStyle(PropertyGrid ppg, ListView lsv, Func pred)
{
object varStyle = ppg.SelectedObject;
if (!(varStyle is DrawerPointStyle))
{
List list = lsv.Items.OfType().Where(r => r.Tag is CurveView).ToList();
int index = list.FindIndex(r => r.Tag is CurveView && r.Tag == varStyle);
if (index > 0)
{
if (pred(index))
{
int i = lsv.Items.IndexOf(list[index]);
ListViewItem item = lsv.Items[i];
lsv.Items.RemoveAt(i);
lsv.Items.Insert(i - 1, item);
this.Viewer.Redraw();
}
}
}
}
///
/// 向下移动曲线样式
///
/// ppg
/// lsv
/// pred
private void MoveDownCurveStyle(PropertyGrid ppg, ListView lsv, Func pred)
{
object varStyle = ppg.SelectedObject;
if (!(varStyle is DrawerPointStyle))
{
List list = lsv.Items.OfType().Where(r => r.Tag is CurveView).ToList();
int index = list.FindIndex(r => r.Tag is CurveView && r.Tag == varStyle);
if (index < list.Count - 1)
{
if (pred(index))
{
int i = lsv.Items.IndexOf(list[index]);
ListViewItem item = lsv.Items[i];
lsv.Items.RemoveAt(i);
lsv.Items.Insert(i + 1, item);
this.Viewer.Redraw();
}
}
}
}
///
/// 删除选择的样式
///
/// 属性面板
/// 修饰列表
/// 是否是元素属性
/// 删除曲线样式委托
/// 删除点样式委托
private void DeleteStyle(PropertyGrid ppg, ListView lsv, bool element, Func predCurve, Func predPoint)
{
if (lsv.SelectedItems.Count == 0)
{
return;
}
// 从数据对象中移除修饰
DeleteCurveStyles(lsv, element, predCurve);
DeletePointStyles(lsv, element, predPoint);
if (lsv.Items.Count == 0)
{
ppg.SelectedObject = null;
}
if (lsv.Items.Count > 0)
{
lsv.Items[0].Selected = true;
}
// Reset listview Index;
int n = 1;
for (int i = 0; i < lsv.Items.Count; i++)
{
ListViewItem item = lsv.Items[i];
if (item.Tag is CurveView)
{
item.Text = string.Empty + n++;
}
}
this.SetElementUI();
}
private void DeletePointStyles(ListView lsv, bool element, Func predPoint)
{
bool needRemovePointStyle = GetSelectedTags(lsv).Any(tag => IsPointStyle(tag));
if (!needRemovePointStyle)
{
return;
}
if (!predPoint())
{
return;
}
for (int idx = lsv.Items.Count - 1; idx >= 0; idx--)
{
if (IsPointStyle(lsv.Items[idx].Tag))
{
lsv.Items[idx].Remove();
}
}
if (element && this.elementProperty != null)
{
this.elementProperty.PointStyle = null;
}
else if (!element && this.currentStyle != null)
{
this.currentStyle.PontStyle = null;
}
}
private void DeleteCurveStyles(ListView lsv, bool element, Func predCurve)
{
List