## ConditionalReader

`ConditionalReader` (clip, string filename, string variablename, bool "show")

`ConditionalReader` служит для импорта информации из текстового файла, отдельно для каждого кадра, или только для некоторых кадров.

### Параметры

Параметр | Описание | Значение по умолчанию
clip | Исходный клип. Он не изменяется, если не задавать show=true. | Отсутствует
filename | Файл, содержащий значения, которые будут присвоены переменным | Отсутствует
variablename | Имя переменной, которой следует присвоить значения из файла | Отсутствует
show | Если установлено в true, то значение, соответствующее текущему кадру, будет отображено поверх этого кадра. | false

### Формат файла данных

Это обычный текстовый файл. Все разделители - пробелы, а новые директивы начинаются каждый раз с новой строки. Регистр не имеет значения.
TYPE (int|float|bool)

Тип данных можно задавать только один раз для каждого файла. В настоящий момент возможно использование только вещественных (float), целых (int) или логических (bool) значений. Это определяется директивой TYPE. Она всегда должна идти первой, т.к. пока не определен тип данных, ничего никуда не присваивается. Однажды заданный тип данных изменить в ходе выполнения скрипта невозможно !

DEFAULT <value>

Задает значение по умолчанию для всех кадров. Ставить эту директиву нужно сразу после определения типа. Можно ее и не задавать, но тогда следует убедиться что какие-то значения в явном виде заданы для всех кадров. В противном случае поведение фильтра не определено.

<framenumber> <value>

Задает значение переменной для одного кадра с номером <framenumber>.

R <startframe> <endframe> <value>

Задает значение переменной для диапазона кадров. Обе границы <startframe> и <endframe> включаются в диапазон.

I <startframe> <endframe> <startvalue> <stopvalue>

Линейная интерполяция в диапазоне кадров от <startframe> до <endframe> значений от <startvalue> до <stopvalue>. Работает только для целых и вещественных значений. Обе границы включаются в диапазон.

### Типы данных

Как уже говорилось, тип может быть вещественный (float), целый (int) и логический (bool)
Целые числа должны быть представлены в виде последовательности цифр, возможно со знаком.
Вещественные числа должны быть представлены в виде числа с десятичной точкой, возможно со знаком, и возможно с буквой E или е на конце после которой следует порядок числа. Например -732.103 или 7.12e4.
Логическое, или булево значение может быть истина (true) или ложь (false).

### Примеры

#### Простейший пример

File.txt:

    Type float
    Default 3.45567

    R 45 300 76.5654
    2 -671.454
    72 -671.454

Этот файл содержит вещественные числа. Значение по умолчанию - 3.45567. Для кадров от 45 до 300 будет выдано значение 76.5654, а для кадров 2 и 72 - -671.454.
Как можно заметить, последующие директивы заменяют предыдущие значения. Например кадр '72' - несмотря на то, что он находится внутри диапазона 45-300, будет возвращено -671.454, как позже заданное. С другой стороны, если бы данный диапазон был указан ПОСЛЕ строки '72 -671.454' - значение переменной стало бы 76.5654.
Скрипт для работы с этим файлом мог бы выглядеть так :

    colorbars(512,512)
    trim(0,500)
    ScriptClip("subtitle(string(myvar))")
    ConditionalReader("file.txt", "myvar", false)

Этот скрипт помещает вычисленные значения в переменную "myvar", которая используется фильтром Subtitle, который в свою очередь вызывается из ScriptClip. В результате вычисленное значение отображается как титр.

Заметьте! Строка ConditionalReader() расположена после любого использования "myvar" в вашем скрипте.

#### Управление наложением клипов

AviSynth script:

    colorbars(512,256)
    a1 = trim(0,600)
    a2 = MessageClip("Text clip")
    overlay(a1,a2, y = 100, x = 110, mode="subtract", opacity=0, pc_range=true)
    ConditionalReader("opacity.txt", "ol_opacity_offset", false)
    ConditionalReader("xoffset.txt", "ol_x_offset", false)

xoffset.txt:

    Type int
    Default -50

    I 25 50 -50 100
    R 50 250 100
    I 250 275 100 250

opacity.txt:

    Type float
    Default 0.0

    I 25 50 0.0 1.0
    R 50 250 1.0
    I 250 275 1.0 0.0

Этот скрипт задает значения для смещения по горизонтали и для прозрачности. В кадрах 25->50 непрозрачность клипа увеличивается с 0.0 до 1.0, в это же время текст плывет по экрану слева направо. Потом текст стоит на месте с кадра 50 по кадр 250, а после этого едет обратно, постепенно исчезая.
Проще посмотреть клип, чем подробно объяснить, что именно он делает.

#### Усложненный ApplyRange

Как Вы могли заметить, использование большого числа вызовов ApplyRange() в скрипте может привести к проблемам с ресурсами. Использование `ConditionalReader` вместе с ConditionalFilter может привести к эффективному решению.

File.txt:

    Type Bool
    Default False

    2 True
    R 45 60 True
    72 True
    R 200 220 True
    210 False
    315 True

Указанный выше файл будет возвращать логические величины. Он по умолчанию будет возвращать False. Однако для кадров 2, 45 to 60, 72, 200 до 220 и 315 исключая 210 он будет возвращать True. Как вы могли заметить, последние изменения переназначают установки, сделанные в файле ранее. Это иллюстрируется кадром '210' - даже хотя он внутри интервала 200-220, последняя величина, False, будет возвращена.
Скрипт для использования этого файла, мог бы быть таким:

    colorbars(512,512)
    trim(0,500)
    A=Last
    FlipHorizontal() # Добавьте сложную цепочку фильтров
    B=Last
    ConditionalFilter(A, B, "MyVar", "==", "False", false)
    ConditionalReader("File.txt", "MyVar", false)

Это будет вводить величины в переменную, названную "MyVar", которая используется ConditionalFilter для выбора между необработанной и перевернутой версией источника.

Заметьте! Строка ConditionalReader() расположена после любого использования "myvar" в вашем скрипте.

`$Date: 2008/09/08 16:43:48 $
Русский Перевод 27.05.2005 Alexander Nickolsky (anickol@yahoo.com)
Обновления 10.04.2006 Fizick http://bag.hotmail.ru`