lixiaojun
2024-08-16 8f677b1741b78e4de4c95373fc02587a05d7b5ca
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/01-network/02-node/Tank.cs
@@ -21,32 +21,162 @@
        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 GetCoordinate(Graphics g)
        {
            var ps = this.Position; //原始点
            var ws = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Tank.Size.Width;//原始宽度
            var hs = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Tank.Size.Height;//原始高度
            var wz = ws / g.PageScale;//缩放宽度
            var hz = hs / g.PageScale; //缩放高度
            return Coordinate.GetCoordinate(ps, 0, new SizeF(wz, hz), StringAlignment.Center, StringAlignment.Center);
        }
        private Coordinate _coordinate = null;//坐标信息
        /// <summary>
        /// 绘制
        /// </summary>
        public override void Draw(Graphics g)
        {
            var img = CacheHelper.TankImage;
            if (this.Image != null)
            {
                img = this.Image;
            }
            var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Tank.Width;
            var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Tank.Height;
            var isNewImage = false;
            if (img.Width != (int)width || img.Height != (int)height)
            {
                img = img.CloneC(width, height);
                isNewImage = true;
            }
            _coordinate = GetCoordinate(g);
            g.DrawImage(img, this.Position);
            if (isNewImage)
            if (this.Hovered)
            {
                img.Dispose();
            }
                var hoveredImg = CacheHelper.TankHoveredImage;
                if (this.HoveredImage != null)
                {
                    hoveredImg = this.HoveredImage;
                }
                var hoveredWidth = this.HoveredWidth.HasValue ? this.HoveredWidth.Value : CacheHelper.HydroL2d.Tank.HoveredSize.Width;
                var hoveredHeight = this.HoveredHeight.HasValue ? this.HoveredHeight.Value : CacheHelper.HydroL2d.Tank.HoveredSize.Height;
                var isNewImage = false;
                if (hoveredImg.Width != (int)hoveredWidth || hoveredImg.Height != (int)hoveredHeight)
                {
                    hoveredImg = hoveredImg.CloneC(hoveredWidth, hoveredHeight);
                    isNewImage = true;
                }
                var dx = hoveredWidth / g.PageScale / 2f;
                var dy = hoveredHeight / g.PageScale / 2f;
                var p0 = new PointF(this.Position.X - dx, this.Position.Y - dy);
                g.DrawImage(hoveredImg, p0);
                if (isNewImage)
                {
                    hoveredImg.Dispose();
                }
            }
            else if (this.Selected)
            {
                var selectedImg = CacheHelper.TankSelectedImage;
                if (this.SelectedImage != null)
                {
                    selectedImg = this.SelectedImage;
                }
                var selectedWidth = this.SelectedWidth.HasValue ? this.SelectedWidth.Value : CacheHelper.HydroL2d.Tank.SelectedSize.Width;
                var selectedHeight = this.SelectedHeight.HasValue ? this.SelectedHeight.Value : CacheHelper.HydroL2d.Tank.SelectedSize.Height;
                var isNewImage = false;
                if (selectedImg.Width != (int)selectedWidth || selectedImg.Height != (int)selectedHeight)
                {
                    selectedImg = selectedImg.CloneC(selectedWidth, selectedHeight);
                    isNewImage = true;
                }
                var dx = selectedWidth / g.PageScale / 2f;
                var dy = selectedHeight / g.PageScale / 2f;
                var p0 = new PointF(this.Position.X - dx, this.Position.Y - dy);
                g.DrawImage(selectedImg, p0);
                if (isNewImage)
                {
                    selectedImg.Dispose();
                }
            }
            else
            {
                var img = CacheHelper.TankImage;
                if (this.Image != null)
                {
                    img = this.Image;
                }
                var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Tank.Size.Width;
                var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Tank.Size.Height;
                var isNewImage = false;
                if (img.Width != (int)width || img.Height != (int)height)
                {
                    img = img.CloneC(width, height);
                    isNewImage = true;
                }
                var dx = width / g.PageScale / 2f;
                var dy = height / g.PageScale / 2f;
                var p0 = new PointF(this.Position.X - dx, this.Position.Y - dy);
                g.DrawImage(img, p0);
                if (isNewImage)
                {
                    img.Dispose();
                }
            }
        }
        /// <summary>
        /// 包含
        /// </summary>
        public override bool Contains(PointF pt)
        {
            if (_coordinate == null)
            {
                return false;
            }
            return _coordinate.BeforeRectf.Contains(pt);
        }
        /// <summary>
        /// 相交
        /// </summary>
        public override bool Intersect(RectangleF rectf)
        {
            if (rectf.Contains(this.Position))
            {
                return true;
            }
            return false;
        }
    }
}