using System; using System.Collections.Generic; using System.Drawing; using System.Reflection; using System.Text.Json; using System.Xml; namespace CoreUnit.Control.UserControl.Canvas { public class AddObjectParam { public string ObjectType; public UnitPoint Point1; public UnitPoint Point2; public UnitPoint Center; public float StartAngle; public float EndAngle; public float MajorRadius; public float MinorRadius; public Color Color = Color.White; public float RotateAngle; } public class DataModel : IModel { static Dictionary m_toolTypes = new Dictionary(); static public IDrawObject NewDrawObject(string objecttype) { if (m_toolTypes.ContainsKey(objecttype)) { string type = m_toolTypes[objecttype].ToString(); IDrawObject drawObj = Assembly.GetExecutingAssembly().CreateInstance(type) as IDrawObject; return drawObj; } return null; } Dictionary m_drawObjectTypes = new Dictionary(); DrawObjectBase CreateObject(string objecttype) { if (m_drawObjectTypes.ContainsKey(objecttype)) { return m_drawObjectTypes[objecttype].Clone() as DrawObjectBase; } return null; } Dictionary m_editTools = new Dictionary(); public void AddEditTool(string key, IEditTool tool) { m_editTools.Add(key, tool); } public bool IsDirty { get { return m_undoBuffer.Dirty; } } UndoRedoBuffer m_undoBuffer = new UndoRedoBuffer(); UnitPoint m_centerPoint = UnitPoint.Empty; public UnitPoint CenterPoint { get { return m_centerPoint; } set { m_centerPoint = value; } } float m_scaleToFit = 0;//zoom fit에 맞는 스케일 값 public float ScaleToFit { get { return m_scaleToFit; } set { m_scaleToFit = value; } } float m_zoom = 1; ICanvasLayer m_gridLayer = new GridLayer(); ICanvasLayer m_backgroundLayer = new BackgroundLayer(); List m_layers = new List(); ICanvasLayer m_activeLayer; Dictionary m_selection = new Dictionary(); public delegate void EventHandlerCopyObjects(List objectList); public EventHandlerCopyObjects evtCopyObjects; public delegate void EventHandlerAddObject(IDrawObject obj); public EventHandlerAddObject evtAddObject; public delegate void EventHandlerDeleteObjects(List objectList); public EventHandlerDeleteObjects evtDeleteObjects; public delegate void EventHandlerMoveObjects(List originalObjectList, List newObjectList); public EventHandlerMoveObjects evtMoveObjects; public delegate void EventHandlerMoveNodes(List nodes); public EventHandlerMoveNodes evtMoveNodes; public delegate void EventHandlerSelectObjects(List objects); public EventHandlerSelectObjects evtSelectObjects; public delegate void EventHandlerDeselectAllObjects(); public EventHandlerDeselectAllObjects evtDeselectAllObjects; public delegate void EventHandlerRedo(); public EventHandlerRedo evtRedo; public delegate void EventHandlerUndo(); public EventHandlerUndo evtUndo; public DataModel() { m_toolTypes.Clear(); m_toolTypes[Line.ObjectType] = typeof(Line); m_toolTypes[Circle.ObjectType] = typeof(Circle); m_toolTypes[Arc.ObjectType] = typeof(Arc); m_toolTypes[Arc3Point.ObjectType] = typeof(Arc3Point); m_toolTypes[Dot.ObjectType] = typeof(Dot); m_toolTypes[Spline.ObjectType] = typeof(Spline); m_toolTypes[SnowMan.ObjectType] = typeof(SnowMan); m_toolTypes[ZigZag.ObjectType] = typeof(ZigZag); //group tool 타입 생성 m_toolTypes[Group.ObjectType] = typeof(Group); m_toolTypes[EllipseTool.ObjectType] = typeof(EllipseTool); m_toolTypes[RectangleTool.ObjectType] = typeof(RectangleTool); m_toolTypes[RoiTool.ObjectType] = typeof(RoiTool); m_centerPoint = new UnitPoint(0, 0); DefaultLayer(); } public void AddDrawTool(string key, IDrawObject drawtool) { m_drawObjectTypes[key] = drawtool; if (!m_toolTypes.ContainsKey(key)) { m_toolTypes[key] = drawtool.GetType(); } } void DefaultLayer() { m_layers.Clear(); m_layers.Add(new DrawingLayer(m_layers.Count, string.Empty, Color.Black, 0.01f)); } public IDrawObject GetFirstSelected() { if (m_selection.Count > 0) { Dictionary.KeyCollection.Enumerator e = m_selection.Keys.GetEnumerator(); e.MoveNext(); return e.Current; } return null; } public IDrawObject GetLastSelected() { if (m_selection.Count > 0) { Dictionary.KeyCollection.Enumerator e = m_selection.Keys.GetEnumerator(); IDrawObject drawObject = null; while (e.MoveNext()) { drawObject = e.Current; } return drawObject; } return null; } #region IModel Members public float Zoom { get { return m_zoom; } set { m_zoom = value; } } public ICanvasLayer BackgroundLayer { get { return m_backgroundLayer; } set { m_backgroundLayer = value; } } public ICanvasLayer GridLayer { get { return m_gridLayer; } set { m_gridLayer = value; } } public ICanvasLayer[] Layers { get { return m_layers.ToArray(); } } public ICanvasLayer ActiveLayer { get { if (m_activeLayer == null) m_activeLayer = m_layers[0]; return m_activeLayer; } set { m_activeLayer = value; } } public ICanvasLayer GetLayer(int no) { foreach (ICanvasLayer layer in m_layers) { if (layer.No == no) return layer; } return null; } public ICanvasLayer CreateLayer() { ICanvasLayer layer = new DrawingLayer(m_layers.Count, string.Empty, Color.Black, 0.01f); m_layers.Add(layer); m_activeLayer = layer; return layer; } public void DeleteLayer(int no) { if (m_layers.Count <= 1) { throw new Exception("ERR_SCANNER_CANVAS_USER_CONTROL_NOT_DELETE_DEFAULT_LAYER"); } ICanvasLayer deleteLayer = GetLayer(no); m_layers.Remove(deleteLayer); for (int i = 0; i < m_layers.Count; i++) { ICanvasLayer layer = m_layers[i]; layer.No = i; } ActiveLayer = m_layers[0]; } public void ChangeLayer(int no) { foreach (ICanvasLayer layer in m_layers) { if (layer.No == no) { ActiveLayer = layer; ClearSelectedObjects(); break; } } } public void CopyLayer(int no) { ICanvasLayer targetLayer = GetLayer(no); ICanvasLayer newLayer = CreateLayer(); ((DrawingLayer)newLayer).Copy((DrawingLayer)targetLayer, true); } public IDrawObject CreateObject(string type, UnitPoint point, ISnapPoint snappoint) { DrawingLayer layer = ActiveLayer as DrawingLayer; if (layer.Enabled == false) { return null; } DrawObjectBase newobj = CreateObject(type); if (newobj != null) { (newobj as IDrawObject).No = layer.Objects.Count; newobj.Layer = layer; newobj.InitializeFromModel(point, layer, snappoint); } return newobj as IDrawObject; } public void AddObject(ICanvasLayer layer, IDrawObject drawobject, bool useEventMode = true) { if (drawobject is IObjectEditInstance) { drawobject = ((IObjectEditInstance)drawobject).GetDrawObject(); } if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandAdd(layer, drawobject)); } //객체의 이름을 명명 drawobject.No = layer.Objects.Count; ///////////////////////////////////////////////// ((DrawingLayer)layer).AddObject(drawobject); // 그리자마자 선택됨, AddSelectedObject(drawobject); if (useEventMode == true) { evtAddObject(drawobject); } } public void DeleteObjects(List objects, bool useEventMode = true) { if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandRemove(ActiveLayer, objects)); } ((DrawingLayer)ActiveLayer).DeleteObjects(objects); //객체 삭제 후 이름을 재 명명(hochul.kim) for (int i = 0; i < ActiveLayer.Objects.Count; i++) { IDrawObject obj = ActiveLayer.Objects[i]; obj.No = i; } ///////////////////////////////////////////////// if (useEventMode == true) { evtDeleteObjects(objects); } } public void MoveObjects(UnitPoint offset, List objects, bool useEventMode = true) { if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandMove(offset, objects)); } List originalObjects = new List(); foreach (IDrawObject obj in objects) { IDrawObject newobj = obj.Clone(); originalObjects.Add(newobj); } foreach (IDrawObject obj in objects) { obj.Move(offset); } if (useEventMode == true) { evtMoveObjects(originalObjects, objects); } } public void RotateObjects(float angle, List objects, bool useObjCenter, bool useEventMode = true) { if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandRotate(angle, objects)); } // 원본 객체에 대하여 저장함 List originalObjects = new List(); foreach (IDrawObject obj in objects) { IDrawObject newobj = obj.Clone(); originalObjects.Add(newobj); } foreach (IDrawObject obj in objects) { UnitPoint center = useObjCenter ? new UnitPoint(obj.MiddlePoint.X, obj.MiddlePoint.Y) : new UnitPoint(0, 0); obj.Rotate(angle, center); } if (useEventMode == true) { evtMoveObjects(originalObjects, objects); } } public void SizeObjects(float distance, List objects, bool useEventMode = true) { if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandMakeLength(distance, objects)); } // 원본 객체에 대하여 저장함 List originalObjects = new List(); foreach (IDrawObject obj in objects) { IDrawObject newobj = obj.Clone(); originalObjects.Add(newobj); } foreach (IDrawObject obj in objects) { obj.MakeLength(distance); } if (useEventMode == true) { evtMoveObjects(originalObjects, objects); } } List m_selectedCopyObject; public List SelectedCopyObject { get { return m_selectedCopyObject; } set { m_selectedCopyObject = value; } } bool m_isCopying = false; public bool IsArrayCopying { get { return m_isCopying; } set { m_isCopying = value; } } public void AddSelectedObjects(List objects) { foreach (IDrawObject drawobject in objects) { DrawObjectBase obj = drawobject as DrawObjectBase; RemoveSelectedObject(drawobject); m_selection[drawobject] = true; obj.Selected = true; } } int m_copyCnt = 0; public int CopyCnt { get { return m_copyCnt; } set { m_copyCnt = value; } } public void CopyObjects(UnitPoint offset, List objects, bool useEventMode = true) { ClearSelectedObjects(); List newobjects = new List(); foreach (IDrawObject obj in objects) { IDrawObject newobj = obj.Clone(); newobjects.Add(newobj); newobj.Move(offset); AddObject(ActiveLayer, newobj, useEventMode); if (IsArrayCopying) { SelectedCopyObject.Add(newobj); AddSelectedObjects(SelectedCopyObject); } else AddSelectedObject(newobj); } if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandAdd(ActiveLayer, newobjects)); } if (useEventMode == true) { if (IsArrayCopying) newobjects = SelectedCopyObject; evtCopyObjects(newobjects); } } public void AfterEditObjects(IEditTool edittool) { edittool.Finished(); if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandEditTool(edittool)); } } public IEditTool GetEditTool(string edittoolid) { if (m_editTools.ContainsKey(edittoolid)) return m_editTools[edittoolid].Clone(); return null; } public void MoveNodes(UnitPoint position, List nodes, bool useEventMode = true) { if (m_undoBuffer.CanCapture) { m_undoBuffer.AddCommand(new EditCommandNodeMove(nodes)); } foreach (INodePoint node in nodes) { node.SetPosition(position); node.Finish(); } if (useEventMode == true) { evtMoveNodes(nodes); } } public List GetHitObjects(ICanvas canvas, RectangleF selection, bool anyPoint) { List selected = new List(); foreach (IDrawObject drawobject in ActiveLayer.Objects) { if (drawobject.ObjectInRectangle(canvas, selection, anyPoint)) { selected.Add(drawobject); } } return selected; } public List GetHitObjects(ICanvas canvas, UnitPoint point) { List selected = new List(); foreach (IDrawObject drawobject in ActiveLayer.Objects) { if (drawobject.PointInObject(canvas, point)) { selected.Add(drawobject); } } return selected; } public bool IsSelected(IDrawObject drawobject) { return m_selection.ContainsKey(drawobject); } public void AddSelectedObject(IDrawObject drawobject) { DrawObjectBase obj = drawobject as DrawObjectBase; RemoveSelectedObject(drawobject); m_selection[drawobject] = true; obj.Selected = true; } public void RemoveSelectedObject(IDrawObject drawobject) { if (m_selection.ContainsKey(drawobject)) { DrawObjectBase obj = drawobject as DrawObjectBase; obj.Selected = false; m_selection.Remove(drawobject); } } public List SelectedObjects { get { List obj = new List(); obj.AddRange(m_selection.Keys); return obj; } } public int SelectedCount { get { return m_selection.Count; } } public void ClearSelectedObjects() { List x = SelectedObjects; foreach (IDrawObject drawobject in x) { DrawObjectBase obj = drawobject as DrawObjectBase; obj.Selected = false; } m_selection.Clear(); } public ISnapPoint SnapPoint(ICanvas canvas, UnitPoint point, Type[] runningsnaptypes, Type usersnaptype) { List objects = GetHitObjects(canvas, point); if (objects.Count == 0) return null; foreach (IDrawObject obj in objects) { ISnapPoint snap = obj.SnapPoint(canvas, point, objects, runningsnaptypes, usersnaptype); if (snap != null) return snap; } return null; } public bool CanUndo() { return m_undoBuffer.CanUndo; } public bool DoUndo() { bool result = m_undoBuffer.DoUndo(this); if (result) evtUndo(); return result; } public bool CanRedo() { bool result = m_undoBuffer.CanRedo; return result; } public bool DoRedo() { bool result = m_undoBuffer.DoRedo(this); ClearSelectedObjects(); if (result) evtRedo(); return result; } #region ISerialization function public void Save(XmlWriter wr) { try { #region 2.Drawing Objects에 대한 데이터 로딩 wr.WriteStartElement("DrawingObjects"); (m_backgroundLayer as BackgroundLayer).GetObjectData(wr); (m_gridLayer as GridLayer).GetObjectData(wr); foreach (ICanvasLayer layer in m_layers) { if (layer is ISerialize) { ((ISerialize)layer).GetObjectData(wr); } } wr.WriteEndElement(); m_undoBuffer.Dirty = false; #endregion } catch { } } public string Save() { string jsonString = string.Empty; var options = new JsonSerializerOptions { WriteIndented = true }; try { #region 2.Drawing Objects에 대한 데이터 로딩 //jsonString += JsonSerializer.Serialize(m_backgroundLayer, options); //jsonString += JsonSerializer.Serialize(m_gridLayer, options); foreach (ICanvasLayer layer in m_layers) { if (layer is ISerialize) { jsonString += ((ISerialize)layer).GetObjectData(); } } m_undoBuffer.Dirty = false; #endregion } catch { } return jsonString; } public bool Load(XmlElement root) { try { foreach (XmlElement node in root.ChildNodes) { #region 2.Drawing Objects에 대한 데이터 로딩 ActiveLayer = null; m_layers.Clear(); m_undoBuffer.Clear(); m_undoBuffer.Dirty = false; foreach (XmlElement subNode in node.ChildNodes) { if (subNode.Name == "backgroundlayer") { Common.XmlUtil.ParseProperties(subNode, m_backgroundLayer); continue; } if (subNode.Name == "gridlayer") { Common.XmlUtil.ParseProperties(subNode, m_gridLayer); continue; } if (subNode.Name == "layer") { DrawingLayer l = DrawingLayer.NewLayer(subNode as XmlElement); m_layers.Add(l); } if (subNode.Name == "property") { Common.XmlUtil.ParseProperty(subNode, this); } } if (m_layers.Count == UInt16.MinValue) //만약 Serialize한 레이어의 데이터가 없을 경우에는 default layer의 생성. { DefaultLayer(); } #endregion } return true; } catch (Exception e) { DefaultLayer(); Console.WriteLine("Load exception - {0}", e.Message); } return false; } #endregion #region Group/Ungorup 기능 public void GroupObjects() { Group obj = (Group)CreateObject("Group"); List rearrangeObjects = RearrangeObjects(SelectedObjects); obj.IncludeObjects(rearrangeObjects); DeleteObjects(SelectedObjects, false); ClearSelectedObjects(); AddObject(ActiveLayer, obj); } private List RearrangeObjects(List objects) { for (int i = 0; i < objects.Count - 1; i++) { for (int j = i + 1; j < objects.Count; j++) { if (objects[i].No > objects[j].No) { IDrawObject obj = objects[i]; objects[i] = objects[j]; objects[j] = obj; } } } return objects; } public void UngroupObjects() { List releaseObjects = new List(); foreach (IDrawObject obj in SelectedObjects) { if (obj is Group)//그룹인 경우에만 ungroup 작업 진행 { foreach (IDrawObject subObj in ((Group)obj).SubObjects) { releaseObjects.Add(subObj.Clone()); } DeleteObjects(new List { obj }, false); } } foreach (IDrawObject obj in releaseObjects) { AddObject(ActiveLayer, obj); } } #endregion #region 1.외부에서 Canvas의 객체를 관리하는 함수 /// /// 새로운 객체를 생성하는 함수(Canvas에서 생성하는 것이 아니라, 외부에서 생성할 때 실행) /// /// public IDrawObject AddObject(AddObjectParam param) { IDrawObject drawObj = null; switch (param.ObjectType) { case "Line": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((LineEdit)drawObj).P2 = param.Point2; ((LineEdit)drawObj).Color = param.Color; AddObject(ActiveLayer, drawObj, false); break; case "Dot": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((Dot)drawObj).Color = param.Color; AddObject(ActiveLayer, drawObj, false); break; case "ArcCR": drawObj = CreateObject(param.ObjectType, param.Center, null); ((Arc)drawObj).StartAngle = param.StartAngle; ((Arc)drawObj).EndAngle = param.EndAngle; ((Arc)drawObj).Radius = param.MajorRadius; ((Arc)drawObj).Color = param.Color; ((Arc)drawObj).Rotate(param.RotateAngle, param.Center); AddObject(ActiveLayer, drawObj, false); break; case "Spline": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((Dot)drawObj).Color = param.Color; AddObject(ActiveLayer, drawObj, false); break; case "SnowMan": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((SnowMan)drawObj).P2 = param.Point2; ((SnowMan)drawObj).Color = param.Color; AddObject(ActiveLayer, drawObj, false); break; case "Group": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((Group)drawObj).Color = param.Color; AddObject(ActiveLayer, drawObj, false); break; case "Rectangle": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((RectangleTool)drawObj).Color = param.Color; ((RectangleTool)drawObj).DrawBound(param.Point1, param.Point2); AddObject(ActiveLayer, drawObj, false); break; case "Roi": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((RoiTool)drawObj).Color = param.Color; ((RoiTool)drawObj).Locked = true; ((RoiTool)drawObj).DrawBound(param.Point1, param.Point2); AddObject(ActiveLayer, drawObj, false); break; case "ZigZag": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((ZigZag)drawObj).P2 = param.Point2; ((ZigZag)drawObj).Color = param.Color; AddObject(ActiveLayer, drawObj, false); break; case "PolyLine": drawObj = CreateObject(param.ObjectType, param.Point1, null); ((LineEdit)drawObj).P2 = param.Point2; ((LineEdit)drawObj).Color = param.Color; AddObject(ActiveLayer, drawObj, false); break; case "Ellipse": drawObj = CreateObject(param.ObjectType, param.Center, null); ((EllipseTool)drawObj).Color = param.Color; ((EllipseTool)drawObj).DrawBound(param.Point1, param.Point2); ((EllipseTool)drawObj).Rotate(param.RotateAngle, param.Center); ((EllipseTool)drawObj).StartAngle = param.StartAngle; ((EllipseTool)drawObj).EndAngle = param.EndAngle; AddObject(ActiveLayer, drawObj, false); break; default: break; } return drawObj; } public IDrawObject AddObject(string objectType, UnitPoint pt1, UnitPoint pt2, Color color) { IDrawObject drawObj = null; switch (objectType) { case "Line": drawObj = CreateObject(objectType, pt1, null); ((LineEdit)drawObj).P2 = pt2; ((LineEdit)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "Dot": drawObj = CreateObject(objectType, pt1, null); ((Dot)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "Arc": drawObj = CreateObject(objectType, pt1, null); ((Arc)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "Spline": drawObj = CreateObject(objectType, pt1, null); ((Dot)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "SnowMan": drawObj = CreateObject(objectType, pt1, null); ((SnowMan)drawObj).P2 = pt2; ((SnowMan)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "Group": drawObj = CreateObject(objectType, pt1, null); ((Group)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "Rectangle": drawObj = CreateObject(objectType, pt1, null); ((RectangleTool)drawObj).Color = color; ((RectangleTool)drawObj).Locked = true; ((RectangleTool)drawObj).DrawBound(pt1, pt2); AddObject(ActiveLayer, drawObj, false); break; case "Roi": drawObj = CreateObject(objectType, pt1, null); ((RoiTool)drawObj).Color = color; ((RoiTool)drawObj).Locked = true; ((RoiTool)drawObj).DrawBound(pt1, pt2); AddObject(ActiveLayer, drawObj, false); break; case "ZigZag": drawObj = CreateObject(objectType, pt1, null); ((ZigZag)drawObj).P2 = pt2; ((ZigZag)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "PolyLine": drawObj = CreateObject(objectType, pt1, null); ((LineEdit)drawObj).P2 = pt2; ((LineEdit)drawObj).Color = color; AddObject(ActiveLayer, drawObj, false); break; case "Ellipse": drawObj = CreateObject(objectType, pt1, null); ((EllipseTool)drawObj).Color = color; ((EllipseTool)drawObj).Locked = true; ((EllipseTool)drawObj).DrawBound(pt1, pt2); AddObject(ActiveLayer, drawObj, false); break; default: break; } return drawObj; } /// /// 선택된 객체를 지우는 함수(Canvas에서 지우는 것이 아니라, 외부에서 지울 때 실행) /// public void DeleteAllObjects() { ((DrawingLayer)ActiveLayer).DeleteObjects(((DrawingLayer)ActiveLayer).Objects); } /// /// 객체를 선택하는 함수(Canvas에서 선택하는 것이 아니라, 외부에서 선택할 때 실행) /// public void SelectObject(int index, bool addMode) { if (addMode == false) ClearSelectedObjects(); AddSelectedObject(((DrawingLayer)ActiveLayer).Objects[index]); } #endregion #region 2. 필드 이미지 기능 SizeF m_canvasImageSize = new SizeF(0, 0); public SizeF CanvasImageSize { get { return m_canvasImageSize; } set { m_canvasImageSize = value; } } bool m_canvasImageEnable = false; public bool CanvasImageEnable { get { lock (this) { return m_canvasImageEnable; } } set { lock (this) { m_canvasImageEnable = value; } } } Bitmap m_canvasImage = null; public Bitmap CanvasImage { get { lock (this) { return m_canvasImage; } } set { lock (this) { m_canvasImage = value; } } } #endregion #region 3. Canvas 색상 및 격자 사용 유무 옵션 bool m_canvasColorEnable = false; public bool EnableCanvasColor { get { lock (this) { return m_canvasColorEnable; } } set { lock (this) { m_canvasColorEnable = value; } } } bool m_canvasGridEnable = false; public bool EnableCanvasGrid { get { lock (this) { return m_canvasGridEnable; } } set { lock (this) { m_canvasGridEnable = value; } } } #endregion #endregion public void Clone(DataModel org) { lock (this) { CanvasImage = org.CanvasImage; CenterPoint = org.CenterPoint; CanvasImageEnable = org.CanvasImageEnable; CanvasImageSize = org.CanvasImageSize; ScaleToFit = org.ScaleToFit; Zoom = org.Zoom; EnableCanvasColor = org.EnableCanvasColor; EnableCanvasGrid = org.EnableCanvasGrid; var thisDrawing = ActiveLayer as DrawingLayer; var orgDrawing = org.ActiveLayer as DrawingLayer; thisDrawing.Copy(orgDrawing, true); var thisGrid = GridLayer as GridLayer; var orgGrid = org.GridLayer as GridLayer; thisGrid.Copy(orgGrid); var thisBackground = BackgroundLayer as BackgroundLayer; var orgBackground = org.BackgroundLayer as BackgroundLayer; thisBackground.Copy(orgBackground); } } } }