예제 #1
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);
        }
예제 #2
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);
        }