using System; using System.Drawing; using System.Drawing.Imaging; using System.Collections.Generic; using System.Linq; namespace Assistance { public class Workarea { public readonly Document document; // TODO: remove this? public ActivePoint ActivePoint = null; public Workarea() { document = new Document(this); } public ActivePoint findPoint(Point position) { foreach(ActivePoint point in document.points.Reverse()) if (point.isInside(position)) return point; return null; } public void getGuidelines(List outGuidelines, Point target) { foreach(Assistant assistant in document.assistants) assistant.getGuidelines(outGuidelines, target); } public void draw(Graphics g, ActivePoint activePoint, Point target, Track track) { // canvas document.canvas.draw(g); // guidelines and track List guidelines = new List(); if (track != null && track.points.Count > 0) { Guideline guideline; Track modifiedTrack = modifyTrackByAssistant(track, out guideline); getGuidelines(guidelines, modifiedTrack.transform(track.points.Last())); foreach(Guideline gl in guidelines) gl.draw(g); track.draw(g, true); if (guideline != null) guideline.draw(g, true); List modifiedTracks = modifyTrackByModifiers(modifiedTrack); rebuildTracks(modifiedTracks); foreach(Track t in modifiedTracks) t.draw(g); } else { getGuidelines(guidelines, target); foreach(Guideline guideline in guidelines) guideline.draw(g); } // modifiers foreach(Modifier modifier in document.modifiers) modifier.draw(g); // assistants foreach(Assistant assistant in document.assistants) assistant.draw(g); // active points foreach(ActivePoint point in document.points) point.draw(g, activePoint == point); } public Track modifyTrackByAssistant(Track track, out Guideline guideline) { guideline = null; if (track.points.Count < 1) return track.createChild(Geometry.noTransform); List guidelines = new List(); getGuidelines(guidelines, track.points[0]); guideline = Guideline.findBest(guidelines, track); if (guideline == null) return track.createChild(Geometry.noTransform); return track.createChild(guideline.transformPoint); } public List modifyTrackByModifiers(Track track) { List tracks = new List() { track }; foreach(Modifier modifier in document.modifiers) tracks = modifier.modify(tracks); return tracks; } public void rebuildTracks(List tracks) { foreach(Track track in tracks) track.rebuild(); } public List modifyTrack(Track track) { Guideline guideline; List tracks = modifyTrackByModifiers( modifyTrackByAssistant(track, out guideline) ); rebuildTracks(tracks); return tracks; } public void paintTrack(Track track) { List tracks = modifyTrack(track); foreach(Track t in tracks) document.canvas.paintTrack(t); } } }