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

Тема в разделе «Adobe Photoshop», создана пользователем chesen, 4 окт 2018.

  1. Ребятки, помогите пж. со скриптом.
    Дано: PSD с кучей групп слоев.
    Надо: объединить все группы слоев в соответствующие каждой отдельной группе смартобъекты.
    Естественно, с тем же именем.))
    Есть такой скрипт в сети, но только для СС.
     
  2. Гм, а что там в модели поменялось то? 'hmmm'
    Какую ошибку выдает? И сам скрипт где?
     
  3. Код:
     ///////////////////////////////////////////////////////////////////////////////
        // 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;
       }
    }
     
  4. у меня виснет на первых строчках.
     
  5. Ну, судя по всему, у вас виснет на определении выбранных слоев. Скорее всего, тут даже не в версии дело, возможно, у вас кривая локализация, из за которой такие недокументированные фичи лажают
    А вам обязательно именно выбранные слои экспортировать?
    Вроде в исходном сообщении
    это бы сильно упростило дело
    Вдобавок я не уверен что данная конструкция вообще для групп слоев будет корректно работать
     
  6. нет, не обязательно. Просто все, что наличиствуют.
     
  7. Попробуйте код
    Код:
    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();
        }
     
  8. for( var i =0;i<curDoc.artLayers.length;i++)
    на этой строке не дефенецируется ))
     
  9. Не дефека... чего? :D
     
    • Одобряю Одобряю x 1
  10. undefined

    не определено. )))
     
  11. Код:
    var curDoc = app.activeDocument;
     
  12. Что именно?
     
  13. заменил
    var doc = app.activeDocument;
    на
    var curDoc = app.activeDocument;
    curDoc undefined
     
  14. Ну у вас должен быть как минимум один документ открыт быть
     
  15. естественно!
     
  16. Тогда это какая то неведомая ёлочная хвоя получается
    Проверьте внимательно все символы в названии curDoc одни и те же латинские?
    а если вот так:
    Код:
     for( var i =0;i<app.activeDocument.artLayers.length;i++)
        {
            SelectLayerByIndex( i);
          createSmartObject();
        }
     
  17. ничего... ни ошибки, ни действия.
    Надо отлучиться на пару часиков. Развеятся...
     
  18. Скопировал отсюда, запустил на CS4 64 11.0.2 (в EST), всё отрабатывает. ЧЯДНТ?'hz'
     
  19. Подозреваю, дело в самом документе
     
  20. М-да, так звезды сложились. И меня заработал.
    Но горбато. Он не группы в смарты пакует, а слои в группах. А это ни к чему.
    Плодить такое количество смартов непотребно.