[ID CC-CC2021] Как получить порядок объектов (кто выше, кто ниже) на странице?

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
Как получить порядок объектов (кто выше, кто ниже) на странице? Если просто 2 прямоугольника - index показывает уровень. Но если это прямоугольник, и группа - то у обоих индекс - 0
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
32 307
Реакции
10 590
А как вы объекты перебирете? pageItemы вроде как по порядку следования упорядочены
 

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
В данном случае это был selection. Подниматься по родителям до pages и там перебирать через pageItems? Не будет ли там нюансов если объект на pasteboard?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
32 307
Реакции
10 590
А порядок в селекшне какой?
 

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
не получается. порядок в selection идет вероятно по времени создания объекта в документе. Создали прямоугольник - в selection он будет последним, даже если его перемещали на самый низ...
 

Вложения

  • Untitled-1.png
    Untitled-1.png
    23.3 КБ · Просм.: 259

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
В общем эмипирическим путем вычислено - порядок в selection определяется как выделять - например через Shift или мышкой - какой объект попал в выделение последним - тот и будет последним в массиве.
Index действительно показывает уровень расположения на странице. Единственная проблема - если брать индекс у не группированных объектов - все работает. Если брать у нескольких разных групп - тоже работает.
А вот если смесь групп и простых объектов - начинается наложения. В общем у групп в Indesign свой индекс, у не группированных - свой, и они спокойно совпадают (0,1,2,3,4,... 0,1,2,3,4...)
 

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
С pageItem ситуация похожа - порядок в массиве коррелирует с последовательностью создания объектов, но не их уровнем (выше-ниже) на странице... :(
Единственное что приходит на ум - это клонировать (duplicate) все объекты, запоминать id элементов группы рекурсивно (а вдруг группа в группе), разгруппировывать клонированные (оригиналы не трогать так как могут слететь эффекты (например dropsadow) которые потом не восстановишь) и сравнивать уже index разгруппированных объектов, после чего удалять ненужные копии. Но ещё плюс сопоставлять id оригиналов и копий при duplicate ... в общем это жесть..
Неужели нет более простого способа?
 

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
_MBK_ - спасибо за ссылку. Есть над чем подумать и этот путь явно проще.
P.S. сорри - у меня одного ссылка не открывается на прямую? переадресовывает на главную Adobe Support Community

Читал из кеша google если что....
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
32 307
Реакции
10 590
Читал из кеша google если что....
Да. Глупые адобовские индусы недавно похоронили комьюнити 'RIP' *(
В двух словах до чего там договорились - перебирают все pageItems и формируют массив из id к которому потом быстро напрямую обращаются
JavaScript:
var zOrderById = {}, 
    itemZO = pgItems.everyItem().index, 
    itemIds = pgItems.everyItem().id, 
    i = pgItems.length; 
 
while( i-- ) 
    { 
    zOrderById[itemIds[i]] = itemZO[i]; 
    } 
 
//Then you can use zOrderById[ pgItems[ i ].id ] to retrieve the z-order of the i-indexed item in the pgItems collection:
 
alert( zOrderById[ pgItems[0].id ] ); // => 0 
alert( zOrderById[ pgItems[1].id ] ); // => 2 
alert( zOrderById[ pgItems[2].id ] ); // => 1
 
  • Спасибо
Реакции: Vadim_PDF

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
Да, я понял, костыль, но это тысячекратно лучше, чем я предложил :) Спасибо!