[PS CS4-CS6] Скрипт для старой версии.

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
Ребятки, помогите пж. со скриптом.
Дано: PSD с кучей групп слоев.
Надо: объединить все группы слоев в соответствующие каждой отдельной группе смартобъекты.
Естественно, с тем же именем.))
Есть такой скрипт в сети, но только для СС.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Гм, а что там в модели поменялось то? 'hmmm'
Какую ошибку выдает? И сам скрипт где?
 

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
Код:
 ///////////////////////////////////////////////////////////////////////////////
    // Create SmartObjects from active layers/layersets
    ///////////////////////////////////////////////////////////////////////////////

    //$.writeln( "--START SCRIPT--" );

    var curDoc = activeDocument;
    var selLayers = GetSelectedLayersIndex();

    // Loops through each selected layers.
    for( var i in selLayers )
    {
        SelectLayerByIndex( selLayers[i] );
      createSmartObject();
    }

    ///////////////////////////////////////////////////////////////////////////////
    // Basic Functions
    ///////////////////////////////////////////////////////////////////////////////

    function GetSelectedLayers()
    {
        var selectedLayers = new Array;
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID( "Dcmn" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );
        var desc = executeActionGet( ref );
        if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) )
       {
            desc = desc.getList( stringIDToTypeID( 'targetLayers' ) );
            var c = desc.count
            var selectedLayers = new Array();
            for( var i = 0; i < c; i++ )
            {
                selectedLayers.push(  desc.getReference( i ).getIndex() );
            }
        }
       else
       {
            var ref = new ActionReference();
            ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));
            ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
            selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" )));
        }
        return selectedLayers;
    }

    function SelectLayerByIndex( index, add )
    {
        //$.writeln( "Selecting layer " + index + "." );
        add == undefined ? add = false : add = true;
        var ref = new ActionReference();
        ref.putIndex(charIDToTypeID("Lyr "), index );
        var desc = new ActionDescriptor();
        desc.putReference(charIDToTypeID( "null" ), ref );
        if ( add ) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );
        desc.putBoolean( charIDToTypeID( "MkVs" ), false );
        try
        {
            executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
        }
        catch(e)
        {
            alert( e.message );   
        }
    }

    function GetSelectedLayersIndex()
    {
        var selectedLayers = new Array;
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
        var desc = executeActionGet( ref );
        try
        {
           activeDocument.backgroundLayer;
           var mod = 1;
        }
        catch(e)
        {
            var mod = 0;
        }
        if ( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) )
        {
            desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
            var c = desc.count
            var selectedLayers = new Array();
            //$.writeln( "Several layers selected." );
            for( var i = 0; i < c; i++ )
            {         
                selectedLayers.push( desc.getReference( i ).getIndex() + 1 - mod );
                //$.writeln( "Storing layer " + selectedLayers[i] + "." );
            }
        }
        else
        {
            var ref = new ActionReference();
            ref.putProperty( charIDToTypeID( "Prpr" ) , charIDToTypeID( "ItmI" ) );
            ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );
            selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ) ) - mod );
            //$.writeln( "One layer selected." );
            //$.writeln("Storing layer " + selectedLayers + "." );
        }
       return selectedLayers;
    }

// create smartobject from specified layer (default is active layer)
function createSmartObject(layer)
{
   var doc = app.activeDocument;
   var layer = layer != undefined ? layer : doc.activeLayer;
  
   if(doc.activeLayer != layer) doc.activeLayer = layer;
  
   try
   {
      var idnewPlacedLayer = stringIDToTypeID( "newPlacedLayer" );
      executeAction( idnewPlacedLayer, undefined, DialogModes.NO );
      return doc.activeLayer;
   }
   catch(e)
   {
      return undefined;
   }
}
 

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
у меня виснет на первых строчках.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Ну, судя по всему, у вас виснет на определении выбранных слоев. Скорее всего, тут даже не в версии дело, возможно, у вас кривая локализация, из за которой такие недокументированные фичи лажают
А вам обязательно именно выбранные слои экспортировать?
Вроде в исходном сообщении
все группы слоев
это бы сильно упростило дело
Вдобавок я не уверен что данная конструкция вообще для групп слоев будет корректно работать
 

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
нет, не обязательно. Просто все, что наличиствуют.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Попробуйте код
Код:
var selLayers = GetSelectedLayersIndex();

    // Loops through each selected layers.
    for( var i in selLayers )
    {
        SelectLayerByIndex( selLayers[i] );
      createSmartObject();
    }
заменить на
Код:
    for( var i =0;i<curDoc.artLayers.length;i++)
    {
        SelectLayerByIndex( i);
      createSmartObject();
    }
 

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
for( var i =0;i<curDoc.artLayers.length;i++)
на этой строке не дефенецируется ))
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Не дефека... чего? :D
 
  • Спасибо
Реакции: eugeny

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
undefined

не определено. )))
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
заменил
var doc = app.activeDocument;
на
var curDoc = app.activeDocument;
curDoc undefined
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Ну у вас должен быть как минимум один документ открыт быть
 

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
естественно!
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Тогда это какая то неведомая ёлочная хвоя получается
Проверьте внимательно все символы в названии curDoc одни и те же латинские?
а если вот так:
Код:
 for( var i =0;i<app.activeDocument.artLayers.length;i++)
    {
        SelectLayerByIndex( i);
      createSmartObject();
    }
 

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
ничего... ни ошибки, ни действия.
Надо отлучиться на пару часиков. Развеятся...
 

Elsynor

Tesseract
12 лет на форуме
Сообщения
1 282
Реакции
1 377
Скопировал отсюда, запустил на CS4 64 11.0.2 (в EST), всё отрабатывает. ЧЯДНТ?'hz'
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Подозреваю, дело в самом документе
 

chesen

Топикстартер
15 лет на форуме
Сообщения
552
Реакции
49
М-да, так звезды сложились. И меня заработал.
Но горбато. Он не группы в смарты пакует, а слои в группах. А это ни к чему.
Плодить такое количество смартов непотребно.