Пример #1
0
        public object Clone()
        {
            LightingRoom roomClone = new LightingRoom()
            {
                Side         = Side,
                IndexesTop   = IndexesTop == null ? null: (List <LightingWindow>)IndexesTop.Clone(),
                IndexesBot   = IndexesBot == null ? null : (List <LightingWindow>)IndexesBot.Clone(),
                SideIndexTop = SideIndexTop == null ? null : (LightingWindow)SideIndexTop.Clone(),
                SideIndexBot = SideIndexBot == null ? null : (LightingWindow)SideIndexBot.Clone()
            };

            return(roomClone);
        }
Пример #2
0
        public static LightingRoom GetLightings(RoomInfo room, bool isCorner)
        {
            LightingRoom lightRoomRes;
            string       key = room.Type + "_" + room.LightingTop + "_" + room.LightingNiz;

            if (!dictLightings.TryGetValue(key, out lightRoomRes))
            {
                lightRoomRes = new LightingRoom();
                roomNumber   = 0;

                LightingWindow sideLightings;
                Side           side      = Side.None;
                Side           sideOther = Side.None;

                if (room.SelectedIndexTop != 0)
                {
                    lightRoomRes.IndexesTop   = GetLightingsOneSideRooms(room.LightingTop, true, out sideLightings, out side);
                    lightRoomRes.SideIndexTop = sideLightings;
                }

                if (room.SelectedIndexBottom != 0)
                {
                    lightRoomRes.IndexesBot   = GetLightingsOneSideRooms(room.LightingNiz, false, out sideLightings, out sideOther);
                    lightRoomRes.SideIndexBot = sideLightings;
                }

                if (side != Side.None && sideOther != Side.None && side != sideOther)
                {
                    throw new Exception("Ошибка. У квартиры сотора верхней боковой инсоляции не совпадает со стороной нижней боковой инсоляции.");
                }
                lightRoomRes.Side = side != Side.None ? side : sideOther;

                dictLightings.Add(key, lightRoomRes);
            }
            lightRoomRes = (LightingRoom)lightRoomRes.Clone();
            return(lightRoomRes);
        }
Пример #3
0
        /// <summary>
        /// Проверка инсоляции верхних квартир
        /// </summary>
        private bool CheckSideFlats()
        {
            int step = isTop ? 0 : indexBot;

            for (int i = 0; i < curSideFlats.Count; i++)
            {
                flat = curSideFlats[i];

                string   keyInsFlat = GetKey(step);
                RoomInfo insFlatValue;
                if (!dictInsFlats.TryGetValue(keyInsFlat, out insFlatValue))
                {
                    curFlatIndex = i;
                    bool flatPassed        = true;
                    bool isFirstFlatInSide = IsEndFirstFlatInSide();
                    bool isLastFlatInSide  = IsEndLastFlatInSide();

                    if (flat.SubZone == "0")
                    {
                        // прыжок на ширину ЛЛУ без 1 шага (уходит внутрь угла и не занимает шаг секции)
                        step += flat.SelectedIndexTop;
                        continue;
                    }

                    LightingRoom roomLighting = null;

                    // Ошибка, если у квартиры снизу есть верхняя инсоляция
                    if (!isTop && flat.SelectedIndexTop != 0)
                    {
                        flatPassed = false;
                    }
                    else
                    {
                        roomLighting = LightingRoomParser.GetLightings(flat, true);
                        // Ошибка, если у не торцевой квартиры будет боковая инсоляция
                        if (!isFirstFlatInSide && !isLastFlatInSide &&
                            (roomLighting.SideIndexTop != null || roomLighting.SideIndexBot != null))
                        {
                            flatPassed = false;
                        }
                    }

                    if (flatPassed)
                    {
                        var ruleInsFlat = insService.FindRule(flat);
                        if (ruleInsFlat == null)
                        {
                            // Атас, квартира не ЛЛУ, но без правил инсоляции
                            throw new Exception("Не определено правило инсоляции для квартиры - " + flat.Type);
                        }

                        // Запись значений инсоляции в квартире
                        string[] insBotCur;
                        if (isFirstFlatInSide)
                        {
                            insBotCur = isTop? insBotReverse : insBot;
                        }
                        else
                        {
                            if (isTop)
                            {
                                insBotCur = insBot;
                                indexBot  = flat.SelectedIndexBottom > 0? flat.SelectedIndexBottom: 0;
                            }
                            else
                            {
                                insBotCur = insBot;
                            }
                        }
                        int stepTop;
                        int stepBot;
                        if (isTop)
                        {
                            stepTop = step;
                            stepBot = 0;
                        }
                        else
                        {
                            stepTop = 0;
                            stepBot = step;
                        }
                        roomLighting.FillIns(stepTop, stepBot, insTop, insBotCur, insSideLeftBot, insSideLeftTop, insSideRightBot, insSideRightTop);

                        // Проверка на затык бокового окна (если есть)
                        flatPassed = false;
                        if (CheckFlatSideStopper(isFirstFlatInSide, isLastFlatInSide, roomLighting))
                        {
                            foreach (var rule in ruleInsFlat.Rules)
                            {
                                if (roomLighting.CheckInsRule(rule))
                                {
                                    flatPassed = true;
                                    break;
                                }
                            }
                        }
                    }
                    // Для тесовой визуализации
                    flat.IsInsPassed = flatPassed;

                    // Определение торца квартиры
                    DefineJoint(ref flat, isFirstFlatInSide, isLastFlatInSide, isTop);
                }
                else
                {
                    flat.IsInsPassed = insFlatValue.IsInsPassed;
                    flat.Joint       = insFlatValue.Joint;
                }
#if !TEST
                // Если квартира не прошла инсоляцию - вся секция не прошла
                if (!flat.IsInsPassed)
                {
                    return(false);
                }
#endif
                step += isTop ? flat.SelectedIndexTop : flat.SelectedIndexBottom;
            }
            return(true);
        }
Пример #4
0
        /// <summary>
        /// Проверка - затыкается ли квартира торцом (боковое окна выходит на торец другой секции)
        /// </summary>
        protected bool CheckFlatSideStopper(bool isFirstFlatInSide, bool isLastFlatInSide, LightingRoom roomLighting)
        {
            // Если это не боковая квартра по типу (не заданы боковые индексы инсоляции), то у такой квартиры не нужно проверять боковую инсоляцию
            bool flatHasSide = (roomLighting.Side != Side.None);

            if (!flatHasSide)
            {
                return(true);
            }

            // Квартира боковая по типу (заданы боковые индексы инсоляции)

            // Если это не крайняя квартира на стороне, то такую секцию нельзя пропускать дальше
            if (!isFirstFlatInSide && !isLastFlatInSide)
            {
                return(false);
            }

            bool isStoppor = IsStoppor(roomLighting.SideIndexTop, roomLighting.SideIndexBot);

            var endFlat        = roomLighting.Side;
            var endSideSection = GetSectionEndSide();

            if (endFlat != endSideSection && isStoppor)
            {
                return(false);
            }

            return(true);
        }
Пример #5
0
        private bool CheckCellIns(int startStep = 0)
        {
            int step = startStep;

            for (int i = 0; i < curSideFlats.Count; i++)
            {
                flat = curSideFlats[i];

                string   keyInsFlat = GetKey(step);
                RoomInfo insFlatValue;
                if (!dictInsFlats.TryGetValue(keyInsFlat, out insFlatValue))
                {
                    curFlatIndex = i;
                    bool flatPassed = true;
                    isFirstFlatInSide = IsEndFirstFlatInSide();
                    isLastFlatInSide  = IsEndLastFlatInSide();

                    if (flat.SubZone != "0")
                    {
                        LightingRoom lightingRoom = null;
                        // Ошибка, если у квартиры снизу есть верхняя инсоляция
                        if (!isTop && flat.SelectedIndexTop != 0)
                        {
                            flatPassed = false;
                        }
                        else
                        {
                            lightingRoom = LightingRoomParser.GetLightings(flat, false);
                            // Ошибка, если у не торцевой квартиры будет боковая инсоляция
                            if (!isFirstFlatInSide && !isLastFlatInSide &&
                                (lightingRoom.SideIndexTop != null || lightingRoom.SideIndexBot != null))
                            {
                                flatPassed = false;
                            }
                        }

                        if (flatPassed)
                        {
                            var ruleInsFlat = insService.FindRule(flat);
                            if (ruleInsFlat == null)
                            {
                                // Атас, квартира не ЛЛУ, но без правил инсоляции
                                throw new Exception("Не определено правило инсоляции для квартиры - " + flat.Type);
                            }

                            // Запись значений инсоляции в квартире
                            int      stepTop       = 0;
                            int      stepBot       = 0;
                            string[] insBotCurFlat = null;
                            if (isTop)
                            {
                                stepTop = step;
                                if (isFirstFlatInSide)
                                {
                                    insBotCurFlat = insBotSide;
                                }
                                else if (isLastFlatInSide)
                                {
                                    insBotCurFlat = insBotSide.Reverse().ToArray();
                                }
                            }
                            else
                            {
                                insBotCurFlat = insBotSide;
                                stepTop       = 0;
                                stepBot       = step;
                            }
                            lightingRoom.FillIns(stepTop, stepBot, insTopSide, insBotCurFlat,
                                                 insSideLeftBot, insSideLeftTop, insSideRightBot, insSideRightTop);

                            // Проверка на затык бокового окна (если есть)
                            flatPassed = false;
                            if (CheckFlatSideStopper(isFirstFlatInSide, isLastFlatInSide, lightingRoom))
                            {
                                foreach (var rule in ruleInsFlat.Rules)
                                {
                                    if (lightingRoom.CheckInsRule(rule))
                                    {
                                        flatPassed = true;
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    flat.IsInsPassed = flatPassed;

                    // Определение торца квартиры
                    DefineJoint(ref flat, isFirstFlatInSide, isLastFlatInSide, isTop);

                    dictInsFlats.Add(keyInsFlat, flat);
                }
                else
                {
                    flat.IsInsPassed = insFlatValue.IsInsPassed;
                    flat.Joint       = insFlatValue.Joint;
                }
#if !TEST
                // Если квартира не прошла инсоляцию - вся секция не прошла
                if (!flat.IsInsPassed)
                {
                    return(false);
                }
#endif
                // Сдвиг шага
                step += isTop ? flat.SelectedIndexTop : flat.SelectedIndexBottom;
            }
            // Все квартиры прошли инсоляцию
            return(true);
        }