[AI CC-CC2022] Как получить "абсолютную" ссылку на объект из выделения?

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Здравствуйте! Вопрос такой. В документе выделен один объект - группа. Понятно, что ссылку на него можно получить так
JavaScript:
app.activeDocument.selection[0]
А как получить из выделения "абсолютную" ссылку, типа
Код:
app.activeDocument.layers[такой-то].groupItems[такой-то]
чтобы потом обращаться к этой группе именно таким способом. Заранее спасибо.
 
Ну вообще говоря, у каждого обьекта есть parent. Или вам именно layer надо?
 
Нет, не обязательно. Подойдет любая ссылка. Кроме selection.
 
Собственно, в этом и вопрос. Можно ли как-нибудь ссылку на выделенный объект сделать не через selection, чтобы потом после отмены выделения иметь возможность обращаться к этому объекту? Ну ка-бы конвертировать локальную ссылку в абсолютную.
 
Не, не пойму. Любая ссылка на pageItem абсолютная
 
Имеется ввиду альтернативный вариант ссылки на выделенный объект. Не через activeDocument.selection, а другой возможный способ доступа к выделению. Я так понимаю, что такого варианта нет.
 
Рисуем прямоугольничек. Выделяем. Запускаем

Код:
var bbb = new Array();

aaa=app.activeDocument.selection[0];
bbb.push(aaa);

aaa.selected=false;

rect = app.activeDocument.pathItems.rectangle( 0, 0, 10, 10 );

bbb[0].width=100;

Как видим у прямоугольничка изменился width.
То есть selection сохранили в bbb[0]. Оно?
 
  • Спасибо
Реакции: romaya
Имеется ввиду альтернативный вариант ссылки на выделенный объект. Не через activeDocument.selection, а другой возможный способ доступа к выделению. Я так понимаю, что такого варианта нет.
Нет, я тугой, не пойму. Зачем доступ к выделению не через selection? Можно еще перебирать все pageItem и проверять свойство selected НО ЗАЧЕМ?????
 
Рисуем прямоугольничек. Выделяем. Запускаем

Код:
var bbb = new Array();

aaa=app.activeDocument.selection[0];
bbb.push(aaa);

aaa.selected=false;

rect = app.activeDocument.pathItems.rectangle( 0, 0, 10, 10 );

bbb[0].width=100;

Как видим у прямоугольничка изменился width.
То есть selection сохранили в bbb[0]. Оно?

Да. То, что надо. Спасибо. Только строка
Код:
rect = app.activeDocument.pathItems.rectangle( 0, 0, 10, 10 );
здесь лишняя, имхо.
 
Нет, я тугой, не пойму. Зачем доступ к выделению не через selection? Можно еще перебирать все pageItem и проверять свойство selected НО ЗАЧЕМ??

Ну вот понадобился, для решения специфической задачи. Пока не хочу рассказывать какой, но как допилю - обязательно расскажу.
 
Строка не лишняя, ибо это просто был пример того, что если снять выделение и что-то сделать (это что-то - это и есть строка "
rect = app.activeDocument.pathItems.rectangle( 0, 0, 10, 10 );"), то с выделенным все равно можно работать.
 
Строка не лишняя, ибо это просто был пример того, что если снять выделение и что-то сделать (это что-то - это и есть строка "
rect = app.activeDocument.pathItems.rectangle( 0, 0, 10, 10 );"), то с выделенным все равно можно работать.

Да, вы правы. Еще раз спасибо.
 
В общем, вроде у меня получилось. Но код я не сохранил. А повторить никак не получается. :( Попробую еще раз спросить. Более конкретно. Короче, есть clipping-маска. По сценарию она выделена пользователем. Контур маски сделан Compound Shape-ом. Так вот, я заметил, что если вручную удалить контур такой маски, то сам контейнер из Clip Group становится обычной Group. Вот мне и надо это событие отследить из скрипта. Сам код такой:

Код:
var clipGroupRef = new Array();
var sel = app.activeDocument.selection[0];
clipGroupRef.push(sel);
sel.pageItems[0].remove();
$.write(clipGroupRef[0].clipped);

Четвертая строка удаляет контур. И по идее, после этого действия, свойство clipped этой группы должно стать false. Для этого и нужна была альтернативная ссылка на группу, чтобы можно было проверить ее свойство clipped независимо от выделения. Говорю, я пытался снять выделение после операции удаления контура. Выбрать уже обычную группу по новой ссылке clipGroupRef. Как-то удалось получить clipped = false. Но код я по... терял в общем. Помогите разобраться с проблемой, коллеги. Если надо файл ai могу выложить. Но там ничего особенного, просто маска с любым содержимым и контуром, сделанным из Compound Shape.
 
Ааааа я понял что вам надо - ссылка на обьект, который стал другим обьектом? label ему установите, например - и будет счастье
 
Да хотя бы вот так
JavaScript:
var clipGroupRef = new Array();
var sel = app.activeDocument.selection[0];
sel.name="Selected"
sel.pageItems[0].remove();
alert(app.activeDocument.groupItems.getByName("Selected"));
 
это не работает, так как нужно "отловить" именно изменившееся свойство clipped этого объекта. Если добавить к вашему коду в конце пятой строки ".clipped", то на выходе все равно получим "true", а задача получить "false". Так что простое добавление label к объекту здесь не работает.
 
Вы меня совсем запутали. Сперва вы хотели какую то абсолютную ссылку, потом выбранный обьект но не через select, потом вам вроде надо было отследить во что превращается группа при модификации, теперь я даже и не пойму что вам надо. То что вы хотите сделать на мой взгляд сильно деструктивно а иллюстраторовская модель сильно хрупкая штука - в худшем случае у вас может просто иллюстратор захлопнуться от таких костылей. Вы избавляетесь от клипа убирая контур маски? А с чего вы взяли что модель это сама отслеживает? Должна по идее но вовсе не факт. Попробуйте еще более конкретизировать свою задачу я все равно цель не разумею
 
Если добавить к вашему коду в конце пятой строки ".clipped", то на выходе все равно получим "true", а задача получить "false".
Кстати, так и есть - простое убирание маски глупой индусской модели недостаточно, чтобы объект перестал быть clipped. Для этого есть расово индусский костыль под названием redraw
JavaScript:
var sel = app.activeDocument.selection[0];
alert(sel.clipped);  //true
sel.pageItems[0].remove();
alert(sel.clipped); //true
redraw();
alert(sel.clipped); //Ура! Заработало! false
 
  • Спасибо
Реакции: romaya
Да, действительно работает! Как я сам не догадался. :) И не надо никаких альтернативных выделений. Спасибо.