예제 #1
0
        private static void AddSideLightingValue(string lightingString, ref LightingWindow sideLighting,
                                                 ref int iLightingString)
        {
            // индекс стороны
            int indexSide = GetSideIndex(ref iLightingString, lightingString);
            int number    = isLeaf ? roomNumber : 0;

            sideLighting = new LightingWindow(indexSide, number);
        }
예제 #2
0
 private bool IsStoppor(LightingWindow lightingSideTop, LightingWindow lightingSideBot)
 {
     // Если боковое окно единственное в помещени, то такую квартиру нельзя ставить в глухой торец (без окна с торца на улицу)
     // Если сторона квартиры не соответствует стороне торца, такую секцию нельзя пропускать дальше
     // Только если индекс боковины не половинчатый - если не половинчатый, то боковое окно - будет заткнуто торцом и в комнате не останется окон
     if ((lightingSideTop != null && lightingSideTop.RoomNumber == 0) ||
         (lightingSideBot != null && lightingSideBot.RoomNumber == 0))
     {
         // Одно из боковых окон единственное в помещении - оно затыкается торцом
         return(true);
     }
     return(false);
 }
예제 #3
0
        private static List <LightingWindow> GetLightingsOneSideRooms(string lightingString, bool isTop,
                                                                      out LightingWindow sideLighting, out Side side)
        {
            sideLighting = null;
            List <LightingWindow> lightingsRes = new List <LightingWindow>();

            side = Side.None;

            if (string.IsNullOrEmpty(lightingString))
            {
                return(lightingsRes);
            }

            isRange    = false;
            isLeaf     = false;
            prevIsSide = false;

            for (int i = 0; i < lightingString.Length; i++)
            {
                char item = lightingString[i];
                if (char.IsDigit(item))
                {
                    prevIsSide = false;
                    AddLightingValue((int)char.GetNumericValue(item), lightingsRes);
                    continue;
                }

                if (item == 'B')
                {
                    // Боковая освещенность
                    AddSideLightingValue(lightingString, ref sideLighting, ref i);
                    prevIsSide = true;
                    continue;
                }

                isRange = false;
                isLeaf  = false;

                if (item == '-')
                {
                    isRange = true;
                    continue;
                }

                if (item == '|')
                {
                    roomNumber++;
                    isLeaf = true;
                    // изменение знака предыдущего индекса
                    if (prevIsSide)
                    {
                        sideLighting.RoomNumber = roomNumber;
                    }
                    else
                    {
                        var roomLight = lightingsRes.Last();
                        roomLight.RoomNumber = roomNumber;
                    }
                    continue;
                }
            }
            // Определение стороны по боковой инсоляции
            if (sideLighting != null)
            {
                // освещенность заканчивается боковой инсоляцией
                if (prevIsSide)
                {
                    // Верх - левая сторона: Низ - правая строна
                    side = isTop ? Side.Left : Side.Right;
                }
                else
                {
                    // Освещенность заканчивается обычными рядовым шагом, значит начиналась с боковой
                    // Верх - правая сторона : Низ - левая строна
                    side = isTop ? Side.Right : Side.Left;
                }
            }

            return(lightingsRes);
        }