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

Статус
Закрыто для дальнейших ответов.

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
Наткнулся на очередную странность.
Допустим, требуется создать новый файл ровно в 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'
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
В CS6 работает и так и так. Только в первом случае, док создается как бы сверху вниз (визуально), а во втором, вверх и вправо. Почему? Не дам ответ, очень сегодня туп. Но может, эта инфа тебя на что-нить натолкнет.
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
Чуть конкретизируем задачу
Код:
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
 

similideus

12 лет на форуме
Сообщения
671
Реакции
349
После выполнения addDocument(sett.title,sett) создается новый документ и становится активным. После этого ссылка ad начинает указывать на него и в ar попадают координаты не исходного документа, а jpgdoc.
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
Я думаю, что, скорее всего так. Адобе жешь =)
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
После этого ссылка ad начинает указывать на него и в ar попадают координаты не исходного документа, а jpgdoc.
Да ну как то неубедительно совсем
ad потом используется и явно видно, что они с jpgdoc не эквивалентны
 

similideus

12 лет на форуме
Сообщения
671
Реакции
349
В 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
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
Ну в принципе активирование 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);
Но все равно с логической точки зрения объяснить это невозможно :(
 

similideus

12 лет на форуме
Сообщения
671
Реакции
349
как то неубедительно
Код:
alert( app.activeDocument.name ); // --> src_doc.ai

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

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

Но это не самое страшное :) Не смотря на то, что в 'ad' по прежнему хранится правильная ссылка на исходный документ, 'ad.artboards[0]' указывает на артборд нового документа.
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
Но это не самое страшное
Это как раз не страшно, это понятно и логично - при создании нового документа он становится активным.
А вот то что это действие за каким то лешим меняет артбоард (хоть и временно в памяти) другого документа - уразуметь не могу '\:E@@@'
 

similideus

12 лет на форуме
Сообщения
671
Реакции
349
Документ становится активным, но переменная 'ad' по прежнему хранит ссылку на исходный документ! Так какого лешего при обращении к его свойству Иллюстратор переинициализирует 'ad'?
Код:
alert( ad + ", " + ad.artboards[0].name ); // меняется только вторая часть
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
Документ становится активным, но переменная 'ad' по прежнему хранит ссылку на исходный документ!
ad и должно хранить ссылку на исходный документ
Или вы думаете что при такой инициализации ad всегда должно хранить ссылку на активный документ при любых действиях?
Ничего подобного, ибо если бы было так, то не существовало бы способа хранить ссылку на самый первоначальный открытый документ. А вот то, что открытие и создание новых документов скриптингу (и плагинам кстати тоже) крышу рвет, я заметил давно и даже писал об этом и сюда и даже в адобовское комьюнити. Как обычно развели руками и посоветовали не делать так 'P:E'
 

similideus

12 лет на форуме
Сообщения
671
Реакции
349
ad и должно хранить ссылку на исходный документ
'ad.artboards[0]' указывает на артборд нового документа
это понятно и логично
;)

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

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
В Индизайне наворотили систему текстовых спецификаторов, которые не связаны жестко с объектами а ресолвятся при обращении.
Вот это как раз совсем нелогично
Но в индизайне хоть весь этот цирк более менее надежно и предсказуемо работает, а тут сплошне танцы с бубном при каждом переключении на новый документ 'P:E'
 

Ladygin Alexander

Участник
Сообщения
12
Реакции
4
Я хз че за магия происходит когда создаешь что-то новое (например: документ, артбоард, группу и т.п.), но с переменами типа [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;
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844

Ladygin Alexander

Участник
Сообщения
12
Реакции
4
Пример отличается тем, что данные монтажной области были записаны в переменную перед созданием нового документа. Суть в том, чтобы ссылаться не к объекту, а оперировать только чистыми данными.

Еще странностей, если после выполнения скрипта, закрыть созданный, посредством скрипта, документ ["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]​
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 187
Реакции
10 844
Пример отличается тем, что данные монтажной области были записаны в переменную перед созданием нового документа. Суть в том, чтобы ссылаться не к объекту, а оперировать только чистыми данными.
А смысл заводить дополнительный новый массив, если ar - такие же чистые данные?
 
Статус
Закрыто для дальнейших ответов.