/// <summary>
        /// 階またぎ用の処理(現時点で階またぎは1配線で1回のみ)
        /// </summary>
        /// <param name="wires"></param>
        /// <returns></returns>
        private List <Wire> SummarizedWireAtDrop(Symbol symbol, List <Wire> wires)
        {
            if (wires.Count == 1)
            {
                return(wires);
            }

            var prevWire    = new Wire();
            var removeWires = new List <Wire>();

            //小屋裏の手前にあるパネルに小屋裏を全部まとめる
            //小屋裏は末尾にしかないはず
            foreach (var wire in wires)
            {
                if (wire.CeilingPanel == null)
                {
                    continue;
                }

                if (wire.CeilingPanel.Name.StartsWith("RC"))
                {
                    if (prevWire.CeilingPanel != null)
                    {
                        prevWire.RolledLengthChild += wire.TotalLength2D;
                        prevWire.RolledWireChildren.Add(wire);
                        prevWire.withKoyaura = true;
                        removeWires.Add(wire);
                    }
                    continue;
                }
                else
                {
                    prevWire = wire;
                }
            }

            if (removeWires.Count > 0)
            {
                removeWires.ForEach(p => wires.Remove(p));
            }

            prevWire    = new Wire();
            removeWires = new List <Wire>();

            //階またぎ位置の二本を探す
            //立ち上げ位置が1.5m以下なら上階に巻き取る
            foreach (var wire in wires)
            {
                if (wires.IndexOf(wire) == 0)
                {
                    prevWire = wire;
                    continue;
                }

                if (wire.Floor != prevWire.Floor)
                {
                    var underWire = new Wire();
                    var upperWire = new Wire();

                    if (wire.Floor < prevWire.Floor)
                    {
                        underWire = wire;
                        upperWire = prevWire;
                    }
                    else
                    {
                        underWire = prevWire;
                        upperWire = wire;
                    }
                    var underWireIdx = wires.IndexOf(underWire);
                    var upperWireIdx = wires.IndexOf(upperWire);

                    //立ち上げ部分が1.5m以下なら上にもっていく
                    if (underWire.Length2D <= 1500)
                    {
                        //JB接続位置ならロールしない
                        if (underWireIdx == 0 && symbol.Parent.IsJointBox)
                        {
                            break;
                        }

                        if (underWireIdx == wires.Count - 1 && symbol.IsJointBox)
                        {
                            break;
                        }

                        if (underWireIdx < upperWireIdx)
                        {
                            //二階が子側のとき、子側に一回だけまとめる
                            wires = this.SummarizedWireForChildOnce(symbol, wires, underWireIdx);
                        }
                        else
                        {
                            wires[upperWireIdx].RolledLengthChild += underWire.TotalLength2D;
                            wires[upperWireIdx].RolledWireChildren.Add(underWire);
                            wires.Remove(underWire);
                        }
                    }
                    //二階が子側で、階またぎの巻き取りがなく、二階部分のみ1.5m以下の場合、
                    //子側に巻き取りが可能であれば巻き取る
                    //※そのままだと1階側に行ってしまうので
                    //※親側のときは通常処理にいくのでOK
                    else if (upperWire.Length2D <= 1500)
                    {
                        if (underWireIdx < upperWireIdx && upperWireIdx < wires.Count - 1)
                        {
                            wires = this.SummarizedWireForChildOnce(symbol, wires, upperWireIdx);
                        }
                    }
                    break;
                }
                prevWire = wire;
            }
            return(wires);
        }
        //指定位置から子側に向かって一回だけ巻き取りをやる
        private List <Wire> SummarizedWireForChildOnce(Symbol symbol, List <Wire> wires, int startIdx)
        {
            List <Wire> resultWires = new List <Wire>();

            var     prevWire      = new Wire();
            var     summaryWires  = new List <Wire>();
            decimal summaryLength = 0;
            bool    finished      = false; //1回しかやらないので

            for (var i = 0; i < wires.Count; i++)
            {
                var wire = wires[i];
                if (i < startIdx)
                {
                    resultWires.Add(wire);
                    continue;
                }

                if (finished)
                {
                    resultWires.Add(wire);
                    continue;
                }

                //巻き取り済みがあるとき、継続可能かチェックする
                if (summaryWires.Count > 0)
                {
                    //ロール1回目は制限なし
                    if (summaryWires.Count == 1)
                    {
                        summaryWires.Add(wire);
                        summaryLength += wire.TotalLength2D;
                    }
                    //ロール二回目以降は、
                    //①ここまでの合計が1.5m以下 or
                    //②対象が1.5m以下かつ足したとき2m以下なら巻き取り
                    else
                    {
                        if (summaryLength <= 1500 || (wire.TotalLength2D <= 1500 && summaryLength + wire.TotalLength2D <= 2000))
                        {
                            summaryWires.Add(wire);
                            summaryLength += wire.TotalLength2D;
                        }
                        else
                        {
                            resultWires.Add(this.CombineMargedWires(summaryWires, false));
                            resultWires[resultWires.Count - 1].IsInhibitRoll = true; //あとで動いてしまわないように
                            summaryWires  = new List <Wire>();
                            summaryLength = 0;
                            finished      = true;
                        }
                    }
                }

                //巻き取りがないorクリアされていたら、1.5mチェック
                if (summaryWires.Count == 0)
                {
                    if (wire.IsInhibitRoll || finished)
                    {
                        resultWires.Add(wire);
                    }
                    else if (wire.TotalLength2D <= 1500)
                    {
                        summaryWires.Add(wire);
                        summaryLength += wire.TotalLength2D;
                    }
                    else
                    {
                        resultWires.Add(wire);
                    }
                }

                //末尾で巻き取りが残っていたらまとめる
                if (i == wires.Count - 1 && summaryWires.Count > 0)
                {
                    resultWires.Add(this.CombineMargedWires(summaryWires, false));
                    resultWires[resultWires.Count - 1].IsInhibitRoll = true;
                    finished = true;
                }
            }
            return(resultWires);
        }
        private List <Wire> DivideWirePerCeilingPanel(Wire wire)
        {
            var wires = new List <Wire>();

            //ロール長を計算し直すので初期化
            wire.RolledLengthParent = 0;
            wire.RolledLengthChild  = 0;
            wire.RolledWireParents  = new List <Wire>();
            wire.RolledWireChildren = new List <Wire>();

            //床下配線or天井設置なし配線は分割しない
            if (wire.IsNotInstalledCeiling || wire.IsUnderfloor)
            {
                return new List <Wire> {
                           wire
                }
            }
            ;

            var candidatePanels = this.CeilingPanels.FindAll(p => wire.IsOn(p));

            if (candidatePanels.Count == 0)
            {
                return new List <Wire> {
                           wire
                }
            }
            ;

            var startParam = AutoCad.Db.Curve.GetParameter(wire.ObjectId, wire.StartPoint);

            //ワイヤーとパネルの交点をまとめる。
            var crossPoints = new List <PointD>();

            //パネル同士がぴったり接している場合は同じ座標が交点に入るので削除する。
            foreach (var panel in candidatePanels)
            {
                var points = AutoCad.Db.Entity.GetIntersect2D(panel.ObjectId, wire.ObjectId);

                foreach (var point in points)
                {
                    if (crossPoints.Exists(p => p.X == point.X && p.Y == point.Y))
                    {
                        continue;
                    }

                    crossPoints.Add(point);
                }
            }

            //一枚のパネルで完結しているワイヤーはそのまま返す。
            if (crossPoints.Count == 0)
            {
                wire.CeilingPanel = candidatePanels[0];
                wires.Add(wire);
                return(wires);
            }

            var parameters = new List <double>();

            foreach (var point in crossPoints)
            {
                var parameter = AutoCad.Db.Curve.GetParameter(wire.ObjectId, point);

                parameters.Add(parameter);
            }

            //交点を配線の始点から近い順に並び変える。
            parameters.Sort((p, q) => p.CompareTo(q));

            var tempWireIds = new List <int>();

            //ここで、ワイヤーの長さを算出している。
            //作成した余計な線は必ず削除するよ!
            try
            {
                tempWireIds = AutoCad.Db.Polyline.GetSplitCurves(wire.ObjectId, parameters);
                var divideWires = new List <Wire>();

                foreach (var wireId in tempWireIds)
                {
                    var divideWire = new Wire(wireId, wire);
                    var panel      = candidatePanels.Find(p => divideWire.IsIn(p));
                    if (panel == null)
                    {
                        divideWire.CeilingPanel = null;
                    }
                    else
                    {
                        divideWire.CeilingPanel = panel;
                    }

                    divideWires.Add(divideWire);
                }
                wires.AddRange(divideWires);
            }
            finally
            {
                if (tempWireIds.Count != 0)
                {
                    tempWireIds.ForEach(p => AutoCad.Db.Polyline.Erase(p));
                }
            }

            return(wires);
        }
        public List <Wire> SummarizedWire(Symbol symbol, List <Wire> wires)
        {
            //階マタギの場合は別処理をする。
            wires = this.SummarizedWireAtDrop(symbol, wires);

            if (wires.Count <= 1)
            {
                return(wires);
            }

            //分電盤接続で、分電盤位置が1.5m以内で、巻き取られていない場合は子側に巻き取りをする
            if (symbol.Parent.IsBundenban && wires[0].RolledWireParents.Count == 0 && wires[0].TotalLength2D <= 1500)
            {
                //分電盤が上階の場合は×
                if (symbol.Parent.Floor <= symbol.Floor)
                {
                    wires = this.SummarizedWireForChildOnce(symbol, wires, 0);
                }
            }

            if (wires.Count <= 1)
            {
                return(wires);
            }

            //子側から処理する
            wires.Reverse();

            var     prevWire      = new Wire();
            var     resultWires   = new List <Wire>();
            var     summaryWires  = new List <Wire>();
            decimal summaryLength = 0;

            foreach (var wire in wires)
            {
                var wireIdx = wires.IndexOf(wire);

                //先頭かつJBなら対象外
                if (wireIdx == 0 && symbol.IsJointBox)
                {
                    resultWires.Add(wire);
                    continue;
                }

                //巻き取り済みがあるとき、継続可能かチェックする
                if (summaryWires.Count > 0)
                {
                    //子方向にロール済みの線に、継ぎ足すような足し方はだめ
                    if (wire.RolledWireChildren.Count > 0)
                    {
                        resultWires.Add(this.CombineMargedWires(summaryWires, true));
                        summaryWires  = new List <Wire>();
                        summaryLength = 0;
                    }
                    else
                    {
                        //ロール1回目は制限なし
                        if (summaryWires.Count == 1)
                        {
                            summaryWires.Add(wire);
                            summaryLength += wire.TotalLength2D;
                        }
                        //ロール二回目以降は、
                        //①ここまでの合計が1.5m以下 or
                        //②対象が1.5m以下かつ足したとき2m以下なら巻き取り
                        else
                        {
                            if (summaryLength <= 1500 || (wire.TotalLength2D <= 1500 && summaryLength + wire.TotalLength2D <= 2000))
                            {
                                summaryWires.Add(wire);
                                summaryLength += wire.TotalLength2D;
                            }
                            else
                            {
                                resultWires.Add(this.CombineMargedWires(summaryWires, true));
                                summaryWires  = new List <Wire>();
                                summaryLength = 0;
                            }
                        }
                    }
                }

                //巻き取りがないorクリアされていたら、1.5mチェック
                if (summaryWires.Count == 0)
                {
                    if (wire.IsInhibitRoll)
                    {
                        resultWires.Add(wire);
                    }
                    else if (wire.TotalLength2D <= 1500)
                    {
                        summaryWires.Add(wire);
                        summaryLength += wire.TotalLength2D;
                    }
                    else
                    {
                        resultWires.Add(wire);
                    }
                }

                //末尾で巻き取りが残っていたらまとめる
                if (wireIdx == wires.Count - 1 && summaryWires.Count > 0)
                {
                    resultWires.Add(this.CombineMargedWires(summaryWires, true));
                }
            }

            //配列順を戻す
            resultWires.Reverse();

            return(resultWires);
        }
        private List <Wire> SummarizeUnderCeilingWireSingle(List <Wire> wires)
        {
            if (!wires.Exists(p => !p.IsNotInstalledCeiling && !p.IsUnderfloor))
            {
                return(wires);
            }

            //先頭
            if (wires.Count <= 1)
            {
                return(wires);
            }

            var firstWire = wires[0];
            var nextWire  = wires[1];
            var rollWire  = new Wire();

            if (firstWire.IsAvoidCalculation || firstWire.IsNotInstalledCeiling)
            {
                //緑以外はパネル位置にロールする
                if (firstWire.IsAvoidCalculation)
                {
                    rollWire = null;
                }
                else
                {
                    rollWire = firstWire;
                }

                //マーキング位置のワイヤーが100mm以下のとき、次の線と結合(ロールしない)
                //次の線が無いか、パネル上に無い時は仕方無いので残す
                if (nextWire.Length2D <= Const.MARKING_SHOULD_ROLL_LENGTH)
                {
                    if (wires.Count >= 3)
                    {
                        if (!wires[2].IsAvoidCalculation && !wires[2].IsNotInstalledCeiling)
                        {
                            wires[2].Length2D += nextWire.TotalLength2D;
                            wires.Remove(nextWire);
                        }
                    }
                }

                //ロールしてもしなくても1本目は消す
                wires.Remove(firstWire);
                if (rollWire != null)
                {
                    wires[0].MarkingCeilingAllowLength += this.GetDropPointCeilingDepthLength(rollWire);
                    wires[0].RolledWireParents.Add(rollWire);
                    wires[0].RolledLengthParent += rollWire.TotalLength2D;
                }
            }

            //末尾
            if (wires.Count <= 1)
            {
                return(wires);
            }

            firstWire = wires[wires.Count - 1];
            nextWire  = wires[wires.Count - 2];
            rollWire  = new Wire();
            if (firstWire.IsAvoidCalculation || firstWire.IsNotInstalledCeiling)
            {
                //緑以外はパネル位置にロールする
                if (firstWire.IsAvoidCalculation)
                {
                    rollWire = null;
                }
                else
                {
                    rollWire = firstWire;
                }

                //マーキング位置のワイヤーが100mm以下のとき、次の線と結合(ロールしない)
                //次の線が無いか、パネル上に無い時は仕方無いので残す
                if (nextWire.Length2D <= Const.MARKING_SHOULD_ROLL_LENGTH)
                {
                    if (wires.Count >= 3)
                    {
                        if (!wires[wires.Count - 3].IsAvoidCalculation && !wires[wires.Count - 3].IsNotInstalledCeiling)
                        {
                            wires[wires.Count - 3].Length2D += nextWire.TotalLength2D;
                            wires.Remove(nextWire);
                        }
                    }
                }

                //ロールしてもしなくても1本目は消す
                wires.Remove(firstWire);
                if (rollWire != null)
                {
                    wires[wires.Count - 1].MarkingCeilingAllowLength += this.GetDropPointCeilingDepthLength(rollWire);
                    wires[wires.Count - 1].RolledWireChildren.Add(rollWire);
                    wires[wires.Count - 1].RolledLengthChild += rollWire.TotalLength2D;
                }
            }
            return(wires);
        }
        /// <summary>
        /// 配線の始点と終点が親側から並ぶように並び替える(子配線も含む)
        /// </summary>
        public Wire SetReplaseWireFlag(Symbol symbol, Wire targetWire)
        {
            var childWires = new List <Wire>();

            if (targetWire is RisingWire)
            {
                foreach (var wire in ((RisingWire)targetWire).Wires)
                {
                    childWires.Add(this.SetReplaseWireFlag(symbol, wire));
                }

                ((RisingWire)targetWire).Wires = childWires;
            }
            else if (targetWire is MarkingWire)
            {
                var markingWire = (MarkingWire)targetWire;
                var wires       = ((MarkingWire)targetWire).Wires; //インスタンスが分かれないように
                foreach (var wire in wires)
                {
                    if (markingWire.ChildMarking != null)
                    {
                        if (wire.IsConnected(markingWire.ChildMarking))
                        {
                            //子側
                            if (wire.IsConnected(symbol))
                            {
                                if (symbol.Contains(wire.StartPoint))
                                {
                                    wire.IsReversedWirePoint = true;
                                }
                            }
                            //中間or親側
                            else
                            {
                                if (markingWire.ChildMarking.Contains(wire.StartPoint))
                                {
                                    wire.IsReversedWirePoint = true;
                                }
                            }
                        }
                        else
                        {
                            //子マーキングと接触なしなら親マーキングがあるはず
                            if (markingWire.ParentMarking == null)
                            {
                                throw new ApplicationException("マーキング配線が異常です。");
                            }

                            if (markingWire.ParentMarking.Contains(wire.StartPoint))
                            {
                                wire.IsReversedWirePoint = true;
                            }
                        }
                    }
                    //親⇒arrowのときは子マーキングが無いので
                    else if (markingWire.ParentMarking != null)
                    {
                        if (wire.IsConnected(markingWire.ParentMarking))
                        {
                            //親側
                            if (wire.IsConnected(symbol.Parent))
                            {
                                if (symbol.Contains(wire.EndPoint))
                                {
                                    wire.IsReversedWirePoint = true;
                                }
                            }
                            //中間or子側
                            else
                            {
                                if (markingWire.ParentMarking.Contains(wire.EndPoint))
                                {
                                    wire.IsReversedWirePoint = true;
                                }
                            }
                        }
                        //else
                        //{
                        //    //親マーキングと接触なしなら子マーキングがあるはず
                        //    if (markingWire.ChildMarking == null)
                        //        throw new ApplicationException("マーキング配線が異常です。");

                        //    if (markingWire.ChildMarking.Contains(wire.EndPoint))
                        //        wire.IsReversedWirePoint = true;
                        //}
                    }
                    childWires.Add(wire);
                }
                ((MarkingWire)targetWire).Wires = childWires;
            }
            else
            {
                if ((symbol.Contains(targetWire.StartPoint) && symbol.Floor == targetWire.Floor) ||
                    (symbol.Parent.Contains(targetWire.EndPoint) && symbol.Parent.Floor == targetWire.Floor))
                {
                    targetWire.IsReversedWirePoint = true;
                }
            }
            return(targetWire);
        }
        //DLtoDL
        public List <Wire> SummarizedWireDLtoDL(Symbol symbol, List <Wire> dividedWires)
        {
            List <Wire> resultWires = new List <Wire>();

            if (dividedWires.Count <= 1)
            {
                return(dividedWires);
            }

            //基点のワイヤーを探す
            var baseWires = dividedWires.FindAll(p => p.TotalLength2D > 1500 && p.CeilingPanel != null);

            if (baseWires.Count == 0)
            {
                Decimal maxLength = 0;
                Wire    baseWire  = new Wire();
                foreach (var wk in dividedWires)
                {
                    if (wk.CeilingPanel == null)
                    {
                        continue;
                    }

                    if (maxLength < wk.TotalLength2D)
                    {
                        maxLength = wk.TotalLength2D;
                        baseWire  = wk;
                    }
                }
                baseWires.Add(baseWire);
            }

            List <int> removeIdxes = new List <int>();

            //基点の両端をチェックして、1.5m以下の線を巻き取る
            foreach (var baseWire in baseWires)
            {
                var parentIdx = dividedWires.IndexOf(baseWire);
                //順方向
                for (var i = parentIdx + 1; i < dividedWires.Count; i++)
                {
                    if (dividedWires[i].CeilingPanel == null)
                    {
                        continue;
                    }

                    if (dividedWires[i].TotalLength2D <= 1500)
                    {
                        dividedWires[parentIdx].RolledLengthChild += dividedWires[i].TotalLength2D;
                        dividedWires[parentIdx].RolledWireChildren.Add(dividedWires[i]);
                        removeIdxes.Add(i);

                        if (i + 1 == dividedWires.Count)
                        {
                            symbol.CeilingPanel = dividedWires[parentIdx].CeilingPanel;
                        }
                    }
                    else
                    {
                        break; //対象外にぶつかったら終了
                    }
                }

                //逆方向
                for (var i = parentIdx - 1; i >= 0; i--)
                {
                    if (dividedWires[i].CeilingPanel == null)
                    {
                        continue;
                    }

                    if (dividedWires[i].TotalLength2D <= 1500)
                    {
                        dividedWires[parentIdx].RolledLengthParent += dividedWires[i].TotalLength2D;
                        dividedWires[parentIdx].RolledWireParents.Add(dividedWires[i]);
                        removeIdxes.Add(i);

                        if (i == 0)
                        {
                            symbol.Parent.CeilingPanel = dividedWires[parentIdx].CeilingPanel;
                        }
                    }
                    else
                    {
                        break; //対象外にぶつかったら終了
                    }
                }
                //巻き取りが発生していたら配列を変更してやり直し
                if (removeIdxes.Count > 0)
                {
                    removeIdxes.Sort();
                    removeIdxes.Reverse();
                    foreach (var idx in removeIdxes)
                    {
                        dividedWires.RemoveAt(idx);
                    }

                    resultWires = this.SummarizedWireDLtoDL(symbol, dividedWires);
                    break;
                }
            }
            resultWires = dividedWires;
            return(resultWires);
        }
Example #8
0
        //RisingWireを上階と下階に分ける
        public static void SplitRisingWire(Symbol symbol, out Symbol upperSymbol, out Symbol underSymbol, out Wire upperWire, out Wire underWire)
        {
            var wires = ((RisingWire)symbol.Wire).Wires;

            upperWire = null;
            underWire = null;

            if (symbol.Floor > symbol.Parent.Floor)
            {
                upperSymbol = symbol;
                underSymbol = symbol.Parent;
            }
            else
            {
                upperSymbol = symbol.Parent;
                underSymbol = symbol;
            }

            foreach (var wire in wires)
            {
                if (wire.IsConnected(upperSymbol))
                {
                    upperWire = wire;
                }
                else if (wire.IsConnected(underSymbol))
                {
                    underWire = wire;
                }
            }
            if (upperWire == null || underWire == null)
            {
                throw new ApplicationException("ワイヤーの両端が見つけられませんでした。");
            }
        }
 public WireInfoPanel(Wire wire, RisingWire risingWire) : this(wire)
 {
     this.titleValueLabel.Text = "Link to [" + risingWire.FloorLinkCode + "]";
 }