Skip to main content
Inspiring
August 11, 2022
Answered

How to copy layer structure by number sequence?

  • August 11, 2022
  • 4 replies
  • 1135 views

Hi,
I have a layer structure. I want to copy it according to a number sequence, that is, copy 1, 2, 3, 4, 5, 6, 7, 8... 100 layers. Their structures are the same, but the name of the main layer should be named according to the number. 1, 2, 3... Etc., but the names of all other sub layers cannot be changed. I wonder if there is such a script that can be implemented.
There is a "Copy Layer" command in the layer menu to copy the entire layer structure, but the word "copy" will be automatically added to all layer names, and the main layer cannot be named according to the number sequence, and the names need to be modified one by one, including all sub layer names. This is a very time-consuming and nerve wracking work, so try to use scripts to see if this can be achieved. Thank you.

 

Layer structure to copy:


Effect to be achieved:

This topic has been closed for replies.
Correct answer Raymond ZJH

Thanks @Silly-V  @jduncan @Charu Rajput and @Disposition_Dev for help and ideas.  I divided the problem of this post into the following three parts to solve it. Finally, it was solved:

 

1) Highlighted Layer

https://community.adobe.com/t5/illustrator-discussions/how-to-highlighted-select-a-specified-layer/m-p/13145132#M333218 

 

2)Duplicate Layer

https://community.adobe.com/t5/illustrator-discussions/quot-duplicate-layer-quot-command-in-script/m-p/13132303#M332559 

 

3)Rename Layer

https://community.adobe.com/t5/illustrator-discussions/how-to-move-and-align-objects-with-scripts/m-p/13147109#M333160 

 

Here I share the complete code I have sorted out. I hope this can be helpful to people with similar problems. Thanks!

// Highlihgt and duplicate layer
function highlightLayerInContainer (targetLayer) {
		var someTempPath = targetLayer.pathItems.rectangle(0, 0, 200, 200);
    someTempPath.name = "TEMP [for highlighting]";
		app.activeDocument.selection =  null;
		someTempPath.selected = true;
		app.doScript("target layer", "Test Set 2");
		someTempPath.remove();
  }

    for (var i=1;i<199;i++) {
        highlightLayerInContainer(app.activeDocument.layers[0].layers[0]); // my target layer was a sublayer
        app.doScript("DupeLayer", "Test Set 2");
        app.activeDocument.layers[0].layers[0].name=i+1  // number sequence name, target layer name set to "1"
    }

var doc = app.activeDocument;
var layers = doc.layers;

// Rename all sublayers
for (var i = doc.layers.length - 1; i > -1; i--) {

  recursiveRename(doc.layers[i]);
}

function recursiveRename(parent) {
  for (var i = 0; i < parent.layers.length; i++) {
    parent.layers[i].name = parent.layers[i].name.replace(/\scopy.*$/, "");
    recursiveRename(parent.layers[i]);
  }
}

// Action file
/version 3
/name [ 10
	54657374205365742032
]
/isOpen 1
/actionCount 2
/action-1 {
	/name [ 9
		447570654c61796572
	]
	/keyIndex 0
	/colorIndex 0
	/isOpen 1
	/eventCount 1
	/event-1 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 1
		/isOn 1
		/hasDialog 0
		/parameterCount 2
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 1
		}
		/parameter-2 {
			/key 1851878757
			/showInPalette -1
			/type (ustring)
			/value [ 19
				4475706c69636174652053656c656374696f6e
			]
		}
	}
}
/action-2 {
	/name [ 12
		746172676574206c61796572
	]
	/keyIndex 0
	/colorIndex 0
	/isOpen 1
	/eventCount 3
	/event-1 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 0
		/isOn 1
		/hasDialog 0
		/parameterCount 2
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 19
		}
		/parameter-2 {
			/key 1851878757
			/showInPalette -1
			/type (ustring)
			/value [ 13
				4c6f63617465204f626a656374
			]
		}
	}
	/event-2 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 0
		/isOn 1
		/hasDialog 0
		/parameterCount 1
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 24
		}
	}
	/event-3 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 0
		/isOn 1
		/hasDialog 0
		/parameterCount 1
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 25
		}
	}
}

 

4 replies

Raymond ZJHAuthorCorrect answer
Inspiring
August 20, 2022

Thanks @Silly-V  @jduncan @Charu Rajput and @Disposition_Dev for help and ideas.  I divided the problem of this post into the following three parts to solve it. Finally, it was solved:

 

1) Highlighted Layer

https://community.adobe.com/t5/illustrator-discussions/how-to-highlighted-select-a-specified-layer/m-p/13145132#M333218 

 

2)Duplicate Layer

https://community.adobe.com/t5/illustrator-discussions/quot-duplicate-layer-quot-command-in-script/m-p/13132303#M332559 

 

3)Rename Layer

https://community.adobe.com/t5/illustrator-discussions/how-to-move-and-align-objects-with-scripts/m-p/13147109#M333160 

 

Here I share the complete code I have sorted out. I hope this can be helpful to people with similar problems. Thanks!

// Highlihgt and duplicate layer
function highlightLayerInContainer (targetLayer) {
		var someTempPath = targetLayer.pathItems.rectangle(0, 0, 200, 200);
    someTempPath.name = "TEMP [for highlighting]";
		app.activeDocument.selection =  null;
		someTempPath.selected = true;
		app.doScript("target layer", "Test Set 2");
		someTempPath.remove();
  }

    for (var i=1;i<199;i++) {
        highlightLayerInContainer(app.activeDocument.layers[0].layers[0]); // my target layer was a sublayer
        app.doScript("DupeLayer", "Test Set 2");
        app.activeDocument.layers[0].layers[0].name=i+1  // number sequence name, target layer name set to "1"
    }

var doc = app.activeDocument;
var layers = doc.layers;

// Rename all sublayers
for (var i = doc.layers.length - 1; i > -1; i--) {

  recursiveRename(doc.layers[i]);
}

function recursiveRename(parent) {
  for (var i = 0; i < parent.layers.length; i++) {
    parent.layers[i].name = parent.layers[i].name.replace(/\scopy.*$/, "");
    recursiveRename(parent.layers[i]);
  }
}

// Action file
/version 3
/name [ 10
	54657374205365742032
]
/isOpen 1
/actionCount 2
/action-1 {
	/name [ 9
		447570654c61796572
	]
	/keyIndex 0
	/colorIndex 0
	/isOpen 1
	/eventCount 1
	/event-1 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 1
		/isOn 1
		/hasDialog 0
		/parameterCount 2
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 1
		}
		/parameter-2 {
			/key 1851878757
			/showInPalette -1
			/type (ustring)
			/value [ 19
				4475706c69636174652053656c656374696f6e
			]
		}
	}
}
/action-2 {
	/name [ 12
		746172676574206c61796572
	]
	/keyIndex 0
	/colorIndex 0
	/isOpen 1
	/eventCount 3
	/event-1 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 0
		/isOn 1
		/hasDialog 0
		/parameterCount 2
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 19
		}
		/parameter-2 {
			/key 1851878757
			/showInPalette -1
			/type (ustring)
			/value [ 13
				4c6f63617465204f626a656374
			]
		}
	}
	/event-2 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 0
		/isOn 1
		/hasDialog 0
		/parameterCount 1
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 24
		}
	}
	/event-3 {
		/useRulersIn1stQuadrant 0
		/internalName (ai_plugin_Layer)
		/localizedName [ 5
			4c61796572
		]
		/isOpen 0
		/isOn 1
		/hasDialog 0
		/parameterCount 1
		/parameter-1 {
			/key 1836411236
			/showInPalette -1
			/type (integer)
			/value 25
		}
	}
}

 

Inspiring
August 17, 2022

Thanks @Silly-V  @Charu Rajput for help and ideas.

 

I can solve 80% of my problems with the following script, but I haven't thought of a good way to keep the names of all the copied sub layers consistent with the source layers.

 

// Need to import “target layer” and “dupelayer” actions in the action panel in advance.
// The target layer ”1” to be copied is a sub layer under a parent layer.

function highlightLayerInContainer (targetLayer) {
		var someTempPath = targetLayer.pathItems.rectangle(0, 0, 200, 200);
    someTempPath.name = "TEMP [for highlighting]";
		app.activeDocument.selection =  null;
		someTempPath.selected = true;
		app.doScript("target layer", "Test Set 2"); 
		someTempPath.remove();
  }

    for (var i=1;i<199;i++) {
        highlightLayerInContainer(app.activeDocument.layers[0].layers[0]); // The target layer ”1” to be copied is a sub layer under a parent layer.
        app.doScript("DupeLayer", "Test Set 2");
        app.activeDocument.layers[0].layers[0].name=i+1; //number sequence name
    }

 

I would be greatly appreciated if you could give me help or advice, Thanks in advance!

Inspiring
August 13, 2022

Is there a forum God to help me look at it? 

femkeblanco
Legend
August 11, 2022

Just to be clear, you want to duplicate an empty layer's structure (one layer and its sublayers), not any items on those layers/sublayers?

Inspiring
August 12, 2022

Sorry, I didn't make it clear.
Not only the layer structure, it should also copy all the items in the layers/sublayers if the layers/sublayers have items.