0

我正在尝试制作一个动作管理器功能来选择图层。这可以通过使用 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 匹配,并使用圆顶选择正确的图层,但我喜欢理解 ;)

欢迎任何建议!

4

1 回答 1

0

您发布的代码按名称选择图层,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})

ps 如果您更改ref.putIdentifier()ref.putIndex()片段将按索引选择图层。

于 2021-03-09T17:03:36.950 回答