Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Ebenen ausblenden

Community Beginner ,
May 04, 2023 May 04, 2023

Hallo zusammen,

 

Ich nutze Photoshop 24.0.0 und möchte gerne mit einer Aktion Ebenen aus- und einblenden und zwischendurch die aktuelle Ansicht als JPG abspeichern.

 

Mein Problem ist aktuell, dass die Ebenenwechsel nicht sauber durchgeführt werden.

 

Ich habe euch mal eine Datei zum Testen beigefügt. Meine aufgezeichnete Aktion findet ihr hier: https://www.dropbox.com/s/xnr5fuasqnxpfop/Fotostrecken.atn?dl=0

 

Mein Ziel ist, dass beginnen von oben der oberste Ordner ausgeblendet, der Folgeordner eingeblendet und danach gespeichert wird. Dann wieder ausblenden, nächsten Ordner einblenden und speichern - usw.

 

Wenn ich nun die Aktion ausführe, bekomme ich auch eine korrekte Anzahl von Bildern, allerdings fehlen die Inhalte über dem blauen Balken.

 

Wenn ich nun die einzelnen Schritte der Aktion durchklicke kann ich sehen, dass die "einblenden Ebene XX" Schritte nicht funktionieren. Aber "einblenden Ebene Hintergrund" funktioniert.

 

Könnt ihr euch das erklären?

 

Vielen Dank für eure Hilfe!

VG, thowi

TOPICS
Actions and scripting , macOS
2.1K
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , May 05, 2023 May 05, 2023

Ich bin mir nicht sicher, ob ich ganz folge, aber etwas, das mir auffällig scheint ist, daß Sie die Visibility von vorteileLayerSet nicht auf true beziehungsweise false zu stellen scheinen. 

Translate
Adobe
Community Expert ,
May 04, 2023 May 04, 2023

Actions sind ziemlich beschränkt im Funktionsumfang und ausgeblendete Ebenenen/Gruppen sind ein Problem. 

Ich empfehle statt Actions Scripts zu verwenden, diese können auch Konditionalitäten beinhalten, etwa »jede Gruppe in der Gruppe« und müssen deshalb nicht unbedingt jede Gruppe namentlich identifizieren. 

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
May 04, 2023 May 04, 2023

Manchmal ist es schon nützlich, einen Teil einer Action mit einem Script-Snippet zu erledigen. 

Der folgende Code würde die nächste Gruppe unter der aktiven Ebene/Gruppe auswählen und sichtbar machen. 

// select next group below the selected layer or group;
// 2023, use it at your own risk;
if (app.documents.length > 0){
    var theIndex = getActiveLayerIndex();
    nextGroupBelow (theIndex)
};
////// by mike hale, via paul riggott //////
function getActiveLayerIndex(){
    var ref = new ActionReference();
    ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('hasBackgroundLayer'));
    ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
    var desc = executeActionGet(ref);
    if (desc.getBoolean(stringIDToTypeID("hasBackgroundLayer")) == true) {var theAdd = (-1)}
    else {var theAdd = 0};
    var ref = new ActionReference(); 
    ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('itemIndex'));
    ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt")); 
//    ref.putIdentifier(charIDToTypeID("Lyr "), theId); 
    d = executeActionGet(ref);
    return (d.getInteger(stringIDToTypeID('itemIndex'))+theAdd); 
    };
////// by mike hale, via paul riggott //////
function selectLayerByIndex (index,add,makeVisible){ 
    add = undefined ? add = false:add 
    var ref = new ActionReference();
        ref.putIndex(charIDToTypeID("Lyr "), index);
        var desc = new ActionDescriptor();
        desc.putReference(charIDToTypeID("null"), ref );
           if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) ); 
          desc.putBoolean( charIDToTypeID( "MkVs" ), makeVisible ); 
       try{
        executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
    }catch(e){
    alert(e.message); 
    }
    };
////// group below //////
function nextGroupBelow (theIndex) {
    var theCheck = true;
    while (theCheck == true) {
        theIndex--;
        var ref = new ActionReference(); 
        ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('layerSection'));
        ref.putIndex(charIDToTypeID("Lyr "), theIndex); 
        d = executeActionGet(ref);
        var layerSet = typeIDToStringID(d.getEnumerationValue(stringIDToTypeID("layerSection")));
        if (layerSet == "layerSectionStart" || theIndex == 0) {
            theCheck = false
        }
    };
    try {selectLayerByIndex(theIndex, false, true)}
    catch (e) {};
    return theIndex
};
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
May 04, 2023 May 04, 2023

Danke für den Tipp! Das wäre auch ein möglicher Ansatz. Ich hatte ja versucht, eine Komplettlösung in AppleScript zu bauen. Irgendwie ist meine Antwort hier verschwunden, daher versuche ich es hier einfach nochmal.

 

Die Lösung hier sieht schon ganz gut aus, ich bekomme aber regelmäßig folgende Fehlermeldung:

 

visible of layer 1 of item 2 of every layer set of layer set 5 of document \"document.psd\"“ kann nicht als „true“ gesetzt werden." number -10006 from visible of layer 1 of item 2 of every layer set of layer set 5 of document "document.psd

 

Kannst du dir das erklären? Woran könnte das liegen?

tell application "Adobe Photoshop 2023"
    -- Ebenengruppe "Naht" auswählen
    set layerSet to layer set "Naht" of current document
    set layerSetName to name of layerSet
    
    -- Schleife durch alle Untergruppen in "Naht"
    repeat with subLayerSet in layer sets of layerSet
        -- Überprüfen, ob die erste Ebene in der Untergruppe nicht sichtbar ist
        tell layer 1 of subLayerSet
            if not visible then
                -- Untergruppe einblenden
                set visible to true
                
                -- Name der Untergruppe
                set subLayerSetName to name of subLayerSet
                
                -- Name der Datei
                set docName to name of current document
                set saveName to layerSetName & "-" & subLayerSetName & ".jpg"
                
                -- Speichere Datei im selben Ordner wie die Photoshop-Datei
                set docPath to path of current document
                set saveFolder to (container of docPath) as string
                set saveFile to saveFolder & saveName
                set saveOptions to JPEG save options
                save current document in file saveFile as saveOptions with options {quality:12}
                
                -- Untergruppe ausblenden
                set visible to false
            end if
        end tell
    end repeat
end tell

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
May 04, 2023 May 04, 2023

JavaScript ist die Plattformunabhängige Programmiersprache für Photoshop Scripting, dementsprechend können Sie dafür mit Hilfe von einigen Forum Regulars rechnen, für AppleScript eher weniger. 

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
May 05, 2023 May 05, 2023

Vielen Dank für den Tipp! Klar, das ist logisch und macht Sinn. Ich hab meinen Ansatz mal in JS übertragen. Das funktioniert auch soweit ganz gut. Mein Problem ist aktuell nur, dass die Schriften und Fahnen nicht eingeblendet werden.

 

Das Skript ist nun so gebaut, dass es nach dem Layerset "Vorteile" sucht. Danach soll es jeden untergeordneten Ordner durcharbeiten und dort nacheinander alle unterlayer aktivieren und speichern.

Am Ende soll dann also folgendes rauskommen:

VorteilA-DE.jpg

VorteilA-US.jpg

VorteilA-FR.jpg

VorteilB-DE.jpg

VorteilB-US.jpg

VorteilB-FR.jpg

VorteilC-DE.jpg

VorteilC-US.jpg

VorteilC-FR.jpg

 

Das macht er auch schon - aber irgendwie blendet er mir die Gruppen "DE", "US", "FR" nicht korrekt ein, sodass im Ergebnis die Texte und Flaggen nicht da sind.

 

Können Sie mir sagen, wo hier mein Fehler liegt? Ich habe die Testdatei nochmal aktualisiert beigefügt. Hier das Skript, das sieht für mich eigenltich gut aus, aber ich hab auch nicht wirklich JS Erfahrung:

// get active document
var doc = app.activeDocument;

// get top-level layer set "alleVorteile"
var alleVorteileLayerSet = doc.layerSets.getByName("Vorteile");

// loop through all layer sets in "Vorteile"
for (var i = 0; i < alleVorteileLayerSet.layerSets.length; i++) {
  var vorteileLayerSet = alleVorteileLayerSet.layerSets[i];
  var vorteileName = vorteileLayerSet.name;

  // loop through all layer sets in current "Vorteile" layer set
  for (var j = 0; j < vorteileLayerSet.layerSets.length; j++) {
    var untergruppeLayerSet = vorteileLayerSet.layerSets[j];
    var untergruppeName = untergruppeLayerSet.name;

    // make current layer set visible and hide all others
    untergruppeLayerSet.visible = true;
    for (var k = 0; k < vorteileLayerSet.layerSets.length; k++) {
      if (k != j) {
        vorteileLayerSet.layerSets[k].visible = false;
      }
    }

    // save as JPG with name based on layer set names
    var fileName = vorteileName + "_" + untergruppeName + ".jpg";
    var file = new File(doc.path + "/" + fileName);
    var options = new JPEGSaveOptions();
    jpgSaveOptions.quality = 12;
    
    doc.saveAs(file, options, true, Extension.LOWERCASE);

    // hide current layer set
    untergruppeLayerSet.visible = false;
  }
}

 Vielen Dank für die Hilfe!

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
May 05, 2023 May 05, 2023

Ich bin mir nicht sicher, ob ich ganz folge, aber etwas, das mir auffällig scheint ist, daß Sie die Visibility von vorteileLayerSet nicht auf true beziehungsweise false zu stellen scheinen. 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
May 05, 2023 May 05, 2023

Super Hinweis, vielen Dank! Klaro! Habe es nun gefixt. Falls es interessiert, hier das Skript:

 

// get active document
var doc = app.activeDocument;

// get top-level layer set "Vorteile"
var alleVorteileLayerSet = doc.layerSets.getByName("Vorteile");

// loop through all layer sets in "Vorteile"
for (var i = 0; i < alleVorteileLayerSet.layerSets.length; i++) {
  var vorteileLayerSet = alleVorteileLayerSet.layerSets[i];
  var vorteileName = vorteileLayerSet.name;
  // make current layer set visible and hide all others
  vorteileLayerSet.visible = true;
  for (var k = 0; k < vorteileLayerSet.layerSets.length; k++) { // fix variable name
    if (k != i) {
      vorteileLayerSet.layerSets[k].visible = false; // fix variable name
    }
  }

  // loop through all layer sets in current "Vorteile" layer set
  for (var j = 0; j < vorteileLayerSet.layerSets.length; j++) {
    var untergruppeLayerSet = vorteileLayerSet.layerSets[j];
    var untergruppeName = untergruppeLayerSet.name;

    // make current layer set visible and hide all others
    untergruppeLayerSet.visible = true;
    for (var k = 0; k < vorteileLayerSet.layerSets.length; k++) {
      if (k != j) {
        vorteileLayerSet.layerSets[k].visible = false;
      }
    }

    // save as JPG with name based on layer set names
    var fileName = vorteileName + "-" + untergruppeName + ".jpg";
    var file = new File(doc.path + "/" + fileName);
    var options = new JPEGSaveOptions();
    options.quality = 12; // fix variable name
    options.formatOptions = FormatOptions.OPTIMIZEDBASELINE; // fix variable name
    
    doc.saveAs(file, options, true, Extension.LOWERCASE);

    // hide current layer set
    untergruppeLayerSet.visible = false;
  }
  vorteileLayerSet.visible = false;
}
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
May 05, 2023 May 05, 2023

Vielen Dank für deine Hilfe @c.pfaffenbichler . Das hat mir wirklich weitergeholfen!

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
May 05, 2023 May 05, 2023
LATEST

Gut zu lesen, daß Sie den Prozess ge-streamline-t haben! 

 

Schönes Wochenende! 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines