Пример #1
0
 /// <summary>
 /// MarkingWire同士が接続されているかどうか。
 /// 引数に指定したMarkingWireが持ってるマーキングシンボルと繋がっている
 /// Wireを持っていたらTRUE
 /// </summary>
 /// <param name="combineWire"></param>
 /// <returns></returns>
 public bool IsConnected(MarkingWire combineWire)
 {
     foreach (Wire wire in this.Wires)
     {
         foreach (Symbol marking in combineWire.markingSymbols)
         {
             if (wire.IsConnected(marking))
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Пример #2
0
        /// <summary>
        /// ワイヤーとマーキングシンボルからMarkingWireを生成する。
        /// </summary>
        /// <param name="wires"></param>
        /// <param name="markings"></param>
        /// <returns></returns>
        public static List <MarkingWire> CreateMarkingWire(List <Wire> wires, List <Symbol> markings)
        {
            List <MarkingWire> markingWires = new List <MarkingWire>();

            foreach (Symbol marking in markings)
            {
                //マーキングと繋がっているワイヤー持ってくる
                List <Wire> connectedWires = wires.FindAll(p => p.IsConnected(marking));

                if (connectedWires.Count != 2)
                {
                    continue;
                }

                MarkingWire markingWire = new MarkingWire();
                markingWire.Wires.AddRange(connectedWires);
                markingWire.MarkingSymbols.Add(marking);
                markingWires.Add(markingWire);
                markingWire.Floor = marking.Floor;
            }

            //MarkingWire同士で接続されていた場合、さらにまとめる。
            for (int i = 0; i < markingWires.Count; i++)
            {
                MarkingWire        markingWire           = markingWires[i];
                List <MarkingWire> connectedMarkingWires = markingWires.FindAll(p => p != markingWire && markingWire.IsConnected(p));
                while (1 <= connectedMarkingWires.Count)//接触しているMarkingWireが無くなるまでループ
                {
                    foreach (MarkingWire connectedMarkingWire in connectedMarkingWires)
                    {
                        foreach (Wire wire in connectedMarkingWire.Wires)
                        {
                            if (markingWire.Wires.Contains(wire))
                            {
                                continue;//重複したWireが入らないように
                            }
                            markingWire.Wires.Add(wire);
                        }
                        markingWire.MarkingSymbols.AddRange(connectedMarkingWire.MarkingSymbols);
                        markingWires.Remove(connectedMarkingWire);
                    }

                    connectedMarkingWires = markingWires.FindAll(p => p != markingWire && markingWire.IsConnected(p));
                }
            }

            //余りの座標をワイヤーの両端にする
            foreach (var markingWire in markingWires)
            {
                foreach (var childWire in markingWire.wires)
                {
                    var targets = markings.FindAll(p => p.Floor == childWire.Floor);

                    if (!targets.Exists(p => p.Contains(childWire.StartPoint)))
                    {
                        markingWire.StartPoint = childWire.StartPoint;
                    }

                    if (!targets.Exists(p => p.Contains(childWire.EndPoint)))
                    {
                        markingWire.EndPoint = childWire.EndPoint;
                    }
                }
            }

            //マーキングの子配列にConnectedSymbolObjectIdが入っている場合削除する
            markingWires.ForEach(p => p.Wires.ForEach(q => q.ConnectedSymbolObjectId = -1));
            return(markingWires);
        }