Титровальные скрипты - создание объекта шаг за шагом.

Здесь обсуждаются любые продукты компании СофтЛаб-НСК для телевизионного вещания (Форвард Т, Форвард ТС, Форвард Голкипер, Форвард Рефери, Форвард Офис, Форвард Инжест)

Модераторы: ElenVR, Людмила, PR

Ответить
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Комментарии, вопросы и замечания просьба оставлять в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!

Часть 16. Работа над ошибками.

Мои коллеги, у которых я консультируюсь при написании этого топика, указали на ряд ошибок.
Исправим их.

1)
Если мы хотим, чтобы титровальный элемент Main работал в зацикленном режиме, то этот фрагмент кода не правильный:
//зацикливаем
Main.Props["Loop"] = 0;
Нужно так:
//зацикливаем
Main.Props["Loop"] = 1;
2)
Файловая маска сформирована не совсем корректно. В текущем состоянии она не позволяет выбрать ролики:
//Поле extra позволяет задать файловую маску
//Пока мы её сформируем наполовину вручную, потом ещё раз вернёмся к этому вопросу.
//Сначала добавим статическую графику
info.extra = "Все графические файлы (*.png;*.bmp;*.dib;*.jpg;*.tga)|*.png;*.bmp;*.dib;*.jpg;*.tga";
//добавляем фильтр для анимации - берём непосредственно из самого титровального элемента
info.extra = info.extra + Background.GetTaskMask();
Нужно так:
//Поле extra позволяет задать файловую маску
//Пока мы её сформируем наполовину вручную, потом ещё раз вернёмся к этому вопросу.
//Сначала добавим статическую графику
info.extra = "Все графические файлы (*.png;*.bmp;*.dib;*.jpg;*.tga)|*.png;*.bmp;*.dib;*.jpg;*.tga|";
";
//добавляем фильтр для анимации - берём непосредственно из самого титровального элемента
info.extra = info.extra + Background.GetTaskMask() + "|";[/b]

Соответственно вносим изменения и в английскую часть формирования маски файлов.
//Английский язык
default:

//"Человеческое" название свойства для пользователя
info.displayName = "Background";
//Краткое описание
info.descr = "Background image / animation.";
//Поле extra позволяет задать файловую маску
//Пока мы её сформируем наполовину вручную, потом ещё раз вернёмся к этому вопросу.
//Сначала добавим статическую графику
info.extra = "All image files (*.png;*.bmp;*.dib;*.jpg;*.tga)|*.png;*.bmp;*.dib;*.jpg;*.tga|";
";
//добавляем фильтр для анимации - берём непосредственно из самого титровального элемента
info.extra = info.extra + Background.GetTaskMask() + "|";
}[/b]
3)
Скорость для титровального элемента Main нельзя устанавливать в 0.
Сейчас так:
//устанавливаем скорость в 0
Main.Props["Speed"] = 0;
Нужно так:
//устанавливаем скорость в 0
Main.Props["Speed"] = 0.1;
4)Задание для Main не должно быть абсолютно "пустым".
Сейчас так:
//загружаем пустое задание
Main.LoadTask("", ETaskType.eTaskText);
Нужно так:
//загружаем пустое задание
Main.LoadTask(" ", ETaskType.eTaskText);
Это нужно исправить во всех местах, где загружается задание в Main.


Текущая версия нашего объекта со скриптом здесь:
ftp://ftp.sl.iae.nsk.su/Public/ForwardT ... rd_p16.zip

Комментарии, вопросы и замечания просьба оставлять в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!
Последний раз редактировалось Даниленко Сергей 19 фев 2013 11:43, всего редактировалось 4 раза.
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Комментарии, вопросы и замечания просьба оставлять
в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!


Часть 17. Отладка. Простой вариант.

Давно известно, что невозможно написать программу без ошибок. И для поиска их служит процесс отладки. Титровальные скрипты исключением не являются: по большому счёту это такая же программа. Поэтому и для титровальных скриптов существуют свои способы отладки. В данном разделе поговорим о самом простом, но достаточно эффективном способе.

Даже в нашем ещё до конца не написанном скрипте можно увидеть множество строк вида Debug.WriteLine(.........
Эти строки выводят отладочные сообщения в стандартный debug ouput (отладочный вывод) Win32. Подробнее про debug output можно посмотреть, например, в описании функции OutputDebugString в MSDN.
Увидеть эти сообщения можно различными способами. Например, используя в качестве отладчика "настоящие средства для программирования" типа MS VisualStudio.
Но можно обойтись и "малой кровью". Для этого можно использовать программы, которые перехватывают отладочные (дебагерные) сообщения. Самая доступная из них (и правильная с нашей точки зрения) - это DebugView (DbgView.exe) от Sysinternals.com. Для отладочных целей мы даже включаем её в состав нашего инсталлятора. Найти эту программу можно здесь: C:\Program Files\ForwardT Software\Tools\Dbgview.exe

Для того, чтобы отладочные сообщения выводились необходимо, чтобы в FDTitleDesigner в настройках проекта была включена отладка скриптов.

Изображение

После этого запускаем программу DbgView, а в программе FDTitleDesigner переходим в режим "Превью". Мы видим, что в окне DbgView появились отладочные строки, которые порождены нашим титровальным скриптом.

Изображение

Отладочную информацию можно выводить двумя способами:
1)Используя функцию WriteLine ( Debug.WriteLine("....................") )

Пример:
override function OnElementFinishing(name: String, index: int, id: int, time: double, text: String) {

Debug.WriteLine("===script OnElementFinishing:" + name + " index:" + index);
:::::::::::::
:::::::::::::
:::::::::::::
}
Как мы видим, строку для отладочного вывода можно формировать из строчек текста и переменных:
Debug.WriteLine("===script OnElementFinishing:" + name + " index:" + index);
"===script OnElementFinishing:" - строка текста
+ name - к ней добавляется переменная
+ " index:" - добавляем строку
+ index - добавляем переменную.

Естественно можно выводить только строки или только значения переменных.

2)Используя функцию Print ( Debug.Print("...........", ...........) )
Пример:
override function OnElementFinishing(name: String, index: int, id: int, time: double, text: String) {

Debug.Print("===script OnElementFinishing: name: '{0}' index: '{1}'", name, index);
:::::::::::::
:::::::::::::
:::::::::::::
}
Рассмотрим нашу отладочную строку:
Debug.Print("===script OnElementFinishing: name: '{0}' index: '{1}'", name, index);
При её выводе вместо {0} будет подставлено значение переменной name, т.е той переменной, которая стоит первой по порядку в вызове Debug.Print. А вместо {1} - значение переменной index, которая стоит второй по порядку в вызове Debug.Print.

Порядок вывода переменных в Debug.Print можно менять.
Debug.Print("===script OnElementFinishing: index: '{1}' name: '{0}'", name, index);
В этом случае первым будет выведено значение переменной index, а вторым - name.

Таким образом, расставляя в разные места кода вывод строк с отладочной печатью, достаточно просто, но вместе с тем весьма эффективно, можно проводить отладку титровальных скриптов.

В заключении маленькая хитрость, которая может помочь в дальнейшей работе.
По мере разработки различных скриптов становится ясно, что лучше все их держать в одном титровальном проекте. Так проще переносить куски кода из одного скрипта в другой. Но при отладке становится трудно понять от какого именно скрипта летит та или иная строка. В этом случае я завожу специальную константу с именем скрипта:
const _ScriptLabel : String = "ClipTV script ";
А в отладочных строках её использую, например, следующим образом:
Debug.WriteLine(_ScriptLabel + "GetMainFileName() MainFileName 1 = " + MainFileName);

Комментарии, вопросы и замечания просьба оставлять
в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Комментарии, вопросы и замечания просьба оставлять в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!

Часть 18. Отладка. Простой вариант №2.

Во многих случаях для отладки скриптов одной программы FDTitleDesigner не достаточно. Требуется OnAir, т.к. именно он передаёт нотификационные cообщения, которые поступают в скрипт.

В некоторых версиях ПО был запрещён вывод отладочной печати при работе программы OnAir. Потом ео разрешили, но какие-то проблемы всё равно остались.

Чтобы не зависеть от воли разработчиков ядра титровальных скриптов можно поступить следующим образом: завести глобальный объект для отладки.

Где-нибудь в начале добавляем:
// Trace() -- трассировка, отладочные сообщения
function Trace(format : String, ... args : Object[]) : void
{
Debug.Print("### " + format, args);
}

class Script extends SLTMTitleCommon.Scripting.ScriptBase
{
::::::::::::::
Функцию добавляем специально за пределами класса скрипта. Вызывается глобальный обработчик отладочных сообщений, который не зависит от воли разработчиков ядра (по крайней мере это сейчас так).

Примеры вызова:
Trace("script.ctor() -- script constructed");

Trace("script.Start({0})", atStart);

Trace("*** [{0}].Status >> {1} at {2}.", name, newStatus, now);
Понятно, что оставлять "навечно" отладочные сообщения не хорошо. Поэтому этот способ удобен тем, что изменив обработчик, вы можете избавиться от всех отладочных сообщений.
// Trace() -- трассировка, отладочные сообщения
function Trace(format : String, ... args : Object[]) : void
{

}
Причём, как видно, сделать изменения нужно только в одном месте. А в способе, который был предложен в предыдущем уроке, нужно будет закомментировать каждую строку с выводом отладочной информации.

Можно пойти и дальше. Например, завести в реестре какую-нибудь запись (нужна/не нужна отладочная информация). Проверить её при инициализации скрипта. И в зависимости от результата проверки создавать либо объект, выводящий дебагерную информацию, либо объект, который ничего не делает.

Комментарии, вопросы и замечания просьба оставлять
в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Комментарии, вопросы и замечания просьба оставлять в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!

В следующих сериях:

Часть 19. Подложка.
Часть 20. Точная информация о длительности задания (GetTaskInfo).
Часть 21. Автоматическое формирование фильтра файлов для титровального элемента "АнимЛого" (Background)


Комментарии, вопросы и замечания просьба оставлять в специально для этого предназначенной ветке форума. Из этой ветки они будут удалены!
Ответить