Pencil Tool. Реализация с помощью скрипта. Возможно ли?

  • Автор темы Автор темы KeS))
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

KeS))

Участник
Топикстартер
Сообщения
128
Реакции
0
Pencil Tool. Реализация с помощью скрипта. Возможно ли?
необходимо для рисования небольших рисок шириной в 1 пиксель.
В гайдах не нашел описания данного инструмента, существует ли его поддержка с программной точки зрения.
(к примеру, нарисовать небольшую линию по двум заданным координатам).

либо кто может предложить альтернативы?! (к примеру Stroke в новом слое и удаление лишнего, но... а если координаты начинается с края файла). Т.е. конечно можно сделать новое выделение и удалить лишнее.... но думаю что эту процедуру можно пройти в один шаг, а не в несколько.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Может,попробовать обойтись без скрипта? Попробуйте в экшенах записать нужную инфу указав в числах пропорции, например.
Конкретизируйте ТЗ.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

PHP:
// =======================================================
// Функция для рисования линии текущим активным цветом
// startX, startY – начальные координаты
// endX, endY – конечные координаты
// lineWidth – толшина линии
//
function drawLine(startX, startY, endX, endY, lineWidth) {
var idDraw = charIDToTypeID( "Draw" );
    var desc5 = new ActionDescriptor();
    var idShp = charIDToTypeID( "Shp " );
        var desc6 = new ActionDescriptor();
        var idStrt = charIDToTypeID( "Strt" );
            var desc7 = new ActionDescriptor();
            var idHrzn = charIDToTypeID( "Hrzn" );
            var idRlt = charIDToTypeID( "#Rlt" );
            desc7.putUnitDouble( idHrzn, idRlt, startX );
            var idVrtc = charIDToTypeID( "Vrtc" );
            var idRlt = charIDToTypeID( "#Rlt" );
            desc7.putUnitDouble( idVrtc, idRlt, startY );
        var idPnt = charIDToTypeID( "Pnt " );
        desc6.putObject( idStrt, idPnt, desc7 );
        var idEnd = charIDToTypeID( "End " );
            var desc8 = new ActionDescriptor();
            var idHrzn = charIDToTypeID( "Hrzn" );
            var idRlt = charIDToTypeID( "#Rlt" );
            desc8.putUnitDouble( idHrzn, idRlt, endX );
            var idVrtc = charIDToTypeID( "Vrtc" );
            var idRlt = charIDToTypeID( "#Rlt" );
            desc8.putUnitDouble( idVrtc, idRlt, endY );
        var idPnt = charIDToTypeID( "Pnt " );
        desc6.putObject( idEnd, idPnt, desc8 );
        var idWdth = charIDToTypeID( "Wdth" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc6.putUnitDouble( idWdth, idPxl, lineWidth );
    var idLn = charIDToTypeID( "Ln  " );
    desc5.putObject( idShp, idLn, desc6 );
    var idAntA = charIDToTypeID( "AntA" );
    desc5.putBoolean( idAntA, true );
executeAction( idDraw, desc5, DialogModes.NO );
}
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Upd. Чтобы линия была без антиалиасинга, в предпоследней строчке надо 'true' поменять на 'false'. Ну или вытащить этот аргумент в вызов функции чтобы совсем универсально получилось.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Спасибо, буду пробовать:)

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

осталось теперь и метки зациклить))


PS: Конкретизируйте ТЗ.
Есть файл... который неоходимо побить на несколько равных сегментов с нахлестом между собой. Итог 2,3,4,5 файлов одинаковых по ширине с учетом вводимого нахлеста. Это то что уже готово.
затем рисуются метки... хотя их можно сделать и сразу.. сверху и снизу по небольшой черточке в начале нахлеста...
Применение: при больших пленках для накатки скажем на стекло.. .файл разбивается под ширину печатного материала или ширину удобную монтажникам, затем они по меткам совмещают их между собой по принципу черепицы... слева направо.... т.е.накатали первый левый сегмент (на нем есть две метки), затем накатывают следующий позиционируя его поверх первого по меткам.

Т.е. тех.дизайнеру необходимо сначала высчитать под материал затем проставить направяляющие сделать метки... и поделить файл... Теперь же это делается запуском сприкта (пока без меток) при вводимых значениях кол-ва сегментов и указанием ширины нахлеста.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

ППЦ!

Реперы ставятся сразу. Без всяких скриптов.

Для печати фрагментами тоже есть какой-то индустриальный метод.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Я понимаю, что это все можно сделать в машинном рипе... но у нас производственники с золотыми руками (т.е. руки из золотой жопы растут).

Да и в принципе для больших размеров по длине все просят делить файлик ручками.... к примеру 30м x 9.15м.
Ибо машину может сглючит и выдать ошибку по длине аж до 15 см.

уже все работает, только есть одна заминка.... для DrawLine не соответствует значение в см. Необходимо умножать ещё на приблизительно 1,99. С чем это может быть связано?

ps: коэффициент для см задается как резолюция делимая на 2,54....
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

В текущем виде эта функция рисует исключительно в пикселах, для пересчета в пикселы из миллиметров очевидно придется вводить коэффициенты. Это не баг, это фича.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

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

...
var cm = aDoc.resolution /2.539861719;
...
drawLine (cm*10, 0*cm, cm*10, 1*cm, 1);
...

коэффициент ввожу.... но 10*cm почему-то не равно 10 см.... а равно 13.9 (((
странно, если прогонять через алгоритм то коэффициент другой и в другую сторону...
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Дюйм можно считать за 2,54 см, десяток десятичных знаков теперь вроде не используют :) У меня с коэффициентом получается все честно.

Может быть у вас начало координат в файле сдвинуто относительно верхнего левого угла? Потому что тут действительно есть нюанс, скрипт отсчитывает координаты от этого «подвижного» нуля, а не от физического края изображения.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Координат верны... использую именно то значение (2,5..) так как "эстет" ну либо другое слово. На длинных файлах будет меньшая погрешность.

сначала думал, что что-то меняется в моем алгоритме... ан нет.
ниже привожу скрипт. По идее должен рисовать линию по кординатам 10,0 - 10,1

но нет...

PHP:
var strtRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.CM;

var aDoc = app.activeDocument;

var cm = aDoc.resolution /2.539861719;

drawLine (10*cm, 0*cm, 10*cm, 1*cm, 1); //- рисует линию

function drawLine(startX, startY, endX, endY, lineWidth) { 
var idDraw = charIDToTypeID( "Draw" ); 
    var desc5 = new ActionDescriptor(); 
    var idShp = charIDToTypeID( "Shp " ); 
        var desc6 = new ActionDescriptor(); 
        var idStrt = charIDToTypeID( "Strt" ); 
            var desc7 = new ActionDescriptor(); 
            var idHrzn = charIDToTypeID( "Hrzn" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc7.putUnitDouble( idHrzn, idRlt, startX ); 
            var idVrtc = charIDToTypeID( "Vrtc" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc7.putUnitDouble( idVrtc, idRlt, startY ); 
        var idPnt = charIDToTypeID( "Pnt " ); 
        desc6.putObject( idStrt, idPnt, desc7 ); 
        var idEnd = charIDToTypeID( "End " ); 
            var desc8 = new ActionDescriptor(); 
            var idHrzn = charIDToTypeID( "Hrzn" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc8.putUnitDouble( idHrzn, idRlt, endX ); 
            var idVrtc = charIDToTypeID( "Vrtc" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc8.putUnitDouble( idVrtc, idRlt, endY ); 
        var idPnt = charIDToTypeID( "Pnt " ); 
        desc6.putObject( idEnd, idPnt, desc8 ); 
        var idWdth = charIDToTypeID( "Wdth" ); 
        var idPxl = charIDToTypeID( "#Pxl" ); 
        desc6.putUnitDouble( idWdth, idPxl, lineWidth ); 
    var idLn = charIDToTypeID( "Ln  " ); 
    desc5.putObject( idShp, idLn, desc6 ); 
    var idAntA = charIDToTypeID( "AntA" ); 
    desc5.putBoolean( idAntA, false ); 
executeAction( idDraw, desc5, DialogModes.NO ); 
} 

app.preferences.rulerUnits = strtRulerUnits;

что упускаю? подскажите...
тестирую на новом созданном файле, сливаю слои... юзаю CS4 (не поверите, - лицензия))

итог, есть риска в координате 13,9 см и длиной 1,4 см(
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Просто современный английский дюйм равен 2,54 см. Ровно. Без тысячных и прочих знаков. :)

Результат работы вашего скрипта (CS4):
cmLine.gif

Мистика.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Хотя нет, вру. Дурацкая функция.

Она принимает значения в пикселах для разрешения 72 ppi, а рисует увеличивая пропорционально до текущего разрешения. У вас файл на 100 ppi, т.е. 100/72 = 1,39.

Самое быстрое что можно сделать — поменять разрешение картинки на 72 точки (без ресамплинга конечно), тогда риски будут рисоваться правильно. А на выходе вернуть разрешение обратно.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Английский дюйм или имперский дюйм (англ. inch от лат. uncia — 1/12 часть) с 1958 года приравнивается точно к 2,54 см. Ранее пересчитывался в метрическую систему по-другому...
неужели я такой старый? ))))) не помню почему выбрал именно эту величну, да это и не важно...


Итак, данный скрипт работает адекватно исключительно на 72 точки на дюйм, при другом разрешении имеет коэффициент... ох....

Кто подскажет почему? проблема-то уже известна.

PS: по ходу дела одновременно написали) сохранение разрешения файла необходимо строго сохранять... к примеру если мы переразмерим с 200точек на 72, а затем вернем обратно... или так оставим, будет на айс...
пока буду думать чтоже можно сделать...
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Итак, данный скрипт работает адекватно исключительно на 72 точки на дюйм, при другом разрешении имеет коэффициент... ох....

Кто подскажет почему? проблема-то уже известна.

Это известный баг скриптинга ФШ. В кодах надо добавить функцию пересчета в зависимости от разрешения.

Что касается решения это полный звездец. Рисовать репера карандашом...
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Спасибо всем за помощь... теперь вводя коэффицциент разрешения файла деленное на 72 все отлично.

Zest, почему же звездец?

имеем... кол-во сегментов(K), величину нахлеста (B)

D = W+B*(K-1)
C = D/K

M - коэффициент от резолюции

Q=1; iQ < K; iQ++

guideLine(cm*(iQ*(C-B)), 'Vert' ,'#Pxl');
guideLine(cm*(iQ*C-(iQ-1)*B), 'Vert' ,'#Pxl');

drawLine (cm*(iQ*(C-B))/M, 0*cm, cm*(iQ*(C-B))/M, 1*cm/M, 1);
drawLine (cm*(iQ*(C-B))/M, H*cm/M, cm*(iQ*(C-B))/M, (H-1)*cm/M, 1);


ну и чтобы не быть голословным... сам скрипт(может кому будет полезен)
equal_division_riski.jsx :
PHP:
var strtRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.CM;

var aDoc = app.activeDocument;

var cm = aDoc.resolution /2.539861719;

var H = aDoc.height;
var W = aDoc.width;

var dlg = new Window('dialog', 'Введите параметры');
dlg.frameLocation = [200, 200];

dlg.msgPnl = dlg.add('panel', undefined, 'Параметры');
dlg.msgPnl.alignChildren = "right";
dlg.msgPnl.K = dlg.msgPnl.add('group');
dlg.msgPnl.B = dlg.msgPnl.add('group');

dlg.msgPnl.msgHeight = dlg.msgPnl.add('group');
dlg.msgPnl.selectFolder = dlg.msgPnl.add('group');

with (dlg.msgPnl) {
  K.st = K.add('statictext', undefined, 'Количество равных сегментов:');
  K.et = K.add('edittext', undefined, '3');
  K.et.preferredSize = [40,20];

  B.st = B.add('statictext', undefined, 'Нахлест:');
  B.et = B.add('edittext', undefined, '1');
  B.et.preferredSize = [40,20];

};

var bolUserCancel = false;
dlg.buttons2 = dlg.add('group');

dlg.buttons2.btnClose = dlg.buttons2.add("button",undefined , "Ok" );
dlg.buttons2.btnClose.onClick = function() { this.parent.close(0);  };
dlg.buttons2.btnCancel = dlg.buttons2.add("button",undefined , "Cancel" );
dlg.buttons2.btnCancel.onClick = function() { bolUserCancel = true; this.parent.close(0); };

dlg.show();

var K = parseFloat (dlg.msgPnl.K.et.text);
var B = parseFloat (dlg.msgPnl.B.et.text);

delete dlg;

clearGuides(); 

var D = W+B*(K-1)
var C = D/K

var M = aDoc.resolution/72

var foreColor = new SolidColor(); 
foreColor.cmyk.cyan = 0; 
foreColor.cmyk.magenta = 0; 
foreColor.cmyk.yellow = 0; 
foreColor.cmyk.black = 40; 

app.foregroundColor = foreColor; 


for (var iQ=1; iQ < K; iQ++) {

guideLine(cm*(iQ*(C-B)), 'Vert' ,'#Pxl');
guideLine(cm*(iQ*C-(iQ-1)*B), 'Vert' ,'#Pxl'); 

drawLine (cm*(iQ*(C-B))/M, 0*cm, cm*(iQ*(C-B))/M, 1*cm/M, 1);
drawLine (cm*(iQ*(C-B))/M, H*cm/M, cm*(iQ*(C-B))/M, (H-1)*cm/M, 1);

}
function guideLine(position, type,unit) { 
    var desc = new ActionDescriptor(); 
        var desc2 = new ActionDescriptor(); 
        desc2.putUnitDouble( charIDToTypeID('Pstn'), charIDToTypeID(unit), position); 
        desc2.putEnumerated( charIDToTypeID('Ornt'), charIDToTypeID('Ornt'), charIDToTypeID(type) ); 
    desc.putObject( charIDToTypeID('Nw  '), charIDToTypeID('Gd  '), desc2 ); 
    executeAction( charIDToTypeID('Mk  '), desc, DialogModes.NO ); 
}; 
function clearGuides() { 
   var id556 = charIDToTypeID( "Dlt " ); 
       var desc102 = new ActionDescriptor(); 
       var id557 = charIDToTypeID( "null" ); 
           var ref70 = new ActionReference(); 
           var id558 = charIDToTypeID( "Gd  " ); 
           var id559 = charIDToTypeID( "Ordn" ); 
           var id560 = charIDToTypeID( "Al  " ); 
           ref70.putEnumerated( id558, id559, id560 ); 
       desc102.putReference( id557, ref70 ); 
   executeAction( id556, desc102, DialogModes.NO ); 
};
function drawLine(startX, startY, endX, endY, lineWidth) { 
var idDraw = charIDToTypeID( "Draw" ); 
    var desc5 = new ActionDescriptor(); 
    var idShp = charIDToTypeID( "Shp " ); 
        var desc6 = new ActionDescriptor(); 
        var idStrt = charIDToTypeID( "Strt" ); 
            var desc7 = new ActionDescriptor(); 
            var idHrzn = charIDToTypeID( "Hrzn" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc7.putUnitDouble( idHrzn, idRlt, startX ); 
            var idVrtc = charIDToTypeID( "Vrtc" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc7.putUnitDouble( idVrtc, idRlt, startY ); 
        var idPnt = charIDToTypeID( "Pnt " ); 
        desc6.putObject( idStrt, idPnt, desc7 ); 
        var idEnd = charIDToTypeID( "End " ); 
            var desc8 = new ActionDescriptor(); 
            var idHrzn = charIDToTypeID( "Hrzn" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc8.putUnitDouble( idHrzn, idRlt, endX ); 
            var idVrtc = charIDToTypeID( "Vrtc" ); 
            var idRlt = charIDToTypeID( "#Rlt" ); 
            desc8.putUnitDouble( idVrtc, idRlt, endY ); 
        var idPnt = charIDToTypeID( "Pnt " ); 
        desc6.putObject( idEnd, idPnt, desc8 ); 
        var idWdth = charIDToTypeID( "Wdth" ); 
        var idPxl = charIDToTypeID( "#Pxl" ); 
        desc6.putUnitDouble( idWdth, idPxl, lineWidth ); 
    var idLn = charIDToTypeID( "Ln  " ); 
    desc5.putObject( idShp, idLn, desc6 ); 
    var idAntA = charIDToTypeID( "AntA" ); 
    desc5.putBoolean( idAntA, false ); 
executeAction( idDraw, desc5, DialogModes.NO ); 
} 

app.preferences.rulerUnits = strtRulerUnits;
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

имеем... кол-во сегментов(K), величину нахлеста (B)

Есть же векторные прямоугольники. Изобразите репера на исходном изображении согласно размеру и количеству кусков и режьте на это количество с перехлестом чтобы репера вошли в куски.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

до хера действий... а так работает все быстро и аккуратно. )))
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

Вам уже ничего не поможет, а для тех кто читает ответ: дохера действий требуется чтобы рисовать реперы карандашом. А чтобы их изобразить селекцией это ровно 1 команда. Чтобы залить по селекции - еще команда.
 
Ответ: Pencil Tool. Реализация с помощью скрипта. Возможно ли?

так уже всего ОДНА команда, которая делает всю необходимое... к примеру чтобы разбить на 12 равных частей... сколько затрат по времени... я понимаю что скорость передвижения рук тоже зависит, но мне по данному скрипту проще... это как раз то, что хотят на входе в следующем отделе.
 
Статус
Закрыто для дальнейших ответов.