[AI CS4-CS6] Баг при задании артбоарда

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

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
34 057
Реакции
11 159
Наткнулся на очередную странность.
Допустим, требуется создать новый файл ровно в 10 раз больший исходного:
Код:
 var ad=app.activeDocument;
var sett = new DocumentPreset();
 sett.colorMode = DocumentColorSpace.RGB;
 sett.rasterResolution = DocumentRasterResolution.ScreenResolution;
 sett.units=RulerUnits.Pixels;
  sett.title="tmpjpg";
 
var ar=[ad.artboards[0].artboardRect[0]*10,
      ad.artboards[0].artboardRect[1]*10,
     ad.artboards[0].artboardRect[2]*10,
      ad.artboards[0].artboardRect[3]*10];
 
  var jpgdoc = app.documents.addDocument(sett.title,sett);
 
  jpgdoc.activate();
 
  jpgdoc.artboards[0].artboardRect=ar;
Но стоит легким движением мыши переставить местами две не зависящих друг от друга строки - уже не работает:
Код:
 var ad=app.activeDocument;
var sett = new DocumentPreset();
 sett.colorMode = DocumentColorSpace.RGB;
 sett.rasterResolution = DocumentRasterResolution.ScreenResolution;
 sett.units=RulerUnits.Pixels;
  sett.title="tmpjpg";

  var jpgdoc = app.documents.addDocument(sett.title,sett);

var ar=[ad.artboards[0].artboardRect[0]*10,
      ad.artboards[0].artboardRect[1]*10,
     ad.artboards[0].artboardRect[2]*10,
      ad.artboards[0].artboardRect[3]*10];


  jpgdoc.activate();

  jpgdoc.artboards[0].artboardRect=ar;
Кто нибудь может мне объяснить данную особенность с точки зрения Рамы? 'otbline'
 
В CS6 работает и так и так. Только в первом случае, док создается как бы сверху вниз (визуально), а во втором, вверх и вправо. Почему? Не дам ответ, очень сегодня туп. Но может, эта инфа тебя на что-нить натолкнет.
 
Чуть конкретизируем задачу
Код:
var ad=app.activeDocument;
var sett = new DocumentPreset();
 sett.colorMode = DocumentColorSpace.RGB;
 sett.rasterResolution = DocumentRasterResolution.ScreenResolution;
 sett.units=RulerUnits.Pixels;
  sett.title="tmpjpg";
 alert(ad.artboards[0].artboardRect);

 
  var jpgdoc = app.documents.addDocument(sett.title,sett);
 
  var ar=[ad.artboards[0].artboardRect[0]*10,
      ad.artboards[0].artboardRect[1]*10,
     ad.artboards[0].artboardRect[2]*10,
      ad.artboards[0].artboardRect[3]*10];
 alert(ar);
  jpgdoc.activate();
 
  jpgdoc.artboards[0].artboardRect=ar;
Первый алерт:
upload_2017-3-16_12-35-36.png

второй
upload_2017-3-16_12-35-59.png
 
После выполнения addDocument(sett.title,sett) создается новый документ и становится активным. После этого ссылка ad начинает указывать на него и в ar попадают координаты не исходного документа, а jpgdoc.
 
Я думаю, что, скорее всего так. Адобе жешь =)
 
После этого ссылка ad начинает указывать на него и в ar попадают координаты не исходного документа, а jpgdoc.
Да ну как то неубедительно совсем
ad потом используется и явно видно, что они с jpgdoc не эквивалентны
 
В CS5 у меня получается вот так. Два варианта соответственно:
Код:
ad.artboards[0]: 0,0,10,-10
ar: 0,0,100,-100
jpgdoc.artboards[0]: 0,792,612,0
+jpgdoc.artboards[0]: 0,0,100,-100


ad.artboards[0]: 0,0,10,-10
jpgdoc.artboards[0]: 0,792,612,0
ar: 0,7920,6120,0
+jpgdoc.artboards[0]: 0,7920,6120,0
 
Ну в принципе активирование ad после создания проблему решает
Код:
var ad=app.activeDocument;
var sett = new DocumentPreset();
 sett.colorMode = DocumentColorSpace.RGB;
 sett.rasterResolution = DocumentRasterResolution.ScreenResolution;
 sett.units=RulerUnits.Pixels;
  sett.title="tmpjpg";
 alert(ad.artboards[0].artboardRect);

 
  var jpgdoc = app.documents.addDocument(sett.title,sett);
  ad.activate(); 
  var ar=[ad.artboards[0].artboardRect[0]*10,
      ad.artboards[0].artboardRect[1]*10,
     ad.artboards[0].artboardRect[2]*10,
      ad.artboards[0].artboardRect[3]*10];
 alert(ar);
  jpgdoc.activate();
 
  jpgdoc.artboards[0].artboardRect=ar;
  alert(jpgdoc.artboards[0].artboardRect);
Но все равно с логической точки зрения объяснить это невозможно :(
 
как то неубедительно
Код:
alert( app.activeDocument.name ); // --> src_doc.ai

var jpgdoc = app.documents.addDocument( sett.title, sett );

alert( app.activeDocument.name ); // --> tmpjpg

Но это не самое страшное :) Не смотря на то, что в 'ad' по прежнему хранится правильная ссылка на исходный документ, 'ad.artboards[0]' указывает на артборд нового документа.
 
Но это не самое страшное
Это как раз не страшно, это понятно и логично - при создании нового документа он становится активным.
А вот то что это действие за каким то лешим меняет артбоард (хоть и временно в памяти) другого документа - уразуметь не могу '\:E@@@'
 
Документ становится активным, но переменная 'ad' по прежнему хранит ссылку на исходный документ! Так какого лешего при обращении к его свойству Иллюстратор переинициализирует 'ad'?
Код:
alert( ad + ", " + ad.artboards[0].name ); // меняется только вторая часть
 
Документ становится активным, но переменная 'ad' по прежнему хранит ссылку на исходный документ!
ad и должно хранить ссылку на исходный документ
Или вы думаете что при такой инициализации ad всегда должно хранить ссылку на активный документ при любых действиях?
Ничего подобного, ибо если бы было так, то не существовало бы способа хранить ссылку на самый первоначальный открытый документ. А вот то, что открытие и создание новых документов скриптингу (и плагинам кстати тоже) крышу рвет, я заметил давно и даже писал об этом и сюда и даже в адобовское комьюнити. Как обычно развели руками и посоветовали не делать так 'P:E'
 
ad и должно хранить ссылку на исходный документ
'ad.artboards[0]' указывает на артборд нового документа
это понятно и логично
;)

всегда должно хранить ссылку
В Индизайне наворотили систему текстовых спецификаторов, которые не связаны жестко с объектами а ресолвятся при обращении.
 
В Индизайне наворотили систему текстовых спецификаторов, которые не связаны жестко с объектами а ресолвятся при обращении.
Вот это как раз совсем нелогично
Но в индизайне хоть весь этот цирк более менее надежно и предсказуемо работает, а тут сплошне танцы с бубном при каждом переключении на новый документ 'P:E'
 
Я хз че за магия происходит когда создаешь что-то новое (например: документ, артбоард, группу и т.п.), но с переменами типа [artboardRect], [visible, geometric - bound] бывают проблемы они каким-то образом могут меняться, в общем советую не использовать прямую наследственность, а сохранять данные в переменную.

Бывало еще и такое что сохранил вроде бы в переменную какой-нибудь объект имеющий массив данных, а потом с этим массивом проблемы появляются, но если прогнать объект через цикл и вытащить каждый элемент массива в чистый массив то все работает как надо. (Например (пример условный):

var correctData = (function(){ // вытаскиваем значения массива
var magicData = myObjectArray, // массив с которым могут быть проблемы
i = magicData.length,
arr = [];
while (i--) arr.push(magicData);
return arr.reverse(); // массив с которым проблем не было
}());

);


Вот пример:
var ad=app.activeDocument;
var sett = new DocumentPreset();
sett.colorMode = DocumentColorSpace.RGB;
sett.rasterResolution = DocumentRasterResolution.ScreenResolution;
sett.units=RulerUnits.Pixels;
sett.title="tmpjpg";

var rect = ad.artboards[0].artboardRect;

var jpgdoc = app.documents.addDocument(sett.title,sett);


var ar=[rect[0]*10, rect[1]*10, rect[2]*10, rect[3]*10];

// var jpgdoc = app.documents.addDocument(sett.title,sett);

jpgdoc.activate();

jpgdoc.artboards[0].artboardRect=ar;
 
Пример отличается тем, что данные монтажной области были записаны в переменную перед созданием нового документа. Суть в том, чтобы ссылаться не к объекту, а оперировать только чистыми данными.

Еще странностей, если после выполнения скрипта, закрыть созданный, посредством скрипта, документ ["tmpjpg"] и активировать предыдущий документ, после чего заново запустить скрипт, то выйдет ошибка: Error 1200: an Illustrator error occurred: 1346458189 ('PARM'). Но если не переходить на документ откуда запускался скрипт то данный скрипт будет работать исправно - без ошибки.

Вот пример с ошибкой 1346458189('PARM'):
Magic_Artboard.gif

var ad = app.activeDocument,
sett = new DocumentPreset();

sett.colorMode = DocumentColorSpace.RGB;
sett.rasterResolution = DocumentRasterResolution.ScreenResolution;
sett.units = RulerUnits.Pixels;
sett.title = 'tmpjpg';

alert(ad.artboards[0].parent); // [Document Untitled-1]

var jpgdoc = app.documents.addDocument(sett.title,sett);

alert(ad.artboards[0].parent); // [Document tmpjpg]

var ar = [
ad.artboards[0].artboardRect[0]*10,
ad.artboards[0].artboardRect[1]*10,
ad.artboards[0].artboardRect[2]*10,
ad.artboards[0].artboardRect[3]*10
];


jpgdoc.activate();

jpgdoc.artboards[0].artboardRect = ar;

После выполнения скрипта закрываем созданный документ и выполняем еще раз - получаем ошибку, т.е. получить родителя артбоарда мы уже не можем.​


Вот рабочий пример:

var ad = app.activeDocument,
sett = new DocumentPreset(),
rect = ad.artboards[0].artboardRect; // объявляем данные артбоарда, а не сам артбоард

sett.colorMode = DocumentColorSpace.RGB;
sett.rasterResolution = DocumentRasterResolution.ScreenResolution;
sett.units = RulerUnits.Pixels;
sett.title = 'tmpjpg';

alert(rect); // [0,0,100,-100]

var jpgdoc = app.documents.addDocument(sett.title,sett);

alert(rect); // [0,0,100,-100]

var ar = [
rect[0] * 10,
rect[1] * 10,
rect[2] * 10,
rect[3] * 10
];


jpgdoc.activate();

jpgdoc.artboards[0].artboardRect = ar; // [0,0,1000,-1000]​
 
Пример отличается тем, что данные монтажной области были записаны в переменную перед созданием нового документа. Суть в том, чтобы ссылаться не к объекту, а оперировать только чистыми данными.
А смысл заводить дополнительный новый массив, если ar - такие же чистые данные?
 
Статус
Закрыто для дальнейших ответов.