Помощь - Поиск - Пользователи - Календарь
Полная версия: Как определить HiResBoundingBox документа AI 10 (VB)?
ProDTP > Графика и препресс > Скриптинг
steve
Нужно получить размеры "документа". Документ может содержать маски.
VisibleBounds - выдает максимальный размер включая элементы под маской.

Можно конечно прочитать HiResBoundingBox из файла напрямую, но хотелось бы через через скрипт.
Проблема в том, что группы могут содержать другие группы + группу с маской (clipped).

Вообще, конечно странно, что Адобовцы не сделали ифно-теги документа. :-x
vd
Есть два способа. (в VB перевдешь...)

1. Рекурсивный поиск границ всех объектов документа (включая маски)
Легко сделать на основе движка Smart Align

Код


// Select All

for(i=0; i


// Searching Bounds

mySelection = activeDocument.selection;

if ((mySelection instanceof Array) && (mySelection.length > 0)) {

    bounds = getBounds(mySelection[0]);

    for(i=1; i
 abounds = getBounds(mySelection[i]);

 if( bounds[0] > abounds[0] ) bounds[0] = abounds[0];

 if( bounds[1] < abounds[1] ) bounds[1] = abounds[1];

 if( bounds[2] < abounds[2] ) bounds[2] = abounds[2];

 if( bounds[3] > abounds[3] ) bounds[3] = abounds[3];

    }

}



// Deselect all

activeDocument.selection = null;



// Showing Info

alert(\"Bounds: \"

    + bounds[0] + \", \"

    + bounds[1] + \", \"

    + bounds[2] + \", \"

    + bounds[3] );





function getBounds(obj) {

    var vbounds = new Array();



    if( obj.typename == 'TextFrame' ) {

 objcopy=obj.duplicate().createOutline();

 vbounds = objcopy.visibleBounds;

 objcopy.remove();

    }

    else if( (obj.typename == 'GroupItem') && !obj.clipped ) {

 vbounds = getBounds(obj.pageItems[0]);

 for( n=1; n
     vgb = getBounds(obj.pageItems[n]);

     if( vbounds[0] > vgb[0] ) vbounds[0] = vgb[0];

     if( vbounds[1] < vgb[1] ) vbounds[1] = vgb[1];

     if( vbounds[2] < vgb[2] ) vbounds[2] = vgb[2];

     if( vbounds[3] > vgb[3] ) vbounds[3] = vgb[3];

 }

    }

    else if( (obj.typename == 'GroupItem') && obj.clipped && (obj.pageItems.length > 1) ) {

 vbounds = getBounds(obj.pageItems[0]);

 

 cvgb = getBounds(obj.pageItems[1]);

 objleft = cvgb[0];

 objtop = cvgb[1];

 objright = cvgb[2];

 objbottom = cvgb[3];

 

 obj.pageItems[0].stroked ? so = 0 : so = 1;

 for( n=so; n
     cvgb = getBounds(obj.pageItems[n]);

     if( objleft > cvgb[0] ) objleft = cvgb[0];

     if( objtop < cvgb[1] ) objtop = cvgb[1];

     if( objright < (cvgb[2]) ) objright = cvgb[2];

     if( objbottom > (cvgb[3]) ) objbottom = cvgb[3];

 }

 if( vbounds[0] < objleft ) vbounds[0] = objleft;

 if( vbounds[1] > objtop ) vbounds[1] = objtop;

 if( vbounds[2] > objright ) vbounds[2] = objright;

 if( vbounds[3] < objbottom ) vbounds[3] = objbottom;

    }

    else {

 vbounds = obj.visibleBounds;

    }



    return vbounds;

}



Только стоит учесть что bounds это массив границ (left,top,right,bottom)
И немного могут отличаться значения. (Я особо не тестировал)


2. Выколупать этот HiResBoundingBox прямо из хедера дока (тоже через скрипт)  :evil:
(док должен быть сохранен)

Код


var f = activeDocument.fullName;



if(f.open(\"read\")) {

    flow = true;

    while(flow) {

 str = f.readln();

 if( str.indexOf(\"%%HiResBoundingBox\") >= 0 ) {

     val = str.split(\": \",2);

     bounds = val[1].split(\" \");



     flow = false;

 }

    }

    alert(\"Bounds: \"

 + bounds[0] + \", \"

 + bounds[1] + \", \"

 + bounds[2] + \", \"

 + bounds[3] );

}



Все просто.


Это сообщение было отредактировано:  vd, 18 Сен, 2004 - 13:51
vd
arhip сделай че нить с тэгом [code] !! оно все через строчку гонит...  :-O
steve
Спасибо за код :-) (я уже посмотрел соурса Smart Align v. 0.1)
Всё-таки читать HiresBound - быстрее и правильнее.  К примеру, если в доке будет 20.000 объектов, быстрее прочитать Hires (1 строка).
vd
Цитата
Всё-таки читать HiresBound - быстрее и правильнее


ну второй варант...

а вообще все зависит от общей задачи скрипта (о которой ни слова не сказано), зная которую можно рассуждать что быстрее, а что правильнее... так?
steve
Задача такая: есть куча файлов (ai/tif), нужно сгенерить превьюхи на одноцветном фоне. Фон должен быть на 3 мм больше, чем объекты. Поэтому надо читать hiresBound. Думаю никто спорить не станет, что прочитать 1 строчку быстрее чем перебирать все объекты в доке, читать их VisBound, сравнивать и в итоге получить искомое значение hiresBound`а.
Я уже всё сделал, осталось с опциями экспорта в jpg разобратся.
Кстати, вот еще один вопрос: в jpegExportOptions нет ни слова как указать resolution/color model. Как задать эти параметры?
arhip
Цитата
...в jpegExportOptions нет ни слова как указать resolution/color model. Как задать эти параметры?

Я JavaScript не знаю, но вспомнился подобный вопрос с экспортом в PSD. Тогда Влад (vd) выяснил, что разрешение не задается в скрипте (или - задается, но параметр не срабатывает), а значение берется то, которое было задано последним в диалоге экспорта. Как бы тут не вышла та же история...
Влад, что скажешь?
vd
Цитата
Задача такая: есть куча файлов (ai/tif), нужно сгенерить превьюхи на одноцветном фоне. Фон должен быть на 3 мм больше, чем объекты. Поэтому надо читать hiresBound. Думаю никто спорить не станет, что прочитать 1 строчку быстрее чем перебирать все объекты в доке, читать их VisBound, сравнивать и в итоге получить искомое значение hiresBound`а.


В этой эхе не спорят  :-D

Цитата

Я уже всё сделал, осталось с опциями экспорта в jpg разобратся.
Кстати, вот еще один вопрос: в jpegExportOptions нет ни слова как указать resolution/color model. Как задать эти параметры?


на сколько я понял это реализовано через Save For Web (судя по набору свойств)
color model судя по всему только rgb
resolution 72 dpi...

но там есть свойства verticalScale, horisontalScale...
steve
>>на сколько я понял это реализовано через Save For Web (судя по набору свойств)
color model судя по всему только rgb
resolution 72 dpi...<<

Хм.. а где save for web? В guide и в object невидно :-?
Получается "Save for web" только через action? (но тогда нельзя менять параметры экспорта). А для Ила10 нет чего-то похожего на scriptlistener (как в 7 Фотошопе)?
vd
это я просто думаю что save for web используется скриптовым движком илла для для экспорта джипегов (нет ни колор модел, ни резолюшн)

а код примера сохранения вот он:

// This script exports the current document as a JPEG with specific options
if ( app.documents.length > 0 )
{
    var exportOptions = new ExportOptionsJPEG();
    var type = ExportType.JPEG;
    var fileSpec = new File("~/sample.jpg");
    exportOptions.antiAliasing = false;
    exportOptions.qualitySetting = 70;
    app.activeDocument.exportFile( fileSpec, type, exportOptions );
}



Цитата
А для Ила10 нет чего-то похожего на scriptlistener (как в 7 Фотошопе)?


вродь нету... (да много чего нету)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2012 Invision Power Services, Inc.

Реклама

   Rambler's Top100    Яндекс цитирования