public Structure(string id, string role) : base(id) { Unassigned = true; switch (role.ToLower()) { case "outline": Role = PartRole.Outline; break; case "part": Role = PartRole.Part; break; case "outer": Role = PartRole.Outer; break; case "inner": Role = PartRole.Inner; break; } }
/// <summary> /// </summary> /// <param name="compound"></param> /// <returns></returns> private IEnumerable <Structure> Merge(Compound compound, PartRole role) { /// Ring assignments while (true) { // For each unassigned structure var structure = (from node in compound.Structures where node.Unassigned && node.Role == role select node).FirstOrDefault(); if (structure == null) { break; } if (ways.Contains(structure.Id)) { break; } var way = FindWayById(structure.Id); if (way == null) { break; } ways.Add(structure.Id); // Merge other fitting structures structure.Unassigned = false; MultiPolygon ring = new MultiPolygon(CreateFootprint(way).Points); while (true) { if (ring.IsClosed()) { // Ring is closed, return merged structure structure.Data = way; structure.Polygon = ring; yield return(structure); break; } else { Vector2 first = ring.Points.First(); Vector2 last = ring.Points.Last(); foreach (var str in compound.Structures) { if (!str.Unassigned || str.Role != role) { continue; } var w = FindWayById(str.Id); if (w == null) { continue; } ways.Add(str.Id); var poly = CreateFootprint(w); if (last == poly.Points.First()) { ring.Points.Remove(last); ring.Points.AddRange(poly.Points); str.Unassigned = false; break; } else if (last == poly.Points.Last()) { var newPoly = poly.Points.Reverse <Vector2>().ToList(); ring.Points.Remove(last); ring.Points.AddRange(newPoly); str.Unassigned = false; break; } else if (first == poly.Points.First()) { ring.Points.Remove(first); var oldRing = ring; ring = new MultiPolygon(poly.Points.Reverse <Vector2>().ToList()); ring.Points.AddRange(oldRing.Points); str.Unassigned = false; break; } else if (first == poly.Points.Last()) { ring.Points.Remove(first); var oldRing = ring; ring = new MultiPolygon(poly.Points); ring.Points.AddRange(oldRing.Points); str.Unassigned = false; break; } } } } } }
public Part(string name, double price, PartRole role) { Name = name; Price = price; PartRole = role; }