ReaScripts (скрипты для Reaper) - Учимся создавать!!!

Тема в разделе "Reaper", создана пользователем Archchie, 29 дек 2017.

  1. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Ребята, есть ли возможность (при поможи какой-то функции) как-то остановить или выйти из defer()?
     
  2. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    @Rsay, условие выхода написать.
     
  3. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, можете пожалуйста пример кода показать? я не понимаю по какой команде он завершается....

    Методом тыка пока дошел до такого, но пока рано не все гладко:
    У меня есть графический интерфейс - СКРИПТ, который reaper.defer(СКРИПТ) крутит по кругу и по нажатию на ESC запускается gfx.quit() и reaper.atexit(СКРИПТ)... Окно закрывается. но скрипт продолжает выполнятся...
     
  4. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    775
    Симпатии:
    1.178
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Код:
    if gfx.getchar() >= 0 and gfx.getchar() ~= 27 then reaper.defer(СКРИПТ) else reaper.atexit(gfx.quit) end 
     
    Aleksandr Oleynik нравится это.
  5. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    253
    Симпатии:
    58
    Пол:
    Мужской
    Подскажите есть ли возможность заставить defer() работать медленнее ?
    Например: Отработал defer один цикл ,подождал 1 или 2 сек. пошёл на второй круг и т.д.
    Ну и не только дефер
    Есть ли в API что то типа экшена Action: Wait 1 second before next action так как экшен в скрипте не работает
     
    Последнее редактирование: 17 апр 2018
  6. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
  7. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    253
    Симпатии:
    58
    Пол:
    Мужской
  8. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Archchie, как вариант
    forum.cockos.com/archive/index.php/t-168270.html
    но было бы неплохо узнать есть ли удобнее)
     
    Archchie нравится это.
  9. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    253
    Симпатии:
    58
    Пол:
    Мужской
    @Rsay, Спасибо!
     
  10. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    Чуть позже напишу... на iPadе пока
     
  11. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    PHP:
    defer_rate 1

    cycle 
    0
    function mainloop ()
      
    cycle cycle+1
      
    if cycle == defer_rate then
        main
    ()
        
    cycle 0
      end

      
    if TEST_Env then
        char 
    gfx.getchar()
        if 
    char~=-1 then reaper.defer(mainloopend --defer
        gfx
    .update() -- Update gfx window
      
    else
        
    reaper.defer(mainloop)
      
    end
    end
     
    Archchie нравится это.
  12. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    Это вырванно из скрипта и не есть универсальной функцией, но смысл понятен -
    Дефер запускает по циклу промежуточную функцию - счетчик, и можно, задавая defer_rate, менять скорость перезапуска функции main()
     
  13. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Спасибо, @@Michael, только он (дефер) все равно работает вроде...
    Я поставил консоль для теста: оно закрывается, а в консоли продолжают изменятся значения, даже если закрыть проект и открыть новый
     
    Последнее редактирование: 23 апр 2018
  14. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Ребята, а можно как-то удалить точку автоматизации ссылаясь на ее номер?
    И еще как можно функционально узнать в каких единицах измеряется данный трек автоматизации (к примеру верхняя и нижняя точки)
     
    Последнее редактирование: 24 апр 2018
  15. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    Можно.
    Узнать её time и удалить по PointRange.
    А оно всегда от 0 до 1, на сколько помню.
     
  16. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, ну это по времени, это я умею.. Мне нужно по номеру))

    Про автоматизацию, то я немного поколупался, нашел как узнать крайние значения и уже думал, что сделал то, что нужно, но набрел на кучу подводных камней, которые сложно контролировать:
    Там есть много вариантов от 0 до 1 это наверное только стандартные, а ля громкость и тп... И при том что соотношение редактируемых параметров другое: громкость в дБ, от бесконечности до 0 (смотря как в настройках), панораме тоже заморочки от 100Л до 100Р, и это все в коде регулируется от 0 до 1... Единственное что мьютирование легко реализируется=))

    В РеаконтролМИДИ уже другая систем - либо в тисячах либо как велосити от 0 до 127 (если в настройках РеаконтролМиди поменять), а если не поменять то будет тысячами как питч (из того же РеаконтролМиди)...

    Внешние плагины в зависимости от параметра автоматизируемой ручки
    Одним словом жуть...
     
  17. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    @Rsay, берете номер точки, узнаёте её время и дальше по времени.
     
  18. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Привет, ребята! Можно как-то отследить уровень дБ на аудио айтеме?
    Задача удалить хвост (только хвост) когда он нижу определенного уровня (к примеру -24 дБ)
    Стандартный удалятель тишины не сильно подходит, т.к. он показывает оно, да и еще некоторые штучки есть
     
  19. x.com

    x.com И это тоже не я :)

    Регистрация:
    13 авг 2007
    Сообщения:
    919
    Симпатии:
    223
    Пол:
    Мужской
    Адрес:
    Приморский Край
    @Rsay, Первое что пришло в голову fade-in, fade-out. Когда приходит "ОНО", со своими ШТУЧКАМИ, я НИЖУ плинтуса сразу, трешхолдит не по децки (минус 24 дБ минимум).
     
  20. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    Можно, но задачка не из тривиальных.
    Женя мне делал Функцию, которая складывала точки в которых уровень сигнала в айтеме ниже заданного и выше заданного.
    Очень не просто её даже вычленить из моего скрипта для другой задачи.

    А так то -
    GetMediaItemTake_Peaks
    а дальше - мрак

    Вот часть кода формирующего таблицы -
    PHP:
    attThresh_dB = -65  -- уровень Wav кривой выше которого скрипт включает Fx OnOff
    relThresh_dB 
    = -60  -- уровень Wav кривой ниже которого скрипт выключает Fx OnOff

    function GetAudioItemTrigPoints(item)
      
    local take reaper.GetActiveTake(item)
      
    take reaper.GetActiveTake(item)
      if 
    not take then return {}   -- пока пустая таблица
      
    elseif reaper.TakeIsMIDI(takethen return GetMIDIItemTrigPoints(itemtake)
      
    end
      local item_start 
    reaper.GetMediaItemInfo_Value(item"D_POSITION")
      
    local item_len reaper.GetMediaItemInfo_Value(item"D_LENGTH")
      ------------------
      
    local starttimen_chansn_splswant_extra_typebufretval
      n_chans 
    1         -- GetPeaks only 1 channel now!!!
      
    n_spls math.ceil(item_len*peakrate) -- Noteits Peak Samples!
      
    want_extra_type -- get minmaxno spectral
      buf 
    reaper.new_array(n_spls n_chans 2) -- maxminonly for 1 channel
      buf
    .clear()         -- Clear buffer
      retval 
    reaper.GetMediaItemTake_Peaks(takepeakrateitem_startn_chansn_splswant_extra_typebuf)
      ------------------
      
    local attThresh  10^(attThresh_dB/20)
      
    local relThresh  10^(relThresh_dB/20)
      
    local trig_points = {}
      
    local last_trig false
      
    for 1n_spls do
        
    local max_peak math.max(math.abs(buf[i]), math.abs(buf[i+n_spls]))
        if 
    not last_trig and max_peak >= attThresh then
          trig_points
    [#trig_points+1] = {item_start + (i-1)/peakrate, true}; last_trig = true
        
    elseif last_trig and max_peak relThresh then
          trig_points
    [#trig_points+1] = {item_start + (i-1)/peakrate, false}; last_trig = false
        
    end
      end
      
    ------------------
      if 
    #trig_points > 0 then
        
    if trig_points[1][2] ~= false then  -- Start всегда falseначало айтема
          table
    .insert(trig_points1, {item_startfalse})
        
    end
        
    if trig_points[#trig_points][2] ~= false then  -- End всегда false, конец айтема
          
    table.insert(trig_points, {item_start item_lenfalse})
        
    end
      end
      
    ------------------
      return 
    trig_points
    end

    local items_trig 
    = {} -- Таблица тригточек для айтемов
      local item_cnt 
    reaper.CountTrackMediaItems(track)
      for 
    1item_cnt do
        
    local item reaper.GetTrackMediaItem(tracki-1)
        
    items_trig[i] = GetAudioItemTrigPoints(item)
      
    end

     
    Последнее редактирование: 4 май 2018
  21. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    311
    Симпатии:
    87
    Адрес:
    Spb
    Подскажите пожалуйста как создать код что бы железно было без анду точки? Потому когда настройки такие

    [​IMG]

    он создает кучу точек. Код сделал как учили, но чего то не помогает
    Код стоит на клике мышкой

    Код:
    function click()
    reaper.PreventUIRefresh(1)
    
    reaper.Main_OnCommand(40635, 0) ---Time selection: Remove time selection
    
    reaper.Main_OnCommand(reaper.NamedCommandLookup('_SWS_UNSELALL'), 0) ----SWS: Unselect all items/tracks/env points
    
    
    reaper.Main_OnCommand(40513, 0)--View: Move edit cursor to mouse cursor
    
    reaper.PreventUIRefresh(-1)
    
    end
    
    reaper.defer(click)
     
  22. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    253
    Симпатии:
    58
    Пол:
    Мужской
    @incubator,
    С одной Undo точкой
    PHP:
    function click()

        
    reaper.Undo_BeginBlock()
        
    reaper.PreventUIRefresh(1)

        
    reaper.Main_OnCommand(406350) ---Time selectionRemove time selection

        reaper
    .Main_OnCommand(reaper.NamedCommandLookup('_SWS_UNSELALL'), 0) ----SWSUnselect all items/tracks/env points

        reaper
    .Main_OnCommand(405130)--ViewMove edit cursor to mouse cursor

        reaper
    .PreventUIRefresh(-1)
        
    reaper.Undo_EndBlock("name_script",1)

    end
    click
    ()


    Без Undo точек: / Deselect All 'move play cursor under mouse cursor[no undo]
    PHP:


        
    -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------


        
    reaper.GetSet_LoopTimeRange1000)

        
    local windowsegmentdetails reaper.BR_GetMouseCursorContext()
        
    local mouse reaper.BR_GetMouseCursorContext_Position()
        if 
    mouse 0 then
            reaper
    .SetEditCurPosmouse 0)
        
    end

        local count_track 
    reaper.CountTracks()
        if 
    count_track == 0 then
             no_undo
    ()
           return
        
    end


        reaper
    .PreventUIRefresh(1)

        for 
    1,count_track do

            
    local tr reaper.GetTrack(0,i-1)
            
    reaper.SetTrackSelectedtr)
      
            
    local count_tr_item reaper.CountTrackMediaItemstr )
            for 
    i2 1,count_tr_item do
                
    local tr_item reaper.GetTrackMediaItemtri2-)
                
    reaper.SetMediaItemSelectedtr_item)
            
    end
            local count_track_env 
    =  reaper.CountTrackEnvelopestr )
            for 
    i2 1,count_track_env do
                
    local track_env reaper.GetTrackEnvelopetr i2-)
                
    local count_Env_Point reaper.CountEnvelopePointstrack_env )
                for 
    i3 1,count_Env_Point do
                    
    reaper.SetEnvelopePointtrack_envi3-1____0)
                
    end
                local count_automat_item 
    reaper.CountAutomationItemstrack_env )
                for 
    i3 1,count_automat_item do
                    
    reaper.GetSetAutomationItemInfotrack_envi3-1'D_UISEL'0)
                
    end
            end
        end

        reaper
    .PreventUIRefresh(-1)
        
    reaper.UpdateArrange()
        
    no_undo()

     
    Последнее редактирование: 10 май 2018
  23. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, спасибо, да, код еще тот=)) Попробую тогда обойти чем-то....
     
  24. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    Как можно обойти? Вам по сути нужен Гейт!
     
  25. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, пришлось научится удалять лишнее в хвоте с помощью удалятеля тишины, но это пока так себе вариант, не во всех случаях что мне надо работает, да и окно выскакивает и настройки менять не особо можно
     
  26. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    311
    Симпатии:
    87
    Адрес:
    Spb
    @Archchie, Спасибо большое всегда помогаете мне!
     
  27. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    253
    Симпатии:
    58
    Пол:
    Мужской
    Нарисовал вот такую кнопочку:
    PHP:
        local function msg(param);reaper.ShowConsoleMsg(param.."\n")end   -- msg('test')
        --------------------------------------------------------------------------------



            
    xOut yOut reaper.GetMousePosition()  xOut yOut xOut-230yOut-125                      
            header 
    = [=[test test test]=]
            
    gfx.clear 4210752
            gfx
    .init(header,350 105,0,xOutyOut  )
            ---

        function 
    main(numb)

            
    gfx.setfont(1,"Verdana",15,117) --установить Шрифты
            gfx
    .set(0,0.75,0.75,1) -- r,g,b,aустанавливаем цветкоторым будем рисовать info
            gfx
    .xgfx.2518 -- устgfx.xgfx.yстроки рисуются отталкиваясь от этих координат!
            
    gfx.drawstr([=[NO SELECTED MEDIA ITEM in TIME SELECTION !]=])
            
    gfx.setfont(1,"Verdana",15,105) --установить Шрифты
            gfx
    .xgfx.10040
            gfx
    .drawstr([=[Select an item in time selection ]=])  
            ---

            
    local button numb -- = 0  

            gfx
    .set(0.4,0.4,0.4,1) -- r,g,b,aустанавливаем цветкоторым будем рисовать info        
            gfx
    .roundrect(11565100304)--Рисует прямоугольник с закругленными углами.
      
            if 
    button == 1 then        
                gfx
    .gradrect(117,67,97,270.2,0.2,0.2,1)--Заполняет прямоугольник градиента указанным цветом и альфой(x,y,w,hr,g,b,a)
            elseif 
    button == 0 then
                gfx
    .gradrect(117,67,97,270.3,0.3,0.3,1)--Заполняет прямоугольник градиента указанным цветом и альфой(x,y,w,hr,g,b,a)
            
    end
      

            gfx
    .line(213,93,117,67 )
            
    gfx.line(213,67,117,93 )
            
    gfx.roundrect(1196992224)----Рисует прямоугольник с закругленными углами.
      
            if 
    button == 1 then
                gfx
    .gradrect(119,69,92,220.5,0.5,0.5,1)--Заполняет прямоугольник градиента указанным цветом и альфой(x,y,w,hr,g,b,a)
            elseif 
    button == 0 then
                gfx
    .gradrect(119,69,92,220.4,0.4,0.4,1)--Заполняет прямоугольник градиента указанным цветом и альфой(x,y,w,hr,g,b,a)
            
    end
            
    ---
      
            
    gfx.xgfx.15671 -- устgfx.xgfx.yстроки рисуются отталкиваясь от этих координат!
            
    x,gfx.xgfx.y--устgfx.xgfx.y,строки рисуются отталкиваясь от этих координат!
            
    gfx.setfont(1,"Verdana",18,105) --установить Шрифты
      
            
    if button == 1 then
                gfx
    .set(0000.3)-- r,g,b,aустанавливаем цветкоторым будем рисовать info
            
    elseif button == 0 then
                gfx
    .set(0000.7)-- r,g,b,aустанавливаем цветкоторым будем рисовать info
            end
            
    for 1do
              
    gfx.xgfx.iy-i
              gfx
    .drawstr("OK")
            
    end
      
            gfx
    .set(0.8,0.8,0.8,0.9) -- r,g,b,aустанавливаем цветкоторым будем рисовать info
            gfx
    .xgfx.x,y
            gfx
    .drawstr("OK")

        
    end
        
    ---


        ----------------
        function 
    Mouse_Is_Inside(xywh) --мышь находится внутри
            local mouse_x
    mouse_y gfx.mouse_xgfx.mouse_y
            local inside 
    =
            
    mouse_x >= and mouse_x < (w) and
            
    mouse_y >= and mouse_y < (h)
            return 
    inside
        end
        
    -----------------



        function 
    loop()

            -- If 
    the left button is down
            
    if gfx.mouse_cap&== 1  then
                
    -- If the cursor is inside the rectangle AND the button wasn't down before
                if Mouse_Is_Inside(117,70,98,23) and not mouse_btn_down then
                    main(1)
                    mouse_btn_down = true
                    state = 1
                end
            -- If the left button is up
            else
                main(0)
                mouse_btn_down = false
            end
      
            if gfx.mouse_cap&1 == 0 and  Mouse_Is_Inside(117,70,98,23) and state == 1 then gfx.quit() end
            if not Mouse_Is_Inside(117,70,98,23) then state = 0 end
            if gfx.getchar() >= 0 then reaper.defer(loop)else reaper.atexit(gfx.quit) end
            gfx.update()
      
        end

        loop()
    И подскажите пожалуйста как заставить её взаимодействовать со скриптом ? Что бы она работала как функция reaper.MB('','',0)
    например: вот на таком примере
    PHP:
        local STOP_Script;
        
    local function example()
      
            
    local start_Loop End_Loop reaper.GetSet_LoopTimeRange0000)
            if 
    start_Loop ~= End_Loop then

                local count_item 
    reaper.CountSelectedMediaItems)
                for 
    1,count_item do
                    
    local item reaper.GetSelectedMediaItem0i-)
                    
    local position reaper.GetMediaItemInfo_Valueitem'D_POSITION' )
                    
    local length reaper.GetMediaItemInfo_Valueitem'D_LENGTH' )
                    
    local item_end position length
                    
    if position End_Loop and item_end start_Loop then
                        LoopTime_sel_item 
    1
                      
    break
                    
    end
                end
                
    if not LoopTime_sel_item then
                    local MB 
    reaper.MB([=[  NO SELECTED MEDIA ITEM in TIME SELECTION !
      
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                            Select an item in time selection
                             ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 
    ]=],
                              
    ' example  ',0)
                    
    STOP_Script 1
                    
    if MB == 1 then return end
                      
                
    else
                    for 
    count_item-1,0,-do
                        
    local item reaper.GetSelectedMediaItem0)
                        
    local position reaper.GetMediaItemInfo_Valueitem'D_POSITION' )
                        
    local length reaper.GetMediaItemInfo_Valueitem'D_LENGTH' )
                        if 
    position End_Loop or position+length start_Loop then
                            reaper
    .SetMediaItemSelecteditem)
                        
    end
                    end
                end
            end
        end
        example
    ()
        
    reaper.UpdateArrange()
     
    Последнее редактирование: 10 май 2018
  28. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    253
    Симпатии:
    58
    Пол:
    Мужской
    Ни это ?
    reaper.ApplyNudge( project, nudgeflag, nudgewhat, nudgeunits, value, reverse, copies )
    -- только эта функция работает для всех выделенных айтемов

    или
    обновил 2-й раз 14:22 мск. 16.05.18.
    Предыдущая не правильно работала с растянутым play-rate:
    PHP:

    правый край

    reaper
    .SetMediaItemLengthitemlengthtrue )

    ---------------------------------------------------------

    левый край

      local 
    function SetMediaItemLeftTrim(value,item)
        
    local Pos reaper.GetMediaItemInfo_Valueitem'D_POSITION' )
        
    local len reaper.GetMediaItemInfo_Valueitem'D_LENGTH' )
        
    local take reaper.GetActiveTakeitem )
        
    local playrate reaper.GetMediaItemTakeInfo_Valuetake'D_PLAYRATE')
        
    local offset reaper.GetMediaItemTakeInfo_Valuetake'D_STARTOFFS' )
        if 
    len value then
          reaper
    .SetMediaItemLengthitem,  value true )
          
    reaper.SetMediaItemPositionitem,(len-value)+ Postrue )
          
    reaper.SetMediaItemTakeInfo_Valuetake'D_STARTOFFS',offset + (len-value)*playrate )
        else
          if 
    Pos < (value-lenthen return end
          reaper
    .SetMediaItemLengthitemvalue true )
          
    reaper.SetMediaItemPositionitemPos-(value-len), true )
          
    reaper.SetMediaItemTakeInfo_Valuetake'D_STARTOFFS',offset + (len-value)*playrate )
        
    end
      end

     
    Последнее редактирование: 17 май 2018
    Aleksandr Oleynik нравится это.
  29. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.520
    Симпатии:
    8.052
    Пол:
    Мужской
    Адрес:
    Киев
    @Archchie, спасибо огромное!
    Очень не хотелось разбираться с офсетом, вы выручили :)
     

Поделиться этой страницей