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