用于选择图层的 Photoshop 动作管理器代码,忽略图层 ID,错误?

Photoshop action manager code for selecting layer, ignores layer ID, bug?

我正在尝试为 select 层制作动作管理器功能。 这可以通过使用 dom 来完成,但我想弄清楚为什么它不起作用。 嗯.. 当所有层和 layerSets 有不同的名称时,它会起作用。但是当存在同名图层时,它只会 select 它找到的第一个图层。 但是.. 在从脚本监听器记录的 AM 代码中,使用了一个 layer.id 参数。

我明白为什么我需要一个图层ID,没有它,它只有图层名称,当有多个图层同名时这是不够的。但是好像录对了,就是回放不对。

脚本侦听器显示此 layer.id 更改。 但是当我 运行 listerner 代码时,它忽略了这个参数,并且仍然 select 只是第一个。 您可以在其中输入任何值,这不会产生任何影响。为什么会这样呢?看来在其他AM代码中,有些变量只是没有被整体使用。

    var idslct = charIDToTypeID( "slct" );
    var desc34 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref13 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        ref13.putName( idLyr, "Group 4" );
    desc34.putReference( idnull, ref13 );
    var idMkVs = charIDToTypeID( "MkVs" );
    desc34.putBoolean( idMkVs, false );
    var idLyrI = charIDToTypeID( "LyrI" );
        var list5 = new ActionList();
        list5.putInteger( 4 );
    desc34.putList( idLyrI, list5 );
executeAction( idslct, desc34, DialogModes.NO );

var idslct = charIDToTypeID( "slct" );
    var desc35 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref14 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        ref14.putName( idLyr, "Group 4" );
    desc35.putReference( idnull, ref14 );
    var idMkVs = charIDToTypeID( "MkVs" );
    desc35.putBoolean( idMkVs, false );
    var idLyrI = charIDToTypeID( "LyrI" );
        var list6 = new ActionList();
        list6.putInteger( 6 );
    desc35.putList( idLyrI, list6 );
executeAction( idslct, desc35, DialogModes.NO );

var idslct = charIDToTypeID( "slct" );
    var desc36 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref15 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        ref15.putName( idLyr, "Group 4" );
    desc36.putReference( idnull, ref15 );
    var idMkVs = charIDToTypeID( "MkVs" );
    desc36.putBoolean( idMkVs, false );
    var idLyrI = charIDToTypeID( "LyrI" );
        var list7 = new ActionList();
        list7.putInteger( 8 );
    desc36.putList( idLyrI, list7 );
executeAction( idslct, desc36, DialogModes.NO );

上面的代码“应该”select 3 个 layerSets,名称都为“Group 4”。 ID 被正确记录,4、6 和 8。但它只会 select 一个和相同的 layerSet 3 次。 您可以使用脚本来检查 id 匹配,并使用 dome 到 select 正确的层,但我想了解 ;)

欢迎任何建议!

您发布的代码 select 是层的名称,ID 引用被忽略(我相信它用于检索 ID):这里重要的一点是 putReference 而我不知道不知道您创建的 ActionList 来自哪里。

这是一个 select ID 的函数:

  function selectById(data)
  {
    if (data == undefined) return false;
    if (data.id == undefined) return false;

    var desc = new ActionDescriptor();
    var ref = new ActionReference();
    ref.putIdentifier(charIDToTypeID('Lyr '), data.id);
    desc.putReference(charIDToTypeID('null'), ref);
    if (data.add) desc.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
    if (data.visible) desc.putBoolean(charIDToTypeID('MkVs'), data.visible);
    executeAction(charIDToTypeID('slct'), desc, DialogModes.NO);
  }

到select几个层你可以做类似

的事情
selectById({id: 4})
selectById({id: 6, add: true})
selectById({id: 8, add: true})

p.s。如果您将 ref.putIdentifier() 更改为 ref.putIndex(),该代码段将 select 按索引分层。