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