УкраїнськаEnglishmRussian
Вход/Новый
В теме много сообщений

Вопросы по среде визуализации


Автор Сообщение
Сообщение создано: 03. 10. 2013 [15:22]
adsum
Andrew S
Создатель темы
Зарегистрирован(а) с: 03.10.2013
Сообщения: 31
В процессе изучения OpenSCADA появилось несколько вопросов:
1. При использовании синтезатора речи интерфейс «тормозит» пока синтезатор не закончит фразу. Пробовал отправить в background (echo "%t" | festival --tts --language russian &), но тогда синтезатор запускается каждую секунду с понятным эффектом. Есть ли способ обойти эту проблему?
2. Есть ли возможность при обработке события от мыши, выяснить в какой позиции находился курсор?
3. Есть ли возможность создать обычную таблицу (grid), типа виджета Protocol, но для произвольных данных?

И ещё. Столкнулся с проблемой, которую так и не смог понять.
Для объекта визуализации создал несколько одинаковых дополнительных атрибутов (в примере atr1 и atr2), которые были связаны «полной связью» с атрибутами контроллера сбора данных.
В скрипте сначала инициализировал поля ввода (виджет FormEl, в примере Field1 и Field2) данными из этих атрибутов, а в дальнейшем присваивал им значения из полей ввода:
if( f_start ) {
Field1_value = atr1;
Field2_value = atr2;
}
atr1 = Field1_value;
atr2 = Field2_value;

В результате атрибуты и соответствующие им поля в контроллере сбора данных работали по разному. По каким-то причинам переменная Field2_value всегда оставалась равной 0. Независимо от того, менял ли я значение в поле ввода запущенного проекта или явно присваивал значение в скрипте. Вопрос решил переписав этот код таким образом:
if( f_start ) {
this["Field1"].attrSet("value",atr1);
this["Field2"].attrSet("value",atr2);
}
atr1= this["Field1"].attr("value");
atr2 = this["Field2"].attr("value");

На всякий случай просмотрел всю таблицу в SQLite в которой хранится конфигурация виджитов. Никаких проблем не нашёл (ни с индексами, ни с повтором имён)
Переносил «проект» на другой компьютер, эффект полностью повторился.
Удивляет, что столкнулся с такой проблемой первый и пока единственный раз, хотя в процессе изучения «нарисовал» уже несколько десятков форм.

[Сообщение редактировалось 2 раз(а), в последний раз 03.10.2013 в 15:29.]
Сообщение создано: 03. 10. 2013 [15:32]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"adsum" wrote:

В процессе изучения OpenSCADA появилось пара вопросов:
1. При использовании синтезатора речи интерфейс «тормозит» пока синтезатор не закончит фразу. Пробовал отправить в background (echo "%t" | festival --tts --language russian &), но тогда синтезатор запускается каждую секунду с понятным эффектом. Есть ли способ обойти эту проблему?

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

"adsum" wrote:

2. Есть ли возможность при обработке события от мыши, выяснить в какой позиции находился курсор?

Нет и не нужно.

"adsum" wrote:

И ещё. Столкнулся с проблемой, которую так и не смог понять.
Для объекта визуализации создал несколько одинаковых дополнительных атрибутов (в примере atr1 и atr2), которые были связаны «полной связью» с атрибутами контроллера сбора данных.
В скрипте сначала инициализировал поля ввода (виджет FormEl, в примере Field1 и Field2) данными из этих атрибутов, а в дальнейшем присваивал им значения из полей ввода:
if( f_start ) {
Field1_value = atr1;
Field2_value = atr2;
}
atr1 = Field1_value;
atr2 = Field2_value;

В результате атрибуты и соответствующие им поля в контроллере сбора данных работали по разному. По каким-то причинам переменная Field2_value всегда оставалась равной 0.

Флаг "Обработка" не стоит для "Field1_value".

Learn, learn and learn better than work, work and work.
Сообщение создано: 03. 10. 2013 [16:00]
adsum
Andrew S
Создатель темы
Зарегистрирован(а) с: 03.10.2013
Сообщения: 31
Спасибо за быстрый ответ
Потому что неправильно синтез вызываете. Если внимательно посмотрите на вариант с ru_tts то поймёте, что синтезатор должен формировать звуковой файл, которые воспроизводится визуализатором, а не синтез и воспроизведение прямо на стороне сервера визуализации.

Буду думать и разбираться
Нет и не нужно.

У меня есть такая задача. Есть достаточно протяжённый объект. Неважно как он обозначен на схеме, Картинкой в Media или ElFigure. В зависимости от места, где я открыл Контекстное меню (или просто кликнул мышкой), мне нужно записать определённые значения в атрибуты (по сути - определить участок). Я могу создать этот объект из разных виджитов, тогда задача легко решается. Но их может понадобится довольно много (как минимум - несколько десятков). Боюсь, что это "утяжелит" и интерфейс и разработку. В случае возможности получить позицию курсора всё значительно упрощается.
Флаг "Обработка" не стоит для "Field1_value".

Флаг "Обработка" установлен. Я сравнил оба виждета "до буквы", отличались только именами. Такое впечатление, что "съехала" таблица имён переменных используемых в скрипте. Но я не понял, как это получилось.
Это проблема которая решается, т.ч. не критично.
и ещё. Я дописал третий вопрос в первоначальный пост, но Вы ответили так быстро, что моё исправление было позже ответа.
3. Есть ли возможность создать обычную таблицу (grid), типа виджета Protocol, но для произвольных данных?
Сообщение создано: 03. 10. 2013 [16:23]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"adsum" wrote:

Нет и не нужно.

У меня есть такая задача. Есть достаточно протяжённый объект. Неважно как он обозначен на схеме, Картинкой в Media или ElFigure. В зависимости от места, где я открыл Контекстное меню (или просто кликнул мышкой), мне нужно записать определённые значения в атрибуты (по сути - определить участок). Я могу создать этот объект из разных виджитов, тогда задача легко решается. Но их может понадобится довольно много (как минимум - несколько десятков). Боюсь, что это "утяжелит" и интерфейс и разработку. В случае возможности получить позицию курсора всё значительно упрощается.

У примитива "Media" есть возможность создать области выбора.

"adsum" wrote:

Я дописал третий вопрос в первоначальный пост, но Вы ответили так быстро, что моё исправление было позже ответа.
3. Есть ли возможность создать обычную таблицу (grid), типа виджета Protocol, но для произвольных данных?


Нет, хотя уже мысль бродит и всё отчётливее просматривается ряд задач в будущем.

Learn, learn and learn better than work, work and work.
Сообщение создано: 03. 10. 2013 [17:39]
adsum
Andrew S
Создатель темы
Зарегистрирован(а) с: 03.10.2013
Сообщения: 31
У примитива "Media" есть возможность создать области выбора.

Думал в эту сторону и даже проводил эксперименты.
В скрипте устанавливал атрибуты по событию ws_MapAct0Right, ws_MapAct1Right и т.д. а далее устанавливал дополнительные атрибуты по пользовательским событиям из контекстного меню.
Но этот вариант имеет ограничение 10 областей. хотя это конечно значительно лучше, чем одна. :), т.ч. всё равно придётся разбивать на несколько Media Знание позиции курсора несколько упростило бы задачу.

Нет, хотя уже мысль бродит и всё отчётливее просматривается ряд задач в будущем.

Grid удобен, если нужны справочники и т.п. Пытался изобразить его из нескольких виджетов FormEl типа Дерево, но т.к. есть возможность получить только Значение, изменить выделение в "остальных колонках" оказалось невозможно, особенно если там есть повторы значений. Наверно спасло бы знание номера выделенной строки, при возможности устанавливать его программно.

Да, и раз уж упомянул FormEl типа Дерево, наверно там заложено нечто большее чем простой список, но у меня не получилось сделать ничего большего чем повтор элемента Список с заголовком.
Подскажите пожалуйста, какие возможности есть у Дерева и как ими воспользоваться.
Сообщение создано: 03. 10. 2013 [20:28]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"adsum" wrote:

Но этот вариант имеет ограничение 10 областей. хотя это конечно значительно лучше, чем одна. :),

Количество областей можно расширить до 100.

"adsum" wrote:

т.ч. всё равно придётся разбивать на несколько Media Знание позиции курсора несколько упростило бы задачу.

Можно и добавить, хотя смысла пока не вижу. Может как добавлю функцию тресера GPS и произвольного формирования изображения через SVG и/или LibGD. :)

"adsum" wrote:

Grid удобен, если нужны справочники и т.п. Пытался изобразить его из нескольких виджетов FormEl типа Дерево, но т.к. есть возможность получить только Значение, изменить выделение в "остальных колонках" оказалось невозможно, особенно если там есть повторы значений. Наверно спасло бы знание номера выделенной строки, при возможности устанавливать его программно.

"Дерево" это просто дерево без дополнительных колонок.
Для рецепта я такое через список делаю с индексами и всем нужным в элементах: http://wiki.oscada.org/Using/GraphicElementsLibraries/MainElements#h1036-63
Есть мысль добавить поле идентификатора и иконку, но пока это мне не нужно, поэтому не скоро.

"adsum" wrote:

Да, и раз уж упомянул FormEl типа Дерево, наверно там заложено нечто большее чем простой список, но у меня не получилось сделать ничего большего чем повтор элемента Список с заголовком.
Подскажите пожалуйста, какие возможности есть у Дерева и как ими воспользоваться.

Нет, вид "Дерево" это просто список, но в иерархичной записи, как путь "/dir1/dir2/item1", в документации всё нужное написано.

Learn, learn and learn better than work, work and work.
Сообщение создано: 04. 10. 2013 [16:24]
adsum
Andrew S
Создатель темы
Зарегистрирован(а) с: 03.10.2013
Сообщения: 31
Количество областей можно расширить до 100.

Решил воспользоваться Вашим советом. Поменял в origwidg.cpp ограничение на количество областей:
attrAdd(new TFld("areas",_("Map areas"),TFld::Integer,Attr::Active,"2","0","0;100","",i2s(A_MediaAreas).c_str()));
Создал 100 областей для виджета. В итоге оказалось, что 73 области сформировались нормально, а для 74-й есть только атрибуты образ и координаты (скрин прикреплён). 75-й и последующих областей нет. Решил что проблема в выделенной памяти под Media, но "с наскока" не нашёл где она выделяется. Подскажите, куда смотреть. Или я ошибаюсь?
Нет, вид "Дерево" это просто список, но в иерархичной записи, как путь "/dir1/dir2/item1", в документации всё нужное написано.

Спасибо. Этой строки достаточно для понимания сути. :) Но всё же полез проверять свою невнимательность. Честно говоря, в явном виде, ни в документации на VCAEngine, ни в концепции СВУ не нашёл описания записи items для "Дерева". Хотя мог бы и догадаться :(

[Сообщение редактировалось 1 раз(а), в последний раз 04.10.2013 в 16:53.]
Вложенный файл

MediaAreas.png (Тип файла: image/png, Размер: 11.98 килобайт) — 2058 загрузок
Сообщение создано: 04. 10. 2013 [18:07]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"adsum" wrote:

Решил воспользоваться Вашим советом. Поменял в origwidg.cpp ограничение на количество областей:
attrAdd(new TFld("areas",_("Map areas"),TFld::Integer,Attr::Active,"2","0","0;100","",i2s(A_MediaAreas).c_str()));
Создал 100 областей для виджета. В итоге оказалось, что 73 области сформировались нормально, а для 74-й есть только атрибуты образ и координаты (скрин прикреплён). 75-й и последующих областей нет.

Это Вы на 0.8.0 LTS, там больше чем на 50 лучше не расширять. В рабочей версии можно и 100, у меня проблем нету.

"adsum" wrote:

Спасибо. Этой строки достаточно для понимания сути. :) Но всё же полез проверять свою невнимательность. Честно говоря, в явном виде, ни в документации на VCAEngine, ни в концепции СВУ не нашёл описания записи items для "Дерева". Хотя мог бы и догадаться :(

А да, нет описания, думал, что добавил.
Добавлю!

Learn, learn and learn better than work, work and work.
Сообщение создано: 11. 10. 2013 [16:21]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"adsum" wrote:

Решил что проблема в выделенной памяти под Media, но "с наскока" не нашёл где она выделяется. Подскажите, куда смотреть. Или я ошибаюсь?

Не в памяти, а в размерности ячейки порядкового номера, поскольку атрибуты упорядочены. В рабочей версии размер 10 бит (1024 атрибута), а в LTS — 8 бит (256 атрибутов).

"adsum" wrote:

Честно говоря, в явном виде, ни в документации на VCAEngine, ни в концепции СВУ не нашёл описания записи items для "Дерева". Хотя мог бы и догадаться :(

Не было — добавил.

Learn, learn and learn better than work, work and work.
Сообщение создано: 21. 10. 2013 [15:48]
adsum
Andrew S
Создатель темы
Зарегистрирован(а) с: 03.10.2013
Сообщения: 31
Решил не делать новой темы.
В UI VCAEngine в widget.cpp разрешил атрибутам geomX и geomY присваивать отрицательные значения:
attrAdd(new TFld("geomX",_("Geometry:x"),TFld::Real,Attr::Generic,"","0","-10000;10000","",i2s(A_GEOM_X).c_str()));
attrAdd(new TFld("geomY",_("Geometry:y"),TFld::Real,Attr::Generic,"","0","-10000;10000","",i2s(A_GEOM_Y).c_str()));

Получил некоторые "полезности", как то, возможность показывать окна большего размера чем экран с возможностью контроля положения выводимой части окна. Сделал масштабирование этого окна. При этом появилась возможность запоминать открытую область и масштаб, для следующей сессии. Ну и прочая полезная мелочь.
За неделю опытов никаких проблем не было.
Хочу Вам предложить включить эти изменения и в релиз. Мелочь, а удобно.



2112