Ausgabe
Beispiel-Photoshop-Datei:
[Layer 1]
[Group 1]
[Layer 2]
[Layer 3]
[Layer 4 (Hidden)]
[Layer 5]
Gewünschte Ausgabe ( durch Doppelpunkte getrennte Textdatei ):
Layer 1:x:y:w:h
Group 1:Layer 2:x:y:w:h
Group 1:Layer 3:x:y:w:h
Layer 5:x:y:w:h
Wie Sie sehen können, versuche ich, die Namen jeder Ebene mit ihren Koordinaten und Abmessungen in eine durch Doppelpunkte getrennte Textdatei zu schreiben. Ignorieren aller ausgeblendeten Ebenen und Anhängen des Gruppennamens an alle Ebenen innerhalb von Gruppen. Mit diesem Skript kann ich die Koordinaten und Abmessungen für jede Ebene abrufen:
// Enables double-click launching from the Mac Finder or Windows Explorer
#target photoshop
// Bring application forward
app.bringToFront();
// Set active Document variable and decode name for output
var docRef = app.activeDocument;
var docName = decodeURI(activeDocument.name);
// Define pixels as unit of measurement
var defaultRulerUnits = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;
// Define variable for the number of layers in the active document
var layerNum = app.activeDocument.artLayers.length;
// Define variable for the active layer in the active document
var layerRef = app.activeDocument.activeLayer;
// Define varibles for x and y of layers
var x = layerRef.bounds[0].value;
var y = layerRef.bounds[1].value;
var w = layerRef.bounds[2].value;
var h = layerRef.bounds[3].value;
var coords = "";
// Loop to iterate through all layers
function recurseLayers(currLayers) {
for ( var i = 0; i < currLayers.layers.length; i++ ) {
layerRef = currLayers.layers[i];
if (!layerRef.visibility) {
continue;
}
x = layerRef.bounds[0].value;
y = layerRef.bounds[1].value;
w = layerRef.bounds[2].value - x;
h = layerRef.bounds[3].value - y;
coords += layerRef.name + ":" + x + ":" + y + ":" + w + ":" + h + "\n";
//test if it's a layer set
if ( isLayerSet(currLayers.layers[i]) ) {
recurseLayers(currLayers.layers[i]);
}
}
}
//a test for a layer set
function isLayerSet(layer) {
try {
if ( layer.layers.length > 0 ) {
return true;
}
}
catch(err) {
return false;
}
}
// Ask the user for the folder to export to
var FPath = Folder.selectDialog("Save exported coordinates to");
// Detect line feed type
if ( $.os.search(/windows/i) !== -1 ) {
fileLineFeed = "Windows";
}
else {
fileLineFeed = "Macintosh";
}
// Export to txt file
function writeFile(info) {
try {
var f = new File(FPath + "/" + docName + ".txt");
f.remove();
f.open('a');
f.lineFeed = fileLineFeed;
f.write(info);
f.close();
}
catch(e){}
}
// Run the functions
recurseLayers(docRef);
preferences.rulerUnits = defaultRulerUnits; // Set preferences back to user 's defaults
writeFile(coords);
// Show results
if ( FPath == null ) {
alert("Export aborted", "Canceled");
}
else {
alert("Exported " + layerNum + " layer's coordinates to " + FPath + "/" + docName + ".txt " + "using " + fileLineFeed + " line feeds.", "Success!");
}
Das obige Skript wurde ursprünglich von Chris DeLuca auf dieser Website bereitgestellt, mit einer kleinen Änderung von mir, um die Abmessungen bereitzustellen.
Das listet jedoch alle Ebenen auf, unabhängig davon, ob sie ausgeblendet sind oder nicht, und kümmert sich nicht um Gruppen (Ebenensätze – richtig?)
In einem Versuch, versteckte Ebenen zu ignorieren, habe ich die rekursive Funktion wie folgt geändert:
// Loop to iterate through all layers
function recurseLayers(currLayers) {
for ( var i = 0; i < currLayers.layers.length; i++ ) {
layerRef = currLayers.layers[i];
if (!layerRef.visibility) {
continue;
}
x = layerRef.bounds[0].value;
y = layerRef.bounds[1].value;
w = layerRef.bounds[2].value - x;
h = layerRef.bounds[3].value - y;
coords += layerRef.name + "," + x + "," + y + "," + w + "," + h + "\n";
//test if it's a layer set
if ( isLayerSet(currLayers.layers[i]) ) {
recurseLayers(currLayers.layers[i]);
}
}
}
Denken, dass es alle versteckten Schichten ignorieren würde. Leider erzeugt das eine Null-Byte-Datei.
Ignorieren Sie dieses Problem vorerst und versuchen Sie es mit dem Gruppierungsproblem. Ich möchte nicht, dass eine Gruppe aufgelistet wird, aber ich möchte, dass der Gruppenname an den Anfang aller Ebenen angehängt wird, die sich innerhalb der Gruppe befinden. Ich habe das versucht:
// Loop to iterate through all layers
function recurseLayers(currLayers) {
for ( var i = 0; i < currLayers.layers.length; i++ ) {
layerRef = currLayers.layers[i];
x = layerRef.bounds[0].value;
y = layerRef.bounds[1].value;
w = layerRef.bounds[2].value - x;
h = layerRef.bounds[3].value - y;
coords += group + ":" + layerRef.name + ":" + x + :," + y + ":" + w + ":" + h + "\n";
group = "";
//test if it's a layer set
if ( isLayerSet(currLayers.layers[i]) ) {
group = currLayers.layers[i]
recurseLayers(currLayers.layers[i]);
}
}
}
Aber das hängt nur den Gruppennamen an die erste Ebene darin an. Wirklich verständlich, aber ich kann nicht herausfinden, wie ich die übergeordnete Gruppe jeder Ebene bekomme.
Jede Hilfe bei einem oder beiden dieser Probleme wäre sehr willkommen. Vielen Dank
Lösung
Ich habe ein paar Stunden herumgebastelt und es geschafft, meine eigene Frage zu beantworten. Es ist ein bisschen hacky und ich bin sicher, es gibt eine elegantere Lösung, aber es funktioniert!
Hier ist es, falls es noch jemand braucht:
#target photoshop
// Bring application forward
app.bringToFront();
// Set active Document variable and decode name for output
var docRef = app.activeDocument;
var docName = decodeURI(activeDocument.name);
// Define pixels as unit of measurement
var defaultRulerUnits = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;
// Define variable for the number of layers in the active document
var layerNum = app.activeDocument.artLayers.length;
// Define variable for the active layer in the active document
var layerRef = app.activeDocument.activeLayer;
// Define varibles for x and y of layers
var x = layerRef.bounds[0].value;
var y = layerRef.bounds[1].value;
var w = layerRef.bounds[2].value;
var h = layerRef.bounds[3].value;
var coords = "";
var group = "";
var layersInGroup = 0;
var thisGroupsLayer = 0;
var inGroup = false;
// Loop to iterate through all layers
function recurseLayers(currLayers) {
for ( var i = 0; i < currLayers.layers.length; i++ ) {
layerRef = currLayers.layers[i];
if (!layerRef.visible) {
continue;
}
if (isLayerSet(currLayers.layers[i]) == 0){
x = layerRef.bounds[0].value;
y = layerRef.bounds[1].value;
w = layerRef.bounds[2].value - x;
h = layerRef.bounds[3].value - y;
coords += group + layerRef.name + ":" + x + ":" + y + ":" + w + ":" + h + "\n";
}
if (inGroup && thisGroupsLayer == layersInGroup){
inGroup = false;
group = "";
thisGroupsLayer = 0;
}
if (inGroup && thisGroupsLayer != layersInGroup){
thisGroupsLayer++;
}
if (!inGroup){
layersInGroup = isLayerSet(currLayers.layers[i]);
if ( layersInGroup ) {
var groupname = currLayers.layers[i].toString();
group = groupname.substring(0, groupname.length-1);
group = group.slice(10, group.length)+":";
inGroup = true;
thisGroupsLayer++;
recurseLayers(currLayers.layers[i]);
}
}
}
}
//a test for a layer set
function isLayerSet(layer) {
try {
if ( layer.layers.length > 0 ) {
return layer.layers.length;
}
}
catch(err) {
return false;
}
}
// Ask the user for the folder to export to
var FPath = Folder.selectDialog("Save exported coordinates to");
// Detect line feed type
if ( $.os.search(/windows/i) !== -1 ) {
fileLineFeed = "Windows";
}
else {
fileLineFeed = "Macintosh";
}
// Export to txt file
var filename = docName.substring(0, docName.length - 4) + " subimages.txt";
function writeFile(info) {
try {
var f = new File(FPath + "/" + filename);
f.remove();
f.open('a');
f.lineFeed = fileLineFeed;
f.write(info);
f.close();
}
catch(e){}
}
// Run the functions
recurseLayers(docRef);
preferences.rulerUnits = defaultRulerUnits; // Set preferences back to user 's defaults
writeFile(coords);
// Show results
if ( FPath == null ) {
alert("Export aborted", "Canceled");
}
else {
alert("Exported " + layerNum + " layer's coordinates to " + FPath + "/" + filename + " using " + fileLineFeed + " line feeds.", "Success!");
}
Beantwortet von – Snarf
Antwort geprüft von – Cary Denson (FixError Admin)