Математики рисуют

В каком графическом редакторе надо рисовать странички? А как вы думаете, какую технику стоит выбрать при создании обычных картин - масло, акварель, уголь или цветные карандаши? Каждый выбирает то, что ему по душе. Так и с графическими редакторами. Лично я предпочитаю редактор Macromedia Fireworks. Выбор был не совсем случаен – я уважаю эту фирму и все, что она делает. Скажем, Macromedia Dreamweaver стал для меня первым и самым любимым инструментом для создания сайтов. Более того, я считаю его единственным визуальным редакторок HTML-страниц, генерирующим нормальный код. Никакие FrontPage’ы и рядом не лежали. Впрочем, по некоторым причинам, сам я им пользуюсь редко, но об этом как-нибудь в следующий раз.

Пока же вернемся к нашим баранам, то есть к графическим редакторам. Терпеть не могу рисовать однотипные элементы. Просто не-на-ви-жу! Посмотрите на нарисованные справа желтенькие полосочки c надписями «Архив», «Последние 5 записок» и т.д. (это было справедливо для старого дизайна). Вот их рисовать – самое муторное дело, они должны быть одинакового размера, одинакового цвета, надписи должны быть выполнены одним размером шрифта и отступ текста от края всегда должен быть выверен с точностью до пикселя. Впрочем, могло быть и хуже, например, закругленные рамки, градиентная заливка…

В один прекрасный день, меня окончательно вывела из себя процедура установки всех этих параметров, и я решил жизнь себе облегчить. Для этого были взят любимый редактор Macromedia Fireworks 4.0 и ценнейший документ «Extending Fireworks».

Итак, меню Commands, там пункты Convert to Grayscales, Convert to Sepia Tone и т.д. Это не что иное, как программы, написанные на JavaScript. Их можно выполнить в редакторе, а исходные тексты находятся в каталоге «основной каталог Fireworks»\Configuration\Commands

Вопрос теперь в том, как создавать эти программы. Легче всего, поверьте мне, делать это визуально. Для этого зайдем в окно History (Shift+F10):

история

В этом окне последние несколько команд, выполненных в редакторе. Выделяем те, которые нас интересуют, жмем на иконку save и вводим имя файла. Все, теперь разглядываем исходый код нашей «программы», при необходимости консультируясь в «Extending Fireworks» о назначении того или иного параметра. А параметров таких будет много, очень много, очень-очень много. Положим, линию надо провести. Но для этого надо задать кисть (brush), а делается это приблизительно вот так:

doc.pathAttributes.brush = {
    alphaRemap:"none",
    angle:0,
    antiAliased:false,
    aspect:100,
    blackness:0,
    category:"bc_Pencil",
    concentration:100,
    diameter:s,
    feedback:"none",
    flowRate:0,
    maxCount:15,
    minSize:1,
    name:"1-Pixel Soft",
    shape:"circle",
    softenMode:"bell curve",
    softness:2,
    spacing:15,
    textureBlend:0,
    textureEdge:0,
    tipColoringMode:"random",
    tipCount:1,
    tipSpacing:0,
    tipSpacingMode:"random",
    type:"simple"
};

Супер!!!

Разумеется, не все, что необходимо, можно получить таким образом. Цикл или функцию визуально, увы, не создать :) Их придется делать ручками, благо синтаксис Java Script довольно прост. Вот, скажем, как выглядит программа для рисования «звездного неба»:

var cnt = prompt("Количество звездочек:");
var doc = fw.getDocumentDOM();

for (i=0;i<cnt;i++){ var x = Math.random()doc.width; var y = Math.random()doc.height; var s = Math.random()*3+1; drawStar(x,y,s) }

function drawStar(x,y,s){ doc.pathAttributes.brush = { alphaRemap:"none", angle:0, antiAliased:false, aspect:100, blackness:0, category:"bc_Pencil", concentration:100, diameter:s, feedback:"none", flowRate:0, maxCount:15, minSize:1, name:"1-Pixel Soft", shape:"circle", softenMode:"bell curve", softness:2, spacing:15, textureBlend:0, textureEdge:0, tipColoringMode:"random", tipCount:1, tipSpacing:0, tipSpacingMode:"random", type:"simple" }; doc.pathAttributes.brushColor = "#ffffff"; doc.addNewLine({x:x, y:y}, {x:x, y:y}); }

Небольшой комментарий – уже очень давно у меня на компьютере прописался супер-источник знаний – Microsoft Developer Network (MSDN) Library. Ищите там раздел «JScript Language Reference», где есть все, что касается Java Script. Функция Math.random() была взята не с потолка, а именно оттуда.

А вот результат работы программы:

Немного усложняем, добавив «падающие звезды»:

Побаловавшись с параметрами можно получить неожиданные результаты:

А сейчас на бис, обещанные кнопки:

var text = prompt("Что писать изволите:","Super-Puper Button");
var doc  = fw.getDocumentDOM();

doc.pathAttributes.brush = { alphaRemap:"none", angle:0, antiAliased:false, aspect:100, blackness:0, category:"bc_Pencil", concentration:100, diameter:30, feedback:"none", flowRate:0, maxCount:15, minSize:1, name:"1-Pixel Soft", shape:"circle", softenMode:"bell curve", softness:5, spacing:15, textureBlend:0, textureEdge:0, tipColoringMode:"random", tipCount:1, tipSpacing:0, tipSpacingMode:"random", type:"simple" }; doc.pathAttributes.brushColor = "#ffffff"; doc.addNewLine({x:30, y:90}, {x:170, y:90});

doc.pathAttributes.brush = { alphaRemap:"none", angle:0, antiAliased:false, aspect:100, blackness:0, category:"bc_Pencil", concentration:100, diameter:26, feedback:"none", flowRate:0, maxCount:15, minSize:1, name:"1-Pixel Soft", shape:"circle", softenMode:"bell curve", softness:5, spacing:15, textureBlend:0, textureEdge:0, tipColoringMode:"random", tipCount:1, tipSpacing:0, tipSpacingMode:"random", type:"simple" };

doc.pathAttributes.brushColor = "#000000"; doc.addNewLine({x:30, y:90}, {x:170, y:90}); doc.addNewText({left:35, top:100, right:170, bottom:106}, true); doc.setFillEdgeMode("antialias", 0); doc.setTextAutoKern(true); doc.setTextAntiAliasing("smooth"); doc.setTextOrientation("horizontal left to right");

doc.setTextRuns({ initialAttrs:{ alignment:"center", baselineShift:0, bold:true, face:"Arial", fillColor:"#ffffff", horizontalScale:1, italic:false, leading:1, leadingMode:"percentage", rangeKerning:0, size:"14pt", underline:false }, textRuns:[ { changedAttrs:{ }, characters:text } ] }); doc.setTextRectangleAutoFromPoint({x:35, y:70}); doc.setTextRectangle({left:35, top:100, right:170, bottom:106}); doc.moveSelectionTo({x:35, y:83}, false, false);

И результат:

Теперь можете скачать себе и внимательно рассмотреть все использованные выше скрипты: