2014-10-10 53 views
0

新層我一個Photoshop初學者和目前使用的版本的Photoshop CS3。我一直使用鍵盤快捷方式來加速設計過程,例如創建新圖層等。Photoshop的腳本 - 低於當前層

但是,我覺得Photoshop必須具備的一個命令是在當前工作層下創建一個新圖層,因此我無法分配它通過一個快捷方式。

我要創建的當前層之上的新的層,然後手動將它的當前層,其感覺可以是自動化的使用動作或腳本,這兩者都是困難的我是一個初學者的下方。

任何人可以幫助我在這方面。

感謝 DKJ

+0

這個問題似乎是脫離主題,因爲它是關於Photoshop的使用,屬於http://graphicdesign.stackexchange.com – Raptor 2014-10-10 09:53:18

回答

1

它可與以下照本宣科:

// Create a new layer below current active layer 
// And call it "The Layer Below" 
createLayerBelowCurrent("The Layer Below"); 


function createLayerBelowCurrent(astring) 
{ 
    var currentActivelayer = app.activeDocument.activeLayer; 
    var idx = getLayerIndex(currentActivelayer); 

    // Get a reference to the active layer 
    var layerRef = app.activeDocument.layers[idx]; 

    // Create a new Art Layer, by default at the top of the document 
    var newLayerRef = app.activeDocument.artLayers.add(); 

    // Move the new layer set to after the previously first layer 
    newLayerRef.move(layerRef, ElementPlacement.PLACEAFTER); 
} 


function getLayerIndex(ref) 
{ 
    // return the idex of ALL layers 
    var numOfLayers = app.activeDocument.layers.length; 

    // work from the top of the stack down! 
    for (var i = numOfLayers -1; i >= 0; i--) 
    { 
    var tempLayer = app.activeDocument.layers[i]; 
    if (tempLayer == ref) return i 

    if (tempLayer.typename == "LayerSet") 
    { 
     var subDoc = app.activeDocument.layers[i]; 
     for (var j = numOfSubLayers -1; j >= 0; j--) 
     { 
     var tempSubLayer = subDoc.layers[j] 
     if (tempSubLayer == ref) return j 
     } 
    } 
    } 
} 

然後,您可以記錄該腳本作爲一個動作,把一個快捷鍵。

0

幾年前,我認爲本土PS API與DOM的涼爽,應該更快,但實際上引擎蓋下它的調用堆棧往往不是通過行動執行相同的命令更大。 +有時DOM函數由多個基礎調用組成,例如artLayers.add(),它實際上是將圖層+移動到文檔的頂部。因此,這裏是從我的PS腳本庫,它的功能作用版本:

// get current layer number 
function curLyrN(){ 
    if(app.activeDocument.artLayers.length<2) return 1; 
    var idLyr = charIDToTypeID("Lyr "); 
    var idItmI = charIDToTypeID("ItmI"); 
    var aref = new ActionReference(); 
    aref.putEnumerated(idLyr, charIDToTypeID("Ordn"), charIDToTypeID("Trgt")); 
    var id = executeActionGet(aref).getInteger(charIDToTypeID("LyrI")); 
    aref = new ActionReference(); 
    aref.putProperty(charIDToTypeID("Prpr"), idItmI); 
    aref.putIdentifier(idLyr, id); 
    id = executeActionGet(aref).getInteger(idItmI); 
    if(id) return id; 
    return 0; 
} 

// select [LayerNum], optionally [add] to selection (if add=2: with inclusion) 
function selLyr(LyrN,add){ 
    var adesc = new ActionDescriptor(); 
    var aref = new ActionReference(); 
    aref.putIndex(charIDToTypeID("Lyr "), LyrN); 
    adesc.putReference(charIDToTypeID("null"), aref); 
    if(add){ 
     add = (add==2) ? stringIDToTypeID("addToSelectionContinuous") : stringIDToTypeID("addToSelection"); 
     adesc.putEnumerated(stringIDToTypeID("selectionModifier"),stringIDToTypeID("selectionModifierType"),add); 
    } 
    adesc.putBoolean(charIDToTypeID("MkVs"), false); 
    return executeAction(charIDToTypeID("slct"), adesc, DialogModes.NO); 
} 

// move current layer to [LayerNum] 
function movLyr(LyrN){ 
    var idLyr = charIDToTypeID("Lyr "); 
    var adesc = new ActionDescriptor(); 
    var aref = new ActionReference(); 
    aref.putEnumerated(idLyr, charIDToTypeID("Ordn"), charIDToTypeID("Trgt")); 
    adesc.putReference(charIDToTypeID("null"), aref); 
    aref = new ActionReference(); 
    aref.putIndex(idLyr, LyrN); 
    adesc.putReference(charIDToTypeID("T "), aref); 
    adesc.putBoolean(charIDToTypeID("Adjs"), false); 
    return executeAction(charIDToTypeID("move"), adesc, DialogModes.NO); 
} 

// create new empty layer 
function mkLyr(){ 
    var aref = new ActionReference(); 
    aref.putClass(charIDToTypeID("Lyr ")); 
    var adesc = new ActionDescriptor(); 
    adesc.putReference(charIDToTypeID("null"), aref); 
    return executeAction(charIDToTypeID("Mk "), adesc, DialogModes.NO); 
} 

// count all inner layers from layer-set (group) 
function cntLyrS(lyrs,c){ 
    if(!c){ 
     if(lyrs.typename!='LayerSet') return 0; 
     c = 0; 
    } 
    var ls = lyrs.layers.length; 
    var i = 0; 
    while(i<ls){ 
     c++; 
     if(lyrs.layers[i].typename=='LayerSet') c=cntLyrS(lyrs.layers[i],c); 
     i++; 
    } 
    return c+1; 
} 

// make new layer below current or [LayerNum], optionally [ignoreGroups] 
function mkLyrBelow(LyrN,noGr){ 
    var doc = app.activeDocument; 
    if(!doc) return false; 
    if(LyrN){ 
     selLyr(LyrN); 
    }else{ 
     LyrN = curLyrN(); 
     if(!LyrN) return false; 
    } 
    var actv = doc.activeLayer; 
    if(actv.isBackgroundLayer) actv.isBackgroundLayer=false; 
    mkLyr(); 
    if(curLyrN()==LyrN) return true; 
    if(!noGr){ 
     var lc = cntLyrS(actv); 
     if(lc && lc<LyrN-1) LyrN -= lc; 
    } 
    return movLyr(LyrN-1); 
} 

即使壽它看起來很繁瑣,可怕的 - 我懷疑這是否將執行慢得多。作爲獎勵,將創造歷史記錄的動作最小量(沒有不必要的層移動)+它將正確與背景層工作+將與組(層集)正常工作:如果組被打開 - 它會創建它內部有一個新圖層,如果組關閉,它將正確移動整個組結構下的圖層,包括所選圖層中的其他可能組。

使用它可以:mkLyrBelow();在選定的圖層下創建新圖層,或者通過mkLyrBelow(LayerNumber);在另一個圖層下創建圖層,也可以選擇添加2d參數來忽略圖層組(甚至可以在組內移動新圖層)如果它關閉):mkLyrBelow(LayerNumber,true);mkLyrBelow(0,1); ...

PS不要誤解ActionRefs--它們不是銀彈,最終通常會有更多的便利,但是當你將ARef與本地API結合起來時,獲得最好的結果。只要相信我這句話,我編寫像8年前我的第一個PS腳本,所以我已經嘗試過幾乎一切=)

-1

如果我正確理解你的問題,Photoshop已經擁有這些快捷鍵

Ctrl + Shift + N(創建新的層)

按Ctrl +](要移動層上)

按Ctrl + [(要移動層向下)