2016-11-10 2 views
0

Ich arbeite an einem Skript in Adobe Illustrator (AI), und ich stoße auf ein Problem, das ich nicht verstehen kann. Das liegt vielleicht an der zugrunde liegenden Arbeitsweise von KI, aber ich würde gerne wissen, ob es einen Weg gibt, um das zu umgehen. Ok, meine Frage ist also:Überprüfen auf gesperrte/versteckte Ebenen in Adobe Illustrator

Wie überprüft man, ob ein Sublayer in AI gesperrt ist, während er nicht direkt gesperrt ist (der oberste Layer ist gesperrt/versteckt, während Sublayer den Status erben).

Ich habe derzeit ein Skript, das einen Prozess (Schleifen über Ebenen) und tut dies, solange die Ebene nicht gesperrt/verborgen ist. Das Problem ist, wenn eine oberste Ebene (übergeordnete Ebene) auf "Gesperrt" oder "Versteckt" gesetzt ist, alle ihre Unterlayer/Objekte diese Eigenschaft erben (gesperrt oder verborgen). Das Problem, das ich mit meinem Skript habe, ist, dass diese gesperrten/versteckten Sublayer als sichtbar und freigeschaltet (oder sichtbar undefiniert) klassifiziert werden. Gibt es einen anderen Weg, dies zu bestimmen?

Script:

// JavaScript Document 
if (app.documents.length > 0) { 
    var docRef = app.activeDocument; 
    var docLayers = docRef.layers; 
    var searchText = ""; 
    var replaceText = ""; 
    var found = false; 

    function recurseLayers(currLayers) { 
     var length = currLayers.length; 
     var currentLayer = null; 
     var searchtext = searchText; 
     var replacetext = replaceText; 

     try { 
      for (var i = length; i--;) { 
       currentLayer = currLayers[i]; 

       replaceName(currentLayer, searchText, replaceText); 

       if (currentLayer.layers) { 
        recurseLayers(currentLayer.layers); 
       } 
      } 
     } catch (e) { 
      logger (e); 
     } 
    } 

    function replaceName(objArray, searchText, replaceText) { 
     try { 
      var visible = objArray.visible; 
      var locked = objArray.locked; 
      var typeName = objArray.typename; 
      if (visible && !locked) { 
       //var searchtext = "/\s*" + searchText + "\s*\d*/"; 
       objArray.name = objArray.name.replace(searchText, replaceText); 
      } 
     } catch (e) { 
      logger(e); 
     } 
    } 


    startGUI(); 

    function startGUI() { 

     var win = new Window("dialog", "Replace Layer name", undefined); 

     win.orientation = "column"; 
     win.alignChildren = ["fill", "fill"]; 

     // Search 
     var searchGrp = win.add("panel", undefined, "Search and Replace"); 
     searchGrp.orientation = "column"; 
     searchGrp.alignChildren = ["fill", "fill"]; 

     var titleMsgS = searchGrp.add("statictext", undefined, "Layer name to search:"); 
     var txt_searchText = searchGrp.add("edittext { characters: 1, justify: 'center', active: true }"); 

     txt_searchText.helpTip = "Input layer name to replace"; 

     var titleMsgR = searchGrp.add("statictext", undefined, "Layer name to replace with:"); 
     var txt_replaceText = searchGrp.add("edittext { characters: 1, justify: 'center', active: true }"); 
     txt_replaceText.helpTip = "Input layer name to replace with"; 

     // Set first text box to active 
     txt_searchText.active = true; 

     win.addEventListener ("keydown", function(kd) {enter(kd) }); 

     // Replace button 
     var replaceBtn = searchGrp.add("button", undefined, "Replace"); 
     replaceBtn.helpTip = "Replace layer name"; 
     replaceBtn.onClick = function() { 
      searchText = txt_searchText.text; 
      replaceText = txt_replaceText.text; 

      recurseLayers(docLayers); 
      app.redraw(); 
     } 

     function enter(k) { 
      if (k.keyName == "Enter") { 
       recurseLayers(searchText.text, replaceText.text); 
       app.redraw(); 
      } 
     } 

     // Close button 
     var quitBtn = win.add("button", undefined, "Close"); 
     quitBtn.helpTip = "Press Esc to Close"; 

     // Event listener for the quit button 
     quitBtn.onClick = function() { 
      win.close(); 
     } 

     // Centering & Show Window 
     win.center(); 
     win.show(); 
    } 


    // Prints stack trace 
    function logger(e) { 
     var errorMsg = ""; 

     errorMsg = errorMsg.concat("An error has occured:\n", e.line, "\n", e.message, "\n", e.stack); 
     //$.writeln(errorMsg); 
    } 

} else { 
     alert("You do not have any document opened!"); 
} 

Beispiel: die Deckschicht (Blue Square) wurde gesperrt (Lichtsperrsymbol) gesetzt. Während die Sublayer den gesperrten Status erben (ausgegrautes gesperrtes Symbol). In AI werden diese Sublayer als gesperrt betrachtet, für mein Script sind sie jedoch als unlocked gekennzeichnet (mit layer.locked).

enter image description here Update: Arbeitscode, dank @ermax.

function recurseLayers(currLayers) { 
     var length = currLayers.length; 
     var currentLayer = null; 
     var searchtext = searchText; 
     var replacetext = replaceText; 

     try { 
      for (var i = length; i--;) { 
       currentLayer = currLayers[i]; 
       replaceName(currentLayer, searchText, replaceText); 

       if (currentLayer.layers) { 
        recurseLayers(currentLayer.layers); 
       } 
      } 
     } catch (e) { 
      logger (e); 
     } 
    } 

    function replaceName(currLayer, searchText, replaceText) { 
     try { 
      var visible = currLayer.visible; 
      var locked = currLayer.locked; 
      var typeName = currLayer.typename; 
      if (checkLayerVisibility(currLayer) && !checkLayerLocked(currLayer)) { 
       currLayer.name = currLayer.name.replace(searchText, replaceText); 
      } 
     } catch (e) { 
      logger(e); 
     } 
    } 

    function checkLayerLocked(layer) { 
     if(!layer.locked) 
      for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent) { 
       if(parent.locked) 
        return true; 
      } 
     return layer.locked; 
    } 

    function checkLayerVisibility(layer) { 
     if(layer.visible) 
     for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent) { 
      if(!parent.visible) 
       return false; 
     } 
     return layer.visible; 
    } 

Antwort

2

Sie können indem Sie diesen Status in übergeordneten Ebenen Unterschicht sichtbar Status überprüfen, wenn einer von ihnen verborgen ist, damit diese Unterschicht auch versteckt:

function checkLayerVisibility(layer) 
{ 
    if(layer.visible) 
    for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent) 
    { 
     if(!parent.visible) 
      return false; 
    } 
    return layer.visible; 
} 

Für gesperrt/entsperrt Status die gleiche Art und Weise:

function checkLayerLockedStatus(layer) 
{ 
    if(!layer.locked) 
    for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent) 
    { 
     if(parent.locked) 
      return true; 
    } 
    return layer.locked; 
} 
+0

Wie viele übergeordnete Schichten verarbeitet dieser Prozess? alle bis zum obersten Elternteil? oder hört es bald auf, wenn man versteckt ist und falsch zurückkehrt? –

+0

Ja, es hört bald auf, wenn einer der Eltern versteckt ist. – emax

+0

Ok, ich denke, es funktioniert für versteckte Eltern-Ebenen, wie würdest du das auf gesperrte Ebenen anwenden? Ich habe den Code dupliziert und für gesperrte Layer geändert. Dabei ignoriere ich einige, ändere aber immer noch einige, die gesperrt sind. –

Verwandte Themen