Скин и Скрипт

C форматом LCM мы уже разобрались. На данный момент нет «белых» пятен для создания таких карт. Единственное ограничение для такого формата, что мало цветов, иконок, названий федеральных трасс. Нельзя поменять размер шрифта и многое другое, то есть нельзя иметь полный контроль над создаваемой картой.

Таких недостатков лишен формат AT5. Для приборов серии HDS возможно даже такое свойство созданных карт, как прозрачность. В любом случае формат сейчас не изученный, есть много чего, что нуждается в исключительном понимании процессов создания карты. Кириллица поддерживается в не полном объёме, но дело в том, что процесс изучения формата только-только начинается. И будет развиваться. В итоге мы будем иметь возможность создавать очень подробные, профессионального качества карты. Плюс ко всему, каждый может сделать карты на свой вкус и цвет, не ограничиваясь ни в чем. С точки зрения стандартов – это конечно не хорошо, но здесь опровергается принцип «всем не угодишь». В любом случае, выходная карта всегда получается из исходника. А исходник можно конвертировать в «стандартную» или «не стандартную» цветовую схему. Точность данных от этого не страдает, если конечно исходные данные верны.

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

Как получается карта AT5? Путь следующий: рисуется карта в одной из программ, затем нарисованная карта конвертируется в шейпы (так будем называть файлы, пригодные для конвертации), и уже готовые шейпы конвертируются программой IMC в карту формата AT5. В случае RMпроисходит это в два этапа, исключается отдельный запуск IMC, процесс будет запускаться самим RM. Но IMC в любом случае должен быть установлен на компьютере, а в настройках RMнужно указать его расположение. Как рисовать в RMвы можете узнать, изучив инструкции к данному софту. Далее речь пойдёт о других, более понятных большому кругу людей, программах.

Как нарисовать карту так же почти всем известно, но если вы впервые столкнулись с этим, то обязательно ознакомьтесь с информацией, представленной на этом сайте, или же воспользуйтесь поисковыми сервисами. И вот теперь самый важный момент, с точки зрения создания карт AT5: нам необходимо изначально правильно рисовать и понимать, что мы делаем. И связано это с тем обстоятельством, что на данный момент нет специализированного для Lowranceсофта, отвечающего всем стандартам формата AT5. GME можно «научить» располагать полигоны в нужном нам порядке, рисовать их правильными (поддерживаемыми прибором) цветами и соответственно, создавать правильные шейпы. Информации по данным возможностям довольно мало, и без понимания данного процесса вы не сможете управлять созданием своей карты.

Каким же образом GME можно обучить? Довольно легко, если понимать. Все учились в школе, все проходили основы информатики, поэтому сложного ничего быть не должно. Для нашего случая GME использует два файла: СКРИПТ и СКИН. Если по-русски, то скрипт – это набор правил, в соответствии с которым, программа конвертирует нарисованное в шейпы. Скин – от английского «кожа» - это «краски с трафаретами» для программы – набор правил, в соответствии с которым, программа отображает данные в процессе рисования. В скине прописываются правила для отображения объектов, но учитывая, что создаваемый файл, по сути один текст, то цвета, форма объекта и его название и тип, записываются текстом. Здесь нельзя, к примеру, к в обычном Wordнаписать красным текстом и быть уверенным, что в программе также будет красный. Здесь необходимо присвоить необходимые атрибуты для объекта, и когда этот объект вы нанесете на карту, то он будет отображаться в ней в соответствии с правилом из скина. Существует всего несколько параметров, которые нам нужны. За основу можно взять скин для DD. Повторюсь, чтобы применить скин необходимо выставить в настройках карты тип GARMIN!!!

Разберем структуру скина.

Скин.

Скин – это текстовый файл с расширением .txt. Редактируется любым текстовым редактором, начиная от блокнота и заканчивая Word. Внутри файла только текст: ни каких картинок, разноцветных шрифтов.


; строка начинающаяся с точки-с-запятой является комментарием, и в большинстве случаев расчёт не принимается.
[_drawOrder] порядок отрисовки полигонов, перечисляются все типы на карте
Type=0x0300,1 после типа полигона через запятую указывается слой полигона
Type=0x0301,2 полигоны будут отрисованы вне зависимости от их размеров
Type=0x031a,8 от единицы - самый нижний полигон, до восьмерки - поверх остальных
[end] линии и точки выводятся поверх полигонов

Пояснение: слои в данном контексте и слои в программе GME, или же в карте AT5 – не одно и то же. Это необходимо знать и не путать. В данном случае – это порядок показа полигонов в любом из слоёв GME. По-русски: здесь устанавливается следующее правило: синий полигон поверх белого, белый поверх зелёного и т.д. Как понять, что синий поверх белого? Читаем дальше.


[_polygon]
Type=0x0300 описываем новый тип полигона
Custom=Y обязательная строка, показывает - этот тип пользовательский
String1=4 Depth Area 1m строка описания на английском, после "4" с пробелом
String1=0x19 Отмель до 1м строка описания на русском, после "0x19" с пробелом или без
Xpm="0 0 1 0" используется сплошной цвет заливки
"0 c #00FFFF" код голубого цвета в HTML-формате "#00FFFF" соответствует №11 в Lowrance
[end]

Понятно? Нет, тогда разъясняем. Когда мы описываем полигон, то мы присваиваем полигону номер, затем присваиваем ему атрибут Custom=Y, для того, чтобы GME принял его в расчёт. Затем присваиваем ему описание, которое будет показано в GME  и уже в конце присваиваем ему внешний вид. Но вот здесь стоит немного сделать отступление и подробнее объяснить это волшебство. Дело в том, что вид полигона может быть как в виде сплошной заливки, так и в виде штриховки и прочих узоров. Применение узоров – отдельная тема, которую мы опишем в другом разделе. Сейчас мы ограничимся следующим: одна штриховка и соответствующие заливки. Соответствующие заливки – это полигоны с цветом заливки, которые ваш прибор может воспроизвести. Напомню, что некоторые приборы не воспроизводят больше 30 цветов, поэтому нет смысла определять 200 цветов, при том, что в программе они будут присутствовать, а в приборе неподдерживаемый цвет будет отображаться фиолетовым. Как рекомендация к унификации вашего скина – используйте общие для всех приборов цвета. Информацию об этом можно найти в инструкции к IMC на нашем сайте.


[_polygon]
Type=0x0301 описываем следующий тип
Custom=Y
String1=4 Depth Area 5m
String1=0x19 Глубины до 5м
Xpm="0 0 1 0"
"0 c #0000FF" код синего цвета в HTML-формате "#0000FF" соответствует №9 в Lowrance(смотрите инструкцию к IMC, стр.28)
[end]

Со сплошной заливкой разобрались. Для присвоения нужного цвета смотрим таблицу цветов в инструкции к IMCи меняем на нужное после знака # - шесть последних цифр из таблицы. Например, чтобы присвоить полигону зелёный цвет вы должны сделать следующую запись : "0 c #008000"

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

 

[_polygon]
Type=0x031a этот тип будет обозначать "рыбные" места, всегда поверх рельефа
Custom=Y представляет собой красную сеточку, по аналогии с иконкой "FHS_NAVA_SECURI" в IMC
String1=4 Fishing Area
String1=0x19 Пупышы
XPM="32 8 2 1" размер 32 на 8 пикселей, два цвета
"0 c none" ноль означает прозрачный пиксель
"1 c #FF0000" единица представляет пиксель красного цвета
"00000000000000110000000000000011"
"00000000000011000000000000001100"
"00000000001100000000000000110000"
"00000000110000000000000011000000"
"00000011000000000000001100000000"
"00001100000000000000110000000000"
"00110000000000000011000000000000"
"11000000000000001100000000000000"
[end]

 

Надеюсь, здесь всё понятно и без объяснений. Но на всякий случай распишем подробнее. Если вы отодвинетесь от экрана компьютера подальше и посмотрите на матрицу из нулей и единиц (можно увидеть и так), то увидите «узкие полоски» из единиц, и соответственно «широкие» из нулей. А если посмотреть выше, то увидите, что единичкам присвоен красный цвет, а для нулей выставлена прозрачность. Соответственно, если задать другие цвета и другую конфигурацию трафарета, то увидим на экране соответствующую картину. Вместо единиц и нулей возможно применение любых символов. Вместо нуля можно использовать пробел, вместо единицы – звездочку. Результат смотрите ниже. Трафареты абсолютно идентичны и для программы не имеют никакой разницы.

 

XPM="32 8 2 1"
" c none"
"* c #FF0000"
"               * *               * *"
"             * *               * * "
"           * *               * *   "
"         * *               * *     "
"       * *               * *       "
"     * *               * *         "
"   * *               * *           "
" * *              * *             "
[end]

 

Таким же образом можно описать линии и точки. Сейчас подробнее разберем и эти задачи.

Линии:
[_line]
Type=0x0102 этот тип будет обозначать береговую линию
LineWidth=1 толщина линии
BorderWidth=0 толщина окантовки (рисуется белым цветом)
xpm="0 0 1 0"  
"1 c #000000"
String1=4 Navico Shore line
String1=0x19 Береговая линия[end]

Почти нет отличий от полигонов с простой заливкой. Добавилась только толщина окантовки и толщина линии. Если мы хотим увидеть прерывистую линию в GME или еще какую, то ее описание будет такое же, как и для штриховки для полигона. В разделе "Расширенные возможности" можно ознакомиться с дополнительными возможностями при работе объектами, и линиями, в том числе.

 
[_line]
Type=0x0303
LineWidth=1
BorderWidth=0
xpm="16 1 4 1"
"= c #ff0000"
" c   none"
"3 c #888888"
"4 c #888888"
"====   ====   "
string1=4Navico IsoHard
[end]

 

Точки. С ними вообще всё просто. Здесь нет таких параметров как толщина линии и цвет бордюра.

[_point]
Type=0x0402
String1=4 Navico Wreck
XPM="16 16 4 1"
" c None"
"! c #FFFFFF"
"# c #FF0000"
"$ c #000000"
"              "
"               "
"     $$$$     "
"   $$$   $$$   "
" $   $   $$ "
" $$   $     $$ "
"$$ $ $ $   $$"
"$ $$$$$$$$$$$$ $"
"$$ $ $ $   $$"
" $$   $     $$ "
" $   $     $ "
"   $$$   $$$   "
"     $$$$     "
"               "
"              "
"               "
"               "

[end]

Можно создать все значки из библиотеки IMC и, соответственно, увидеть их в GME и на картах. Создание значков, линий и полигонов достаточно легко осуществить с помощью программы ArtCursor. Видео по созданию и внедрению в скин посмотрите здесь.

На этом можно подвести итог: создание скина – занятие не очень сложное. Правильно сделанный скин существенно облегчит вам работу по созданию карт, потому как вы будете полностью контролировать процесс ее создания. В окне программы будет отображаться почти так же, как и в картплоттере. Но при одном условии: если правильно настроен скрип для вашего скина.

Ведь для того, чтобы увидеть карту в картплоттере, похожую на нарисованную в GME, нужно правильно сделать конвертацию. То есть сопоставить синему полигону в GME синий полигон в AT5, правильные границы отображения, порядок следования объектов на карте AT5 и многое другое. Но, уверяю Вас это не так уж и сложно, и под силу практически любому. Тем более, делается, как правило, один раз и на долгие годы.

Скрипт.

Скрипт – это, так же текстовый файл (в отличие от скина расширение у скрипта - .dat), содержащий набор правил, в соответствии с которым, программа конвертирует нарисованное в шейпы. Значит основная наша задача – сделать правильное правило. Ведь, программа сама не может понять, что нужно сделать, например, с синим полигоном «Озеро», находящимся на нулевом уровне. Ей нужно это указать специальным способом. И используется для этого минимальное количество возможностей, понять которые не составит труда.

Модифицированный скрипт экспорта (dat-файл) так же можно редактировать любым текстовым редактором. Я использую Notepad++ потому, как он очень удобный и позволяет много чего автоматизировать. Принцип работы скрипта следующий: атрибуту IMC присваивается значение из данных карты или при отсутствии оных – нужное значение. Например, название любого объекта (VALUE), будь то точка, линия или полигон можно взять из польского файла, где название хранится в переменной Label. Предположим, что у Вас есть точка с названием города “Zelenograd”. В таком случае, запись вида string "VALUE" {return label;} создаст в шейпе следующую строку VALUE=Zelenograd. Из документации к IMC: VALUE – текстовое поле – ПО УМОЛЧАНИЮ пустая строка - используется для указания текста, применяемого в отношении используемого режима. Соответственно, string – это обозначение вида (текст), return обозначает знак равенства. И на полученной карте мы увидим эту точку с соответствующей надписью. Чуть сложнее обстоит дело, когда нужно выбрать из некоторого количества параметров. Но и здесь не должно возникнуть трудностей. Для решения этой задачи используется функция IF. Синтаксис функции следующий: IF(условие, значение если условие выполнено, значение если условие не выполнено). Эта функция возвращает для условия (записанного после скобки первым) записанное вторым значение, если условие верно, и записанное третьим значение, если условие ложно или не выполнено.

Рассмотрим структуру файла ShpLowrance.dat:

.export_schema_shp обязательная первая строка схемы экспорта
; строка начинающаяся с точки-с-запятой является комментарием и ряде случаев в расчет не принимается.
.name Lowrance если задать новое имя схемы, то не придется перезаписывать стандартный ShpDefault.dat
.polygons "Polygons" раздел экспорта полигонов
{
string "VALUE" {return label;} задается атрибут равный переменной label (надпись)
integer "L_LIMIT" {return "0";} задается фиксированный числовой атрибут
integer "U_LIMIT" {return if(max_level="0","10", if(max_level="1","17", if(max_level="2","19","19")));} четыре варианта атрибута
}

Последнюю строку рассмотрим подробнее:
integer добавляется целочисленный (число – потому, как Integer – число, а string – текст) атрибут "U_LIMIT" имя обязательного атрибута из инструкции к IMC
{return if(max_level="0","10",if... если объект имеет max_level=0, то атрибуту U_LIMIT будет присвоено значение 10
{return if(max_level="0","10", if(max_level="1","17" если max_level не равен 0, выполняется следующее сравнение и т.д.
Очевидно, что в таких конструкциях можно использовать любые параметры объектов из польского формата, главное не ошибиться в синтаксисе и количестве закрывающих скобок. Список стандартных переменных в GME не очень велик на сегодняшний момент, но позволяет почти полностью контролировать процесс конвертации, то есть позволяет создать правильные правила конвертации. Однако есть очень существенное дополнение: список не стандартных переменных, включаемых в процесс конвертации - безграничен, что позволяет полностью контролировать процесс создания карты. 
{return if(label="OZERO",... что бы задать атрибут в зависимости от подписи
{return if(type="769",... или сделать зависимость от десятичного значения типа объекта.

И более того, условия можно комбинировать! Например, полигоны с одинаковым типом, но с меньшей глубиной, можно располагать на более высоком уровне карты, изменяя атрибут LAYER:
integer "LAYER" {return if(type="60", if(label="1","10", if(label="2","20","30")),"33");} все полигоны "Озеро большое" с типом 0x3c (десятичное значение 60) с глубиной в надписи равной 1 окажутся на 10 уровне, с глубиной 2 на 20, с другой глубиной или без подписи на 30 уровне; остальные полигоны с другими типами окажутся на более низком 33 слое.

Путаница может возникнуть на этапе создания условий. Связано с тем, что в условии должны присутствовать десятичные значения, а в скине прописаны шестнадцатеричные. Посмотреть значения одного и того же числа можно в стандартном калькуляторе. Выбираете Вид – Программирование. Включаете кнопку “HEX”, вводите число. Чтобы увидеть его десятичное выражение жмете кнопку “Dec”.

Если скрипт написан правильно, то созданная вами карта будет мало отличаться от карты в GME. При этом Вы избежите многих проблем в процессе создания и редактирования карты: будете четко понимать, что на экране – то и в приборе. Возможны, конечно, варианты, когда будет не совсем то, что планировали, особенно в плане прозрачности. Но в целом этого будет более чем достаточно для создания профессиональных карт.

Надеемся, что сейчас Вы готовы к самостоятельному созданию и редактированию скинов и скриптов. Для начала потренируйтесь с абстрактной картой на одном слое. Затем нарисуйте несколько полигонов, причем разместите их на разных слоях и в разных местах. Так понятнее будет в процессе обучения. Когда разберетесь и с этим, то можно приступать к точкам и заполнению полигонов произвольными заливками. Но об этом чуть позже.

Расширенные возможности.

Для того, чтобы получить полный контроль над созданием карты разработчик GME сделал нам подарок. Конечно же, нужно иметь хоть какое-то воображение, потому что некоторые из этих возможностей реализуются только во время экспорта: увидеть результат их работы возможно только в приборе. Итак, приступим.
Толщина границы полигона, её цвет, прозрачность полигона, способ отображения, а также значение подъема над уровнем моря – значения, изначально никак не включаемые в расчет, сейчас легко можно применять. Для этого нам нужно включить соответствующие параметры в схему экспорта – скрипт, а в самой программе GME прописать соответствующие скрипту значения. Соответственно, в скрипте мы пишем один раз, а в GME прописываем значения для нужных нам полигонов.
Что пишем в скрипте:
integer "BDR_COLOR" {return c_attr("color");}
integer "BDR_WIDTH" {return c_attr("width");}
string   "BDR_PATTER" {return c_attr("pattern");}
integer "IMG_RENDER" {return c_attr("render");}
string   "VALUE2" {return c_attr("value2");}

Значения получились на все времена для всех возможных полигонов. Сюда же можно и заливку иконками включить и любой из возможных атрибутов. В любом случае, если атрибута нет в карте, то и скрипт его конвертировать не будет. Теперь дело за малым: заставить GME вывести в шейпы нужные нам атрибуты. В данном случае это будут c_attr(“color”) и другие. И снова достаточно всё просто! Дважды кликаем на нужный нам полигон, идем во вкладку «Комментарий» и прописываем нужные параметры. Всё!

Причем, вы можете записать любое слово вместо COLOR или WIDTH, главное, чтобы они совпадали в скрипте и в программе.
Таким же способом можно действовать и с другими объектами.

В качестве примеров можете скачать и использовать следующие два скина со скриптами: Feel и Anglingchart
По мере изучения формата или же в случае обнаружения новых возможностей данная статья будет обновляться.