Skip to main content
Inspiring
August 9, 2022
Answered

Select layer group below the currently selected group

  • August 9, 2022
  • 1 reply
  • 1164 views

Dear @Manan Joshi is it possible to make similar thing with a group of layers instead of single layer. To be more precise i need to select group of layers bellow currently selected group? Thanks in advance

This topic has been closed for replies.
Correct answer Manan Joshi

So you mean that the code should not look for groups inside the currently selected group but outside that? Try the following version

var s2t = stringIDToTypeID;
var t2s = typeIDToStringID;

function getProperty(className, property, index)
{
	var r = new ActionReference(), p = s2t(property)
	r.putProperty(s2t('property'), p)
	if(index != undefined)
		r.putIndex(s2t(className),index)
	else
		r.putEnumerated(s2t(className), s2t('ordinal'), s2t('targetEnum'))
	var a = executeActionGet(r)
	return a
}

function isGroup(layerIdx){
	var r 
	if(layerIdx !== null)
		r = t2s(getProperty("layer", "layerSection", layerIdx).getEnumerationValue(s2t("layerSection")))
	else
		r = t2s(getProperty("layer", "layerSection").getEnumerationValue(s2t("layerSection")))
		
	return r === "layerSectionStart"
}

function movetoEnd(grpIdx){
	var r = t2s(getProperty("layer", "layerSection", grpIdx).getEnumerationValue(s2t("layerSection")))
	while(r !== "layerSectionEnd")
		r = t2s(getProperty("layer", "layerSection", --grpIdx).getEnumerationValue(s2t("layerSection")))
		
	return grpIdx
}

function selectGroup(layerName, layerID) {
    var idselect = stringIDToTypeID("select");
    var desc25 = new ActionDescriptor();
    var idnull = stringIDToTypeID("null");
    var ref11 = new ActionReference();
    var idlayer = stringIDToTypeID("layer");
    ref11.putName(idlayer, layerName);
    desc25.putReference(idnull, ref11);
    var idmakeVisible = stringIDToTypeID("makeVisible");
    desc25.putBoolean(idmakeVisible, false);
    var idlayerID = stringIDToTypeID("layerID");
    var list5 = new ActionList();
    list5.putInteger(layerID);
    desc25.putList(idlayerID, list5);
    executeAction(idselect, desc25, DialogModes.NO);
}

var layerIdx = activeDocument.activeLayer.itemIndex
var bgLayer = getProperty("document", "hasBackgroundLayer").getBoolean(s2t("hasBackgroundLayer")) ? 0 : 1
!bgLayer && layerIdx--
if(isGroup())
{
	layerIdx = movetoEnd(layerIdx)
	r = isGroup(--layerIdx)
	while(!r && layerIdx > bgLayer){
		r = isGroup(--layerIdx)
	}

	if(isGroup(layerIdx)){
		var n = getProperty("layer", "name", layerIdx).getString(s2t("name"))
		selectGroup(n, layerIdx)
	}
}

-Manan

1 reply

Community Expert
August 15, 2022

Hi @milevic,

Give the following code a try. When run with a group selected in the layers panel, it will search for the next group under it and select it if found

var s2t = stringIDToTypeID;
var t2s = typeIDToStringID;

function getProperty(className, property, index)
{
	var r = new ActionReference(), p = s2t(property)
	r.putProperty(s2t('property'), p)
	if(index != undefined)
		r.putIndex(s2t(className),index)
	else
		r.putEnumerated(s2t(className), s2t('ordinal'), s2t('targetEnum'))
	var a = executeActionGet(r)
	return a
}

function isGroup(layerIdx){
	var r 
	if(layerIdx !== null)
		r = t2s(getProperty("layer", "layerSection", layerIdx).getEnumerationValue(s2t("layerSection")))
	else
		r = t2s(getProperty("layer", "layerSection").getEnumerationValue(s2t("layerSection")))
		
	return r === "layerSectionStart"
}

function selectGroup(layerName, layerID) {
    var idselect = stringIDToTypeID("select");
    var desc25 = new ActionDescriptor();
    var idnull = stringIDToTypeID("null");
    var ref11 = new ActionReference();
    var idlayer = stringIDToTypeID("layer");
    ref11.putName(idlayer, layerName);
    desc25.putReference(idnull, ref11);
    var idmakeVisible = stringIDToTypeID("makeVisible");
    desc25.putBoolean(idmakeVisible, false);
    var idlayerID = stringIDToTypeID("layerID");
    var list5 = new ActionList();
    list5.putInteger(layerID);
    desc25.putList(idlayerID, list5);
    executeAction(idselect, desc25, DialogModes.NO);
}

var layerIdx = activeDocument.activeLayer.itemIndex
var bgLayer = getProperty("document", "hasBackgroundLayer").getBoolean(s2t("hasBackgroundLayer")) ? 0 : 1
!bgLayer && layerIdx--
if(isGroup())
{
	r = isGroup(--layerIdx)
	while(!r && layerIdx > bgLayer){
		r = isGroup(--layerIdx)
	}

	if(isGroup(layerIdx)){
		var n = getProperty("layer", "name", layerIdx).getString(s2t("name"))
		selectGroup(n, layerIdx)
	}
}

-Manan

-Manan
milevicAuthor
Inspiring
August 16, 2022

Thanks for the answering, i tested the script but a problem appears if the selected folder contains subfolders, is it possible to improve this?

Manan JoshiCommunity ExpertCorrect answer
Community Expert
August 16, 2022

So you mean that the code should not look for groups inside the currently selected group but outside that? Try the following version

var s2t = stringIDToTypeID;
var t2s = typeIDToStringID;

function getProperty(className, property, index)
{
	var r = new ActionReference(), p = s2t(property)
	r.putProperty(s2t('property'), p)
	if(index != undefined)
		r.putIndex(s2t(className),index)
	else
		r.putEnumerated(s2t(className), s2t('ordinal'), s2t('targetEnum'))
	var a = executeActionGet(r)
	return a
}

function isGroup(layerIdx){
	var r 
	if(layerIdx !== null)
		r = t2s(getProperty("layer", "layerSection", layerIdx).getEnumerationValue(s2t("layerSection")))
	else
		r = t2s(getProperty("layer", "layerSection").getEnumerationValue(s2t("layerSection")))
		
	return r === "layerSectionStart"
}

function movetoEnd(grpIdx){
	var r = t2s(getProperty("layer", "layerSection", grpIdx).getEnumerationValue(s2t("layerSection")))
	while(r !== "layerSectionEnd")
		r = t2s(getProperty("layer", "layerSection", --grpIdx).getEnumerationValue(s2t("layerSection")))
		
	return grpIdx
}

function selectGroup(layerName, layerID) {
    var idselect = stringIDToTypeID("select");
    var desc25 = new ActionDescriptor();
    var idnull = stringIDToTypeID("null");
    var ref11 = new ActionReference();
    var idlayer = stringIDToTypeID("layer");
    ref11.putName(idlayer, layerName);
    desc25.putReference(idnull, ref11);
    var idmakeVisible = stringIDToTypeID("makeVisible");
    desc25.putBoolean(idmakeVisible, false);
    var idlayerID = stringIDToTypeID("layerID");
    var list5 = new ActionList();
    list5.putInteger(layerID);
    desc25.putList(idlayerID, list5);
    executeAction(idselect, desc25, DialogModes.NO);
}

var layerIdx = activeDocument.activeLayer.itemIndex
var bgLayer = getProperty("document", "hasBackgroundLayer").getBoolean(s2t("hasBackgroundLayer")) ? 0 : 1
!bgLayer && layerIdx--
if(isGroup())
{
	layerIdx = movetoEnd(layerIdx)
	r = isGroup(--layerIdx)
	while(!r && layerIdx > bgLayer){
		r = isGroup(--layerIdx)
	}

	if(isGroup(layerIdx)){
		var n = getProperty("layer", "name", layerIdx).getString(s2t("name"))
		selectGroup(n, layerIdx)
	}
}

-Manan

-Manan