lixiaojun
2024-08-16 a92ce718c9ad0b01b9b4698a59ffd72ff7c95a1e
2d只绘制可见区域
已修改10个文件
已添加4个文件
719 ■■■■■ 文件已修改
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/00-core/CacheHelper.cs 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/01-network/04-link/Pump.cs 215 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/01-network/04-link/Valve.cs 213 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/02-panel/NetworkPanel.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/03-settings/01-paras/05-pump/Paras_HydroL2d_Pump.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/03-settings/01-paras/06-valve/Paras_HydroL2d_Pump.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/Yw.WinFrmUI.Hydro.L2d.Core.csproj 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/Pump.png 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/Valve.png 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/pump_hovered.png 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/pump_selected.png 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/valve_hovered.png 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/valve_selected.png 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/paras_hydro_l2d_settings.json 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/00-core/CacheHelper.cs
@@ -293,12 +293,91 @@
                    using (var img = Image.FromFile(fileName))
                    {
                        _pumpImage = img.CloneC(HydroL2d.Pump.Size.Width, HydroL2d.Pump.Size.Height);
                        _pumpImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    }
                }
                return _pumpImage;
            }
        }
        private static Image _pumpImage = null;
        /// <summary>
        /// 水泵选择线画笔
        /// </summary>
        public static Pen PumpSelectedLinePen
        {
            get
            {
                if (_pumpSelectedLinePen == null)
                {
                    var lineColor = ColorTranslator.FromHtml(HydroL2d.Pump.SelectedLine.Color);
                    var lineWidth = HydroL2d.Pump.SelectedLine.Width;
                    _pumpSelectedLinePen = new Pen(lineColor, lineWidth);
                }
                return _pumpSelectedLinePen;
            }
        }
        private static Pen _pumpSelectedLinePen = null;
        /// <summary>
        /// 水泵选择图片
        /// </summary>
        public static Image PumpSelectedImage
        {
            get
            {
                if (_pumpSelectedImage == null)
                {
                    var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Pump.SelectedImage}.png");
                    using (var img = Image.FromFile(fileName))
                    {
                        _pumpSelectedImage = img.CloneC(HydroL2d.Pump.SelectedSize.Width, HydroL2d.Pump.SelectedSize.Height);
                        _pumpSelectedImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    }
                }
                return _pumpSelectedImage;
            }
        }
        private static Image _pumpSelectedImage = null;
        /// <summary>
        /// 水泵悬停线画笔
        /// </summary>
        public static Pen PumpHoveredLinePen
        {
            get
            {
                if (_pumpHoveredLinePen == null)
                {
                    var lineColor = ColorTranslator.FromHtml(HydroL2d.Pump.HoveredLine.Color);
                    var lineWidth = HydroL2d.Pump.HoveredLine.Width;
                    _pumpHoveredLinePen = new Pen(lineColor, lineWidth);
                }
                return _pumpHoveredLinePen;
            }
        }
        private static Pen _pumpHoveredLinePen = null;
        /// <summary>
        /// 水泵悬停图片
        /// </summary>
        public static Image PumpHoveredImage
        {
            get
            {
                if (_pumpHoveredImage == null)
                {
                    var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Pump.HoveredImage}.png");
                    using (var img = Image.FromFile(fileName))
                    {
                        _pumpHoveredImage = img.CloneC(HydroL2d.Pump.HoveredSize.Width, HydroL2d.Pump.HoveredSize.Height);
                        _pumpHoveredImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    }
                }
                return _pumpHoveredImage;
            }
        }
        private static Image _pumpHoveredImage = null;
        #endregion
@@ -335,6 +414,7 @@
                    using (var img = Image.FromFile(fileName))
                    {
                        _valveImage = img.CloneC(HydroL2d.Valve.Size.Width, HydroL2d.Valve.Size.Height);
                        _valveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    }
                }
                return _valveImage;
@@ -342,6 +422,84 @@
        }
        private static Image _valveImage = null;
        /// <summary>
        /// 阀门选择线画笔
        /// </summary>
        public static Pen ValveSelectedLinePen
        {
            get
            {
                if (_valveSelectedLinePen == null)
                {
                    var lineColor = ColorTranslator.FromHtml(HydroL2d.Valve.SelectedLine.Color);
                    var lineWidth = HydroL2d.Valve.SelectedLine.Width;
                    _valveSelectedLinePen = new Pen(lineColor, lineWidth);
                }
                return _valveSelectedLinePen;
            }
        }
        private static Pen _valveSelectedLinePen = null;
        /// <summary>
        /// 阀门选择图片
        /// </summary>
        public static Image ValveSelectedImage
        {
            get
            {
                if (_valveSelectedImage == null)
                {
                    var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Valve.SelectedImage}.png");
                    using (var img = Image.FromFile(fileName))
                    {
                        _valveSelectedImage = img.CloneC(HydroL2d.Valve.SelectedSize.Width, HydroL2d.Valve.SelectedSize.Height);
                        _valveSelectedImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    }
                }
                return _valveSelectedImage;
            }
        }
        private static Image _valveSelectedImage = null;
        /// <summary>
        /// 阀门悬停线画笔
        /// </summary>
        public static Pen ValveHoveredLinePen
        {
            get
            {
                if (_valveHoveredLinePen == null)
                {
                    var lineColor = ColorTranslator.FromHtml(HydroL2d.Valve.HoveredLine.Color);
                    var lineWidth = HydroL2d.Valve.HoveredLine.Width;
                    _valveHoveredLinePen = new Pen(lineColor, lineWidth);
                }
                return _valveHoveredLinePen;
            }
        }
        private static Pen _valveHoveredLinePen = null;
        /// <summary>
        /// 阀门悬停图片
        /// </summary>
        public static Image ValveHoveredImage
        {
            get
            {
                if (_valveHoveredImage == null)
                {
                    var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Valve.HoveredImage}.png");
                    using (var img = Image.FromFile(fileName))
                    {
                        _valveHoveredImage = img.CloneC(HydroL2d.Valve.HoveredSize.Width, HydroL2d.Valve.HoveredSize.Height);
                        _valveHoveredImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    }
                }
                return _valveHoveredImage;
            }
        }
        private static Image _valveHoveredImage = null;
        #endregion
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/01-network/04-link/Pump.cs
@@ -16,6 +16,26 @@
        public float? LineWidth { get; set; }
        /// <summary>
        /// 悬停线色
        /// </summary>
        public Color? HoveredLineColor { get; set; }
        /// <summary>
        /// 悬停线宽
        /// </summary>
        public float? HoveredLineWidth { get; set; }
        /// <summary>
        /// 选择线色
        /// </summary>
        public Color? SelectedLineColor { get; set; }
        /// <summary>
        /// 选择线宽
        /// </summary>
        public float? SelectedLineWidth { get; set; }
        /// <summary>
        /// 图片
        /// </summary>
        public Image Image { get; set; }
@@ -29,6 +49,38 @@
        /// 高度
        /// </summary>
        public float? Height { get; set; }
        /// <summary>
        /// 悬停图片
        /// </summary>
        public Image HoveredImage { get; set; }
        /// <summary>
        /// 悬停宽度
        /// </summary>
        public float? HoveredWidth { get; set; }
        /// <summary>
        /// 悬停高度
        /// </summary>
        public float? HoveredHeight { get; set; }
        /// <summary>
        /// 选择图片
        /// </summary>
        public Image SelectedImage { get; set; }
        /// <summary>
        /// 选择宽度
        /// </summary>
        public float? SelectedWidth { get; set; }
        /// <summary>
        /// 选择高度
        /// </summary>
        public float? SelectedHeight { get; set; }
        private Coordinate _coordinate { get; set; }//坐标信息
@@ -51,53 +103,156 @@
        public override void Draw(Graphics g)
        {
            _coordinate = GetCoordinate(g);
            #region 画线
            var fromCachePen = true;
            var pen = CacheHelper.PumpLinePen;
            if (this.LineColor.HasValue && this.LineWidth.HasValue)
            if (this.Hovered)
            {
                pen = new Pen(this.LineColor.Value, this.LineWidth.Value);
                fromCachePen = false;
                var fromCachePen = true;
                var pen = CacheHelper.PumpHoveredLinePen;
                if (this.HoveredLineColor.HasValue && this.HoveredLineWidth.HasValue)
                {
                    pen = new Pen(this.HoveredLineColor.Value, this.HoveredLineWidth.Value);
                    fromCachePen = false;
                }
                var penWidth = pen.Width;
                pen.Width = pen.Width / g.PageScale;
                g.DrawLine(pen, this.StartPosition, this.EndPosition);
                pen.Width = penWidth;
                if (!fromCachePen)
                {
                    pen.Dispose();
                }
            }
            var penWidth = pen.Width;
            pen.Width = pen.Width / g.PageScale;
            g.DrawLine(pen, this.StartPosition, this.EndPosition);
            pen.Width = penWidth;
            if (!fromCachePen)
            else if (this.Selected)
            {
                pen.Dispose();
                var fromCachePen = true;
                var pen = CacheHelper.PumpSelectedLinePen;
                if (this.SelectedLineColor.HasValue && this.SelectedLineWidth.HasValue)
                {
                    pen = new Pen(this.SelectedLineColor.Value, this.SelectedLineWidth.Value);
                    fromCachePen = false;
                }
                var penWidth = pen.Width;
                pen.Width = pen.Width / g.PageScale;
                g.DrawLine(pen, this.StartPosition, this.EndPosition);
                pen.Width = penWidth;
                if (!fromCachePen)
                {
                    pen.Dispose();
                }
            }
            else
            {
                var fromCachePen = true;
                var pen = CacheHelper.PumpLinePen;
                if (this.LineColor.HasValue && this.LineWidth.HasValue)
                {
                    pen = new Pen(this.LineColor.Value, this.LineWidth.Value);
                    fromCachePen = false;
                }
                var penWidth = pen.Width;
                pen.Width = pen.Width / g.PageScale;
                g.DrawLine(pen, this.StartPosition, this.EndPosition);
                pen.Width = penWidth;
                if (!fromCachePen)
                {
                    pen.Dispose();
                }
            }
            #endregion
            #region 画图片
            var img = CacheHelper.PumpImage;
            if (this.Image != null)
            if (this.Hovered)
            {
                img = this.Image;
                var img = CacheHelper.PumpHoveredImage;
                if (this.HoveredImage != null)
                {
                    img = this.HoveredImage;
                }
                var width = this.HoveredWidth.HasValue ? this.HoveredWidth.Value : CacheHelper.HydroL2d.Pump.HoveredSize.Width;
                var height = this.HoveredHeight.HasValue ? this.HoveredHeight.Value : CacheHelper.HydroL2d.Pump.HoveredSize.Height;
                var isNewImage = false;
                if (img.Width != (int)width || img.Height != (int)height)
                {
                    img = img.CloneC(width, height);
                    isNewImage = true;
                }
                var pt = this.StartPosition.GetCenter(this.EndPosition);
                var dx = width / g.PageScale / 2f;
                var dy = height / g.PageScale / 2f;
                var p0 = new PointF(pt.X - dx, pt.Y - dy);
                g.DrawImage(img, p0);
                if (isNewImage)
                {
                    img.Dispose();
                }
            }
            var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Pump.Size.Width;
            var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Pump.Size.Height;
            var isNewImage = false;
            if (img.Width != (int)width || img.Height != (int)height)
            else if (this.Selected)
            {
                img = img.CloneC(width, height);
                isNewImage = true;
                var img = CacheHelper.PumpSelectedImage;
                if (this.SelectedImage != null)
                {
                    img = this.SelectedImage;
                }
                var width = this.SelectedWidth.HasValue ? this.SelectedWidth.Value : CacheHelper.HydroL2d.Pump.SelectedSize.Width;
                var height = this.SelectedHeight.HasValue ? this.SelectedHeight.Value : CacheHelper.HydroL2d.Pump.SelectedSize.Height;
                var isNewImage = false;
                if (img.Width != (int)width || img.Height != (int)height)
                {
                    img = img.CloneC(width, height);
                    isNewImage = true;
                }
                var pt = this.StartPosition.GetCenter(this.EndPosition);
                var dx = width / g.PageScale / 2f;
                var dy = height / g.PageScale / 2f;
                var p0 = new PointF(pt.X - dx, pt.Y - dy);
                g.DrawImage(img, p0);
                if (isNewImage)
                {
                    img.Dispose();
                }
            }
            else
            {
                var img = CacheHelper.PumpImage;
                if (this.Image != null)
                {
                    img = this.Image;
                }
                var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Pump.Size.Width;
                var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Pump.Size.Height;
                var isNewImage = false;
                if (img.Width != (int)width || img.Height != (int)height)
                {
                    img = img.CloneC(width, height);
                    isNewImage = true;
                }
                var pt = this.StartPosition.GetCenter(this.EndPosition);
                var dx = width / g.PageScale / 2f;
                var dy = height / g.PageScale / 2f;
                var p0 = new PointF(pt.X - dx, pt.Y - dy);
                g.DrawImage(img, p0);
                if (isNewImage)
                {
                    img.Dispose();
                }
            }
            var pt = this.StartPosition.GetCenter(this.EndPosition);
            var dx = width / g.PageScale / 2f;
            var dy = height / g.PageScale / 2f;
            var p0 = new PointF(pt.X - dx, pt.Y - dy);
            g.DrawImage(img, p0);
            if (isNewImage)
            {
                img.Dispose();
            }
            #endregion
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/01-network/04-link/Valve.cs
@@ -16,6 +16,26 @@
        public float? LineWidth { get; set; }
        /// <summary>
        /// 悬停线色
        /// </summary>
        public Color? HoveredLineColor { get; set; }
        /// <summary>
        /// 悬停线宽
        /// </summary>
        public float? HoveredLineWidth { get; set; }
        /// <summary>
        /// 选择线色
        /// </summary>
        public Color? SelectedLineColor { get; set; }
        /// <summary>
        /// 选择线宽
        /// </summary>
        public float? SelectedLineWidth { get; set; }
        /// <summary>
        /// 图片
        /// </summary>
        public Image Image { get; set; }
@@ -29,6 +49,36 @@
        /// 高度
        /// </summary>
        public float? Height { get; set; }
        /// <summary>
        /// 悬停图片
        /// </summary>
        public Image HoveredImage { get; set; }
        /// <summary>
        /// 悬停宽度
        /// </summary>
        public float? HoveredWidth { get; set; }
        /// <summary>
        /// 悬停高度
        /// </summary>
        public float? HoveredHeight { get; set; }
        /// <summary>
        /// 选择图片
        /// </summary>
        public Image SelectedImage { get; set; }
        /// <summary>
        /// 选择宽度
        /// </summary>
        public float? SelectedWidth { get; set; }
        /// <summary>
        /// 选择高度
        /// </summary>
        public float? SelectedHeight { get; set; }
        private Coordinate _coordinate { get; set; }//坐标信息
@@ -51,53 +101,156 @@
        public override void Draw(Graphics g)
        {
            _coordinate = GetCoordinate(g);
            #region 画线
            var fromCachePen = true;
            var pen = CacheHelper.ValveLinePen;
            if (this.LineColor.HasValue && this.LineWidth.HasValue)
            if (this.Hovered)
            {
                pen = new Pen(this.LineColor.Value, this.LineWidth.Value);
                fromCachePen = false;
                var fromCachePen = true;
                var pen = CacheHelper.ValveHoveredLinePen;
                if (this.HoveredLineColor.HasValue && this.HoveredLineWidth.HasValue)
                {
                    pen = new Pen(this.HoveredLineColor.Value, this.HoveredLineWidth.Value);
                    fromCachePen = false;
                }
                var penWidth = pen.Width;
                pen.Width = pen.Width / g.PageScale;
                g.DrawLine(pen, this.StartPosition, this.EndPosition);
                pen.Width = penWidth;
                if (!fromCachePen)
                {
                    pen.Dispose();
                }
            }
            var penWidth = pen.Width;
            pen.Width = pen.Width / g.PageScale;
            g.DrawLine(pen, this.StartPosition, this.EndPosition);
            pen.Width = penWidth;
            if (!fromCachePen)
            else if (this.Selected)
            {
                pen.Dispose();
                var fromCachePen = true;
                var pen = CacheHelper.ValveSelectedLinePen;
                if (this.SelectedLineColor.HasValue && this.SelectedLineWidth.HasValue)
                {
                    pen = new Pen(this.SelectedLineColor.Value, this.SelectedLineWidth.Value);
                    fromCachePen = false;
                }
                var penWidth = pen.Width;
                pen.Width = pen.Width / g.PageScale;
                g.DrawLine(pen, this.StartPosition, this.EndPosition);
                pen.Width = penWidth;
                if (!fromCachePen)
                {
                    pen.Dispose();
                }
            }
            else
            {
                var fromCachePen = true;
                var pen = CacheHelper.ValveLinePen;
                if (this.LineColor.HasValue && this.LineWidth.HasValue)
                {
                    pen = new Pen(this.LineColor.Value, this.LineWidth.Value);
                    fromCachePen = false;
                }
                var penWidth = pen.Width;
                pen.Width = pen.Width / g.PageScale;
                g.DrawLine(pen, this.StartPosition, this.EndPosition);
                pen.Width = penWidth;
                if (!fromCachePen)
                {
                    pen.Dispose();
                }
            }
            #endregion
            #region 画图片
            var img = CacheHelper.ValveImage;
            if (this.Image != null)
            if (this.Hovered)
            {
                img = this.Image;
                var img = CacheHelper.ValveHoveredImage;
                if (this.HoveredImage != null)
                {
                    img = this.HoveredImage;
                }
                var width = this.HoveredWidth.HasValue ? this.HoveredWidth.Value : CacheHelper.HydroL2d.Valve.HoveredSize.Width;
                var height = this.HoveredHeight.HasValue ? this.HoveredHeight.Value : CacheHelper.HydroL2d.Valve.HoveredSize.Height;
                var isNewImage = false;
                if (img.Width != (int)width || img.Height != (int)height)
                {
                    img = img.CloneC(width, height);
                    isNewImage = true;
                }
                var pt = this.StartPosition.GetCenter(this.EndPosition);
                var dx = width / g.PageScale / 2f;
                var dy = height / g.PageScale / 2f;
                var p0 = new PointF(pt.X - dx, pt.Y - dy);
                g.DrawImage(img, p0);
                if (isNewImage)
                {
                    img.Dispose();
                }
            }
            var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Valve.Size.Width;
            var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Valve.Size.Height;
            var isNewImage = false;
            if (img.Width != (int)width || img.Height != (int)height)
            else if (this.Selected)
            {
                img = img.CloneC(width, height);
                isNewImage = true;
                var img = CacheHelper.ValveSelectedImage;
                if (this.SelectedImage != null)
                {
                    img = this.SelectedImage;
                }
                var width = this.SelectedWidth.HasValue ? this.SelectedWidth.Value : CacheHelper.HydroL2d.Valve.SelectedSize.Width;
                var height = this.SelectedHeight.HasValue ? this.SelectedHeight.Value : CacheHelper.HydroL2d.Valve.SelectedSize.Height;
                var isNewImage = false;
                if (img.Width != (int)width || img.Height != (int)height)
                {
                    img = img.CloneC(width, height);
                    isNewImage = true;
                }
                var pt = this.StartPosition.GetCenter(this.EndPosition);
                var dx = width / g.PageScale / 2f;
                var dy = height / g.PageScale / 2f;
                var p0 = new PointF(pt.X - dx, pt.Y - dy);
                g.DrawImage(img, p0);
                if (isNewImage)
                {
                    img.Dispose();
                }
            }
            else
            {
                var img = CacheHelper.ValveImage;
                if (this.Image != null)
                {
                    img = this.Image;
                }
                var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Valve.Size.Width;
                var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Valve.Size.Height;
                var isNewImage = false;
                if (img.Width != (int)width || img.Height != (int)height)
                {
                    img = img.CloneC(width, height);
                    isNewImage = true;
                }
                var pt = this.StartPosition.GetCenter(this.EndPosition);
                var dx = width / g.PageScale / 2f;
                var dy = height / g.PageScale / 2f;
                var p0 = new PointF(pt.X - dx, pt.Y - dy);
                g.DrawImage(img, p0);
                if (isNewImage)
                {
                    img.Dispose();
                }
            }
            var pt = this.StartPosition.GetCenter(this.EndPosition);
            var dx = width / g.PageScale / 2f;
            var dy = height / g.PageScale / 2f;
            var p0 = new PointF(pt.X - dx, pt.Y - dy);
            g.DrawImage(img, p0);
            if (isNewImage)
            {
                img.Dispose();
            }
            #endregion
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/02-panel/NetworkPanel.cs
@@ -110,8 +110,8 @@
                g.TranslateTransform(_dxo, _dyo);
                g.ScaleTransform(1, -1);
                //_network.Draw(g, dispRect);
                _network.Draw(g);
                _network.Draw(g, dispRect);
                // _network.Draw(g);
            }
            lock (_dispLocker)
            {
@@ -312,7 +312,7 @@
            {
                return default;
            }
            var pt = ClientToDispPoint(_clientRectf.Location);
            var pt = ClientToDispPoint(new PointF(_clientRectf.X, _clientRectf.Height));
            var width = _clientRectf.Width / _zoom;
            var height = _clientRectf.Height / _zoom;
            return new RectangleF(pt, new SizeF(width, height));
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/03-settings/01-paras/05-pump/Paras_HydroL2d_Pump.cs
@@ -20,6 +20,40 @@
        /// </summary>
        public Paras_HydroL2d_Size Size { get; set; }
        /// <summary>
        /// 选择线
        /// </summary>
        public Paras_HydroL2d_Line SelectedLine { get; set; }
        /// <summary>
        /// 选择图片
        /// </summary>
        public string SelectedImage { get; set; }
        /// <summary>
        /// 选择尺寸
        /// </summary>
        public Paras_HydroL2d_Size SelectedSize { get; set; }
        /// <summary>
        /// 悬停线
        /// </summary>
        public Paras_HydroL2d_Line HoveredLine { get; set; }
        /// <summary>
        /// 悬停图片
        /// </summary>
        public string HoveredImage { get; set; }
        /// <summary>
        /// 悬停尺寸
        /// </summary>
        public Paras_HydroL2d_Size HoveredSize { get; set; }
    }
}
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/03-settings/01-paras/06-valve/Paras_HydroL2d_Pump.cs
@@ -20,6 +20,35 @@
        /// </summary>
        public Paras_HydroL2d_Size Size { get; set; }
        /// <summary>
        /// 选择线
        /// </summary>
        public Paras_HydroL2d_Line SelectedLine { get; set; }
        /// <summary>
        /// 选择图片
        /// </summary>
        public string SelectedImage { get; set; }
        /// <summary>
        /// 选择尺寸
        /// </summary>
        public Paras_HydroL2d_Size SelectedSize { get; set; }
        /// <summary>
        /// 悬停线
        /// </summary>
        public Paras_HydroL2d_Line HoveredLine { get; set; }
        /// <summary>
        /// 悬停图片
        /// </summary>
        public string HoveredImage { get; set; }
        /// <summary>
        /// 悬停尺寸
        /// </summary>
        public Paras_HydroL2d_Size HoveredSize { get; set; }
    }
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/Yw.WinFrmUI.Hydro.L2d.Core.csproj
@@ -32,12 +32,18 @@
  <ItemGroup>
    <None Remove="images\l2d\Loading.gif" />
    <None Remove="images\l2d\Pump.png" />
    <None Remove="images\l2d\pump.png" />
    <None Remove="images\l2d\pump_hovered.png" />
    <None Remove="images\l2d\pump_selected.png" />
    <None Remove="images\l2d\Reservoir.png" />
    <None Remove="images\l2d\reservoir_hovered.png" />
    <None Remove="images\l2d\reservoir_selected.png" />
    <None Remove="images\l2d\Tank.png" />
    <None Remove="images\l2d\tank_hovered.png" />
    <None Remove="images\l2d\tank_selected.png" />
    <None Remove="images\l2d\Valve.png" />
    <None Remove="images\l2d\valve.png" />
    <None Remove="images\l2d\valve_hovered.png" />
    <None Remove="images\l2d\valve_selected.png" />
    <None Remove="paras_hydro_l2d_settings.json" />
  </ItemGroup>
@@ -48,7 +54,19 @@
    <Content Include="images\l2d\pump.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\pump_hovered.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\pump_selected.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\reservoir.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\reservoir_hovered.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\reservoir_selected.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\tank.png">
@@ -63,6 +81,12 @@
    <Content Include="images\l2d\valve.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\valve_hovered.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="images\l2d\valve_selected.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="paras_hydro_l2d_settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/Pump.png

WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/Valve.png

WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/pump_hovered.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/pump_selected.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/valve_hovered.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/valve_selected.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/paras_hydro_l2d_settings.json
@@ -81,6 +81,24 @@
      },
      "Image": "pump",
      "Size": {
        "Width": 30,
        "Height": 30
      },
      "HoveredLine": {
        "Color": "#ffbf00",
        "Width": 4
      },
      "HoveredImage": "pump_hovered",
      "HoveredSize": {
        "Width": 32,
        "Height": 32
      },
      "SelectedLine": {
        "Color": "Red",
        "Width": 4
      },
      "SelectedImage": "pump_selected",
      "SelectedSize": {
        "Width": 32,
        "Height": 32
      }
@@ -92,6 +110,24 @@
      },
      "Image": "valve",
      "Size": {
        "Width": 30,
        "Height": 30
      },
      "HoveredLine": {
        "Color": "#ffbf00",
        "Width": 4
      },
      "HoveredImage": "valve_hovered",
      "HoveredSize": {
        "Width": 32,
        "Height": 32
      },
      "SelectedLine": {
        "Color": "Red",
        "Width": 4
      },
      "SelectedImage": "valve_selected",
      "SelectedSize": {
        "Width": 32,
        "Height": 32
      }