Skip to main content
Leilang
Inspiring
June 29, 2018
Answered

Loop for moving copied layers.

  • June 29, 2018
  • 2 replies
  • 1784 views

Hello, I have a problem with the loop, I would like it to move each subsequent copied layer by the value entered in the prompt window.

The number of steps is determined by the width of the document divided by the prompt value.

Layers copy the given number of times but do not move. Where have I made a mistake?

I will be grateful for your help.

var docRef = app.activeDocument;

var layerRef = docRef.activeLayer;

app.displayDialogs = DialogModes.NO; 

var strtRulerUnits = app.preferences.rulerUnits; 

var strtTypeUnits = app.preferences.typeUnits; 

app.preferences.rulerUnits = Units.CM; 

app.preferences.typeUnits = TypeUnits.MM; 

var NEW_LAYER_NAME = "first";     // name

var createNewLayer = function() {

    try {

        if (app.documents.length) {

            var doc = activeDocument;

            var layers = doc.artLayers;

            var newLayer = layers.add();

           

            if(NEW_LAYER_NAME) {

                newLayer.name = NEW_LAYER_NAME;

            }

           

            doc.activeLayer = newLayer;

        }

    } catch (e) {

   

    }

}

createNewLayer();

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// add selection

var r1 = activeDocument.resolution / 5 ;

var x1 = activeDocument.resolution / 5 ;

Circle(0,0,Number(r1),Number(x1));

app.preferences.rulerUnits = strtRulerUnits;

app.preferences.typeUnits = strtTypeUnits;

function Circle(Top,Left,Bottom,Right) {

var desc3 = new ActionDescriptor();

        var ref1 = new ActionReference();

        ref1.putProperty( charIDToTypeID('Chnl'), charIDToTypeID('fsel') );

    desc3.putReference( charIDToTypeID('null'), ref1 );

        var desc4 = new ActionDescriptor();

        desc4.putUnitDouble( charIDToTypeID('Top '), charIDToTypeID('#Pxl'), Top );

        desc4.putUnitDouble( charIDToTypeID('Left'), charIDToTypeID('#Pxl'), Left );

        desc4.putUnitDouble( charIDToTypeID('Btom'), charIDToTypeID('#Pxl'), Bottom );

        desc4.putUnitDouble( charIDToTypeID('Rght'), charIDToTypeID('#Pxl'), Right );

    desc3.putObject( charIDToTypeID('T   '), charIDToTypeID('Elps'), desc4 );

    desc3.putBoolean( charIDToTypeID('AntA'), true );

    executeAction( charIDToTypeID('setd'), desc3, DialogModes.NO );

};

//////////////////////////////////////////////////////////////////////////// fill color

fillColor = new CMYKColor();

fillColor.cyan = 40;

fillColor.magenta = 30;

fillColor.yellow = 30;

fillColor.black = 100;

app.activeDocument.selection.fill(fillColor); 

app.activeDocument.selection.deselect();

var doc=app.activeDocument

var docRef = app.activeDocument;

var layerRef = docRef.activeLayer;

var circleLayer= docRef.activeLayer;

var myAnchor = circleLayer.anchor;

doc.activeLayer=circleLayer;

var wys = 1.5;

MoveLayer(circleLayer,1.5,wys)         /* move */

function MoveLayer(fLayer,fX,fY) {

  var Position = fLayer.bounds;

  Position[0] = fX - Position[0];

  Position[1] = fY - Position[1];

  fLayer.translate(-Position[0],-Position[1]);

}

var oczkaGora = prompt("Oczka góra", "50");

var krokiPoziom = Math.round(activeDocument.width / oczkaGora);                   // oczka góra

var przesunieciePoziom = activeDocument.width / krokiPoziom;     

var szerokosc = activeDocument.width;

var wysokosc = activeDocument.height;

var x;

for (x=0; x<krokiPoziom; x++) {  

var test = x;   

if (test==0) {

            var newLayer = activeDocument.artLayers.getByName("first");

}   else if (test==1) {

            var newLayer = activeDocument.artLayers.getByName(0);

}   else if (test > 1) {

           var newLayer = activeDocument.artLayers.getByName(test -1);

           var layername = "";

            activeDocument.activeLayer.name = layername;  

           }

newLayer.duplicate();

newLayer.name = (test);

var circleLayer= newLayer;

var myAnchor = circleLayer.anchor;

doc.activeLayer=circleLayer;

var wys = 1.5;

MoveLayer(circleLayer,krokiPoziom ,wys)         /* move */

function MoveLayer(fLayer,fX,fY) {

var Position = fLayer.bounds;

Position[0] = fX - Position[0];

Position[1] = fY - Position[1];

fLayer.translate(-Position[0],-Position[1]);

 

 

  }

 

     }     

This topic has been closed for replies.
Correct answer r-bin

Look it up

var docRef = app.activeDocument; 

var layerRef = docRef.activeLayer; 

 

app.displayDialogs = DialogModes.NO;   

var strtRulerUnits = app.preferences.rulerUnits;   

app.preferences.rulerUnits = Units.CM;   

 

 

var NEW_LAYER_NAME = "first";     // name 

 

 

var createNewLayer = function() { 

    try { 

        if (app.documents.length) { 

            var doc = activeDocument; 

            var layers = doc.artLayers; 

            var newLayer = layers.add(); 

             

            if(NEW_LAYER_NAME) { 

                newLayer.name = NEW_LAYER_NAME; 

            } 

             

            doc.activeLayer = newLayer; 

        } 

    } catch (e) { 

     

    } 

 

 

 

 

createNewLayer(); 

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// add selection 

 

 

var r1 = activeDocument.resolution / 5 ; 

var x1 = activeDocument.resolution / 5 ; 

Circle(0,0,Number(r1),Number(x1)); 

 

 

app.preferences.rulerUnits = strtRulerUnits; 

 

 

 

function Circle(Top,Left,Bottom,Right) { 

 

 

var desc3 = new ActionDescriptor(); 

 

 

        var ref1 = new ActionReference(); 

 

 

        ref1.putProperty( charIDToTypeID('Chnl'), charIDToTypeID('fsel') ); 

 

 

    desc3.putReference( charIDToTypeID('null'), ref1 ); 

 

 

        var desc4 = new ActionDescriptor(); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Top '), charIDToTypeID('#Pxl'), Top ); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Left'), charIDToTypeID('#Pxl'), Left ); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Btom'), charIDToTypeID('#Pxl'), Bottom ); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Rght'), charIDToTypeID('#Pxl'), Right ); 

 

 

    desc3.putObject( charIDToTypeID('T   '), charIDToTypeID('Elps'), desc4 ); 

 

 

    desc3.putBoolean( charIDToTypeID('AntA'), true ); 

 

 

    executeAction( charIDToTypeID('setd'), desc3, DialogModes.NO ); 

 

 

}; 

 

 

//////////////////////////////////////////////////////////////////////////// fill color 

 

 

fillColor = new CMYKColor(); 

fillColor.cyan = 40; 

fillColor.magenta = 30; 

fillColor.yellow = 30; 

fillColor.black = 100; 

 

 

app.activeDocument.selection.fill(fillColor);   

app.activeDocument.selection.deselect(); 

 

 

var doc=app.activeDocument 

var docRef = app.activeDocument; 

var layerRef = docRef.activeLayer; 

var circleLayer= docRef.activeLayer; 

var myAnchor = circleLayer.anchor; 

 

 

doc.activeLayer=circleLayer; 

 

 

var wys = 1.5; 

 

 

MoveLayer(circleLayer,1.5,wys)         /* move */ 

 

 

 

 

var oczkaGora = prompt("Oczka góra", "50"); 

var krokiPoziom = Math.round(activeDocument.width / oczkaGora);                   // oczka góra 

var przesunieciePoziom = activeDocument.width / krokiPoziom;       

 

 

var szerokosc = activeDocument.width; 

var wysokosc = activeDocument.height; 

 

 

var x; 

for (x=0; x<krokiPoziom; x++) {    

var test = x;     

if (test==0) { 

            var newLayer = activeDocument.artLayers.getByName("first"); 

}   else if (test==1) { 

            var newLayer = activeDocument.artLayers.getByName(0); 

}   else if (test > 1) { 

           var newLayer = activeDocument.artLayers.getByName(test -1); 

           } 

 

var circleLayer = newLayer.duplicate(); 

circleLayer.name = (test); 

 

doc.activeLayer=circleLayer; 

MoveLayer(circleLayer, krokiPoziom, 0)

}       

///////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////

// translate() uses transform. To avoid this we use this function.

function MoveLayer(layer, x, y)

    {

    try {

        if (layer != undefined) app.activeDocument.activeLayer = layer;

        var d1 = new ActionDescriptor();

        var r = new ActionReference();

        r.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );

        d1.putReference( charIDToTypeID( "null" ), r );

        var d2 = new ActionDescriptor();

        d2.putUnitDouble( charIDToTypeID( "Hrzn" ), charIDToTypeID( "#Rlt" ), x*72/2.54 );

        d2.putUnitDouble( charIDToTypeID( "Vrtc" ), charIDToTypeID( "#Rlt" ), y*72/2.54 );

        d1.putObject( charIDToTypeID( "T   " ), charIDToTypeID( "Ofst" ), d2);

        executeAction( charIDToTypeID( "move" ), d1, DialogModes.NO );

        }

    catch (e) { _alert(e); throw(e); }

    }

2 replies

Kukurykus
Legend
June 30, 2018

There is too much mess in your script, no needed parts that I could simply remove and it would still work, so I only change those parts that make script will work the way you want. Don't forget to have CM's set before running script and don't enter neither ZERO nor values wider than documents width. I did the distance from last point will be the same like from first to its edge. Now the only changes you should do...

Change:

var oczkaGora = prompt("Oczka góra", "50");

var krokiPoziom = Math.round(activeDocument.width / oczkaGora);                  // oczka góra

var przesunieciePoziom = activeDocument.width / krokiPoziom;

to:

var oczkaGora = prompt("Oczka góra", "50");

less = 2 * wys + (UnitValue(r1, 'px').as('cm') / activeDocument.resolution * 72)

var krokiPoziom = Math.round((activeDocument.width - less) / oczkaGora);                  // oczka góra

var przesunieciePoziom = (activeDocument.width - less) / krokiPoziom;

Change:

newLayer.duplicate();

newLayer.name = (test);

var circleLayer= newLayer;

to:

newLayer = activeDocument.activeLayer

circleLayer = activeDocument.activeLayer = newLayer.duplicate();

newLayer.name = (test);

Change:

fLayer.translate(-Position[0],-Position[1]);

to:

fLayer.translate(przesunieciePoziom,-Position[1]);

Leilang
LeilangAuthor
Inspiring
July 2, 2018

The problem is only in the last line you advised to replace.

Change:

  1. fLayer.translate(-Position[0],-Position[1]); 

to:

  1. fLayer.translate(przesunieciePoziom,-Position[1]); 

Replacing this line fixes everything.

Thank you for your help, it helped me get to where I made the mistake;)

Kukurykus
Legend
July 2, 2018

Replacing only last line makes script is very unaccurate. Together with previous changes you will have perfect results

r-binCorrect answer
Legend
June 29, 2018

Look it up

var docRef = app.activeDocument; 

var layerRef = docRef.activeLayer; 

 

app.displayDialogs = DialogModes.NO;   

var strtRulerUnits = app.preferences.rulerUnits;   

app.preferences.rulerUnits = Units.CM;   

 

 

var NEW_LAYER_NAME = "first";     // name 

 

 

var createNewLayer = function() { 

    try { 

        if (app.documents.length) { 

            var doc = activeDocument; 

            var layers = doc.artLayers; 

            var newLayer = layers.add(); 

             

            if(NEW_LAYER_NAME) { 

                newLayer.name = NEW_LAYER_NAME; 

            } 

             

            doc.activeLayer = newLayer; 

        } 

    } catch (e) { 

     

    } 

 

 

 

 

createNewLayer(); 

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// add selection 

 

 

var r1 = activeDocument.resolution / 5 ; 

var x1 = activeDocument.resolution / 5 ; 

Circle(0,0,Number(r1),Number(x1)); 

 

 

app.preferences.rulerUnits = strtRulerUnits; 

 

 

 

function Circle(Top,Left,Bottom,Right) { 

 

 

var desc3 = new ActionDescriptor(); 

 

 

        var ref1 = new ActionReference(); 

 

 

        ref1.putProperty( charIDToTypeID('Chnl'), charIDToTypeID('fsel') ); 

 

 

    desc3.putReference( charIDToTypeID('null'), ref1 ); 

 

 

        var desc4 = new ActionDescriptor(); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Top '), charIDToTypeID('#Pxl'), Top ); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Left'), charIDToTypeID('#Pxl'), Left ); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Btom'), charIDToTypeID('#Pxl'), Bottom ); 

 

 

        desc4.putUnitDouble( charIDToTypeID('Rght'), charIDToTypeID('#Pxl'), Right ); 

 

 

    desc3.putObject( charIDToTypeID('T   '), charIDToTypeID('Elps'), desc4 ); 

 

 

    desc3.putBoolean( charIDToTypeID('AntA'), true ); 

 

 

    executeAction( charIDToTypeID('setd'), desc3, DialogModes.NO ); 

 

 

}; 

 

 

//////////////////////////////////////////////////////////////////////////// fill color 

 

 

fillColor = new CMYKColor(); 

fillColor.cyan = 40; 

fillColor.magenta = 30; 

fillColor.yellow = 30; 

fillColor.black = 100; 

 

 

app.activeDocument.selection.fill(fillColor);   

app.activeDocument.selection.deselect(); 

 

 

var doc=app.activeDocument 

var docRef = app.activeDocument; 

var layerRef = docRef.activeLayer; 

var circleLayer= docRef.activeLayer; 

var myAnchor = circleLayer.anchor; 

 

 

doc.activeLayer=circleLayer; 

 

 

var wys = 1.5; 

 

 

MoveLayer(circleLayer,1.5,wys)         /* move */ 

 

 

 

 

var oczkaGora = prompt("Oczka góra", "50"); 

var krokiPoziom = Math.round(activeDocument.width / oczkaGora);                   // oczka góra 

var przesunieciePoziom = activeDocument.width / krokiPoziom;       

 

 

var szerokosc = activeDocument.width; 

var wysokosc = activeDocument.height; 

 

 

var x; 

for (x=0; x<krokiPoziom; x++) {    

var test = x;     

if (test==0) { 

            var newLayer = activeDocument.artLayers.getByName("first"); 

}   else if (test==1) { 

            var newLayer = activeDocument.artLayers.getByName(0); 

}   else if (test > 1) { 

           var newLayer = activeDocument.artLayers.getByName(test -1); 

           } 

 

var circleLayer = newLayer.duplicate(); 

circleLayer.name = (test); 

 

doc.activeLayer=circleLayer; 

MoveLayer(circleLayer, krokiPoziom, 0)

}       

///////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////

// translate() uses transform. To avoid this we use this function.

function MoveLayer(layer, x, y)

    {

    try {

        if (layer != undefined) app.activeDocument.activeLayer = layer;

        var d1 = new ActionDescriptor();

        var r = new ActionReference();

        r.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );

        d1.putReference( charIDToTypeID( "null" ), r );

        var d2 = new ActionDescriptor();

        d2.putUnitDouble( charIDToTypeID( "Hrzn" ), charIDToTypeID( "#Rlt" ), x*72/2.54 );

        d2.putUnitDouble( charIDToTypeID( "Vrtc" ), charIDToTypeID( "#Rlt" ), y*72/2.54 );

        d1.putObject( charIDToTypeID( "T   " ), charIDToTypeID( "Ofst" ), d2);

        executeAction( charIDToTypeID( "move" ), d1, DialogModes.NO );

        }

    catch (e) { _alert(e); throw(e); }

    }

Leilang
LeilangAuthor
Inspiring
June 29, 2018

Perfect, thank you !

But I would be grateful if you could explain to me how it works?

I've lost a lot of time to solve this and I can not figure out how you do it;)

Legend
June 30, 2018

Sorry, I do not speak English so well. This is too difficult for me and for a long time.

Everything is clear there and minimum of changes.