Slugline в MetaDimension, часть 2: вариант использования

Слаглайн, который удалось русифицировать в первой части истории, было бы неплохо для чего-нибудь приспособить. В голову пришла следующая идея: подписывать разные пруфы разными словами, например, “для печати” и “для постпечатки”.

Пруф “для печати” не содержит никаких служебных линий (штампов, обрезных прямоугольников и т.п.) и служит образцом печатнику, а пруф “для постпечатки”, наоборот, содержит максимум полезной для вырубщика или резчика информации. Контур штампа, его название, номер изделия на листе и всё остальное — то, что теоретически может помешать печатнику при сверке листа с пруфом.

Идея хорошая, реализуется легко, только вот разницу между двумя пруфами заметить сложно. Метка небольшая, лежит на краю листа и отличается всего несколькими буквами!

Неплохо бы ввести цветовую дифференциацию штанов пруфов. Тем не менее, в Принекте слаг — это просто текст, и его цветом управлять невозможно. А хочется, например, выводить текст слага на крупном, заметном цветном прямоугольнике; причём цвет прямоугольника должен быть разным в зависимости от назначения пруфа. Пора опять расчехлять текстовый редактор и править старый гейдельберговский код.

Я выложил модифицированный HDAG_Slugline.ps, можно скачать и сразу установить его в Мету. Ну и следить за мыслью с кодом в руках проще.

Замечу, что отладка и модификация чужой программы на PostScript — дело непростое. Беда в том, что этот код крепко связан с собственно системой (MetaDimension) и вытащить его в отладчик просто нереально (да и много ли есть отладчиков для PostScript?). Дело усложняется тем, что Мета ничего вразумительного при допущенной в программе ошибке не говорит:

Остаётся только догадываться, что же сейчас находится в стеке, анализировать существующий код и пытаться понять, как он работает. Иначе никак.

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

Для простоты я решил поменять местами пользовательский текст и текущую дату, чтобы рисовать прямоугольник под текстом прямо из точки начала координат слага, не вычисляя длину даты. Не очень красиво, но решение должно быть простым и нетрудоёмким (почему — станет ясно в конце статьи). Проще всего сделать это, поменяв названия функций ut и dt местами. Одна из них выводит как раз дату, а другая — текст слага.

Точка кода, где начинается собственно отрисовка текста слаглайна — сразу после определения функции Slugline. Добавим туда код, рисующий прямоугольник длиной 8 см и высотой 1 см:

 gsave
 newpath
 4 2 moveto
 80 0 rlineto
 0 10 rlineto
 -80 0 rlineto
 closepath 
 grestore

А теперь надо как-то придумать, как передать из кокпита в код информацию: каким цветом мы хотим покрасить прямоугольник. Так как видов пруфов в моей задаче всего два, я решил закодировать эту информацию длиной строки. Если она чётная — пусть прямоугольник будет зелёный, если нечётная — пусть будет красный.

Считаем количество символов в пользовательском тексте. На каждый символ, помещаемый в стек, я увеличиваю на единицу значение новой переменной colortrigger:

/dt
 {
 usertext
   { 
   /colortrigger colortrigger 1 add def
   mark exch 
   sshow
   } forall
 mark space sshow
 } bind def

Осталось добавить проверку на чётность и в зависимости от результата закрашивать прямоугольник нужным цветом:

 gsave
 newpath
 4 2 moveto
 80 0 rlineto
 0 10 rlineto
 -80 0 rlineto
 closepath
 colortrigger 2 mod 0 eq 
 { 0 0.8 0.8 0 setcmykcolor }
 { 0.8 0 0.8 0 setcmykcolor } ifelse
 fill 
 grestore

Вот и всё! Если написать в слаге “Для печати” (чётное количество символов) — будет зелёный маркер. А если написать “Для постпечатки” (нечётное) — будет красный.

Такой грубый способ, конечно, не подойдёт, если нужно различать цветом три или, скажем, восемь видов пруфов (правда, для чего может понадобиться столько пруфов, я не представляю). Если пруфов больше двух, оптимальнее всего передавать информацию в HDAG_SlugTail.ps, например, в первом символе слага. Тогда следует не считать количество символов функции ut, а просто записывать в переменную colortrigger первый знак текста, и анализировать его при отрисовке прямоугольника.

Однако сейчас MetaDimension, как отдельный продукт, всё больше и больше “забывается” компанией Heidelberg. Разработка новых версий идёт крайне вяло, разве что выпускаются патчи, исправляющие совсем критичные ошибки. Вместо Меты активно предлагается новый RIP Prinect Renderer, из которого функционал слаглайнов зачем-то удалён (в версии 2017 точно). Выход из этого положения примерно такой: нужную подпись можно внедрить в пользовательскую шкалу для контроля цвета (Color bar). Сколько видов пруфов — столько и PDF’ок. Вот так просто:

Впрочем, и в Рендерере торчат уши от Меты: HDAG_CropMark.ps образца 1994 года спокойно живёт себе в папке PTConfig\SysConfig\Resources\Marks\StdPS. Нельзя просто так взять и выбросить PostScript legacy code! 🙂