// slices and layer comp combinations;
// based on code by michael l hale;
// 2025, use it at your own risk;
if (app.documents.length > 0) {
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
var myDocument = app.activeDocument;
var docName = myDocument.name;
try {
var basename = docName.match(/(.*)\.[^\.]+$/)[1];
var origDocPath = myDocument.fullName;
var docPath = myDocument.path;
}
catch (e) {
var basename = myDocument.name;
var docPath = "~/Desktop"
};
// get properties;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var docDesc = executeActionGet(ref);
var theComps = docDesc.getList(stringIDToTypeID("compsList"));
var theSlices = docDesc.getObjectValue(stringIDToTypeID("slices")).getList(stringIDToTypeID("slices"));
var theArray = new Array;
for (var m = 0; m < theSlices.count; m++) {
var thisOne = theSlices.getObjectValue(m);
if (thisOne.hasKey(stringIDToTypeID("name")) == true) {theArray.push([thisOne.getString(stringIDToTypeID("name")), thisOne.getObjectValue(stringIDToTypeID("bounds")).getInteger(stringIDToTypeID("left")), thisOne.getObjectValue(stringIDToTypeID("bounds")).getInteger(stringIDToTypeID("top")), thisOne.getObjectValue(stringIDToTypeID("bounds")).getInteger(stringIDToTypeID("right")), thisOne.getObjectValue(stringIDToTypeID("bounds")).getInteger(stringIDToTypeID("bottom"))])}
};
var theCompsArray = new Array;
for (var m = 0; m < theComps.count; m++) {
var thisOne = theComps.getObjectValue(m);
theCompsArray.push(thisOne.getString(stringIDToTypeID("title")))
};
// process the slices and arrays;
if (theArray.length != 0 && theCompsArray.length != 0) {
var theCopy = activeDocument.duplicate("theCopy");
var theState = theCopy.activeHistoryState;
for (var n = 0; n < theArray.length; n++) {
theCopy.crop([theArray[n][1], theArray[n][2], theArray[n][3], theArray[n][4]]);
var theState2 = theCopy.activeHistoryState;
for (var o = 0; o < theCompsArray.length; o++) {
applyLayerComp (o+1);
savePNG (theCopy, docPath, basename, theArray[n][0]+"_"+theCompsArray[o])
theCopy.activeHistoryState = theState2;
};
theCopy.activeHistoryState = theState;
};
theCopy.close(SaveOptions.DONOTSAVECHANGES);
};
// reset;
app.preferences.rulerUnits = originalRulerUnits;
};
////////////////////////////////////
////// based on code by michael l hale //////
function checkDesc2 (theDesc, theAlert) {
var c = theDesc.count;
var str = '';
for(var i=0;i<c;i++){ //enumerate descriptor's keys
str = str + 'Key '+i+' = '+typeIDToStringID(theDesc.getKey(i))+': '+theDesc.getType(theDesc.getKey(i))+'\n'+getValues (theDesc, i)+'\n';
};
if (theAlert == true) {alert("desc\n\n"+str);
return};
return str
};
////// check //////
function getValues (theDesc, theNumber) {
switch (theDesc.getType(theDesc.getKey(theNumber))) {
case DescValueType.ALIASTYPE:
return theDesc.getPath(theDesc.getKey(theNumber));
break;
case DescValueType.BOOLEANTYPE:
return theDesc.getBoolean(theDesc.getKey(theNumber));
break;
case DescValueType.CLASSTYPE:
return theDesc.getClass(theDesc.getKey(theNumber));
break;
case DescValueType.DOUBLETYPE:
return theDesc.getDouble(theDesc.getKey(theNumber));
break;
case DescValueType.ENUMERATEDTYPE:
return (typeIDToStringID(theDesc.getEnumerationValue(theDesc.getKey(theNumber)))+"_"+typeIDToStringID(theDesc.getEnumerationType(theDesc.getKey(theNumber))));
break;
case DescValueType.INTEGERTYPE:
return theDesc.getInteger(theDesc.getKey(theNumber));
break;
case DescValueType.LISTTYPE:
return theDesc.getList(theDesc.getKey(theNumber));
break;
case DescValueType.OBJECTTYPE:
return (theDesc.getObjectValue(theDesc.getKey(theNumber))+"_"+typeIDToStringID(theDesc.getObjectType(theDesc.getKey(theNumber))));
break;
case DescValueType.RAWTYPE:
return theDesc.getReference(theDesc.getData(theNumber));
break;
case DescValueType.REFERENCETYPE:
return theDesc.getReference(theDesc.getKey(theNumber));
break;
case DescValueType.STRINGTYPE:
return theDesc.getString(theDesc.getKey(theNumber));
break;
case DescValueType.UNITDOUBLE:
return (theDesc.getUnitDoubleValue(theDesc.getKey(theNumber))+"_"+typeIDToStringID(theDesc.getUnitDoubleType(theDesc.getKey(theNumber))));
break;
default:
break;
};
};
////// apply layer comp //////
function applyLayerComp (theIndex) {
// =======================================================
var desc6 = new ActionDescriptor();
var ref3 = new ActionReference();
ref3.putIndex( stringIDToTypeID( "compsClass" ), theIndex );
//ref3.putName( stringIDToTypeID( "compsClass" ), theName );
desc6.putReference( stringIDToTypeID( "null" ), ref3 );
executeAction( stringIDToTypeID( "applyComp" ), desc6, DialogModes.NO );
};
////// function to png //////
function savePNG (myDocument, docPath, basename, theSuffix) {
var desc10 = new ActionDescriptor();
var desc11 = new ActionDescriptor();
desc11.putEnumerated( stringIDToTypeID( "method" ), stringIDToTypeID( "PNGMethod" ), stringIDToTypeID( "quick" ) );
desc11.putEnumerated( stringIDToTypeID( "PNGInterlaceType" ), stringIDToTypeID( "PNGInterlaceType" ), stringIDToTypeID( "PNGInterlaceNone" ) );
desc11.putEnumerated( stringIDToTypeID( "PNGFilter" ), stringIDToTypeID( "PNGFilter" ), stringIDToTypeID( "PNGFilterAdaptive" ) );
desc11.putInteger( stringIDToTypeID( "compression" ), 6 );
desc11.putEnumerated( stringIDToTypeID( "embedIccProfileLastState" ), stringIDToTypeID( "embedOff" ), stringIDToTypeID( "embedOff" ) );
var idPNGFormat = stringIDToTypeID( "PNGFormat" );
desc10.putObject( stringIDToTypeID( "as" ), idPNGFormat, desc11 );
desc10.putPath( stringIDToTypeID( "in" ), new File( docPath+"/"+basename+"_"+theSuffix+".png" ) );
desc10.putBoolean( stringIDToTypeID( "copy" ), true );
desc10.putBoolean( stringIDToTypeID( "lowerCase" ), true );
desc10.putBoolean( stringIDToTypeID( "embedProfiles" ), true );
desc10.putEnumerated( stringIDToTypeID( "saveStage" ), stringIDToTypeID( "saveStageType" ), stringIDToTypeID( "saveSucceeded" ) );
executeAction( stringIDToTypeID( "save" ), desc10, DialogModes.NO );
};
