【问题标题】:Photoshop action manager code for selecting layer, ignores layer ID, bug?用于选择图层的 Photoshop 操作管理器代码,忽略图层 ID,错误?
【发布时间】:2021-03-09 09:50:38
【问题描述】:

我正在尝试使用操作管理器功能来选择图层。 这可以通过使用 dom 来完成,但我想弄清楚为什么它不起作用。 好吧..当所有图层和图层集具有不同的名称时,它就可以工作。但是当有同名的层时,它只选择它找到的第一个。 但是..在从scriptlistener记录的AM代码中,使用了layer.id参数。

我明白为什么我需要一个图层 ID,没有它,它只有图层名称,当有多个同名图层时,这是不够的。但它似乎记录正确,但不播放。

scriptlistener 显示此 layer.id 更改。 但是当我运行侦听器代码时,它会忽略此参数,并且仍然只选择第一个。 您可以在其中输入任何值,并且没有任何区别。为什么会这样?似乎在其他 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 );

上面的代码“应该”选择 3 个 layerSets,所有的名字都是“Group 4”。 ID被正确记录,4、6和8。但它只会选择一个相同的layerSet 3次。 您可以使用脚本来检查 id 匹配,并使用圆顶选择正确的层,但我喜欢理解 ;)

欢迎任何建议!

【问题讨论】:

  • 我猜,我说它不是在做连续选择"addToSelectionContinuous" 。当您选择第 4 组然后继续选择其他两个时,您是否尝试过查看脚本侦听器踢出的内容? - 由于您的 PSD 中的 IDS 不正确,我的 SL 代码不匹配。

标签: select photoshop layer script


【解决方案1】:

您发布的代码按名称选择图层,ID 参考被忽略(我相信它用于检索 ID):这里的重要位是 putReference 而我不知道 ActionList 你在哪里'正在创建来自。

这是一个按 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);
  }

要选择多个图层,您可以执行以下操作

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

附言如果您将ref.putIdentifier() 更改为ref.putIndex(),sn-p 将按索引选择图层。

【讨论】:

  • 帮助很大!我设法让它按名称、id 和索引在选择层上工作。为什么监听器代码在不使用时包含图层 ID,这对我来说并不重要。但我从未使用操作管理器代码检索任何信息,所以也许我可以尝试使用检索数据。
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多