2016-09-09 45 views
1

我有一个JavaScript,它贯穿Adobe Illustrator中的图层列表,并根据用户的输入更改名称。在扩展中设置编辑文本的焦点

有2个'edittext'文本框用于输入,第一个是您要搜索的名称,第二个是您想要替换的名称。该脚本的作品,但我想在脚本启动时,第一个文本框集中,所以用户开始在第一个文本框,并可以选择第二个。

另外我想让我的提交按钮在按下'enter'按钮时运行,以使其更快。

我在Adobe Illustrator CS6中使用Adobe ExtendScript TK。

#target illustrator 
#targetengine main 

// JavaScript Document 
function renameText(searchText, replaceText) { 
    if (app.documents.length == 0) return; 
    var docRef = app.activeDocument; 
    recurseLayers(searchText, replaceText, docRef.layers); 
} 


function recurseLayers(searchText, replaceText, objArray) { 
    try { 
     $.writeln("Layer length: " + objArray.length); 
     for (var i = 0; i < objArray.length; i++) { 
      if (objArray[i].visible == true && objArray[i].locked == false) { 

       //var searchtext = "/\s*" + searchText + "\s*\d*/"; 
       objArray[i].name = objArray[i].name.replace(searchText, replaceText); 

        if (objArray[i].layers.length > 0) { 
         recurseLayers(searchText, replaceText, objArray[i].layers); 
        } 
      } 
      } 
     } 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 searchText = searchGrp.add("edittext { characters: 1, justify: 'center', active: true }"); 
     searchTest.setFocus(); 

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

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

     // Replace button 
     var replaceBtn = searchGrp.add("button", undefined, "Replace"); 
     replaceBtn.helpTip = "Replace layer name"; 
     replaceBtn.onClick = function() { 
       renameText(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); 
    } 

回答

1

这应该让你去。编辑文本有一个属性active。如果设置为true,则它具有焦点。关键是通过Eventlistener完成的。

但是:

- 不严格地说ScriptUI问题:在After Effects和Illustrator中,事件监听器可以不再使用:阅读进度()不工作。
ScriptUI for dummies || kahrel.plus.com/indesign/scriptui.html

var win = new Window ("dialog"); 
var etext1 = win.add ("edittext", undefined, "foo"); 
var etext2 = win.add ("edittext", undefined, "bah"); 
win.add ("button", undefined, "OK"); 
win.add ("button", undefined, "Cancel"); 
etext1.active = true; 
win.addEventListener ("keydown", function (kd) {pressed (kd)}); 
function pressed (k) { 
if(k.keyName === "Enter"){ 
    $.writeln("You pressed " + k.keyName); 
    } 
} 
win.show (); 

在MacOS 10.11.6

+0

在ESTK 4.0.0.1测试工作就像一个魅力,谢谢! –

+0

你可以upvote我的问题,所以我可以得到代表? –