Click here to Skip to main content
15,891,936 members
Articles / Desktop Programming / Win32

OpenS-CAD, a simple 2D CAD application

Rate me:
Please Sign up or sign in to vote.
4.92/5 (89 votes)
30 Dec 2007CPOL14 min read 339.9K   31.3K   222  
A simple 2D CAD application.
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace Canvas
{
	public class DrawingLayer : ICanvasLayer, ISerialize
	{
		string m_id;
		string m_name = "<Layer>";
		Color m_color;
		float m_width = 0.00f;
		bool m_enabled = true;
		bool m_visible = true;
		[XmlSerializable]
		public Color Color
		{
			get { return m_color; }
			set { m_color = value; }
		}
		[XmlSerializable]
		public float Width
		{
			get { return m_width; }
			set { m_width = value; }
		}
		[XmlSerializable]
		public string Name
		{
			get { return m_name; }
			set { m_name = value; }
		}
		public DrawingLayer(string id, string name, Color color, float width)
		{
			m_id = id;
			m_name = name;
			m_color = color;
			m_width = width;
		}
		List<IDrawObject> m_objects = new List<IDrawObject>();
		Dictionary<IDrawObject, bool> m_objectMap = new Dictionary<IDrawObject, bool>();
		public void AddObject(IDrawObject drawobject)
		{
			if (m_objectMap.ContainsKey(drawobject))
				return; // this should never happen
			if (drawobject is DrawTools.DrawObjectBase)
				((DrawTools.DrawObjectBase)drawobject).Layer = this;
			m_objects.Add(drawobject);
			m_objectMap[drawobject] = true;
		}
		public List<IDrawObject> DeleteObjects(IEnumerable<IDrawObject> objects)
		{
			if (Enabled == false)
				return null;
			List<IDrawObject> removedobjects = new List<IDrawObject>();
			// first remove from map only
			foreach (IDrawObject obj in objects)
			{
				if (m_objectMap.ContainsKey(obj))
				{
					m_objectMap.Remove(obj);
					removedobjects.Add(obj);
				}
			}
			// need some smart algorithm here to either remove from existing list or build a new list
			// for now I will just ise the removed count;
			if (removedobjects.Count == 0)
				return null;
			if (removedobjects.Count < 10) // remove from existing list
			{
				foreach (IDrawObject obj in removedobjects)
					m_objects.Remove(obj);
			}
			else // else build new list;
			{
				List<IDrawObject> newlist = new List<IDrawObject>();
				foreach (IDrawObject obj in m_objects)
				{
					if (m_objectMap.ContainsKey(obj))
						newlist.Add(obj);
				}
				m_objects.Clear();
				m_objects = newlist;
			}
			return removedobjects;
		}
		public int Count
		{
			get { return m_objects.Count; }
		}
		public void Copy(DrawingLayer acopy, bool includeDrawObjects)
		{
			if (includeDrawObjects)
				throw new Exception("not supported yet");
			m_id = acopy.m_id;
			m_name = acopy.m_name;
			m_color = acopy.m_color;
			m_width = acopy.m_width;
			m_enabled = acopy.m_enabled;
			m_visible = acopy.m_visible;
		}
		#region ICanvasLayer Members
		public void Draw(ICanvas canvas, RectangleF unitrect)
		{
			CommonTools.Tracing.StartTrack(Program.TracePaint);
			int cnt = 0;
			foreach (IDrawObject drawobject in m_objects)
			{
				DrawTools.DrawObjectBase obj = drawobject as DrawTools.DrawObjectBase;
				if (obj is IDrawObject && ((IDrawObject)obj).ObjectInRectangle(canvas, unitrect, true) == false)
					continue;
				bool sel = obj.Selected;
				bool high = obj.Highlighted;
				obj.Selected = false;
				drawobject.Draw(canvas, unitrect);
				obj.Selected = sel;
				obj.Highlighted = high;
				cnt++;
			}
			CommonTools.Tracing.EndTrack(Program.TracePaint, "Draw Layer {0}, ObjCount {1}, Painted ObjCount {2}", Id, m_objects.Count, cnt);
		}
		public PointF SnapPoint(PointF unitmousepoint)
		{
			return PointF.Empty;
		}
		public string Id
		{
			get { return m_id; }
		}
		public ISnapPoint SnapPoint(ICanvas canvas, UnitPoint point, List<IDrawObject> otherobj)
		{
			foreach (IDrawObject obj in m_objects)
			{
				ISnapPoint sp = obj.SnapPoint(canvas, point, otherobj, null, null);
				if (sp != null)
					return sp;
			}
			return null;
		}
		public IEnumerable<IDrawObject> Objects
		{
			get { return m_objects; }
		}
		[XmlSerializable]
		public bool Enabled
		{
			get { return m_enabled && m_visible; }
			set { m_enabled = value; }
		}
		[XmlSerializable]
		public bool Visible
		{
			get { return m_visible; }
			set { m_visible = value; }
		}
		#endregion
		#region XML Serialize
		public void GetObjectData(XmlWriter wr)
		{
			wr.WriteStartElement("layer");
			wr.WriteAttributeString("Id", m_id);
			XmlUtil.WriteProperties(this, wr);
			wr.WriteStartElement("items");
			foreach (IDrawObject drawobj in m_objects)
			{
				if (drawobj is ISerialize)
					((ISerialize)drawobj).GetObjectData(wr);
			}
			wr.WriteEndElement();
			wr.WriteEndElement();
		}
		public void AfterSerializedIn()
		{
		}
		public static DrawingLayer NewLayer(XmlElement xmlelement)
		{
			string id = xmlelement.GetAttribute("Id");
			if (id.Length == 0)
				id = Guid.NewGuid().ToString();
			DrawingLayer layer = new DrawingLayer(id, string.Empty, Color.White, 0.0f);
			foreach (XmlElement node in xmlelement.ChildNodes)
			{
				XmlUtil.ParseProperty(node, layer);
				if (node.Name == "items")
				{
					foreach (XmlElement itemnode in node.ChildNodes)
					{
						object item = DataModel.NewDrawObject(itemnode.Name);
						if (item == null)
							continue;
						if (item != null)
							XmlUtil.ParseProperties(itemnode, item);
						if (item is ISerialize)
						   ((ISerialize)item).AfterSerializedIn();
						if (item is IDrawObject)
							layer.AddObject(item as IDrawObject);
					}
				}
			}
			return layer;
		}
		#endregion
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions