www.pudn.com > cad-draw.zip > GridLayer.cs, change:2007-12-17,size:4343b


using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Windows.Forms; 
using System.Xml; 
 
namespace Canvas 
{ 
	public class GridLayer : ICanvasLayer, ISerialize 
	{ 
		public enum eStyle 
		{ 
			Dots, 
			Lines, 
		} 
		public SizeF m_spacing = new SizeF(1f, 1f); // 12" 
		private bool m_enabled = true; 
		private int m_minSize = 15; 
		private eStyle m_gridStyle = eStyle.Lines; 
		private Color m_color = Color.FromArgb(50, Color.Gray); 
		[XmlSerializable] 
		public SizeF Spacing 
		{ 
			get { return m_spacing; } 
			set { m_spacing = value; } 
		} 
		[XmlSerializable] 
		public int MinSize 
		{ 
			get { return m_minSize; } 
			set { m_minSize = value; } 
		} 
		[XmlSerializable] 
		public eStyle GridStyle 
		{ 
			get { return m_gridStyle; } 
			set { m_gridStyle = value; } 
		} 
		[XmlSerializable] 
		public Color Color 
		{ 
			get { return m_color; } 
			set { m_color = value; } 
		} 
 
		public void Copy(GridLayer acopy) 
		{ 
			m_enabled = acopy.m_enabled; 
			m_spacing = acopy.m_spacing; 
			m_minSize = acopy.m_minSize; 
			m_gridStyle = acopy.m_gridStyle; 
			m_color = acopy.m_color; 
		} 
		#region ICanvasLayer Members 
		public void Draw(ICanvas canvas, RectangleF unitrect) 
		{ 
			if (Enabled == false) 
				return; 
			float gridX = Spacing.Width; 
			float gridY = Spacing.Height; 
			float gridscreensizeX = canvas.ToScreen(gridX); 
			float gridscreensizeY = canvas.ToScreen(gridY); 
			if (gridscreensizeX < MinSize || gridscreensizeY < MinSize) 
				return; 
 
			PointF leftpoint = unitrect.Location; 
			PointF rightpoint = ScreenUtils.RightPoint(canvas, unitrect); 
 
			float left = (float)Math.Round(leftpoint.X / gridX) * gridX; 
			float top = unitrect.Height + unitrect.Y; 
			float right = rightpoint.X; 
			float bottom = (float)Math.Round(leftpoint.Y / gridY) * gridY; 
 
			if (GridStyle == eStyle.Dots) 
			{ 
				GDI gdi = new GDI(); 
				gdi.BeginGDI(canvas.Graphics); 
				for (float x = left; x <= right; x += gridX) 
				{ 
					for (float y = bottom; y <= top; y += gridY) 
					{ 
						PointF p1 = canvas.ToScreen(new UnitPoint(x, y)); 
						gdi.SetPixel((int)p1.X, (int)p1.Y, m_color.ToArgb()); 
					} 
				} 
				gdi.EndGDI(); 
			} 
			if (GridStyle == eStyle.Lines) 
			{ 
				Pen pen = new Pen(m_color); 
				GraphicsPath path = new GraphicsPath(); 
 
				// draw vertical lines 
				while (left < right) 
				{ 
					PointF p1 = canvas.ToScreen(new UnitPoint(left, leftpoint.Y)); 
					PointF p2 = canvas.ToScreen(new UnitPoint(left, rightpoint.Y)); 
					path.AddLine(p1, p2); 
					path.CloseFigure(); 
					left += gridX; 
				} 
 
				// draw horizontal lines 
				while (bottom < top) 
				{ 
					PointF p1 = canvas.ToScreen(new UnitPoint(leftpoint.X, bottom)); 
					PointF p2 = canvas.ToScreen(new UnitPoint(rightpoint.X, bottom)); 
					path.AddLine(p1, p2); 
					path.CloseFigure(); 
					bottom += gridY; 
				} 
				canvas.Graphics.DrawPath(pen, path); 
			} 
		} 
		public string Id 
		{ 
			get { return "grid"; } 
		} 
		public ISnapPoint SnapPoint(ICanvas canvas, UnitPoint point, List<IDrawObject> otherobj) 
		{ 
			if (Enabled == false) 
				return null; 
			UnitPoint snappoint = new UnitPoint(); 
			UnitPoint mousepoint = point; 
			float gridX = Spacing.Width; 
			float gridY = Spacing.Height; 
			snappoint.X = (float)(Math.Round(mousepoint.X / gridX)) * gridX; 
			snappoint.Y = (float)(Math.Round(mousepoint.Y / gridY)) * gridY; 
			double threshold = canvas.ToUnit(/*ThresholdPixel*/6); 
			if ((snappoint.X < point.X - threshold) || (snappoint.X > point.X + threshold)) 
				return null; 
			if ((snappoint.Y < point.Y - threshold) || (snappoint.Y > point.Y + threshold)) 
				return null; 
			return new GridSnapPoint(canvas, snappoint); 
		} 
		public IEnumerable<IDrawObject> Objects 
		{ 
			get { return null; } 
		} 
		[XmlSerializable] 
		public bool Enabled 
		{ 
			get { return m_enabled; } 
			set { m_enabled = value; } 
		} 
		public bool Visible 
		{ 
			get { return true; } 
		} 
		#endregion 
		#region ISerialize 
		public void GetObjectData(XmlWriter wr) 
		{ 
			wr.WriteStartElement("gridlayer"); 
			XmlUtil.WriteProperties(this, wr); 
			wr.WriteEndElement(); 
		} 
		public void AfterSerializedIn() 
		{ 
		} 
		#endregion 
	} 
}