using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; #if NET8_0 #else using System.Drawing.Design; #endif using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml; using System.Xml.Serialization; using GeoSigma.SigmaDrawerStyle.Converter; using GeoSigmaDrawLib; using SigmaDrawerStyle; namespace GeoSigma.SigmaDrawerStyle { [XmlRoot("HowToViewPoint")] [TypeConverter(typeof(PropertySorter))] public class DrawerPointStyle { private Font textFont; /// /// 属性类别排序 /// private List categorys = new List() { "文本", "符号", "Z值", "杂项" }; /// /// Initializes a new instance of the class. /// public DrawerPointStyle() { textSize.FixScale = true; zSize.FixScale = true; if (text == null) { text = new PointText(); text.Style = (int)TextStyleFlags.alignRight | (int)TextStyleFlags.alignTop | (int)TextStyleFlags.frameNull; } this._BackColor.PropertyChanged += _BackColor_PropertyChanged; this._SymbolBackColor.PropertyChanged += _SymbolBackColor_PropertyChanged; this._SymbolForeColor.PropertyChanged += _SymbolForeColor_PropertyChanged; this._ZBackColor.PropertyChanged += _ZBackColor_PropertyChanged; } private void _ZBackColor_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName.Equals("HaveColor")) { if (_ZBackColor.HaveColor != true) { textZ.Style = (textZ.Style &= ~(int)TextStyleFlags.backgroundColor); } else { textZ.Style = (textZ.Style |= (int)TextStyleFlags.backgroundColor); } } if (e.PropertyName.Equals("ColorValue")) { textZ.BkColor = ColorTranslator.ToWin32(_ZBackColor.ColorValue); } else { if (_ZBackColor.HaveColor != true) { textZ.Style = (textZ.Style &= ~(int)TextStyleFlags.backgroundColor); } else { textZ.Style = (textZ.Style |= (int)TextStyleFlags.backgroundColor); } textZ.BkColor = ColorTranslator.ToWin32(_ZBackColor.ColorValue); } } private void _SymbolForeColor_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName.Equals("HaveColor")) { Symbol.EnableFrColor = _SymbolForeColor.HaveColor ? 1 : 0; return; } else if (e.PropertyName.Equals("ColorValue")) { Symbol.FrColor = ColorTranslator.ToWin32(_SymbolForeColor.ColorValue); } else { Symbol.EnableFrColor = _SymbolForeColor.HaveColor ? 1 : 0; Symbol.FrColor = ColorTranslator.ToWin32(_SymbolForeColor.ColorValue); } } private void _SymbolBackColor_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName.Equals("HaveColor")) { Symbol.EnableBkColor = _SymbolBackColor.HaveColor ? 1 : 0; return; } else if (e.PropertyName.Equals("ColorValue")) { Symbol.BkColor = ColorTranslator.ToWin32(_SymbolBackColor.ColorValue); } else { Symbol.EnableBkColor = _SymbolBackColor.HaveColor ? 1 : 0; Symbol.BkColor = ColorTranslator.ToWin32(_SymbolBackColor.ColorValue); } } private void _BackColor_PropertyChanged(object sender, PropertyChangedEventArgs e) { // 透明,没有背景色 if (e.PropertyName.Equals("HaveColor")) { if (_BackColor.HaveColor != true) { text.Style = (text.Style &= ~(int)TextStyleFlags.backgroundColor); } else { text.Style = (text.Style |= (int)TextStyleFlags.backgroundColor); } return; } if (e.PropertyName.Equals("ColorValue")) { text.BkColor = ColorTranslator.ToWin32(_BackColor.ColorValue); } else { if (_BackColor.HaveColor != true) { text.Style = (text.Style &= ~(int)TextStyleFlags.backgroundColor); } else { text.Style = (text.Style |= (int)TextStyleFlags.backgroundColor); } text.BkColor = ColorTranslator.ToWin32(_BackColor.ColorValue); } } [XmlIgnore] [Browsable(false)] public GeoSigmaXY Geo { get; set; } = null; [XmlIgnore] [Category("文本"), DisplayName("字体"), PropertyOrder(1)] [TypeConverter(typeof(FontPropertyConvert))] public Font TextFont { get { textFont = Font.FromLogFont(this.FontStyle); //PropertyHelp.SetPropertyVisibility(_TextFont, "Unit", false); return textFont; } set { textFont = value; FontStyle = LogFontConverter.convert(textFont); // _TextFont.ToLogFont(FontStyle); } } private PropertySize textSize; [XmlIgnore] [Category("文本"), DisplayName("尺寸"), PropertyOrder(2)] [TypeConverter(typeof(PropertyScaleSizeConvert))] public PropertySize TextSize { get { this.textSize.Width = this.text.Width; this.textSize.Height = this.text.Height; return this.textSize; } set { /* if (this.textSize.FixScale == true) { //double factor = (value.Height / this.textSize.Height) * (value.Width / this.textSize.Width); decimal dFactorW = 1; if (this.textSize.Width == 0) { this.text.Width = value.Width; this.text.Height = value.Height; this.textSize.FixScale = value.FixScale; return; } if (this.textSize.Height == 0) { this.text.Width = value.Width; this.text.Height = value.Height; this.textSize.FixScale = value.FixScale; return; } dFactorW = (decimal)(value.Width / this.textSize.Width); decimal dFactorH = (decimal)(value.Height / this.textSize.Height); if (dFactorW == 1m) { this.text.Width = Math.Round(this.text.Width * (double)dFactorH, 4, MidpointRounding.AwayFromZero); this.text.Height = value.Height; } else if (dFactorH == 1m) { this.text.Width = value.Width; this.text.Height = Math.Round(this.text.Height * (double)dFactorW, 4, MidpointRounding.AwayFromZero); } else { this.text.Width = value.Width; this.text.Height = value.Height; } this.textSize.FixScale = value.FixScale; return; }*/ this.textSize = value; this.text.Width = this.textSize.Width; this.text.Height = this.textSize.Height; } } private double _TextAngle; [XmlIgnore] [Category("文本"), DisplayName("角度"), PropertyOrder(3)] public double TextAngle { get { _TextAngle = text.Angle; return _TextAngle; } set { _TextAngle = value; text.Angle = _TextAngle; } } private PointF _Offset; [XmlIgnore] [Category("文本"), DisplayName("偏移"), PropertyOrder(4)] public PropertyPoint Offset { get => text.Delt; set => text.Delt = value; } private int _AlignHorizion = 0; [XmlIgnore] [Category("文本"), DisplayName("水平对齐"), PropertyOrder(5)] [TypeConverter(typeof(Converter.AlignHorizionConverter))] public int AlignHorizion { get { _AlignHorizion = text.Style & (int)TextStyleFlags.alignAllPosition; return _AlignHorizion; } set { _AlignHorizion = value; text.Style &= ~(int)TextStyleFlags.alignAllPosition; text.Style |= _AlignHorizion; } } private int _AlignVertical = 0; [XmlIgnore] [Category("文本"), DisplayName("垂直对齐"), PropertyOrder(6)] [TypeConverter(typeof(Converter.AlignVerticalConverter))] public int AlignVertical { get { _AlignVertical = text.Style & (int)TextStyleFlags.alignAllV; return _AlignVertical; } set { _AlignVertical = value; text.Style &= ~(int)TextStyleFlags.alignAllV; text.Style |= _AlignVertical; } } private int _BorderType = 0; [XmlIgnore] [Category("文本"), DisplayName("文字边框"), PropertyOrder(7)] [TypeConverter(typeof(Converter.BorderTypeConverter))] public int BorderType { get { _BorderType = text.Style & (int)TextStyleFlags.frameAll; return _BorderType; } set { _BorderType = value; text.Style &= ~(int)TextStyleFlags.frameAll; text.Style |= _BorderType; } } private Color? _ForeColor; [XmlIgnore] [Category("文本"), DisplayName("前景色"), PropertyOrder(8)] #if NET8_0 #else [Editor(typeof(PropertyEditorColor), typeof(UITypeEditor))] #endif [TypeConverter(typeof(PropertyColorIndicatorConvert))] public Color? ForeColor { get { _ForeColor = ColorTranslator.FromWin32(text.FrColor); return _ForeColor; } set { _ForeColor = value; text.FrColor = ColorTranslator.ToWin32(_ForeColor.Value); } } //private Color _BackColor; //[XmlIgnore] //[Category("\t文本"), DisplayName("背景色")] //public Color BackColor //{ // get // { // _BackColor = ColorTranslator.FromWin32(text.BkColor); // // 不透明,有背景色 // if ((text.Style & (int)TextStyleFlags.backgroundColor)!=0) // { } // else // { // _BackColor = Color.Transparent; // } // return _BackColor; // } // set // { // // 透明,没有背景色 // if (value.Name.Equals("Transparent")) // { // text.Style = (text.Style &= ~(int)TextStyleFlags.backgroundColor); // _BackColor = Color.Transparent; // } // else // { // text.Style = (text.Style |= (int)TextStyleFlags.backgroundColor); // _BackColor = value; // } // text.BkColor = ColorTranslator.ToWin32(_BackColor); // } //} private PropertyColorNullable _BackColor = new PropertyColorNullable(); [XmlIgnore] [Category("文本"), DisplayName("背景颜色"), PropertyOrder(9)] //[TypeConverter(typeof(ExpandableObjectConverter))] [TypeConverter(typeof(PropertyColorNullable.PropertyColorNullableConvert))] public PropertyColorNullable BackColor// { set; get; } = new PropertyColorNullable(); { get { // 不透明,有背景色 try { if ((text.Style & (int)TextStyleFlags.backgroundColor) != 0) { _BackColor.HaveColor = true; _BackColor.ColorValue = ColorTranslator.FromWin32(text.BkColor); } else { _BackColor.HaveColor = false; } } catch (Exception ex) { Trace.WriteLine(ex.Message); } return _BackColor; } set { //_BackColor = value; _BackColor.HaveColor = value.HaveColor; _BackColor.ColorValue = value.ColorValue; // 透明,没有背景色 if (value.HaveColor != true) { text.Style = (text.Style &= ~(int)TextStyleFlags.backgroundColor); } else { text.Style = (text.Style |= (int)TextStyleFlags.backgroundColor); } text.BkColor = ColorTranslator.ToWin32(_BackColor.ColorValue); } } private string _SymbolName; [XmlIgnore] [Browsable(false)] public string SymbolName { get { _SymbolName = Symbol.Name; return _SymbolName; } set { _SymbolName = value; Symbol.Name = _SymbolName; } } private SymbolNameWrapper symbolEditor = new SymbolNameWrapper(); [XmlIgnore] [Category("符号"), DisplayName("名称"), PropertyOrder(1)] //[Editor("UCDraw.Editor.MarkEditor, UCDraw", typeof(UITypeEditor))] #if NET8_0 #else [Editor("GeoSigma.SigmaDrawerStyle.PropertyEditorSymbol, GeoSigma.SigmaDrawerStyle", typeof(UITypeEditor))] #endif public SymbolNameWrapper SymbolEditor { get { symbolEditor.DrawerGeo = Geo; symbolEditor.SymbolName = Symbol.Name == null ? string.Empty : Symbol.Name; // _SymbolName = symbolEditor.SymbolName; return symbolEditor; } set { symbolEditor = value; symbolEditor.DrawerGeo = this.Geo; // this.Geo = (GeoSigmaXY)(value.DrawerGeo); Symbol.Name = symbolEditor.SymbolName; } } private SizeF _SymbolSize; [XmlIgnore] [Category("符号"), DisplayName("尺寸"), PropertyOrder(2)] [TypeConverter(typeof(PropertySizeConvert))] public SizeF SymbolSize { get { _SymbolSize = new SizeF { Width = (float)Symbol.Width, Height = (float)Symbol.Height, }; return _SymbolSize; } set { _SymbolSize = value; Symbol.Width = _SymbolSize.Width; Symbol.Height = _SymbolSize.Height; } } private double _SymbolAngle; [XmlIgnore] [Category("符号"), DisplayName("角度"), PropertyOrder(3)] public double SymbolAngle { get { _SymbolAngle = Symbol.Angle; return _SymbolAngle; } set { _SymbolAngle = value; Symbol.Angle = _SymbolAngle; } } private PropertyColorNullable _SymbolBackColor = new PropertyColorNullable(); [XmlIgnore] [Browsable(true)] [Category("符号"), DisplayName("符号背景"), Description("统一显示符号背景色"), ReadOnly(false), PropertyOrder(4)] //[TypeConverter(typeof(ExpandableObjectConverter))] [TypeConverter(typeof(PropertyColorNullable.PropertyColorNullableConvert))] public PropertyColorNullable SymbolBackColor { get { if (Symbol.BkColor > 16777215) { _SymbolBackColor.ColorValue = Color.Transparent; } else { _SymbolBackColor.ColorValue = ColorTranslator.FromWin32(Symbol.BkColor); } _SymbolBackColor.HaveColor = (Symbol.EnableBkColor == 1); return _SymbolBackColor; } set { _SymbolBackColor.ColorValue = value.ColorValue; _SymbolBackColor.HaveColor = value.HaveColor; Symbol.EnableBkColor = _SymbolBackColor.HaveColor ? 1 : 0; Symbol.BkColor = ColorTranslator.ToWin32(_SymbolBackColor.ColorValue); } } private PropertyColorNullable _SymbolForeColor = new PropertyColorNullable(); [XmlIgnore] [Browsable(true)] [Category("符号"), DisplayName("符号前景"), Description("统一显示符号前景色"), ReadOnly(false), PropertyOrder(5)] //[TypeConverter(typeof(ExpandableObjectConverter))] [TypeConverter(typeof(PropertyColorNullable.PropertyColorNullableConvert))] public PropertyColorNullable SymbolForeColor { get { if (Symbol.FrColor > 16777215) { _SymbolForeColor.ColorValue = Color.Transparent; } else { _SymbolForeColor.ColorValue = ColorTranslator.FromWin32(Symbol.FrColor); } _SymbolForeColor.HaveColor = (Symbol.EnableFrColor == 1); return _SymbolForeColor; } set { _SymbolForeColor.ColorValue = value.ColorValue; _SymbolForeColor.HaveColor = value.HaveColor; Symbol.EnableFrColor = _SymbolBackColor.HaveColor ? 1 : 0; Symbol.FrColor = ColorTranslator.ToWin32(_SymbolForeColor.ColorValue); } } private bool _CanMoveCoordinate = false; [XmlIgnore] [DisplayName("坐标可移动")] [TypeConverter(typeof(Converter.YesNoConverter))] public bool CanMoveCoordinate { get { int nFlag = text.Style & (int)TextStyleFlags.noCanMoveCoor; _CanMoveCoordinate = !(nFlag != 0); return _CanMoveCoordinate; } set { _CanMoveCoordinate = value; if (_CanMoveCoordinate == true) { text.Style &= ~(int)TextStyleFlags.noCanMoveCoor; } else { text.Style |= (int)TextStyleFlags.noCanMoveCoor; } } } [Browsable(false)] [XmlAttribute("Name")] public string Name { get; set; } [Browsable(false)] [XmlElement("Font")] public LogFont FontStyle { get; set; } = LogFont.Default; [Browsable(false)] [XmlElement("Symbol")] public PointSymbol Symbol { get; set; } = new PointSymbol(); private PointText text; [Browsable(false)] [XmlElement("Text")] public PointText Text { get { if (text == null) { text = new PointText(); text.Style = (int)TextStyleFlags.alignRight | (int)TextStyleFlags.alignTop | (int)TextStyleFlags.frameNull; } return text; } set { text = value; } } private PointText textZ = new PointText(); [Browsable(false)] [XmlElement("ZText")] public PointText TextZ { get { if (textZ == null) { textZ = new PointText(); textZ.Style = (int)TextStyleFlags.alignRight | (int)TextStyleFlags.alignTop | (int)TextStyleFlags.frameNull; } return textZ; } set { textZ = value; } } [Browsable(false)] [XmlElement("ZFont")] public LogFont FontStyleZ { get; set; } = LogFont.Default; private Font textZFont; [XmlIgnore] [Category("Z值"), DisplayName("字体"), PropertyOrder(1)] [TypeConverter(typeof(FontPropertyConvert))] public Font TextZFont { get { textZFont = Font.FromLogFont(this.FontStyleZ); return textZFont; } set { textZFont = value; FontStyleZ = LogFontConverter.convert(textZFont); } } // private bool _FixScale = true; // [XmlIgnore] // [Category("\t文本"), DisplayName("\t\t\t\t\t\t固定长宽比例")] // [TypeConverter(typeof(Converter.YesNoConverter))] // public bool FixScale { get=>_FixScale; set=>_FixScale = value; } private PropertySize zSize; [XmlIgnore] [Category("Z值"), DisplayName("尺寸"), PropertyOrder(2)] [TypeConverter(typeof(PropertyScaleSizeConvert))] public PropertySize ZSize { get { this.zSize.Width = this.textZ.Width; this.zSize.Height = this.textZ.Height; return this.zSize; } set { /* if (this.zSize.FixScale == true) { //double factor = (value.Height / this.textSize.Height) * (value.Width / this.textSize.Width); decimal dFactorW = 1; if (this.zSize.Width == 0) { this.textZ.Width = value.Width; this.textZ.Height = value.Height; this.zSize.FixScale = value.FixScale; return; } if (this.zSize.Height == 0) { this.textZ.Width = value.Width; this.textZ.Height = value.Height; this.zSize.FixScale = value.FixScale; return; } dFactorW = (decimal)(value.Width / this.zSize.Width); decimal dFactorH = (decimal)(value.Height / this.zSize.Height); if (dFactorW == 1m) { this.textZ.Width = Math.Round(this.textZ.Width * (double)dFactorH, 4, MidpointRounding.AwayFromZero); this.textZ.Height = value.Height; } else if (dFactorH == 1m) { this.textZ.Width = value.Width; this.textZ.Height = Math.Round(this.textZ.Height * (double)dFactorW, 4, MidpointRounding.AwayFromZero); } else { this.textZ.Width = value.Width; this.textZ.Height = value.Height; } this.zSize.FixScale = value.FixScale; return; } */ this.zSize = value; this.textZ.Width = this.zSize.Width; this.textZ.Height = this.zSize.Height; } } private double _ZAngle; [XmlIgnore] [Category("Z值"), DisplayName("角度"), PropertyOrder(3)] public double ZAngle { get { _ZAngle = textZ.Angle; return _ZAngle; } set { _ZAngle = value; textZ.Angle = _ZAngle; } } //private PointF _ZOffset; [XmlIgnore] [Category("Z值"), DisplayName("偏移"), PropertyOrder(4)] public PropertyPoint ZOffset { get => textZ.Delt; set => textZ.Delt = value; } private int _ZAlignHorizion = 0; [XmlIgnore] [Category("Z值"), DisplayName("水平对齐"), PropertyOrder(5)] [TypeConverter(typeof(Converter.AlignHorizionConverter))] public int ZAlignHorizion { get { _ZAlignHorizion = textZ.Style & (int)TextStyleFlags.alignAllPosition; return _ZAlignHorizion; } set { _ZAlignHorizion = value; textZ.Style &= ~(int)TextStyleFlags.alignAllPosition; textZ.Style |= _ZAlignHorizion; } } private int _ZAlignVertical = 0; [XmlIgnore] [Category("Z值"), DisplayName("垂直对齐"), PropertyOrder(6)] [TypeConverter(typeof(Converter.AlignVerticalConverter))] public int ZAlignVertical { get { _ZAlignVertical = textZ.Style & (int)TextStyleFlags.alignAllV; return _ZAlignVertical; } set { _ZAlignVertical = value; textZ.Style &= ~(int)TextStyleFlags.alignAllV; textZ.Style |= _ZAlignVertical; } } private int _ZBorderType = 0; [XmlIgnore] [Category("Z值"), DisplayName("文字边框"), PropertyOrder(7)] [TypeConverter(typeof(Converter.BorderTypeConverter))] public int ZBorderType { get { _ZBorderType = textZ.Style & (int)TextStyleFlags.frameAll; return _ZBorderType; } set { _ZBorderType = value; textZ.Style &= ~(int)TextStyleFlags.frameAll; textZ.Style |= _ZBorderType; } } private Color? _ZForeColor; [XmlIgnore] [Category("Z值"), DisplayName("前景色"), PropertyOrder(8)] #if NET8_0 #else [Editor(typeof(PropertyEditorColor), typeof(UITypeEditor))] #endif [TypeConverter(typeof(PropertyColorIndicatorConvert))] public Color? ZForeColor { get { _ZForeColor = ColorTranslator.FromWin32(textZ.FrColor); return _ZForeColor; } set { _ZForeColor = value; textZ.FrColor = ColorTranslator.ToWin32(_ZForeColor.Value); } } private PropertyColorNullable _ZBackColor = new PropertyColorNullable(); [XmlIgnore] [Category("Z值"), DisplayName("Z值背景"), PropertyOrder(9)] [TypeConverter(typeof(PropertyColorNullable.PropertyColorNullableConvert))] public PropertyColorNullable ZBackColor { get { // 不透明,有背景色 try { if ((textZ.Style & (int)TextStyleFlags.backgroundColor) != 0) { _ZBackColor.HaveColor = true; _ZBackColor.ColorValue = ColorTranslator.FromWin32(textZ.BkColor); } else { _ZBackColor.HaveColor = false; } } catch (Exception ex) { Trace.WriteLine(ex.Message); } return _ZBackColor; } set { //_BackColor = value; _ZBackColor.HaveColor = value.HaveColor; _ZBackColor.ColorValue = value.ColorValue; // 透明,没有背景色 if (value.HaveColor != true) { textZ.Style = (textZ.Style &= ~(int)TextStyleFlags.backgroundColor); } else { textZ.Style = (textZ.Style |= (int)TextStyleFlags.backgroundColor); } textZ.BkColor = ColorTranslator.ToWin32(_ZBackColor.ColorValue); } } /// /// 输出Xml数据 /// public string SerialXml() { try { string strData = ""; XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = " "; settings.NewLineChars = "\r\n"; settings.Encoding = Encoding.Default; // 去除xml声明 settings.OmitXmlDeclaration = true; // System.IO.MemoryStream mem = new MemoryStream(); using (var mem = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(mem, settings)) { // 去除默认命名空间xmlns:xsd和xmlns:xsi XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(string.Empty, string.Empty); XmlSerializer formatter = new XmlSerializer(this.GetType()); formatter.Serialize(writer, this, ns); } mem.Position = 0; // 重置流位置 return Encoding.Default.GetString(mem.ToArray()); } } catch (Exception ex) { Trace.WriteLine(ex.Message); return string.Empty; } } public virtual DrawerPointStyle DeserialXml(string xml) { XmlSerializer xs = new XmlSerializer(this.GetType()); using (StringReader sr = new StringReader(xml)) { var obj = xs.Deserialize(sr) as DrawerPointStyle; return obj; } } public DrawerPointStyle Clone() { return DeserialXml(SerialXml()); } } public class SymbolNameWrapper { private GeoSigmaXY drawerGeo; public GeoSigmaXY DrawerGeo { get { return drawerGeo; } set { drawerGeo = value; } } public string SymbolName { get; set; } = string.Empty; /// public override string ToString() { return SymbolName; } public bool IsEmpty() { if (DrawerGeo == null || String.IsNullOrEmpty(SymbolName)) { return true; } return false; } } }