2017-03-03 24 views
1

是否可以在Adobe Illustrator UI中编辑静态文本?例如,我在底部有一个数字,用于显示某些事物的进度。我想在一个循环中更新它以显示进度(X项中的X项)。在Adobe Illustrator脚本中更新UI中的文本

我试着用UI创建文本并稍后更新变量,但是因为gui代码不能再次运行(除非通过事件监听器),所以不起作用。

我也尝试编辑循环中的文本,但没有内置的方法(就像在Java中一样)。

我只是想知道这是否有可能以任何方式(仍然学习AI脚本)。如果它不可能,那很好,它并不重要,只是一个显示长/慢循环进程的整洁功能。

function startGUI() { 
     var inputText, inputNum; 

     // Create Main Window 
     win = new Window("dialog", "title", undefined); 

     // Enable use of 'Enter' key 
     win.addEventListener ("keydown", function(kd) {enter(kd) }); 

     // Style for Main Window 
     win.orientation = "column"; 
     win.alignChildren = ["fill", "fill"]; 
     win.preferredSize = [250, 150]; 

     // Style for group 
     var objGrp = win.add("panel", undefined, "group"); 
     objGrp.orientation = "column"; 
     objGrp.alignChildren = ["fill", "fill"]; 

     var titleMsg = objGrp.add ("statictext", undefined, "name:"); 
     var txt_Input = objGrp.add("edittext { characters: 1, justify: 'center', active: true }"); 
     txt_Input.helpTip = ""; 

     var titleMsg = objGrp.add ("statictext", undefined, "Number to start from:"); 
     var txt_Num = objGrp.add("edittext { characters: 1, justify: 'center' }"); 
     txt_Num.helpTip = "Object number to start from, other than 1"; 

     var txt_Count = win.add("statictext", undefined, "Current object: ".concat (itemCount).concat(" out of: ").concat(countTotal)); 

     // Button 
     var objBtn = objGrp.add("button", undefined, "Start"); 
     objGrp.helpTip = ""; 
     objGrp.onClick = function() { 
      inputText = txt_Input.text; 
      inputNum = txt_Num.text; 

      start(inputText, inputNum); 
      app.redraw(); 
     } 

     // Use Enter key 
     function enter(k) { 
      if (k.keyName == "Enter") { 
       inputText = txt_Input.text; 
       inputNum = txt_Num.text; 

       start(inputText, inputNum); 
       app.redraw(); 
      } 
     } 

     // Listener for the input 
     txt_Input.onChanging = function() { 
      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(); 
    }// end startGUI 

更新:

#target illustrator 

if (app.documents.length > 0) { 

    // Update with new script versions 
    var alphaLayersFile = "/AlphabatizeLayers-v1.03.jsx"; 
    var deleteLayersFile = "/DeleteEmptyLayers-v1.00.jsx"; 

    var dialogName = "Layer Search Selection" 
    var doc = app.activeDocument; 
    var docLayers = doc.layers; 

    var inputText; 
    var caseSense = false; 
    var exactWord = false; 
    var match = false; 
    var textSearch = false; 
    var itemCount = 0, countTotal; 

    // Display GUI 
    startGUI(); 

    // Main Search function 
    function searchAll(layers, txt_Count, win) { 
     match = false; 
     searchLayers(layers, txt_Count, win); 

     // When match is found, show dialog 
     if (match) { 
      alert("Found match!"); 
      match = false; 
     } else { 
      alert("No match found."); 
      match = false; 
     } 
    } 


    // Recursive loop to search all layers in active document 
    function searchLayers (layers, txt_Count, win) { 
     var input = inputText; 
     var length = layers.length; 
     var currentLayer ; 

     try { 
      countTotal = length; 
      for (var i = length; i--;) { //var i = length; i--; //var i = 0; i <= length; i++ 
       currentLayer = layers[i]; 

       itemCount++; 
       txt_Count.text = "Current object: ".concat(itemCount).concat(" out of: ").concat(countTotal); 
       win.update(); 
       $.sleep(1000); 

       var locked = currentLayer.locked; 
       var visible = currentLayer.visible; 

       if (visible == true || locked == false) { 
        searchLayerName(input, currentLayer); 

        // Search for sublayers, page items or group items 
        if (currentLayer.layers) { 
         searchLayers(currentLayer.layers);       
         searchLayers(currentLayer.groupItems); 
         searchLayers(currentLayer.pathItems); 
         searchLayers(currentLayer.compoundPathItems); 
         searchLayers(currentLayer.symbolItems); 
         searchLayers(currentLayer.textFrames); 
        } 
       } 
      } 
     } catch (error) { 
      logger (error); 
     } 
    }// end SearchLayers 

    // Search for match between input and layer name 
    function searchLayerName(inputText, currentLayer) { 
     try { 
      if (inputText) { 
       var layerName = ""; 
       var layerType = currentLayer.typename; 
       var searchIndex = -1; 
       var exact = false; 

       switch (layerType) { 
        default: 
         layerName = currentLayer.name; 
         searchIndex = searchLayer(inputText, layerName); 

         selectLayer(searchIndex, currentLayer, layerType) 
         break; 
        case "SymbolItem": 
         layerName = currentLayer.symbol.name; 
         searchIndex = searchLayer(inputText, layerName); 

         selectLayer(searchIndex, currentLayer, layerType) 
         break; 
        case "TextFrame": 
         layerName = currentLayer.contents; 
         searchIndex = searchLayer(inputText, layerName); 

         selectLayer(searchIndex, currentLayer, layerType) 
         break; 
        case "Layer": 
         layerName = currentLayer.name; 
         searchIndex = searchLayer(inputText, layerName); 

         selectLayer(searchIndex, currentLayer, layerType) 
         break; 
       } // end Switch 


      } // end inputText 
     } catch (error) { 
      logger(error); 
     } 
    } // end Search 

    function searchLayer(inputText, layerName) { 
     var searchIndex = -1; 
     var caseSensitive = caseSense; 
     var exact = exactWord; 

     //inputText = fixString(inputText); 

     if (caseSensitive) { 
      searchIndex = layerName.indexOf(inputText) ; 
     } else if (exact) {     
      if (layerName === inputText) { 
        searchIndex = 0; 
      } 
     } else { 
      searchIndex = layerName.toLowerCase().indexOf(inputText.toLowerCase()); 
     } 

     return searchIndex; 
    } 

    function selectLayer(searchIndex, currentLayer, layerType) { 

     if (searchIndex != -1) { 
      if (layerType != "Layer") { 
       currentLayer.selected = true; 
       match = true; 
      } else if (layerType == "Layer") { 
       currentLayer.hasSelectedArtwork = true; 
       //layer.selected = true; 
       match = true; 
      } 
     } 
    } // end selectLayer 

    // Display GUI 
    function startGUI() { 

     // Create Main Window 
     var win = new Window("dialog", dialogName); 

     // Style for Main Window 
     win.orientation = "column"; 
     win.alignChildren = ["fill", "fill"]; 
     //win.preferredSize = [150, 350]; 

     // Style for Search group 
     var searchGrp = win.add("panel", undefined, "Search Layers"); 
     searchGrp.orientation = "column"; 
     searchGrp.alignChildren = ["fill", "fill"]; 

     var titleMsg = searchGrp.add ("statictext", undefined, "Layer name to search:"); 
     var txt_Input = searchGrp.add("edittext { characters: 1, justify: 'center', active: true }"); 
     txt_Input.helpTip = "Input letters to search"; 

     countTotal = docLayers.length; 

     txt_Count = win.add("statictext", undefined, "Current object ".concat(itemCount).concat(" out of: ").concat(countTotal)); 

     // Search Button 
     var searchBtn = searchGrp.add("button", undefined, "Search"); 
     searchBtn.helpTip = "Search from text items"; 
     searchBtn.onClick = function() { 
      inputText = txt_Input.text; 
      searchAll(docLayers, txt_Count, win); 
      app.redraw(); 
     } 

     // Listener for the input 
     txt_Input.onChanging = function() { 
      app.redraw(); 
     } 

     // Options 
     var optionsGrp = win.add("panel", undefined, "Options"); 
     optionsGrp.orientation = "row"; 
     optionsGrp.margins = [10, 15, 10, 6]; 
     optionsGrp.alignChildren = ["fill", "fill"]; 

     // Radio button: Case Sensitive 
     var rdb_caseSensitive = optionsGrp.add ("radiobutton", undefined, "Match Case"); 
     rdb_caseSensitive.helpTip = "Case sensitive search"; 
     rdb_caseSensitive.value = false; 

     // Listener: Case Sensitive 
     rdb_caseSensitive.onClick = function() { 
      caseSense = rdb_caseSensitive.value; 
      app.redraw(); 
     } 

     // Radio button: Exact Word 
     var rdb_exactWord = optionsGrp.add ("radiobutton", undefined, "Match Exact Word"); 
     rdb_exactWord.helpTip = "Search exact word"; 
     rdb_exactWord.value = false; 

     // Listener: Exact Word 
     rdb_exactWord.onClick = function() { 
      exactWord = rdb_exactWord.value; 
      app.redraw(); 
     } 

     // Radio button: None 
     var chk_none = optionsGrp.add ("radiobutton", undefined, "None"); 
     chk_none.helpTip = "Use no extra option"; 
     chk_none.value = false; 

     // Radio button: None 
     chk_none.onClick = function() { 
      exactWord = false; 
      caseSense = false; 
      //textSearch = chk_textSearch.value; 
      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(); 
    }// end startGUI 

     // Check to see if parent layer is visible 
     // Sometimes child layers that inheirit locked/hidden 
     // status from parent will return 'undefined' for visibility 
     function checkParentVisibility(layer) { 
      for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent) { 
       var pvis = parent.visible; 
       if(!pvis) { 
        return false; 
       } else { 
        return true; 
       } 
      } 
     } 
    } 

    function fixString(str) { 
     str = str.split("_").join(" "); 
     return str; 
    } 

    // Prints stack trace 
    // Note: Don't print error message unless debugging 
    function logger(e) { 
     var errorMsg = ""; 

     errorMsg = errorMsg.concat(e.line, "\n", e.message, "\n", e.stack); 
     $.writeln(errorMsg); 
    } 
} else { 
     alert("You do not have any document opened!"); 
} 

回答

0

这里是一个脚本,将更新静态文本

var countTotal = 10; 
var itemCount = 0; 

function startGUI() { 
    var inputText, inputNum; 
    // Create Main Window 
    win = new Window("dialog", "title", undefined); 

    // Enable use of 'Enter' key 
    win.addEventListener("keydown", function(kd) { 
     enter(kd) 
    }); 

    // Style for Main Window 
    win.orientation = "column"; 
    win.alignChildren = ["fill", "fill"]; 
    win.preferredSize = [250, 150]; 

    // Style for group 
    var objGrp = win.add("panel", undefined, "Panel"); 
    objGrp.orientation = "column"; 
    objGrp.alignChildren = ["fill", "fill"]; 

    var titleMsg = objGrp.add("statictext", undefined, "Number to start from:"); 
    var txt_Num = objGrp.add("edittext { characters: 1, justify: 'center' }"); 
    txt_Num.helpTip = "Object number to start from, other than 1"; 

    txt_Count = win.add("statictext", undefined, "Current object: ".concat(itemCount).concat(" out of: ").concat(countTotal)); 

    // Button 
    var btn = objGrp.add("button", undefined, "Start"); 
    btn.onClick = function() { 
     inputText = txt_Num.text; 
     itemCount = inputText 
     inputNum = txt_Num.text; 
     for (var i = 0; i < 10; i++) { 
      itemCount++; 
      txt_Count.text = "Current object: ".concat(itemCount).concat(" out of: ").concat(countTotal); 
      win.update(); 
      $.sleep(1000); 
     } 
     win.close(); 
    } 

    // Use Enter key 
    function enter(k) { 
     if (k.keyName == "Enter") { 
      inputText = txt_Num.text; 
      inputNum = txt_Num.text; 
      inputNum = txt_Num.text; 
      for (var i = 0; i < 10; i++) { 
       itemCount++; 
       txt_Count.text = "Current object: ".concat(itemCount).concat(" out of: ").concat(countTotal); 
       win.update(); 
       $.sleep(1000); 
      } 
      win.close(); 
     } 
    } 

    // Close button 
    var quitBtn = win.add("button", undefined, "Close"); 

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

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

startGUI(); 

您可以更改脚本按要求。我刚从代码中删除了一些字段。我已经使用for循环来更新itemCount的静态文本的值,并使用$ .sleep(1000)以便在for循环中更改应该是可见的,否则您将无法看到更改。

希望这会帮助你。此外,您可以使用进度条如果您想要显示进度

+0

我不得不休息一下AI脚本,但我暂时回来了。我试图使用你的例子,但问题是我递归地遍历文档中的图层,同时搜索输入的内容。我试图传递文本对象和窗口对象,并在那里执行更新,但它没有工作,我刚刚'未定义不是对象'的错误。我将发布有问题的更新。 –