#target photoshop /** * 增加 批量替换名称如: * 头,身体,大手臂,小手臂,手掌,大腿,小腿 * head,body,bigarm,forearm,palm,thigh,calf * **/ var cacheValue = new Map (); var win; var res ="dialog { \ text:'图层批量重命名 ',\ group: Group{orientation: 'column',alignChildren:'left',\ mode:Panel{orientation: 'row', text:'作用范围:',\ selected:RadioButton {text:'选中图层' },\ all:RadioButton {text:'所有图层' },\ }\ whichType:Panel{orientation: 'row', text:'类型:',\ whole:RadioButton {text:'整体' },\ rep:RadioButton {text:'替换' },\ add_del:RadioButton {text:'添加/删除' },\ }\ allGroup:Panel {orientation:'stack', alignChildren:'top',text: '整体', \ renameall: Group { orientation: 'column',alignChildren:'left',text: '命名规则',\ name: Group { orientation: 'row', \ txt: StaticText { text:'命名规则:' }, \ edit: EditText { preferredSize: [240, 20] } ,\ }, \ helpTip: Group{orientation: 'column',alignChildren:'left',\ txt1: StaticText{ text:'在此处输入“A_#” 则图层名为“A_<数字编号>'},\ txt2: StaticText{ text:'使用 * 插入原始图层名称'},\ txt3: StaticText{ text:'使用 # 以数字插入指定位置'},\ }\ paramGroup: Group{orientation: 'column',alignChildren:'left',\ beginId: Group { orientation: 'row', \ txt: StaticText { text:'开始于:' }, \ edit: EditText { text:'0',preferredSize: [50, 20]} ,\ }, \ incremental: Group { orientation: 'row', \ txt: StaticText { text:'增量: ' }, \ edit: EditText { text:'1', preferredSize: [50, 20]} ,\ }, \ bits: Group { orientation: 'row', \ txt: StaticText { text:'位数: ' }, \ dropdownlist:DropDownList { alignment:'left', itemSize: [34,16] },\ }, \ }\ prefabGroup: Panel{orientation: 'column',alignChildren:'top',text: '属性预设',\ prefab1: Group { orientation: 'row', alignment:'left', \ btnButton: Button { text:'btn',size:{width:72,height:22}}, \ btnToggle: Button { text:'toggle'} \ btnCheck: Button { text:'toggle@check'} \ }, \ prefab2: Group { orientation: 'row',alignment:'left', \ btnPng9: Button { text:'.9',size:{width:60,height:22}} \ btnProgressBar: Button { text:'progressBar'} \ btnBar: Button { text:'progressBar@bar'} \ }, \ prefab3: Group { orientation: 'row',alignment:'left', \ btnSize: Button { text:'size'} \ btnScale: Button { text:'scale'} \ btnFull: Button { text:'full'} \ }, \ prefab4: Group { orientation: 'row', alignment:'left',\ btnFlip: Button { text:'flip'} \ btnFlipX: Button { text:'flipX'} \ btnFlipY: Button { text:'flipY'} \ }, \ prefab5: Group { orientation: 'row',alignment:'left', \ btnIgnore: Button { text:'ignore'} \ btnIgnoreImg: Button { text:'ignoreimg'} \ btnIgnoreNode: Button { text:'ignorenode'} \ }, \ prefab6: Group { orientation: 'row', alignment:'left',\ btnImg: Button { text:'img'} \ btnAR: Button { text:'ar'} \ }, \ }\ }, \ repGroup: Group { orientation: 'column',alignChildren:'left',text: '命名规则',\ helpTip: Group{orientation: 'column',alignChildren:'left',\ txt1: StaticText{ text:'替换文件名中的字符 '},\ },\ oldStr: Group { orientation: 'row', \ txt: StaticText { text:'把: ' }, \ edit: EditText { preferredSize: [160, 20] } ,\ }, \ newStr: Group { orientation: 'row', \ txt: StaticText { text:'替换成:' }, \ edit: EditText { preferredSize: [160, 20] } ,\ }, \ }, \ add_del: Group { orientation: 'column',alignChildren:'left',text: '添加/删除',\ frontadd: Group { orientation: 'row', \ txt: StaticText { text:'文件名前添加: ' }, \ edit: EditText { preferredSize: [200, 20] } ,\ }, \ backtoadd: Group{ orientation: 'row', \ txt: StaticText { text:'文件名后添加: ' }, \ edit: EditText { preferredSize: [200, 20] } ,\ }, \ del: Group{ orientation: 'row', \ txt: StaticText { text:'删除文件名中的:' }, \ edit: EditText { preferredSize: [200, 20] } ,\ }, \ extensionadd: Checkbox{text:'扩展添加'},\ addGroup: Group{orientation: 'column',alignChildren:'left',\ beginId: Group { orientation: 'row', \ txt: StaticText { text:'从文件名第:' }, \ edit: EditText { text:'0',preferredSize: [50, 20]} ,\ txt: StaticText { text:'个字符开始' }, \ }, \ extensionaddStr: Group { orientation: 'row', \ txt: StaticText { text:'添加字符串:' }, \ edit: EditText { text:'', preferredSize: [80, 20]} ,\ }, \ }\ extensiondel: Checkbox{text:'扩展删除'},\ delGroup: Group{orientation: 'column',alignChildren:'left',\ beginId: Group { orientation: 'row', \ txt: StaticText { text:'从文件名第:' }, \ edit: EditText { text:'0',preferredSize: [50, 20]} ,\ txt: StaticText { text:'个字符开始' }, \ }, \ totalNum: Group { orientation: 'row', \ txt: StaticText { text:'共删除:' }, \ edit: EditText { text:'1', preferredSize: [50, 20]} ,\ txt: StaticText { text:'字符' }, \ }, \ }\ }, \ }\ },\ buttons: Group { orientation: 'row', alignment: 'right',\ btnOK: Button { text:'确定', properties:{name:'ok'} }, \ btnCancel: Button { text:'取消', properties:{name:'cancel'} } \ }, \ }"; var prefabBtns = [['btnButton','@btn'],['btnToggle','@toggle'],['btnCheck','@check'],['btnPng9','@.9{l:0,r:0,b:0,t:0}'],['btnProgressBar','@progressBar'],['btnBar','@bar'],['btnSize','@size{w:100,h:100}'],['btnScale','@scale{x:1,y:1}'],['btnFull','@full'],['btnFlip','@flip{bind: 0, x: 0, y: 0}'],['btnFlipX','@flipX{bind: 0}'],['btnFlipY','@flipY{bind: 0}'],['btnIgnore','@ignore'],['btnIgnoreImg','@ignoreimg'],['btnIgnoreNode','@ignorenode'],['btnImg','@img{name: *,id: 0,bind: 0}'],['btnAR','@ar{x:0.5,y:0.5}']]; app.bringToFront(); if (documents.length == 0) { alert("没有可处理的文档"); }else { main(); } function main(){ initWin(); } function initWin(){ win = new Window (res); var whichType = win.group.whichType; var repGroup = win.group.allGroup.repGroup; var add_del = win.group.allGroup.add_del; var renameall = win.group.allGroup.renameall; whichType.whole.value = true; add_del.visible = false; repGroup.visible = false; whichType.whole.onClick = function(){ renameall.visible = true; add_del.visible = false; repGroup.visible = false; win.group.allGroup.text = "整体"; } whichType.rep.onClick = function(){ renameall.visible = false; add_del.visible = false; repGroup.visible = true; win.group.allGroup.text = "替换"; } whichType.add_del.onClick = function(){ renameall.visible = false; add_del.visible = true; repGroup.visible = false; win.group.allGroup.text = "添加/删除"; } //整体 checkNum(renameall.paramGroup.beginId.edit,0); checkNum(renameall.paramGroup.incremental.edit,1); //checkNum(renameall.paramGroup.bits.renameall,1); renameall.paramGroup.bits.enabled = false; // ====================================================暂时不能选择位数 等待补全==================================================== win.group.mode.selected.value = true; var dropDownList = renameall.paramGroup.bits.dropdownlist; for(var i = 0; i < 5; i++){//给下拉列表添加元素 dropDownList.add("item",i+1); } dropDownList.items[0].selected=true;//使第一个被选中 //添加/删除 add_del.addGroup.enabled = false; add_del.delGroup.enabled = false; checkNum(add_del.addGroup.beginId.edit,0); checkNum(add_del.delGroup.beginId.edit,0); checkNum(add_del.delGroup.totalNum.edit,1); add_del.extensiondel.onClick = function(){ add_del.delGroup.enabled = !add_del.delGroup.enabled; } add_del.extensionadd.onClick = function(){ add_del.addGroup.enabled = !add_del.addGroup.enabled; } win.buttons.btnCancel.onClick = function () { win.close(); } win.buttons.btnOK.onClick = function () { var isSucc = false; if(renameall.visible){ isSucc = exeRename(); }else if(add_del.visible){ isSucc = exeAdd_Del(); }else if(repGroup.visible){ isSucc = exeReplace(); } isSucc && win.close(); } for(var i=0;i<prefabBtns.length;i++){ var prefab = prefabBtns[i]; var btn = prefab[0]; var property = prefab[1]; var fun = function(property){ return function(){ if(renameall.name.edit.text.indexOf(property) != -1){ alert ("请勿输入相同声明"); return; } renameall.name.edit.text += property; } } renameall.prefabGroup["prefab"+(Math.floor(i/3)+1)][btn].onClick =fun(property); } win.center(); win.show(); } function exeRename(){ var layers = []; var renameall = win.group.allGroup.renameall; var name = renameall.name.edit.text; var beginIds = Number(renameall.paramGroup.beginId.edit.text); var incremental =Number(renameall.paramGroup.incremental.edit.text); var bits = Number(renameall.paramGroup.bits.dropdownlist.selection) + 1; if(name == ""){ alert("空文本无法使用"); return false; } if(win.group.mode.selected.value){ layers = getSelectedLayers(); }else{ getLayers(app.activeDocument, layers); } for (var i = 0; i < layers.length; i++) { //var reg1 = new RegExp("*","g"); var reg2 = new RegExp("#","g"); var reg3 = new RegExp(" ","g"); var newname = name.replace ("*", layers[i].name);//替换 * 为原文件名 newname = newname.replace ("*", layers[i].name);//替换 * 为原文件名 newname = newname.replace ("*", layers[i].name);//替换 * 为原文件名 newname = newname.replace ("*", layers[i].name);//替换 * 为原文件名 newname = newname.replace (reg2,formatNum( beginIds+i*incremental,bits));//替换 # 为数字 newname = newname.replace (reg3, "");//删除空格 layers[i].name = newname ; } return true; } function exeReplace(){ var layers = []; var repGroup = win.group.allGroup.repGroup; var oldstr = repGroup.oldStr.edit.text; var newstr = repGroup.newStr.edit.text; var oldstrs= new Array(); //定义一数组 oldstrs = oldstr.split (","); var newstrs= new Array(); //定义一数组 newstrs = newstr.split (","); if(oldstrs.length != newstrs.length){ alert ("新字符的数量必须和旧字符串的数量一致"); return false; } if(win.group.mode.selected.value){ layers = getSelectedLayers(); }else{ getLayers(app.activeDocument, layers); } for (var i = 0; i < layers.length; i++) { var newname = layers[i].name; for(var j = 0;j <oldstrs.length;j++){ var reg = new RegExp(oldstrs[j],"g"); newname = newname.replace (reg, newstrs[j]);//替换 * 为原文件名 } //var reg = new RegExp(oldstr,"g"); //newname = newname.replace (reg, newstr);//替换字符 layers[i].name = newname ; } return true; } function exeAdd_Del(){ var layers = []; var add_del = win.group.allGroup.add_del; var frontaddstr = add_del.frontadd.edit.text;//文件名前添加的字符 var backtoaddstr = add_del.backtoadd.edit.text;//文件名后添加的字符 var delstr = add_del.del.edit.text;//删除的字符 var addbeginID = Number(add_del.addGroup.beginId.edit.text); var addStr = add_del.addGroup.extensionaddStr.edit.text; var delbeginID = Number(add_del.delGroup.beginId.edit.text); var deltotalNum = Number(add_del.delGroup.totalNum.edit.text); if(win.group.mode.selected.value){ layers = getSelectedLayers(); }else{ getLayers(app.activeDocument, layers); } for (var i = 0; i < layers.length; i++) { var newname = frontaddstr+layers[i].name; newname = newname+backtoaddstr; //扩展添加 if(add_del.extensionadd.value){ //插入字符 newname = insert_flg(newname,addStr,addbeginID); } var reg = new RegExp(delstr,"g"); newname = newname.replace (reg, "");//删除字符 //扩展删除 if(add_del.extensiondel.value){ newname = del_flg(newname,delbeginID,deltotalNum); } reg = new RegExp(" ","g"); newname = newname.replace (reg, "");//删除空格 layers[i].name = newname ; } return true; } //插入字符 //参数说明:str表示原字符串变量,flg表示要插入的字符串,sn表示要插入的位置 function insert_flg(str,flg,sn){ newstr = str.substring(0,sn) +flg+ str.substring(sn,str.length); return newstr; } //删除指定位置的字符 x代表要删除的位置 代表删除字符的个数 function del_flg(str,x,num){ var newstr = str.substring(0,x) + str.substring(x+num,str.length); return newstr; } function formatNum(num,bits){ if(bits > 1){ var str = Number.toString (num); var form=''; for(var i = 0;i < bits-1;i++){ form+='0'; } return form+num; } return num; } function checkNum(editText,defaultNum){ cacheValue.set(editText,defaultNum); editText.onChanging = function(){ if(isNaN(editText.text)){//非数字 editText.text = cacheValue.get(editText); }else{ cacheValue.set(editText,editText.text); } } } function getSelectedLayers(){ var idGrp = stringIDToTypeID( "groupLayersEvent" ); var descGrp = new ActionDescriptor(); var refGrp = new ActionReference(); refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" )); descGrp.putReference(charIDToTypeID( "null" ), refGrp ); executeAction( idGrp, descGrp, DialogModes.ALL ); var resultLayers=new Array(); for (var ix=0;ix<app.activeDocument.activeLayer.layers.length;ix++){resultLayers.push(app.activeDocument.activeLayer.layers[ix])} var id8 = charIDToTypeID( "slct" ); var desc5 = new ActionDescriptor(); var id9 = charIDToTypeID( "null" ); var ref2 = new ActionReference(); var id10 = charIDToTypeID( "HstS" ); var id11 = charIDToTypeID( "Ordn" ); var id12 = charIDToTypeID( "Prvs" ); ref2.putEnumerated( id10, id11, id12 ); desc5.putReference( id9, ref2 ); executeAction( id8, desc5, DialogModes.NO ); return resultLayers; } function getLayers (layer, collect) { if (!layer.layers || layer.layers.length == 0) return layer; if(layer != app.activeDocument){ collect.push(layer); } for (var i = 0, n = layer.layers.length; i < n; i++) { // For checking if its an adjustment layer, but it also excludes // LayerSets so we need to find the different types needed. //if (layer.layers[i].kind == LayerKind.NORMAL) { //collect.push(layer.layers[i]); var child = getLayers(layer.layers[i], collect); if (child) collect.push(child); //} } } function Map() { this.keys = new Array(); this.values= new Array(); //添加键值对 this.set = function (key, value) { if (this.values[key] == null) {//如键不存在则身【键】数组添加键名 this.keys.push(value); } this.values[key] = value;//给键赋值 }; //获取键对应的值 this.get = function (key) { return this.values[key]; }; //去除键值,(去除键数据中的键名及对应的值) this.remove = function (key) { this.keys.remove(key); this.values[key] = null; }; //判断键值元素是否为空 this.isEmpty = function () { return this.keys.length == 0; }; //获取键值元素大小 this.size = function () { return this.keys.length; }; }