using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Design; using System.Globalization; using GeoSigmaDrawLib; namespace GeoSigma.SigmaDrawerStyle { /// /// 长度单位转换类 /// public class UnitConverter : StringConverter { public static readonly string[] Units = new string[] { " ", "公里","千米", "米", "km", "m", " (公里)", " (千米)", " (米)", " (km)", " (m)" }; public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { return new StandardValuesCollection(Units); } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return false; } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(int)) { if (value is string v) { return Array.IndexOf(Units, v); } } return base.ConvertTo(context, culture, value, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is int v) { if (v < 0) // 新建比例尺时是 -1 { v = 0; } if (v < Units.Length) { return Units[v]; } } return base.ConvertFrom(context, culture, value); } } public interface IProportionPropertyChange { void ChangeScale(double scale); void ChangeNumber(int number); void ChangeShowMode(int mode); void ChangeUnit(int unit); void ChangeColor(int r, int g, int b); void ChangeTextScale(double scale); void ChangeAlign(int align); void ChangeTextHeight(double height); void ChangeTextWidth(double width); void ChangeTextHeightAlone(int alone); void ChangeCoordinate(double x, double y); void ChangeScaleHeight(double height); } public class ProportionProperty { public enum SHOWMODE { 普通式, 现代式, 流行式, } public enum ALONE { 否, 是, } public enum ALIGN { 左对齐, 水平居中, 右对齐, } //private static List UnitsValues = new List //{ // "公里", "千米", "米", " (公里)"," (千米)"," (米)" //}; [Browsable(false)] public IProportionPropertyChange PropertyParent { get { return iChange; } set { iChange = value; } } /// /// Initializes a new instance of the class. /// /// iChange public ProportionProperty(IProportionPropertyChange iChange) { this.iChange = iChange; scale = 100; number = 5; textScale = 1; align = ALIGN.水平居中; textHeightAlone = ALONE.否; color = Color.Black; showMode = SHOWMODE.流行式; } public void FillData(ref ProportionData data) { data.x = xCoord; data.y = yCoord; data.ScaleLength = scale; data.ScaleHeight = scaleHeight; data.ViewMode = (int)showMode; UnitConverter converter = new UnitConverter(); data.Unit = (int)converter.ConvertTo(proportionUnit, typeof(int)); data.num = number; data.ColorR = color.R; data.ColorG = color.G; data.ColorB = color.B; data.TextScale = textScale; data.TextAlign = (int)align; data.TextHeight = textHeight; data.TextWidth = textWidth; } private IProportionPropertyChange iChange; private double xCoord; private double yCoord; private double scale; //比例格式为 "1:xxxxx" private double scaleHeight; private Color color; private SHOWMODE showMode; private string proportionUnit; private int number; //个数 private double textScale; //文本比例 private ALIGN align;//水平对齐:[水平居中]、左对齐、右对齐。 private double textHeight; //文字高度 private double textWidth; //文字宽度 private ALONE textHeightAlone; //是否可以单独改变高度 public void SetData(GeoSigmaDrawLib.ProportionData data) { xCoord = data.x; yCoord = data.y; scale = (double)data.ScaleLength; scaleHeight = (double)data.ScaleHeight; showMode = (SHOWMODE)data.ViewMode; UnitConverter converter = new UnitConverter(); proportionUnit = (string)converter.ConvertFrom(data.Unit); number = data.num; color = Color.FromArgb(data.ColorR, data.ColorG, data.ColorB); textScale = data.TextScale; align = (ALIGN)data.TextAlign; textHeight = (int)data.TextHeight; textWidth = (int)data.TextWidth; } public void SetXY(double x, double y) { this.xCoord = x; this.yCoord = y; } [Category("\t坐标"), DisplayName("\t\t\t\t\t\tX"), Browsable(false)] public double XCoord { get => xCoord; set { xCoord = value; iChange.ChangeCoordinate(xCoord, yCoord); } } [Category("\t坐标"), DisplayName("\t\t\t\t\t\tY"), Browsable(false)] public double YCoord { get => yCoord; set { yCoord = value; iChange.ChangeCoordinate(xCoord, yCoord); } } [Category("\t基本属性"), DisplayName("\t\t\t\t\t\t刻度间隔")] public double Scale { get => scale; set { scale = value; iChange.ChangeScale(scale); //if (value.Length < 3) //{ // MessageBox.Show("比例不合法,请重新输入。", "提示"); //} //else //{ // if (value[0] != '1' || value[1] != ':') // { // MessageBox.Show("比例不合法,请重新输入。", "提示"); // } // else // { // string scaleStr = value.Substring(2); // int scale = 0; // if (!int.TryParse(scaleStr, out scale)) // { // MessageBox.Show("比例不合法,请重新输入。", "提示"); // } // else // { // scaleString = value; // iChange.ChangeScale(scale); // } // } //} } } [Category("\t基本属性"), DisplayName("\t\t\t\t\t\t显示模式")] public SHOWMODE ShowMode1 { get => showMode; set { showMode = value; iChange.ChangeShowMode((int)showMode); } } [Category("\t基本属性"), TypeConverter(typeof(UnitConverter)), DisplayName("\t\t\t\t\t\t单位")] public string ProportionUnit { get => proportionUnit; set { proportionUnit = value; int type = Array.IndexOf(UnitConverter.Units, value); if (type == -1) { type = 0; } iChange.ChangeUnit(type); } } [Category("\t基本属性"), DisplayName("\t\t\t\t\t\t高度")] public double ScaleHeight { get => scaleHeight; set { scaleHeight = value; iChange.ChangeScaleHeight(scaleHeight); } } [Category("\t基本属性"), DisplayName("\t\t\t\t\t\t个数")] public int Number { get => number; set { number = value; iChange.ChangeNumber(number); } } [Category("\t基本属性"), DisplayName("\t\t\t\t\t\t颜色")] [Editor(typeof(PropertyEditorColor), typeof(UITypeEditor))] [TypeConverter(typeof(PropertyColorIndicatorConvert))] public Color Color { get => color; set { color = value; iChange.ChangeColor(color.R, color.G, color.B); } } [Category("\t文本属性"), DisplayName("\t\t\t\t\t\t文本比例")] public double TextScale { get => textScale; set { textScale = value; iChange.ChangeTextScale(textScale); } } [Category("\t文本属性"), DisplayName("\t\t\t\t\t\t水平对齐")] public ALIGN Aligin { get => align; set { align = value; iChange.ChangeAlign((int)align); } } [Category("\t文本属性"), DisplayName("\t\t\t\t\t\t文字高度")] public double TextHeight { get => textHeight; set { textHeight = value; textWidth = textHeight * 0.4; iChange.ChangeTextHeight(textHeight); } } [Category("\t文本属性"), DisplayName("\t\t\t\t\t\t文字宽度"),Browsable(false)] public double TextWidth { get => TextHeight * 0.4; set { textWidth = value; iChange.ChangeTextWidth(textWidth); } } [Category("\t文本属性"), DisplayName("\t\t\t\t\t\t宽度可单独调整"), Browsable(false)] public ALONE TextHeightAlone { get => textHeightAlone; set { textHeightAlone = value; if (value == ALONE.是) { iChange.ChangeTextHeightAlone(1); } else { iChange.ChangeTextHeightAlone(0); } } } } }