using System; using System.Drawing; using System.Drawing.Imaging; using System.Collections.Generic; using System.Linq; namespace Assistance { public class Workarea { public readonly List assistants = new List(); public readonly List points = new List(); public readonly Canvas canvas = new Canvas(); public ActivePoint ActivePoint = null; public ActivePoint findPoint(Point position) { foreach(ActivePoint point in points.Reverse()) if (point.isInside(position)) return point; return null; } public void getGuidelines(List outGuidelines, Point target) { foreach(Assistant assistant in assistants) assistant.getGuidelines(outGuidelines, target); } public void draw(Graphics g, ActivePoint activePoint, Point target, Track track) { // canvas canvas.draw(g); // guidelines and track List guidelines = new List(); if (track != null && track.points.Count > 0) { getGuidelines(guidelines, track.points[0]); foreach(Guideline gl in guidelines) gl.draw(g); Guideline guideline = Guideline.findBest(guidelines, track); if (guideline != null) { track.draw(g, true); guideline.modifyTrack(track).draw(g); guideline.draw(g, true); } else { track.draw(g); } } else { getGuidelines(guidelines, target); foreach(Guideline guideline in guidelines) guideline.draw(g); } // assistants foreach(Assistant assistant in assistants) assistant.draw(g); // assistant active points foreach(ActivePoint point in points) point.draw(g, activePoint == point); } public Track modifyTrack(Track track) { if (track.points.Count < 1) return track; List guidelines = new List(); getGuidelines(guidelines, track.points[0]); Guideline guideline = Guideline.findBest(guidelines, track); if (guideline == null) return track; return guideline.modifyTrack(track); } public void paintTrack(Track track) { canvas.paintTrack( modifyTrack(track) ); } } }