コード例 #1
0
        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;
            }
        }
コード例 #2
0
        /// <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;
                            }
                        }
                    }
                }
            }
        }
コード例 #3
0
ファイル: Part.cs プロジェクト: Damco92/C--Advanced
 public Part(string name, double price, PartRole role)
 {
     Name     = name;
     Price    = price;
     PartRole = role;
 }