2017-09-27 19 views
0

Photoshop에서 새 그림 작업을 시작할 때 수행하는 모든 다른 작업을 자동화하는 스크립트를 만드는 동안 다음과 같은 문제가 발생했습니다.레이어를 복제하고 이름을 바꾸는 Photoshop 스크립트

다른 그룹과 다른 그룹을이 그룹 내에 만들고 싶습니다. 모든 것은이 때까지 완벽하게 정상적으로 진행됩니다

#target photoshop 

app.bringToFront(); 

var doc = app.activeDocument; 

newCurve(); 

var clippingHelpLayerLight = doc.activeLayer; 
clippingHelpLayerLight.blendMode = BlendMode.SCREEN; 
clippingHelpLayerLight.name = "Clipping Help Layer - Light"; 
clippingHelpLayerLight.visible = false; 
clippingHelpLayerLight.duplicate(); 

var clippingHelpLayerLighter = doc.activeLayer; 
clippingHelpLayerLighter.name = "Clipping Help Layer - Lighter"; 
clippingHelpLayerLighter.visible = false; 

function newCurve() { 
    var c_ADJ_LAYER = charIDToTypeID("AdjL"); 
    var c_ADJUSTMENT = charIDToTypeID("Adjs"); 
    var c_CHANNEL = charIDToTypeID("Chnl"); 
    var c_COMPOSITE = charIDToTypeID("Cmps"); 
    var c_CURVE = charIDToTypeID("Crv "); 
    var c_CURVE_A = charIDToTypeID("CrvA"); 
    var c_CURVES = charIDToTypeID("Crvs"); 
    var c_HORIZONTAL = charIDToTypeID("Hrzn"); 
    var c_MAKE = charIDToTypeID("Mk "); 
    var c_NULL = charIDToTypeID("null"); 
    var c_POINT = charIDToTypeID("Pnt "); 
    var c_TYPE = charIDToTypeID("Type"); 
    var c_USING = charIDToTypeID("Usng"); 
    var c_VERTICAL = charIDToTypeID("Vrtc"); 

    var d_CURVES_LAYER = new ActionDescriptor(); 
    // Contains all the information necessary to perform the "MAKE" action 
    var r_CLASS = new ActionReference(); 
    r_CLASS.putClass(c_ADJ_LAYER); 
    d_CURVES_LAYER.putReference(c_NULL, r_CLASS); 
    // Class of make action is of an ajdustment layer 
    var d_TYPE_CURVES = new ActionDescriptor(); 
    // Contains all the information about all the curves 
    var d_CHANNEL_CURVES = new ActionDescriptor(); 
    var l_CHANNEL_CURVES = new ActionList(); 
    // Contains a list of channel curves 
    var d_CHANNEL_CURVE = new ActionDescriptor(); 
    // Information for 1 channel curve 
    var r_CHANNEL = new ActionReference(); 
    r_CHANNEL.putEnumerated(c_CHANNEL, c_CHANNEL, c_COMPOSITE); 
    // This curve is for the composite channel - VARIES 
    d_CHANNEL_CURVE.putReference(c_CHANNEL, r_CHANNEL); 
    // Contains the point list 
    var l_POINTS = new ActionList(); 
    // List of points for this channel - LENGTH VARIES 
    var d_POINT = new ActionDescriptor(); 
    // One point on the curve, has INPUT and OUTPUT value 
    d_POINT.putDouble(c_HORIZONTAL, 0.000000); 
    d_POINT.putDouble(c_VERTICAL, 0.000000); 
    l_POINTS.putObject(c_POINT, d_POINT); 
    //var d_POINT3 = new ActionDescriptor(); 
    d_POINT.putDouble(c_HORIZONTAL, 255.000000); 
    d_POINT.putDouble(c_VERTICAL, 255.000000); 
    l_POINTS.putObject(c_POINT, d_POINT); 
    // Made the list of points 
    d_CHANNEL_CURVE.putList(c_CURVE, l_POINTS); 
    // Now have a list of points for a specific channel 
    l_CHANNEL_CURVES.putObject(c_CURVE_A, d_CHANNEL_CURVE); 
    // Add to the list of channel curves 
    d_CHANNEL_CURVES.putList(c_ADJUSTMENT, l_CHANNEL_CURVES); 
    // All the channel curves are inside here 
    d_TYPE_CURVES.putObject(c_TYPE, c_CURVES, d_CHANNEL_CURVES); 
    // ..... 
    d_CURVES_LAYER.putObject(c_USING, c_ADJ_LAYER, d_TYPE_CURVES); 
    // package the curves and definition of the adjustment layer type 
    executeAction(c_MAKE, d_CURVES_LAYER, DialogModes.NO); 
} 

는 실제로 "클리핑 도움말 레이어 - 라이트"라는 제 1 층 만들려는, 혼합 모드 : 화면과 전원을 끄십시오. 그런 다음 새 레이어의 이름을 "클리핑 도움말 레이어 - 더 밝게"로 변경하고 끕니다. 이처럼

: Screenshot of what I would like to do

그것은 2 층을 만들 않지만, 첫 번째는 그 이름의 끝에서 "복사"를 가지고 있으며이 켜져 유지합니다.

Screenshot of the actual result

이유는 무엇입니까?

예상대로 작동하지 않으며 그 문제를 해결할 수없는 이유를 이해할 수 없습니다.

도움이 될 것입니다.

+0

소스 이미지가 보이지 않으므로 어둠 속에서 찌르는 것입니다. getLayerByname을 사용하여 새로운 밝은 레이어를 activeLayer로 만들 수 있습니다. –

+0

답변 해 주셔서 감사합니다. 스크립팅에 대한 도움을 요청한 것은 이번이 처음이었고 여기에 내 질문에 유용한 부분 만 복사하여 간단하게 유지하려고했습니다. 라이트 - doc.activeLayer = doc.artLayers.getByName ("클리핑 도움말 층 : 지금 – metalmp3

+0

그래서 내가 두 번째 이름을 변경하기 전에이 작업을 추가하려고 ... 내가 이해하는 코드의 충분한 복사하지 않은 실현 부"); var clippingHelpLayerLighter = doc.activeLayer; clippingHelpLayerLighter.name = "클리핑 도움말 레이어 - 더 밝게"; clippingHelpLayerLighter.visible = false; 또는 이와 유사 할 수도 있습니다. var clippingHelpLayerLighter = doc.artLayers.getByName ("클리핑 도움말 레이어 - 라이트 복사"); 하지만 getByName이 작동하지 않는다는 이유를 모르겠다.이 레이어를 찾지 못했다 ... – metalmp3

답변

0

나는 당신이 겪고있는 문제가 doc.activeLayer과 관련 있다고 생각합니다. "클리핑 도움말 레이어 - 라이트"를 복사 한 후 스크립트가 doc.activeLayer이 가리키는 내용을 변경하지 않은 것으로 보이므로 clippingHelpLayerLighter에 지정하려고하면 정의되지 않은 레이어를 가리키고 있습니다. 난 당신이 그렇게 할 때 뒤에서 무슨 일이 일어나고 있는지 정확히 알 수는 없지만, 나는이 문제가 해결됩니다 믿는다 :

#target photoshop 

app.bringToFront(); 

var doc = app.documents.add(4, 4); 

doc = app.activeDocument; 

var clippingHelpLayerLight = doc.activeLayer; 
clippingHelpLayerLight.blendMode = BlendMode.SCREEN; 
clippingHelpLayerLight.name = "Clipping Help Layer - Light"; 
clippingHelpLayerLight.visible = false; 
clippingHelpLayerLight.duplicate(); 

doc.activeLayer = doc.layers[ "Clipping Help Layer - Light copy" ]; 
doc.activeLayer.name = "Clipping Help Layer - Lighter"; 
doc.activeLayer.visible = false; 

//I am not sure if you need this pointer to be called upon later in your 
//code. If you do not, just leave this line out. 
var clippingHelpLayerLighter = doc.activeLayer; 

희망이 도움이! 궁금한 점이 있으면 알려주십시오. 전문가는 아니지만 스크립트를 자주 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 실제로 doc.activeLayer가 옳은 것을 가리키지 않는 문제였습니다. 귀하의 솔루션은 잘 작동합니다. 감사합니다! – metalmp3

+0

괜찮습니다! 기쁜 데 도움이되었습니다. –