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

romaya

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 183
Реакции
10 843
Ну вообще говоря, у каждого обьекта есть parent. Или вам именно layer надо?
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Нет, не обязательно. Подойдет любая ссылка. Кроме selection.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Собственно, в этом и вопрос. Можно ли как-нибудь ссылку на выделенный объект сделать не через selection, чтобы потом после отмены выделения иметь возможность обращаться к этому объекту? Ну ка-бы конвертировать локальную ссылку в абсолютную.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 183
Реакции
10 843
Не, не пойму. Любая ссылка на pageItem абсолютная
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Имеется ввиду альтернативный вариант ссылки на выделенный объект. Не через activeDocument.selection, а другой возможный способ доступа к выделению. Я так понимаю, что такого варианта нет.
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
Рисуем прямоугольничек. Выделяем. Запускаем

Код:
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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 183
Реакции
10 843
Имеется ввиду альтернативный вариант ссылки на выделенный объект. Не через activeDocument.selection, а другой возможный способ доступа к выделению. Я так понимаю, что такого варианта нет.
Нет, я тугой, не пойму. Зачем доступ к выделению не через selection? Можно еще перебирать все pageItem и проверять свойство selected НО ЗАЧЕМ?????
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Рисуем прямоугольничек. Выделяем. Запускаем

Код:
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 );
здесь лишняя, имхо.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Нет, я тугой, не пойму. Зачем доступ к выделению не через selection? Можно еще перебирать все pageItem и проверять свойство selected НО ЗАЧЕМ??

Ну вот понадобился, для решения специфической задачи. Пока не хочу рассказывать какой, но как допилю - обязательно расскажу.
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
Строка не лишняя, ибо это просто был пример того, что если снять выделение и что-то сделать (это что-то - это и есть строка "
rect = app.activeDocument.pathItems.rectangle( 0, 0, 10, 10 );"), то с выделенным все равно можно работать.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Строка не лишняя, ибо это просто был пример того, что если снять выделение и что-то сделать (это что-то - это и есть строка "
rect = app.activeDocument.pathItems.rectangle( 0, 0, 10, 10 );"), то с выделенным все равно можно работать.

Да, вы правы. Еще раз спасибо.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
В общем, вроде у меня получилось. Но код я не сохранил. А повторить никак не получается. :( Попробую еще раз спросить. Более конкретно. Короче, есть 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.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 183
Реакции
10 843
Ааааа я понял что вам надо - ссылка на обьект, который стал другим обьектом? label ему установите, например - и будет счастье
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 183
Реакции
10 843
Да хотя бы вот так
JavaScript:
var clipGroupRef = new Array();
var sel = app.activeDocument.selection[0];
sel.name="Selected"
sel.pageItems[0].remove();
alert(app.activeDocument.groupItems.getByName("Selected"));
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
это не работает, так как нужно "отловить" именно изменившееся свойство clipped этого объекта. Если добавить к вашему коду в конце пятой строки ".clipped", то на выходе все равно получим "true", а задача получить "false". Так что простое добавление label к объекту здесь не работает.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 183
Реакции
10 843
Вы меня совсем запутали. Сперва вы хотели какую то абсолютную ссылку, потом выбранный обьект но не через select, потом вам вроде надо было отследить во что превращается группа при модификации, теперь я даже и не пойму что вам надо. То что вы хотите сделать на мой взгляд сильно деструктивно а иллюстраторовская модель сильно хрупкая штука - в худшем случае у вас может просто иллюстратор захлопнуться от таких костылей. Вы избавляетесь от клипа убирая контур маски? А с чего вы взяли что модель это сама отслеживает? Должна по идее но вовсе не факт. Попробуйте еще более конкретизировать свою задачу я все равно цель не разумею
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 183
Реакции
10 843
Если добавить к вашему коду в конце пятой строки ".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

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Да, действительно работает! Как я сам не догадался. :) И не надо никаких альтернативных выделений. Спасибо.