[AI CC-CC2021] Сортировка объектов по шаблону.

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
Всем привет, пытаюсь отсортировать объекты (квадратики) по определённому шаблону, см. картинку.

order.jpg


Нужно, чтобы они в таком порядке шли в слое, т.е. отсортировать их zOrder.
 

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 886
Реакции
3 457
  • Спасибо
Реакции: _MBK_ и lev

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Головоломка заключается уже в самой постановкн вопроса? Или это был не вопрос? Рома, я тут явно не вижу ни одного вопросительного знака
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
42 же!
 
  • Спасибо
Реакции: Fragarach и ~RA~

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 886
Реакции
3 457
42
 

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
Всем привет, с сортировкой разобрался - сделал через трёхмерный массив.

Наткнулся на какой-то глюк - zOrder со сдвигом на шаг вверх/вниз (SENDTOBACK и BRINGFORWARD) двигается только вверх. Причём, работать с pathItems не хочет, только с выделением и немного c pageItems (через раз).

Вопрос - 1) у меня одного такие глюки со сдвигом zOrder ?
2) как сдвинуть каждый 4й объект на шаг вниз?

примеры кода, которые у меня не работают:

PHP:
    var aDoc = app.activeDocument;
    var mSel = aDoc.selection;
    var paths = aDoc.pathItems;

    for (k = 1; k < mSel.length; k+4) //  каждый 2й элемент вниз на единицу с шагом 4
    {
        mSel[k].zOrder(ZOrderMethod.BRINGFORWARD);
    }


//  2й вариант

    for (k = 1; k < mSel.length; k++) //  каждый 2й элемент вниз на единицу с шагом 4
    {
        mSel[k+4].zOrder(ZOrderMethod.BRINGFORWARD);
    }

//  3й вариант - с paths вместо mSel
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
SENDTOBACK это не на шаг вниз, а в самый низ

как вы собираетесь используя BRINGFORWARD отправлять элементы вниз я вообще не понял



for (k = 1; k < mSel.length; k+4)
так нельзя

в общем, комментарии и код имеют мало что общего
 
Последнее редактирование:

eugeny

15 лет на форуме
Сообщения
859
Реакции
210
@Станислав Хоффман,
у вас странно циклы организованны в обоих вариантах.
1 вариант -
Код:
for (k = 1; k < mSel.length; k+4)
Начинаете со второго элемента , т.к. отчет начинается нуля.
Работаете только с с выделеными объектами. т.к. mSel -- это selection.
2 вариант -
Код:
for (k = 1; k < mSel.length; k++)
mSel[k+4].zOrder...
Здесь у вас проблема не первого элемента та же.
А потом по циклу вы просто пропускаете в начале несколько элементов, именно 5, т.к. отчет идет с нуля . Ваши индексы элементов будут: 5,6,7,8,9....
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Я, конечно, не слышал как жираф пердит, но, наверное, все таки, SENDBACKWARD и k+=4 ? 'hmmm'
 

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
SENDTOBACK это не на шаг вниз, а в самый низ

как вы собираетесь используя BRINGFORWARD отправлять элементы вниз я вообще не понял



for (k = 1; k < mSel.length; k+4)
так нельзя

в общем, комментарии и код имеют мало что общего
SENDTOBACK - опечатка, конечно же SENDBACKWARD - шаг на единицу.

Переварил информацию, понял свою ошибку. Решение найдено, но zOrder всё равно глючит - примеры ниже.

Сначала решение.

сдвиг элементов по zOrder с шагом 4 начиная со 2го эелемента:

PHP:
    var aDoc = app.activeDocument;
    var mSel = aDoc.selection;
    var paths = aDoc.pathItems;

    for (k = 0; k < mSel.length; k++) //  каждый 2й элемент вниз на единицу с шагом 4
    {
        k+=1;
        mSel[k].zOrder(ZOrderMethod.SENDBACKWARD);
        k+=2;
    }

значения K по циклу:
for k = 0
k = 0+1 = 1
mSel = 1
k = 1+2 = 3
--
for k = 3+1 = 4
k = 4+1 = 5
mSel = 5
k = 5+2 = 7
--
for k = 7+1 = 8
k = 8+1 = 9
mSel = 9
k = 9+2 = 11
и т.д. ...

итого, mSel = 1, 5, 9... шаг 4, что и требовалось.
математика цикла, конечно, примитивная, но очень сбивает такое в голове прокручивать.

Теперь, глюки zOrder, примеры с SELECTION и PATHS:

PHP:
    var aDoc = app.activeDocument;
    var mSel = aDoc.selection;
    var paths = aDoc.pathItems;
///////////////////////////////////////////////////
    for (k = 0; k < mSel.length; k++) // SELECTION - код НИЧЕГО не делает
    {
        mSel[k].zOrder(ZOrderMethod.SENDBACKWARD);  // BACKWARD
    }
///////////////////////////////////////////////////
    for (k = 0; k < mSel.length; k++) // SELECTION - сдвигает элементы ВВЕРХ
    {
        mSel[k].zOrder(ZOrderMethod.BRINGFORWARD);  // FORWARD
    }
///////////////////////////////////////////////////
    for (k = 0; k < paths.length; k++) // PATHS - сдвигает элементы ВВЕРХ
    {
        paths[k].zOrder(ZOrderMethod.SENDBACKWARD); // BACKWARD
    }
///////////////////////////////////////////////////
    for (k = 0; k < paths.length; k++) // PATHS - сдвигает элементы ВВЕРХ
    {
        paths[k].zOrder(ZOrderMethod.BRINGFORWARD); // FORWARD
    }
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Вообще говоря, я не совсем понимаю, как можно так спокойно, последовательно перебирая элементы массива на каждом шаге менять порядок элементов в нем. Это все равно, что пытаться усидеть на фанерке, которую держишь у себя в руках, причем, периодически вырывая ее у себя из-под задницы. 'hmmm'
 

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
ещё одна моя ошибка:
в комментах кода я писал "// каждый 2й элемент вниз на единицу с шагом 4"
не каждый 2й элемент, а НАЧИНАЯ со 2го элемента с шагом 4...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Я б на вашем месте, чтобы стало очень здорово, присвоил бы каждому элементу селекшна некий уникальный name, затем на каждом шаге искал нужный объект через getByName и его уже сдвигал внутри слоя в перед или в зад
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
а то что в исходном массиве элементы расположены хаотично не смущает? Для начала его нужно по zIndex отсортировать
 

eugeny

15 лет на форуме
Сообщения
859
Реакции
210
Я б на вашем месте, чтобы стало очень здорово, присвоил бы каждому элементу селекшна некий уникальный name, затем на каждом шаге искал нужный объект через getByName и его уже сдвигал внутри слоя в перед или в зад
Согласен,
вы в начале переберите все элементы и присвойте им имена в соответствии с вашими индексами. Тогда увидите, что двигается, а что нет.
Я думаю, ситуация из разряда:
три элемента: 1,2,3
сперва двигается 2 - 1,3,2
потом двигается 1 - ,3,1,2
потом двигается 3 - 1,3,2
опа! а первый элемент на месте! почему не произошло движение? :)
 

eugeny

15 лет на форуме
Сообщения
859
Реакции
210
как вариант можно двигать в группу в конец
var group=myDoc.groupItems.add();
Код:
element.move (group, ElementPlacement.PLACEATEND);
или в начало
Код:
element.move (group, ElementPlacement.PLACEATBEGINNING);
потом разгруппируйте
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну в случае кода
Код:
 for (k = 0; k < mSel.length; k++) // SELECTION - код НИЧЕГО не делает
    {
        mSel[k].zOrder(ZOrderMethod.SENDBACKWARD);  // BACKWARD
    }
по идее работать должно правильно. И вообще непонятно, как тогда работают остальные варианты? 'hz'
Иллюстраторовский скриптинг - это вообще индусский черный ящик, полагаю что по какому то завету Будды, обращение к SENDBACKWARD переинициализирует внутренние массивы объектов так, что все ссылки просто повисают в воздухе. А первый элемент и так сзади, он никуда не перемещается. 'hz' Вполне правдоподобно?