[AI CC-CC2021] Копирует елемент со сдвигом (StepRepeat)

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
Доброго времени суток
Нужно написать небольшой скрипт
которьій будет копировать вьіделеньій елемент указаное количество раз по горизонтали и вертикали
и добавлять определеньіе маркерьі но єто уже след етап
для начала хочу разобраться с копированием(duplicate) и размещением елементов на листе (geometricBounds)
взял код с Урока №2 но у меня копирует с отступом а нужно что б елементьі распологались один к одному без отступа

Код:
function main () {
var doc = app.activeDocument;

  //Сохраняем в отдельные переменные для удобства
var aLeft = activeDocument.selection[0];
var aRight = activeDocument.selection[2];
var aTop = activeDocument.selection[1];
var aBottom = activeDocument.selection[3];
var aWidth = aRight - aLeft;
var aHeight = aTop - aBottom;
//Выделенные объекты находятся в массиве doc.selection их необходимо скопировать в отдельный массив, иначе при копировании объектов массив с выделением нарушится
var sel = [];
for (var i = 0 ; i < doc.selection.length; i++) {
   sel.push(doc.selection[i]);
   }
for (var i = 0 ; i < sel.length; i++) {
   var item = sel[i];
 

 
   var iBounds = item.geometricBounds;
   var iLeft = iBounds[0];
   var iRight = iBounds[2];
   var iTop = iBounds[1];
   var iBottom = iBounds[3];
   var copyItem = undefined;
   var copyItem2 = undefined;
 
   }
     copyItem = item.duplicate(item, ElementPlacement.PLACEAFTER);
     copyItem.translate(iRight,0);

   
}

main ();

var doc = app.activeDocument;

var docVB = doc.visibleBounds;

var left = docVB[0];
var top = docVB[1];
var right = docVB[2];
var bottom = docVB[3];

var ab = doc.artboards.getActiveArtboardIndex();

doc.artboards[ab].artboardRect = [left,top,right,bottom];

и можно ли как-то указать сразу количество копий ну например через диалоговое окно вписать сколько нужно сделать копий
есть вот код окна
Код:
// DIALOG
// ======
var dialog = new Window("dialog");
    dialog.text = "Montaż_WITO";
    dialog.orientation = "column";
    dialog.alignChildren = ["center","top"];
    dialog.spacing = 10;
    dialog.margins = 16;

// PANEL1
// ======
var panel1 = dialog.add("panel", undefined, undefined, {name: "panel1"});
    panel1.text = "Wypełnij i lecimy z koksem";
    panel1.orientation = "column";
    panel1.alignChildren = ["left","center"];
    panel1.spacing = 17;
    panel1.margins = 20;

// GROUP1
// ======
var group1 = panel1.add("group", undefined, {name: "group1"});
    group1.orientation = "row";
    group1.alignChildren = ["left","center"];
    group1.spacing = 10;
    group1.margins = 0;

var statictext1 = group1.add("statictext", undefined, undefined, {name: "statictext1"});
    statictext1.text = "Ilość zębów:";
    statictext1.preferredSize.width = 94;

var Z = group1.add('edittext {justify: "center", properties: {name: "Z"}}');
    Z.text = "72";
    Z.preferredSize.width = 70;

// GROUP2
// ======
var group2 = panel1.add("group", undefined, {name: "group2"});
    group2.orientation = "row";
    group2.alignChildren = ["left","center"];
    group2.spacing = 10;
    group2.margins = 0;

var statictext2 = group2.add("statictext", undefined, undefined, {name: "statictext2"});
    statictext2.text = "Ilość użytków:";

var UH = group2.add('edittext {properties: {name: "UH"}}');
    UH.text = "2";

var statictext3 = group2.add("statictext", undefined, undefined, {name: "statictext3"});
    statictext3.text = "x";

var UW = group2.add('edittext {properties: {name: "UW"}}');
    UW.text = "4";

// DIALOG
// ======
var button1 = dialog.add("button", undefined, undefined, {name: "button1"});
    button1.text = "ok";
    button1.preferredSize.width = 100;
   
   button1.onClick = function (event) {
   dialog.close();
   
}


dialog.show();

    var ZM = parseInt(Z.text); // сохраняем полученньіе данньіе в переменньіе
    var WU = parseInt(UW.text);
    var HU= parseInt(UH.text);
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
for (var i = 0 ; i < sel.length; i++) { var item = sel; var iBounds = item.geometricBounds; var iLeft = iBounds[0]; var iRight = iBounds[2]; var iTop = iBounds[1]; var iBottom = iBounds[3]; var copyItem = undefined; var copyItem2 = undefined; }
Просто классический пример индийского кода из Парижской палаты мер и весов 'cooll)'
Зачем это здесь?
 

_MBK_

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

Не по теме:
И убрать рудименты мовы из Великого и Могучего Языка
 

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
Просто классический пример индийского кода из Парижской палаты мер и весов 'cooll)'
Зачем это здесь?
точно забьіл убрать, по факту два раза одно и то же ) ;]=
но нужно тогда поправить тут а я пока не понимаю как

copyItem = item.duplicate(item, ElementPlacement.PLACEAFTER);
copyItem.translate(iRight,0);
чем являеться (Item) а чем copyItem
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
чем являеться (Item)
Смотрите вот этот код
JavaScript:
for (var i = 0 ; i < doc.selection.length; i++) {
   sel.push(doc.selection[i]);
   }
for (var i = 0 ; i < sel.length; i++) {
   var item = sel[i];
зачем то копирует весь селекшн из одного массива в другой а затем присваивает переменной item последний элемент этого массива. Он и дублируется в итоге.
полученным дублем item
 

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
поправил так но теперь копирует в то же самое место

Код:
function main () {
 var doc = app.activeDocument;
 
  //Сохраняем в отдельные переменные для удобства
var myS =  activeDocument.selection[0];
 
 var aLeft = myS [0];
 var aRight = myS [2];
 var aTop = myS [1];
 var aBottom = myS [3];
 var aWidth = aRight - aLeft;
 var aHeight = aTop - aBottom;
 //Выделенные объекты находятся в массиве doc.selection их необходимо скопировать в отдельный массив, иначе при копировании объектов массив с выделением нарушится
 
 
     copymyS = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
     copymyS.translate(aRight,0);

    
 }

main ();

я не до конца понимаю с етими bounds
Screenshot_3.jpg

и в данной ситуации я указьіваю правую строну в координате Х
так ?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
JavaScript:
var myS =  activeDocument.selection[0];
 
 var aLeft = myS [0];
 var aRight = myS [2];
 var aTop = myS [1];
 var aBottom = myS [3];
У вас в myS первый объект селекшна сидит
А вы к нему как к массиву обращаетесь да еще и хотите элемент массива как смещение использовать
 

eugeny

15 лет на форуме
Сообщения
859
Реакции
210
Не смотрел весь код. Но такой вопрос возник сразу: у вас случайно лишний отступ не равен толщине обводки?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
В вашем коде это же есть
JavaScript:
var iBounds = item.geometricBounds;
   var iLeft = iBounds[0];
   var iRight = iBounds[2];
   var iTop = iBounds[1];
   var iBottom = iBounds[3];
Это координаты габаритов объекта в поинтах. Разницы меду правым и левым - ширина, верхним и нижним - высота
 

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
сори за такие вопросьі ( трудно мне идут инструкции в анг яз.
В вашем коде это же есть
JavaScript:
var iBounds = item.geometricBounds;
   var iLeft = iBounds[0];
   var iRight = iBounds[2];
   var iTop = iBounds[1];
   var iBottom = iBounds[3];
Это координаты габаритов объекта в поинтах. Разницы меду правым и левым - ширина, верхним и нижним - высота

поправил так
и вроде заработало

Код:
function main () {
 var doc = app.activeDocument;

  //Сохраняем в отдельные переменные для удобства
var copymyS;
var myS =  doc.selection[0];
 
var iBounds = myS.geometricBounds;
var aLeft = iBounds[0];
var aRight = iBounds[2];
var aTop = iBounds[1];
var aBottom = iBounds[3];
var aWidth = aRight - aLeft;
var aHeight = aTop - aBottom;

 //Выделенные объекты находятся в массиве doc.selection их необходимо скопировать в отдельный массив, иначе при копировании объектов массив с выделением нарушится
var copymyS;
 if ( docSelected.length > 0 ) {
for ( i = 0; i < docSelected.length; i++ ) {
docSelected[i].selected = false;
newItem = docSelected[i].duplicate( doc,ElementPlacement.PLACEATEND );
newItem.translate(aWidth,0);
}
}
}

main ();

var doc = app.activeDocument;
 
var docVB = doc.geometricBounds;
 
var left = docVB[0];
var top = docVB[1];
var right = docVB[2];
var bottom = docVB[3];
 
var ab = doc.artboards.getActiveArtboardIndex();
 
doc.artboards[ab].artboardRect = [left,top,right,bottom];

только теперь вопрос как можно сделать определенное количество(полученное через prompt) копий
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Вот этот кусок
JavaScript:
newItem = docSelected[i].duplicate( doc,ElementPlacement.PLACEATEND );
newItem.translate(aWidth,0);
поместить в отдельный цикл, причем в качестве дистанции в translate использовать переменные чтоб она копии как то не на одно и то же место делало
 

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
Вот этот кусок
JavaScript:
newItem = docSelected[i].duplicate( doc,ElementPlacement.PLACEATEND );
newItem.translate(aWidth,0);
поместить в отдельный цикл, причем в качестве дистанции в translate использовать переменные чтоб она копии как то не на одно и то же место делало
Ну пока получилось так

Код:
function main () {
var doc = app.activeDocument;

var copymySW;
var copymySH;
var myS =  doc.selection[0];

var iBounds = myS.geometricBounds;
var aLeft = iBounds[0];
var aRight = iBounds[2];
var aTop = iBounds[1];
var aBottom = iBounds[3];
var aWidth = aRight - aLeft;
var aHeight = aTop - aBottom;

var Q1 = prompt('Сколько копий в право', 4) ;
var Q2 = prompt('Сколько копий в низ', 4) ;
var i = 1;
while (i < Q1) {
copymySW = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
copymySW.translate(aWidth*i,0);
  i++;
}
var j = 1;
while (j < Q2) { 
copymySH = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
copymySH.translate(0,-aHeight*j);
  j++;
}

   
}

main ();
Есть идея как заполнить так что б бьіло квадрат 4 на 4 ?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
JavaScript:
var i = 1;
while (i < Q1) { // выводит 0, затем 1, затем 2
copymySW = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
copymySW.translate(aWidth*i,0);
  i++;
}
var j = 1;
while (j < Q2) { // выводит 0, затем 1, затем 2
copymySH = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
copymySH.translate(0,-aHeight*j);
  j++;
}
можно сделать проще
JavaScript:
for (var i=0;i < Q1;i++)
for (var j=0;j < Q2;j++)
{
  var copymySW = myS.duplicate(doc.activeLayer, ElementPlacement.PLACEAFTER);
  copymySW.translate(aWidth*(i+1),-aHeight*(j+1));
}
 
Последнее редактирование:

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
JavaScript:
var i = 1;
while (i < Q1) { // выводит 0, затем 1, затем 2
copymySW = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
copymySW.translate(aWidth*i,0);
  i++;
}
var j = 1;
while (j < Q2) { // выводит 0, затем 1, затем 2
copymySH = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
copymySH.translate(0,-aHeight*j);
  j++;
}
можно сделать проще
JavaScript:
for (var i=0;i < Q1;i++)
for (var j=0;j < Q2;j++)
{
  var copymySW = myS.duplicate(doc.activeLayer, ElementPlacement.PLACEAFTER);
  copymySW.translate(aWidth*(i+1),-aHeight*(j+1));
}
Ругаеться на строку

var copymySW = myS.duplicate(doc.activeLayer, ElementPlacement.PLACEAFTER);
 

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
вот так получаеться почти то что планировалось
Код:
function main () {
var doc = app.activeDocument;

var copymySW;
var copymySH;
var myS =  doc.selection[0];

var iBounds = myS.geometricBounds;
var aLeft = iBounds[0];
var aRight = iBounds[2];
var aTop = iBounds[1];
var aBottom = iBounds[3];
var aWidth = aRight - aLeft;
var aHeight = aTop - aBottom;

var Q1 = prompt('Сколько копий в право', 4) ;
var Q2 = prompt('Сколько копий в низ', 4) ;

for (var i=0;i < Q1;i++)
for (var j=0;j < Q2;j++)
{
  var copymySW = myS.duplicate(myS, ElementPlacement.PLACEAFTER);
  copymySW.translate(aWidth*(i),-aHeight*(j));
}
   
}

main ();

на месте первого обьекта остаеться еще одна копия
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Эта конструкция, хоть и приводится в уроке, но весьма сомнительна с моей точки зрения.
Представим себе ситуацию, если myS это группа. Я не знаю как индусы обходят данную коллизию (видимо следующий параметр проверяют), но по индусской логике объектной модели группа должна сдублироваться в себя же
Вот так попробуйте
JavaScript:
for (var i=0;i < Q1;i++)
for (var j=0;j < Q2;j++)
{
  var copymySW = myS.duplicate(doc.activeLayer, ElementPlacement.PLACEATBEGINNING );
  copymySW.translate(aWidth*(i+1),-aHeight*(j+1));
}
 
Последнее редактирование: