WIF (Weaving Information File) — построчный текстовый формат для обмена заправочными рисунками между программами. Сегодня для этого используется версия 1.1 от 20 апреля 1997 года.
Эта статья — справочник по WIF 1.1 с комментариями. Правила формата приводятся по спецификации 1997 года. Примечания с пометкой Bower описывают, как эти правила реализованы в Bower и в бесплатном инструменте «Просмотр файлов WIF». Это описание реализации, в спецификацию 1997 года оно не входит. Простой обзор формата — в статье «Что такое файл WIF?».
В примечаниях Bower статус обозначается так:
- Поддерживается — поле или секция читается, записывается или и то и другое.
- Игнорируется — поле или секция может встречаться в файле; такие данные пропускаются и сами по себе не приводят к ошибке импорта.
- Не записывается — при экспорте поле или секция никогда не записывается.
- Приостановлено в 1.1 — упоминается в тексте 1997 года, но сегодня при обмене файлами не используется.
1. Цели разработки
WIF задуман так, чтобы его можно было расширять, читать в текстовом редакторе и обрабатывать в любой системе, которая умеет читать обычный текст.
Структура хранится как номера ремизок и подножек через запятую, а не как упакованные двоичные битовые поля. По устройству файл похож на файл Windows .INI: заголовки секций в квадратных скобках и строки вида Key=value. В отличие от классических INI-файлов Windows 3.1, WIF не ограничен размером 64 КБ, и разбирать его функциями Windows API для INI-файлов нельзя. Нужен отдельный парсер.
2. Тип файла
Файл WIF — это обычный текст. Двоичного контейнера нет. Принятое расширение имени файла — .wif. Формат определяется по секции [WIF].
Расширение .wif Кодировка ASCII (на практике принимается и UTF-8 без BOM) Окончания строк LF или CRLF Порядок Порядок секций и ключей не важен
Bower. При импорте и экспорте файл .wif обрабатывается как обычный текст.
3. Лексические правила
Грамматика построчная. Каждая строка либо пуста, либо содержит комментарий, заголовок секции или пару «ключ — значение».
- Пустые строки игнорируются.
- Если первый непробельный символ строки —
;, вся строка считается комментарием. За числом или логическим значением в конце строки может следовать комментарий — обычно после второго;. Текстовые значения в свободной форме нельзя дополнять комментарием в той же строке. - Заголовки секций имеют вид
[Section Name]. Имена сравниваются без учёта регистра. Принято писать их прописными буквами. - Присваивания имеют вид
Key=value. Ключи сравниваются без учёта регистра. Значение — всё, что стоит в строке после первого знака=. - Одинаковые ключи в одной секции не соответствуют спецификации. Программа, читающая файл, не должна отклонять его только из-за повторного ключа; она может взять первое или последнее значение.
- Порядок секций и порядок ключей внутри секции не важен.
Ниже — фрагмент с этими лексическими формами. Это не полный заправочный рисунок:
; this line is ignored [WEAVING] Shafts=4 Treadles=4
Bower. Пустые строки и строки-комментарии, начинающиеся с ;, пропускаются. Имена сравниваются без учёта регистра. У обычных ключей берётся последнее значение. В строках структуры ключом служит номер. Пробелы по краям значений отбрасываются. Комментарии в конце строки не удаляются.
4. Логические значения и символы
Истинными считаются значения true, on, yes и 1, ложными — false, off, no и 0. Пропущенное необязательное логическое значение считается ложью, если для конкретной секции не указано иное.
Bower. Истиной считаются true, yes и 1. Любое другое непустое значение считается ложью. on и off отдельно не обрабатываются.
Тип «символ» задаёт один отображаемый знак, который выводится вместо закрашенной клетки:
=1 цифра =X один символ ='X' символ в кавычках =#219 код символа 0..255 Пробел записывается как ' ' или #32. Решётка записывается как '#' или #35.
Bower. Символы не реализованы: внешний вид задаётся только цветами. Секции символов при импорте игнорируются и при экспорте никогда не записываются.
5. Минимальные требования
Файл версии 1.1, соответствующий спецификации, содержит секции [WIF] и [CONTENTS]. Любая другая секция, которая есть в файле, должна быть указана в [CONTENTS] со значением true. Неиспользуемые секции можно не указывать или указать со значением false. Если секция есть, в ней должны быть все её обязательные ключи.
Файл с данными проборки, но без секции [WIF], не считается корректным документом WIF 1.1, даже если некоторые программы пытаются его прочитать.
Bower. Без [WIF] импорт завершается ошибкой. Секция [CONTENTS] при импорте не требуется и не проверяется. При экспорте всегда записываются обе секции, а каждая записанная секция отмечается значением true.
6. Виды секций и разреженные данные
Информационные секции хранят общие сведения (название, размер палитры, число ремизок и подножек). Секции данных хранят строки для отдельных нитей основы и утка (проборку, цвета и связанные с ними таблицы). В [CONTENTS] перечислены включённые в файл секции, кроме [WIF].
Данные хранятся разреженно. Число нитей основы и утка задаёт ключ Threads. Значения по умолчанию берутся из [WARP] и [WEFT]. Клетки структуры по умолчанию равны нулю (не используются). Записывать нужно только ключи, значения которых отличаются от значений по умолчанию. При чтении программа восстанавливает пропущенные значения из значений по умолчанию.
Если у восьми нитей основы один цвет и отличается только 3-я нить, общий цвет задаётся значением по умолчанию для основы, а исключение записывается одним переопределением:
[WARP] Threads=8 Color=1 [WARP COLORS] 3=2
Нити 1, 2 и 4–8 имеют цвет 1 из палитры, нить 3 — цвет 2. То же правило действует для структуры: если строки проборки для нити нет, нить не пробрана ни в одну ремизку, а не повторяет предыдущую.
Bower. Используются число нитей, таблицы структуры и цветов. Значения по умолчанию для расстояния между нитями и толщины, а также разреженные таблицы толщины и расстояния между нитями не реализованы. Структура по умолчанию пустая: если строки структуры для нити нет, нить остаётся пустой. Если в файле есть таблица цветов, сначала применяется цвет по умолчанию из ключа Color в [WARP] / [WEFT] (если его номер в палитре больше нуля), а затем — цвета отдельных нитей основы и утка.
7. Частные секции
Программы могут хранить собственные данные, не нарушая обмена. Имя секции должно содержать уникальный идентификатор источника, чтобы секции разных разработчиков не совпадали:
[PRIVATE <SourceID> <SectionName>] Строки внутри секции не должны начинаться с '[', чтобы читающая программа могла найти следующую секцию.
Bower. Частные секции пропускаются и никогда не записываются. Собственного Source ID у Bower нет.
8. Перечень секций
В этом разделе перечислены все именованные секции WIF 1.1 и для каждой указано, как она реализована в Bower. Для обмена файлами с Bower важны структура, цвет и профиль экспорта, описанный в разделе 10.
8.1 [WIF] — обязательная
Обязательная секция, определяющая формат. Файл без [WIF] не считается корректным документом WIF 1.1.
Ключ Статус Описание ---- ------ -------- Version обязателен например, 1.1 Date обязателен дата в произвольной форме Developers обязателен контакты / авторы Source Program обязателен название программы, создавшей файл Source Version необязателен версия программы, создавшей файл
Bower. При импорте секция обязательна. При экспорте записываются Version=1.1, Date=April 20, 1997, [email protected], Source Program=Bower и Source Version=1.0. Отсутствие отдельных ключей в [WIF] не приводит к ошибке импорта.
8.2 [CONTENTS] — обязательная в 1.1
Оглавление: имя секции — ключ, true или false — значение. Обязательно перечислять только секции, которые есть в файле, — со значением true. Перечислять все определённые секции со значением true или false можно, но не обязательно.
При чтении программа может выбирать секции, опираясь на один лишь CONTENTS.
Флаги информационных секций: COLOR PALETTE, WARP SYMBOL PALETTE, WEFT SYMBOL PALETTE, TEXT, WEAVING, WARP, WEFT Флаги секций данных: NOTES, TIEUP, COLOR TABLE, WARP SYMBOL TABLE, WEFT SYMBOL TABLE, THREADING, WARP THICKNESS, WARP THICKNESS ZOOM, WARP SPACING, WARP SPACING ZOOM, WARP COLORS, WARP SYMBOLS, TREADLING, LIFTPLAN, WEFT THICKNESS, WEFT THICKNESS ZOOM, WEFT SPACING, WEFT SPACING ZOOM, WEFT COLORS, WEFT SYMBOLS, PRIVATE <SourceID> <SectionName> Приостановлены / зарезервированы: TRANSLATIONS BITMAP IMAGE, BITMAP FILE, BITMAP IMAGE DATA
Bower. CONTENTS при импорте не требуется и не используется для выбора секций, которые нужно разобрать. При экспорте значение true записывается для каждой действительно записанной секции.
8.3 [COLOR PALETTE]
Задаёт размер палитры и числовой диапазон значений RGB. В старых файлах вместо 0–255 может использоваться диапазон 0–999; читающая программа должна пересчитывать значения.
Ключ Статус Описание ---- ------ -------- Entries обязателен целое число > 0, размер палитры Range обязателен min,max, где max > min Form=RGB устарел не записывать; если есть, игнорировать
При Range=0,999 запись таблицы 1=999,0,0 даёт для красного канала значение 255 в 8-битном представлении. При Range=0,255 запись 1=255,0,0 пересчёта не требует.
Bower. Range читается (если его нет — по умолчанию 0,255, то есть от 0 до 255). Каждый канал пересчитывается по формуле round((c − min) / (max − min) * 255), затем ограничивается диапазоном 0–255. Если max − min равно нулю или отрицательно, импорт завершается ошибкой. Entries не проверяется. При экспорте всегда используется Range=0,255.
8.4 [WARP SYMBOL PALETTE] / [WEFT SYMBOL PALETTE]
Ключ Статус Описание ---- ------ -------- Entries обязателен целое число > 0
Bower. Игнорируется. Не записывается.
8.5 [TEXT]
Необязательные сведения об изделии и его авторе: название, автор, контактные данные. Ни один из этих ключей не влияет на сетку заправочного рисунка.
Ключ Статус ---- ------ Title необязателен Author необязателен Address необязателен EMail необязателен Telephone необязателен FAX необязателен
Bower. Игнорируется. Не записывается.
8.6 [WEAVING]
Размер станка и работа ремизок на подъём или на спуск. Число ремизок и подножек может увеличиться, если в секциях структуры встречаются номера больше указанных здесь.
Ключ Статус Описание ---- ------ -------- Shafts обязателен целое число > 0 Treadles обязателен целое число > 0 Rising Shed необязателен true = указанные ремизки поднимаются Profile устарел игнорировать; не записывать
Работа на подъём означает, что поднимаются ремизки, указанные в порядке подъёма ремизок (или поднимаемые подножками через подвязь). При работе на спуск всё наоборот. Если в файле указана работа на спуск, клетки порядка подъёма ремизок или подвязи после загрузки инвертируются, чтобы внутренние сетки оставались в режиме «на подъём», а ткань совпадала с файлом.
Bower. Shafts и Treadles читаются (если их нет — по 4) и при необходимости увеличиваются по данным секций структуры. Если значение Rising Shed не задано, оно считается равным true. Значение false включает инверсию, описанную выше. При экспорте всегда записывается Rising Shed=true, а в режиме порядка подъёма ремизок — Treadles=0. Profile игнорируется.
8.7 [WARP] и [WEFT]
Эти секции описывают основу или уток в целом и значения по умолчанию для каждой нити. Когда значение Threads известно, создаётся указанное в нём число нитей основы или утка, к ним применяются значения по умолчанию, а секции для отдельных нитей задают некоторым из них собственные значения (раздел 6).
Ключ В спецификации Описание
---- -------------- --------
Threads обязателен число нитей основы или утка
Color необязателен номер в палитре или номер + R,G,B
Symbol необязателен тип символа
Symbol Number необязателен номер в таблице символов
Units обязателен, если Decipoints | Inches | Centimeters
заданы Spacing
или Thickness
Spacing необязателен вещественное ≥ 0
Thickness необязателен вещественное ≥ 0
Spacing Zoom необязателен целое ≥ 0
Thickness Zoom необязателен целое ≥ 0
Устарели в 1.1 (игнорировать, не записывать):
Colors, Palette, ColorMix
Для обмена между программами Color предпочтительно записывать простым номером в палитре. В некоторых файлах после номера дописана ещё тройка RGB.
Color=2 ; every end/pick defaults to COLOR TABLE entry 2 Color=2,255,0,0 ; index plus optional RGB — index only is kept
Если программа поддерживает только одно из двух — интервал (Spacing) или толщину (Thickness), — то при наличии обоих предпочтение отдаётся Spacing. Программе, которая работает только с толщиной, следует записывать Spacing или оба ключа с одинаковыми числами.
Bower. Threads читается (если ключа нет — 32 для основы и 48 для утка). Color читается как один номер в палитре, если он больше нуля. Символы, интервал, толщина, масштабы и дописанная к Color тройка RGB игнорируются. При экспорте записываются Threads, Color и Units=Centimeters.
8.8 [NOTES]
Свободный текст: каждая пронумерованная строка — одна строка заметок. В сетки заправочного рисунка не входит.
1=First line of notes 2=Second line
Bower. Игнорируется. Не записывается.
8.9 [TIEUP]
Для каждой подножки перечислены ремизки, которые она поднимает (при зеве на подъём, до инверсии, если она есть). Используется вместе с проборкой и ходом по подножкам, если в файле не один только порядок подъёма ремизок.
Ключ = подножка (1..n)
Значение = ремизки через запятую
одно значение 0 — не используется
Отсутствующие строки остаются неиспользованными
Пример: 1=1,2 → подножка 1 поднимает ремизки 1 и 2
Bower. Поддерживается в режиме подвязи. Значения с несколькими ремизками принимаются. При экспорте записывается по одной строке на подножку.
8.10 [COLOR TABLE]
Цвета палитры. Ключи Color основы и утка ссылаются на номера в этой таблице. Числа R,G,B задаются в диапазоне Range из [COLOR PALETTE].
Ключ = номер в палитре Значение = R,G,B в диапазоне Range палитры
Палитра, цвет основы по умолчанию и собственные цвета двух нитей основы:
[COLOR PALETTE] Entries=2 Range=0,255 [COLOR TABLE] 1=200,40,40 2=40,40,200 [WARP] Threads=4 Color=1 [WARP COLORS] 2=2 4=2
Нити основы 1 и 3 по умолчанию получают цвет 1 палитры, нити 2 и 4 — цвет 2.
Bower. Поддерживается; Range пересчитывается, как описано выше. При экспорте каждый цвет пряжи записывается в таблицу один раз, а диапазон всегда записывается как Range=0,255.
8.11 [WARP SYMBOL TABLE] / [WEFT SYMBOL TABLE]
Ключ = номер символа Значение = тип символа WIF (см. раздел 4)
Bower. Игнорируется. Не записывается.
8.12 [THREADING]
Ремизки для каждой нити основы. Одна нить может быть пробрана в несколько ремизок.
Ключ = нить основы (1..n)
Значение = ремизка или ремизка,ремизка,...
1=1,5 — нить 1 пробрана в ремизки 1 и 5
0 — не используется
Отсутствующие строки остаются неиспользованными
Bower. Поддерживается, включая нити в нескольких ремизках. При экспорте записывается по одной строке на нить.
8.13 Секции для отдельных нитей основы и утка
В этих секциях значения задаются для отдельных нитей основы или утка. Секции делятся на три группы: структура (ход по подножкам / порядок подъёма ремизок), цвет и внешний вид (толщина, интервал, символы).
Секция Значение По умолчанию
------ -------- ------------
[WARP THICKNESS] вещественное ≥ 0 [WARP].Thickness
[WARP THICKNESS ZOOM] целое ≥ 0 [WARP].Thickness Zoom
[WARP SPACING] вещественное ≥ 0 [WARP].Spacing
[WARP SPACING ZOOM] целое ≥ 0 [WARP].Spacing Zoom
[WARP COLORS] номер в палитре [WARP].Color
(одно целое; старую дописанную тройку R,G,B игнорировать)
[WARP SYMBOLS] номер символа [WARP].Symbol Number
[TREADLING] подножки не используется (ноль)
[LIFTPLAN] ремизки не используется (ноль)
[WEFT THICKNESS] вещественное ≥ 0 [WEFT].Thickness
[WEFT THICKNESS ZOOM] целое ≥ 0 [WEFT].Thickness Zoom
[WEFT SPACING] вещественное ≥ 0 [WEFT].Spacing
[WEFT SPACING ZOOM] целое ≥ 0 [WEFT].Spacing Zoom
[WEFT COLORS] номер в палитре [WEFT].Color
[WEFT SYMBOLS] номер символа [WEFT].Symbol Number
Ход по подножкам управляет ремизками через подвязь: ключ — нить утка, значение — нажатые подножки, например 5=1,2. Порядок подъёма ремизок задаёт их напрямую: ключ — нить утка, значение — поднимаемые ремизки, например 5=1,3. Обычно в файле используется один из этих способов, а не оба (раздел 8.14).
Bower. Поддерживаются ход по подножкам, порядок подъёма ремизок и цвета основы и утка. Секции толщины, интервала, масштаба и символов игнорируются и никогда не записываются.
8.14 Режим станка, зев на подъём и рисунок переплетения
Ключа mode= нет. Режим станка определяется по тому, какие секции структуры есть в файле.
Bower и бесплатный «Просмотр файлов WIF» действуют по такому правилу:
Если [LIFTPLAN] есть
и ([TREADLING] нет или Treadles равно 0),
то файл читается как порядок подъёма ремизок
(THREADING + LIFTPLAN),
иначе — как подвязь
(THREADING + TIEUP + TREADLING)
Порядок подъёма ремизок — модель кареточного станка: для каждой нити утка перечислены ремизки. Подвязь — модель станка с подножками: подножка выбирает столбец подвязи, а ход по подножкам — это последовательность нажатия подножек.
Если значение Rising Shed равно false, после загрузки сеток инвертируется каждая клетка: в режиме порядка подъёма ремизок — в порядке подъёма ремизок, в режиме подвязи — в подвязи. Проборка и ход по подножкам остаются такими, как записаны.
Rising Shed=true, нить утка 1=1,2 → ремизки 1 и 2 подняты
Rising Shed=false, та же строка → эти ремизки хранятся опущенными,
остальные переключаются в поднятые
Рисунок переплетения в файле не хранится. После загрузки структуры и инверсии зева (если она нужна) клетка ткани — основное перекрытие, если хотя бы одна ремизка, в которую пробрана эта нить основы, поднята при прокидке этой нити утка: по порядку подъёма ремизок или нажатой подножкой и её подвязью. Иначе клетка — уточное перекрытие. Программы пересчитывают рисунок переплетения для показа, а секции, в которую его можно было бы экспортировать, нет.
Bower. Файл загружается и показывается по этой процедуре. Бесплатный «Просмотр файлов WIF» использует те же правила для структуры и цвета. В режиме порядка подъёма ремизок он не показывает пустой блок подвязи, а число подножек на боковой панели выводит как «-».
8.15 Приостановленные и устаревшие элементы
Приостановлены в 1.1: [TRANSLATIONS] [BITMAP FILE], [BITMAP IMAGE], [BITMAP IMAGE DATA] Исключены / устарели в тексте 1.1: секция Design, ColorMix, ключ Colors, ключ Palette, дописанная тройка RGB в WARP/WEFT COLORS
Bower. Всё перечисленное игнорируется и не записывается. Неизвестные секции сами по себе не приводят к ошибке импорта.
9. Ограничения размеров в реализации
Эти ограничения не входят в WIF 1.1. При импорте размеры урезаются до допустимых, чтобы файл не мог создать сетку неограниченного размера. Значения вне диапазона приводятся к нему, а не отклоняются как не соответствующие WIF.
Нити основы, утка 1–4096 Ремизки, подножки 1–64
10. Профиль экспорта
Bower экспортирует полный файл WIF 1.1 с зевом на подъём, рассчитанный на программы, которые понимают перечисленные ниже основные секции. Если импортировать файл и снова экспортировать его, заметки, символы, интервалы и собственные данные других программ не сохранятся.
- [WIF], [CONTENTS], [COLOR PALETTE] с Range=0,255, [WEAVING] с Rising Shed=true
- [WARP] и [WEFT] с ключами Threads, Color (номер в палитре) и Units=Centimeters
- [COLOR TABLE], [THREADING], [WARP COLORS], [WEFT COLORS]
- Либо [LIFTPLAN] и Treadles=0, либо [TIEUP] и [TREADLING] вместе
- Без секций TEXT и NOTES, символов, интервала, толщины, частных секций и растровых изображений (bitmap)
11. Примеры
Ниже — полные файлы WIF 1.1. В них только структура, таблицы цветов нет.
11.1 Режим подвязи
Восемь нитей основы, восемь нитей утка, четыре ремизки, четыре подножки. Рядовая проборка, подвязь для саржи и ход по подножкам, в котором повторяется последовательность из четырёх подножек.
[WIF] Version=1.1 Date=April 20, 1997 [email protected] Source Program=Example Source Version=1.0 [CONTENTS] WEAVING=true WARP=true WEFT=true THREADING=true TIEUP=true TREADLING=true [WEAVING] Shafts=4 Treadles=4 Rising Shed=true [WARP] Threads=8 [WEFT] Threads=8 [THREADING] 1=1 2=2 3=3 4=4 5=1 6=2 7=3 8=4 [TIEUP] 1=1,2 2=2,3 3=3,4 4=1,4 [TREADLING] 1=1 2=2 3=3 4=4 5=1 6=2 7=3 8=4
11.2 Режим порядка подъёма ремизок
Четыре нити основы, четыре нити утка. Значение Treadles равно 0 и есть [LIFTPLAN], поэтому файл читается как порядок подъёма ремизок. Для каждой нити утка ремизки перечислены напрямую. Подвязи и хода по подножкам нет.
[WIF] Version=1.1 Date=April 20, 1997 [email protected] Source Program=Example [CONTENTS] WEAVING=true WARP=true WEFT=true THREADING=true LIFTPLAN=true [WEAVING] Shafts=4 Treadles=0 Rising Shed=true [WARP] Threads=4 [WEFT] Threads=4 [THREADING] 1=1 2=2 3=3 4=4 [LIFTPLAN] 1=1,2 2=2,3 3=3,4 4=1,4
12. Связанные программы
Файл .wif можно открыть в бесплатном инструменте «Просмотр файлов WIF», чтобы посмотреть заправочный рисунок в браузере, или импортировать в Bower для редактирования. В инструменте есть команда «Открыть в Bower».
13. Источники
Источники текста о формате. Заметки с пометкой Bower на этой странице описывают импорт и экспорт в Bower; в спецификацию 1997 года они не входят.
- Nielsen, Ravi, et al. Weaving Information File (WIF) Specification, Version 1.1. 20 апреля 1997 г. Среди авторов — Ravi Nielsen (Patternland / Maple Hill Software), Bob Keates (Fiberworks), Rob Sinkler (SwiftWeave) и участники списка рассылки WIF 1997 года. Текст: http://www.tantradharma.com/maplehill/wif/wif1-1.txt.
- Nielsen, Ravi; Keates, Bob; Sinkler, Rob. Weaving Information File (WIF) Specification, Version 1.0. 3 марта 1996 г. Заменена версией 1.1, которой пользуются для обмена сейчас.
- Asunder — Bower и бесплатный «Просмотр файлов WIF».