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

В каком графическом редакторе надо рисовать странички? А как вы
думаете, какую технику стоит выбрать при создании обычных картин -
масло, акварель, уголь или цветные карандаши? Каждый выбирает то, что
ему по душе. Так и с графическими редакторами. Лично я предпочитаю
редактор 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);

И результат:



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

Комментирование закрыто.