/// <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); }
/// <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); }