PS中執(zhí)行N遍選定動作的腳本

一個單步的動作,用了這個腳本,就可以重復(fù)執(zhí)行100遍1000遍。
上面就是一個路徑描邊100遍的效果,吼吼~ 不知道大家明白用處沒有?(以前老是困惑不停地去點動作,點個幾十次來重復(fù)一個任務(wù))
不容易啊。這次這個腳本前面的函數(shù)都是抄襲的,一些是抄ps自帶的腳本,還有一個建立快照是這里的:http://www.ps-scripts.com/bb/vie ... ;highlight=snapshot 感謝老外。再次謝謝XYBLUEIDEA 斑竹和其他朋友的支持鼓勵!
貼出代碼,方便指正優(yōu)化
操作對象:
任何錄制好的動作;
操作結(jié)果:
對選定的動作,重復(fù)執(zhí)行指定次數(shù);(效果要靠動作本身實現(xiàn))
用法:
把解壓出來的 “執(zhí)行N遍動作.jsx” 文件復(fù)制到 “ps安裝目錄\預(yù)置\腳本” 下,重新打開ps以后就可以在~
[菜單- 文件-腳本] 里面找到 “執(zhí)行N遍動作”
或者解壓出來,在開著ps的情況下,直接雙擊也可以用。
備注:
執(zhí)行操作前可以先建立快照,如果對操作結(jié)果不滿意,可以通過快照返回。
(不過如果是多個文件、保存關(guān)閉之類的操作就別選了,恐怕會出錯 )
#target photoshop
app.bringToFront();
// 重復(fù)執(zhí)行N遍選中的動作
/////////////////////////////////////////////////////////////////////
// Function: GlobalVariables
// Usage: global action items that are reused
// Input: <none>
// Return: <none>
/////////////////////////////////////////////////////////////////////
function GlobalVariables() {
gClassActionSet = charIDToTypeID( 'ASet' );
gClassAction = charIDToTypeID( 'Actn' );
gKeyName = charIDToTypeID( 'Nm ' );
gKeyNumberOfChildren = charIDToTypeID( 'NmbC' );
}
/////////////////////////////////////////////////////////////////////
// Function: GetActionSetInfo
// Usage: walk all the items in the action palette and record the action set
// names and all the action children
// Input: <none>
// Return: the array of all the ActionData
// Note: This will throw an error during a normal execution. There is a bug
// in Photoshop that makes it impossible to get an acurate count of the number
// of action sets.
/////////////////////////////////////////////////////////////////////
function GetActionSetInfo() {
var actionSetInfo = new Array();
var setCounter = 1;
while ( true ) {
var ref = new ActionReference();
ref.putIndex( gClassActionSet, setCounter );
var desc = undefined;
try { desc = executeActionGet( ref ); }
catch( e ) { break; }
var actionData = new ActionData();
if ( desc.hasKey( gKeyName ) ) {
actionData.name = desc.getString( gKeyName );
}
var numberChildren = 0;
if ( desc.hasKey( gKeyNumberOfChildren ) ) {
numberChildren = desc.getInteger( gKeyNumberOfChildren );
}
if ( numberChildren ) {
actionData.children = GetActionInfo( setCounter, numberChildren );
actionSetInfo.push( actionData );
}
setCounter++;
}
return actionSetInfo;
}
/////////////////////////////////////////////////////////////////////
// Function: GetActionInfo
// Usage: used when walking through all the actions in the action set
// Input: action set index, number of actions in this action set
// Return: true or false, true if file or folder is to be displayed
/////////////////////////////////////////////////////////////////////
function GetActionInfo( setIndex, numChildren ) {
var actionInfo = new Array();
for ( var i = 1; i <= numChildren; i++ ) {
var ref = new ActionReference();
ref.putIndex( gClassAction, i );
ref.putIndex( gClassActionSet, setIndex );
var desc = undefined;
desc = executeActionGet( ref );
var actionData = new ActionData();
if ( desc.hasKey( gKeyName ) ) {
actionData.name = desc.getString( gKeyName );
}
var numberChildren = 0;
if ( desc.hasKey( gKeyNumberOfChildren ) ) {
numberChildren = desc.getInteger( gKeyNumberOfChildren );
}
actionInfo.push( actionData );
}
return actionInfo;
}
/////////////////////////////////////////////////////////////////////
// Function: ActionData
// Usage: this could be an action set or an action
// Input: <none>
// Return: a new Object of ActionData
/////////////////////////////////////////////////////////////////////
function ActionData() {
this.name = "";
this.children = undefined;
this.toString = function () {
var strTemp = this.name;
if ( undefined != this.children ) {
for ( var i = 0; i < this.children.length; i++ ) {
strTemp += " " + this.children[i].toString();
}
}
return strTemp;
}
}
//////////
function CreateSnapshot(name) {
function cTID(s) { return app.charIDToTypeID(s); };
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass( cTID('SnpS') );
desc.putReference( cTID('null'), ref );
var ref1 = new ActionReference();
ref1.putProperty( cTID('HstS'), cTID('CrnH') );
desc.putReference( cTID('From'), ref1 );
desc.putString( cTID('Nm '), name);
desc.putEnumerated( cTID('Usng'), cTID('HstS'), cTID('FllD') );
executeAction( cTID('Mk '), desc, DialogModes.NO );
}
//////////
res ="dialog { \
text:'重復(fù)執(zhí)行選定動作',\
group: Group{orientation: 'column',alignChildren:'left',\
corrdination: Panel { orientation: 'row', \
text: '選擇動作', \
cla: Group { orientation: 'row', \
d: DropDownList { alignment:'left' },\
}\
act: Group { orientation: 'row', \
d: DropDownList { alignment:'left' },\
}\
}, \
num: Group { orientation: 'row', \
s: StaticText { text:'執(zhí)行次數(shù):' }, \
e: EditText { preferredSize: [50, 20] } ,\
}, \
Snapshot:Group{ orientation: 'row', \
c: Checkbox { preferredSize: [16, 16]} ,\
s: StaticText {text:'建立快照(根據(jù)動作內(nèi)容適當(dāng)選擇)'},\
}, \
},\
buttons: Group { orientation: 'row', alignment: 'right',\
Btnok: Button { text:'確定', properties:{name:'ok'} }, \
Btncancel: Button { text:'取消', properties:{name:'cancel'} } \
} \
}";
win = new Window (res);
GlobalVariables();
var actionInfo = GetActionSetInfo();
var ddSet=win.group.corrdination.cla.d;
var ddAction=win.group.corrdination.act.d;
if ( actionInfo.length > 0 ) {
for ( var i = 0; i < actionInfo.length; i++ ) {
ddSet.add( "item", actionInfo[i].name );
}
ddSet.items[0].selected = true;
ddSet.onChange = function() {
ddAction.removeAll();
for ( var i = 0; i < actionInfo[ this.selection.index ].children.length; i++ ) {
ddAction.add( "item", actionInfo[ this.selection.index ].children[ i ].name );
}
if ( ddAction.items.length > 0 ) {
ddAction.items[0].selected = true;
}
ddSet.helpTip = ddSet.items[ ddSet.selection.index ].toString();
}
ddSet.onChange();
} else {
ddSet.enabled = false;
ddAction.enabled = false;
}
ddAction.onChange = function() {
ddAction.helpTip = ddAction.items[ ddAction.selection.index ].toString();
}
win.buttons.Btncancel.onClick = function () {
this.parent.parent.close();
}
win.buttons.Btnok.onClick = function () {
g=Number(win.group.num.e.text);
if(g<1){
alert ('-_-!!! 至少得運行一次吧?')
win.group.num.e.text='1';
g=1
}else {
var b=win.group.Snapshot.c.value;
if(b && app.documents.length) {CreateSnapshot(g+"遍動作執(zhí)行前");} //安全起見,建立快照
for(i=0;i<g;i++){
doAction(ddAction.selection,ddSet.selection) //執(zhí)行選擇的動作
}
this.parent.parent.close();
}
}
win.center();
win.show();
相關(guān)文章
psd文件用什么打開? 沒有Photoshop的情況下打開psd文件的四種方法
收到了psd文件,但是電腦沒有安裝ps,該怎么解決這個問題呢?下面我們就來看看這個問題的解決辦法2024-12-24ps一直閃退是什么原因? Photoshop閃退原因及解決方案
在使用過程中,Photoshop總是會無緣無故地自動退出,這不僅打斷了工作流程,還可能導(dǎo)致未保存的更改丟失,令人頭疼不已,本文將深入剖析Photoshop自動退出的原因,并提供相2024-07-04怎么優(yōu)化PSD文件? 有效防止Photoshop崩潰卡死的技巧奧
明就幾個圖層,并沒有引入什么大型圖片,但是 PSD 文件卻異常巨大,而且用起來經(jīng)常卡頓?下面我們就來看看pds文件優(yōu)化方法2024-05-25- 將多個圖層合并為一個圖層,但作為設(shè)計師你需要了解一下合并圖層是有破壞性的,下面我們就來詳細(xì)介紹一下2024-05-25
- 通常是因為Photoshop使用的暫存盤空間不足,導(dǎo)致無法正常工作,那么,如何解決這一問題呢?本文將為您提供詳細(xì)的解決方案2024-05-25
PS存儲和存儲為有什么區(qū)別? 理解存儲與存儲為的重要性
ps導(dǎo)出文件的時候,可以直接存儲,也可以另存存儲為,這兩個操作有區(qū)別嗎?新手該怎么保存文件呢?詳細(xì)請看下文介紹2024-03-28ps beta ai顯示高峰需求進(jìn)不去怎么辦? psai高峰期需求用不了解決辦法
PSBetaAI2023加入了AI的功能,在使用過程中,有時會遇到一個令人煩惱的問題,那就是PhotoshopBetaAI提示我們正在面臨高峰需求,請稍候再試,針對這個問題,本文為大家整理2024-03-28ps段落兩端對齊不能用怎么辦? ps文字排版不能對齊的修復(fù)技巧
PS進(jìn)行設(shè)計時,段落兩端對齊是一個常用的排版功能,它能讓文本看起來更加整潔和專業(yè),然而,許多用戶在使用PS時可能會遇到一個令人頭疼的問題:段落兩端對齊功能似乎不起作2024-03-09- PS插件是許多人常用的一種工具,有些用戶可能會困惑,不知道應(yīng)該將PS插件安裝到哪個文件夾,對于這個問題我們需要從多個角度進(jìn)行分析,以便給出一個準(zhǔn)確的答案2024-02-20
ps打開出現(xiàn)dll文件丟失怎么辦 ps提示缺少dll文件的詳細(xì)修復(fù)方法
打開ps時,系統(tǒng)提示缺少DLL文件,這通常意味著應(yīng)用程序無法找到它所依賴的DLL文件,可能是因為這些文件已經(jīng)被刪除、移動或更改了名稱,下面我們就來分享幾種解決辦法2024-02-19