//
// Copyright (c) PlaceholderCompany. All rights reserved.
//
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
#if NET8_0
#else
using System.Drawing.Design;
#endif
using System.Linq;
using System.Xml.Serialization;
using GeoSigma;
using GeoSigma.SigmaDrawerStyle;
using GeoSigma.SigmaDrawerUtil;
using GeoSigmaDrawLib;
using SigmaDrawerStyle;
namespace SigmaDrawerElement
{
[TypeConverter(typeof(PropertySorter))]
public class DrawerSurface : ElementBase
{
///
/// 属性类别排序
///
private List categorys = new List() { "基础属性", "曲面", "颜色标尺", "光照", "数据", "其他", "杂项" };
public DrawerSurface()
{
ElementType = DrawElementType.ELEMENT_MESH;
}
#region Other
[XmlIgnore]
[Category("数据"), DisplayName("名字"), ReadOnly(true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}
[Category("光照"), DisplayName("启用"), PropertyOrder(0)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.YesNoConverter))]
public bool LightEnable { get; set; } = false;
private float lightAzimuth;
[Category("光照"), DisplayName("水平照射角度(度)"),PropertyOrder(1)]
public float LightAzimuth
{
get { return lightAzimuth; }
set { lightAzimuth = GetValueInRange(value, 0.0f, 360.0f); }
}
private float lightElevation;
[Category("光照"), DisplayName("垂直照射角度(度)"), PropertyOrder(2)]
public float LightElevation
{
get { return lightElevation; }
set { lightElevation = GetValueInRange(value, 0.0f, 90.0f); }
}
private float lightIntensity;
[Category("光照"), DisplayName("环境光强度"), PropertyOrder(3)]
public float LightIntensity
{
get { return lightIntensity; }
set { lightIntensity = GetValueInRange(value, 0.0f, 1.0f); }
}
private float zScaleFactor;
[Category("光照"), DisplayName("Z轴缩放因子"), PropertyOrder(4)]
public float ZScaleFactor
{
get { return zScaleFactor; }
set { zScaleFactor = value; }
}
[Browsable(false)]
[XmlElement("Other")]
// [TypeConverter(typeof(SigmaDrawerStyle.Converter.BaseExpandableConverter))]
public SfOther Other { get; set; } = new SfOther();
[XmlIgnore]
[Category("曲面"), DisplayName("加密次数"), PropertyOrder(0)]
public int OtherTimes
{
get => Other.Times;
set => Other.Times = value;
}
///
/// Gets or sets 自动设置标尺.
///
///
/// true if [automatic update]; otherwise, false.
///
[XmlIgnore]
[Category("颜色标尺"), DisplayName("自动设置"), PropertyOrder(1)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.YesNoConverter))]
public bool AutoUpdate
{
get
{
if ((Other.Style & (int)MeshAlphaType.MESH_UPDATE_RULER) > 0)
{
return true;
}
return false;
}
set
{
if (value == true)
{
Other.Style |= (int)MeshAlphaType.MESH_UPDATE_RULER;
}
else
{
Other.Style &= ~(int)MeshAlphaType.MESH_UPDATE_RULER;
}
}
}
[XmlIgnore]
[TypeConverter(typeof(Converter.MeshAlphaTypeConverter1)), PropertyOrder(2)]
[Category("曲面"), DisplayName("透明处理"), ReadOnly(false)]
public int OtherStyle1
{
get => Other.Style & (int)MeshAlphaType.IMAGE_TRANSPARENT_ALL;
set
{
Other.Style &= ~(int)MeshAlphaType.IMAGE_TRANSPARENT_ALL;
Other.Style |= value;
}
}
[Browsable(false)]
[XmlIgnore]
public int OtherAlpha
{
get => this.Other.Alpha;
set => Other.Alpha = value;
}
[XmlIgnore]
[Category("曲面"), DisplayName("透明色"), ReadOnly(false), PropertyOrder(3)]
#if NET8_0
#else
[Editor(typeof(PropertyEditorColor), typeof(UITypeEditor))]
#endif
[TypeConverter(typeof(PropertyColorIndicatorConvert))]
public Color TransparentColor
{
get
{
return ColorTranslator.FromWin32(OtherAlpha);
}
set
{
OtherAlpha = ColorTranslator.ToWin32(value);
}
}
#endregion
[XmlIgnore]
[TypeConverter(typeof(Converter.MeshAlphaTypeConverter2))]
[Category("曲面"), DisplayName("处理方式"), PropertyOrder(4)]
public int OtherStyle2
{
get => Other.Style & (int)MeshAlphaType.MESH_DIFFERENTIAL_ALL;
set
{
Other.Style &= ~(int)MeshAlphaType.MESH_DIFFERENTIAL_ALL;
Other.Style |= value;
}
}
private ValueRange _RangeZ = new ValueRange();
[XmlIgnore]
[Category("曲面"), DisplayName("Z值范围"), PropertyOrder(5)]
[TypeConverter(typeof(PropertyRangeConvert))]
public ValueRange RangeZ
{
get
{
if (_RangeZ == null)
{
_RangeZ = new ValueRange(0, 100);
}
return _RangeZ;
}
set
{
_RangeZ = value;
_RangeZ.Zmin = value.Zmin;
_RangeZ.Zmax = value.Zmax;
//当颜色标尺 自动设置为跟随才设置
if (AutoUpdate)
{
RulerRangeZ = _RangeZ;
}
}
}
#region ColorRuler
[DisplayName("颜色标尺")]
public class SfColorRuler
{
#region Coordinate
public class SfCoordinate
{
//public class SfPoint
//{
// public double X { get; set; }
// public double Y { get; set; }
// public override string ToString()
// {
// return $"{X},{Y}";
// }
//}
//public class SfSize
//{
// [DisplayName("\t\t\t宽度")]
// public double Width { get; set; }
// [DisplayName("\t\t高度")]
// public double Height { get; set; }
// public override string ToString()
// {
// return $"{Width},{Height}";
// }
//}
[XmlText]
public string Text
{
get
{
return $"{Point.X},{Point.Y} {Point.X + RulerSize.Width},{Point.Y + RulerSize.Height}";
}
set
{
var arr = value.Split(new string[] { ",", " ", "\t" }, StringSplitOptions.RemoveEmptyEntries);
if (arr.Length == 4)
{
Point.X = Convert.ToDouble(arr[0]);
Point.Y = Convert.ToDouble(arr[1]);
var xMax = Convert.ToDouble(arr[2]);
var yMax = Convert.ToDouble(arr[3]);
this.RulerSize = new SizeF((float)(xMax - Point.X), (float)(yMax - Point.Y));
}
}
}
[XmlIgnore]
public PropertyPoint Point { get; set; } = new PropertyPoint();
[XmlIgnore]
public SizeF RulerSize { get; set; } = default(SizeF);
}
//[Browsable(false)]
[XmlElement("Coordinate")]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseExpandableConverter)), ReadOnly(true)]
public SfCoordinate Coordinate { get; set; } = new SfCoordinate();
#endregion
[XmlElement("RangeZ")]
public SfcrRangeZ RangeZ { get; set; } = new SfcrRangeZ();
[XmlElement("Other")]
public SfcrOther Other { get; set; } = new SfcrOther();
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseExpandableConverter))]
public class SfcrRangeZ
{
[DisplayName("\t\t最小")]
[XmlAttribute]
public double Zmin { get; set; }
[DisplayName("\t\t\t最大")]
[XmlAttribute]
public double Zmax { get; set; }
[DisplayName("\t步长")]
[XmlAttribute]
public double Delt { get; set; }
public override string ToString()
{
return $"{Zmin}, {Zmax}";
}
}
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseExpandableConverter))]
public class SfcrOther
{
[XmlAttribute]
public double TextHeight { get; set; }
[XmlAttribute]
public int Style { get; set; }
[XmlAttribute]
public int Number { get; set; }
[XmlAttribute]
public int DF { get; set; }
}
}
[XmlElement("ColorRuler")]
[Browsable(false)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseExpandableConverter))]
public SfColorRuler ColorRuler { get; set; } = new SfColorRuler();
[XmlIgnore]
[Category("颜色标尺"), DisplayName("显示标尺"), PropertyOrder(0)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.YesNoConverter))]
public bool RulerShow
{
get => (Other.Style & (int)MeshAlphaType.MESH_DRAW_RULER) == (int)MeshAlphaType.MESH_DRAW_RULER;
set
{
if (value)
{
Other.Style |= (int)MeshAlphaType.MESH_DRAW_RULER;
}
else
{
Other.Style &= ~(int)MeshAlphaType.MESH_DRAW_RULER;
}
}
}
[XmlIgnore]
[Category("颜色标尺"), DisplayName("反转显示"), PropertyOrder(2)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.YesNoConverter)), ReadOnly(false)]
public bool RulerStyleReverse
{
get => (ColorRuler.Other.Style & (int)MeshRulerIdea.COLOR_RULER_REVERSAL) == (int)MeshRulerIdea.COLOR_RULER_REVERSAL;
set
{
if (value)
{
ColorRuler.Other.Style |= (int)MeshRulerIdea.COLOR_RULER_REVERSAL;
}
else
{
ColorRuler.Other.Style &= ~(int)MeshRulerIdea.COLOR_RULER_REVERSAL;
}
}
}
[XmlIgnore]
[Browsable(false)]
[Category("颜色标尺"), DisplayName("显示方式"), PropertyOrder(3)]
[TypeConverter(typeof(Converter.MeshRulerIdeaConverter))]
public int RulerStyle
{
get => ColorRuler.Other.Style & (int)MeshRulerIdea.COLOR_RULER_HV_ALL;
set
{
ColorRuler.Other.Style &= ~(int)MeshRulerIdea.COLOR_RULER_HV_ALL;
ColorRuler.Other.Style |= value;
}
}
[XmlIgnore]
[Category("颜色标尺"), DisplayName("坐标"), ReadOnly(false), PropertyOrder(4)]
[TypeConverter(typeof(PropertyPointConvert))]
public PropertyPoint Point
{
get => ColorRuler.Coordinate.Point;
set => ColorRuler.Coordinate.Point = value;
}
[XmlIgnore]
[Category("颜色标尺"), DisplayName("尺寸"), ReadOnly(false), PropertyOrder(5)]
[TypeConverter(typeof(PropertySizeConvert))]
public SizeF RulerSize
{
get => ColorRuler.Coordinate.RulerSize;
set => ColorRuler.Coordinate.RulerSize = value;
}
[XmlIgnore]
[Category("颜色标尺"), DisplayName("文字高度"), ReadOnly(false), PropertyOrder(6)]
public double RulerTextHeight
{
get => ColorRuler.Other.TextHeight;
set => ColorRuler.Other.TextHeight = value;
}
private ValueRange _RulerRangeZ;
[XmlIgnore]
[Category("颜色标尺"), DisplayName("标注范围"), ReadOnly(false), PropertyOrder(7)]
[TypeConverter(typeof(PropertyRangeConvert))]
public ValueRange RulerRangeZ
{
get
{
if (_RulerRangeZ == null)
{
_RulerRangeZ = new ValueRange();
}
if (ColorRuler.RangeZ != null)
{
_RulerRangeZ.Zmin = ColorRuler.RangeZ.Zmin;
_RulerRangeZ.Zmax = ColorRuler.RangeZ.Zmax;
}
return _RulerRangeZ;
}
set
{
_RulerRangeZ = value;
ColorRuler.RangeZ.Zmin = _RulerRangeZ.Zmin;
ColorRuler.RangeZ.Zmax = _RulerRangeZ.Zmax;
}
}
// TODO:步长
[XmlIgnore]
[Category("颜色标尺"), DisplayName("个数"), ReadOnly(false), PropertyOrder(8)]
public int RulerNumber
{
get => ColorRuler.Other.Number;
set => ColorRuler.Other.Number = value;
}
[XmlIgnore]
[Category("颜色标尺"), DisplayName("保留小数位数"), ReadOnly(false), PropertyOrder(9)]
public int RulerDF
{
get => ColorRuler.Other.DF;
set => ColorRuler.Other.DF = value;
}
#endregion
#region MeshColor
[Browsable(false)]
[XmlElement("MeshColor")]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseExpandableConverter))]
public SfMeshColor MeshColor { get; set; } = new SfMeshColor();
private GradientColors colorItems = new GradientColors();
//[RefreshProperties(RefreshProperties.All)]
//[NotifyParentProperty(true)]
[Category("曲面"), DisplayName("颜色"), PropertyOrder(1)]
[TypeConverter(typeof(GeoSigma.SigmaDrawerStyle.Converter.BaseCollectionConverter))]
//[TypeConverter(typeof(ExpandableObjectConverter))]
#if NET8_0
#else
[Editor("GeoSigma.SigmaDrawerStyle.PropertyEditorGradientColor, SigmaDrawerStyle", typeof(System.Drawing.Design.UITypeEditor))]
#endif
[XmlIgnore]
public GradientColors Items
{
get
{
if (colorItems == null)
{
colorItems = new GradientColors();
}
else
{
colorItems.Clear();
}
colorItems.AddRange(MeshColor.Items);
double dZMin = RangeZ.Zmin;
double dZMax = RangeZ.Zmax;
if (dZMin == dZMax)
{
CalculateRange(ref dZMin, ref dZMax);
}
colorItems.ZMin = RulerRangeZ.Zmin = dZMin;
colorItems.ZMax = RulerRangeZ.Zmax = dZMax;
return colorItems;
}
set
{
colorItems = value;
MeshColor.Items.CloneFrom(colorItems);
RulerRangeZ.Zmin = colorItems.ZMin;
RulerRangeZ.Zmax = colorItems.ZMax;
}
}
public void SetColors(GradientColors colors)
{
colorItems.CloneFrom(colors);
MeshColor.Items = colorItems;
RulerRangeZ.Zmin = colorItems.ZMin;
RulerRangeZ.Zmax = colorItems.ZMax;
}
private void CalculateRange(ref double min, ref double max)
{
min = MeshColor.Items.Min(r => r.Z);
max = MeshColor.Items.Max(r => r.Z);
}
//[Browsable(false)]
//[XmlIgnore]
//public List AlphItems
//{
// get => MeshColor.AlphaItems;
// set
// {
// MeshColor.AlphaItems = value;
// }
//}
#endregion
private void GenerateMesh()
{
double ZMin = _RulerRangeZ.Zmin;
double ZMax = _RulerRangeZ.Zmax;
var origin = Items;
var list = new GradientColors();
var originZMin = origin.Min(r => r.Z);
var originZMax = origin.Max(r => r.Z);
var range = ZMax - ZMin;
foreach (var c in origin)
{
var z0 = (c.Z - originZMin) / (originZMax - originZMin);
c.Z = z0 * range + ZMin;
list.Add(c);
}
Items.Clear();
Items.AddRange(list);
}
private float GetValueInRange(float value, float min, float max)
{
if (value < min)
{
return min;
}
else if (value > max)
{
return max;
}
else
{
return value;
}
}
}
public class SfOther
{
[XmlAttribute]
public int Style { get; set; } =
(int)(MeshAlphaType.MESH_DRAW_RULER
| MeshAlphaType.MESH_UPDATE_RULER
| MeshAlphaType.MESH_TEXT
| MeshAlphaType.MESH_SERIALIZE_RULER)
& (~(int)MeshAlphaType.MESH_UPDATE_RULER);
[XmlAttribute]
public int Times { get; set; }
[XmlAttribute]
public int Alpha { get; set; }
}
}