Vectorboom

Как вытащить объекты символа из подслоев - Страница 3 - Форум по Векторной Графике

Новое сообщение / Участники / Правила форума / Поиск / RSS
Страница 3 из 3«123
Форум по Векторной Графике » Общие вопросы по Adobe Illustrator » Adobe Illustrator » Как вытащить объекты символа из подслоев
Как вытащить объекты символа из подслоев
EvilHIRURGДата: Понедельник, 20.10.2014, 12:20 | Сообщение # 31
Группа: Человек
Сообщений: 205
Статус: Offline
Ярослав, думаю проблема в Вашем компьютере или иллюстраторе, потому как поставил себе английскую версию СС18.1 и всё работает хорошо. Вот видео.

 
 
lazunДата: Понедельник, 20.10.2014, 12:36 | Сообщение # 32
Группа: Администраторы
Сообщений: 2363
Статус: Offline
Спасибо, за подтверждение
 
lazunДата: Вторник, 21.10.2014, 12:20 | Сообщение # 33
Группа: Администраторы
Сообщений: 2363
Статус: Offline
Для того чтобы скрипт работал надо чтобы "var alayer = app.activeDocument.activeLayer; " начиналось с новой строки.
Т.е. удалить "// Не трогать, магия!" или перевести строку после "!"

Все равно, в моем случае, скрипт неправильно отрабатывает - кидает все символы в верхний подслой, при этом не группируя их

У нас отличая в OS, у меня Win7 x86
 
EvilHIRURGДата: Вторник, 21.10.2014, 13:02 | Сообщение # 34
Группа: Человек
Сообщений: 205
Статус: Offline
Ага, понятно! У меня Win7 x64.
 Я проверил то правда с новой строчки должно быть. Но я оригинал скопировал и на форуме вставил как КОД но текст не вставился как в оригинале а сбил всё до купы. 

Возможно вечером еще одна версия скрипта будет от другого разработчика. В ней должна быть функция разблокировки слоя если он заблокирован, а этот скрипт не обрабатывает заблокированые слои, а выдает ошибку.
 
EvilHIRURGДата: Среда, 22.10.2014, 09:40 | Сообщение # 35
Группа: Человек
Сообщений: 205
Статус: Offline
Как и обещал выкладываю усовершенствованный скрипт. Этот уже умеет работать с скрытыми и заблокированными подслоями. Скрытые он оставляет на своем месте в иерархии слоев (но не показывает его), а с залоченых снимает замочки если вдруг забыли снять.  

Пользуйтесь бесплатно!


Код
moveToTop();

function moveToTop() {
   /**
    * action:
    * */
   var actLay = activeDocument.activeLayer;
   _unlockAllVisible(actLay);
   _move(actLay);
   _delEmptyLays();

   /**
    * lib:
    * */
   function _move(a) {
     a.hasSelectedArtwork = true;
     sel = activeDocument.selection;
     for (var i = sel.length - 1; i >= 0; i--) {
       sel[i].move(a, ElementPlacement.INSIDE);
       sel[i].selected = false;
     }
   }

   /**
    * рекурсивная ф-ция снятия блокировки со всех видимых элементов слоя
    * @param {Object} lay - объект класса Layer
    * @return {Object} lay - объект класса Layer
    */
   function _unlockAllVisible(lay) {
     if (lay.visible == false) return;
     if (lay.parent.typename == 'Layer' && lay.parent.visible == false) return;

     lay.locked == true ? lay.locked = false : '';
     _unlockVisibleItems(lay);

     for (var i = 0; i < lay.layers.length; i++) {
       var thisSubLay = _getSubs(lay)[i];
       if (thisSubLay.visible == false) continue;
       thisSubLay.locked == true ? thisSubLay.locked = false : '';
       _unlockVisibleItems(thisSubLay);

       if (_hasSubs(thisSubLay)) {
         var parent = _unlockAllVisible(thisSubLay);
         if (parent.visible == false) continue;
       }
     }

     /**
      * снятие блокировки с видимых элементов одноуровнего слоя
      */
     function _unlockVisibleItems(lay) {
       for (var i = 0; i < lay.pageItems.length; i++) {
         lay.pageItems[i].locked == true ? lay.pageItems[i].locked = false : '';
       }
     }

     return lay;
   }

   /**
    * ф-ция удаления всех пустых слоёв/подслоёв
    */
   function _delEmptyLays() {

     for (var i = 0; i < activeDocument.layers.length; i++) {
       var lay = activeDocument.layers[i];
       if (_hasSubs(lay)) {
         _delSubs(lay);
       }
       if (_isEmpty(lay) && activeDocument.layers.length > 1) { // попытка удалить единственный слой приведёт к его переименованию в <layer>
         lay.locked == true ? lay.locked = false : '';
         lay.visible == false ? lay.visible = true : '';
         lay.remove();
         i--;
       }
     }

     /**
      * рекурсивная ф-ция удаления подслоя
      * @param {Object} lay - объект класса Layer
      * @return {Object} lay - объект класса Layer
      */
     function _delSubs(lay) {
       for (var i = 0; i < lay.layers.length; i++) {
         var thisSubLay = _getSubs(lay)[i];

         if (_isEmpty(thisSubLay)) {
           thisSubLay.locked == true ? thisSubLay.locked = false : '';
           thisSubLay.visible == false ? thisSubLay.visible = true : '';
           thisSubLay.remove();
           i--;
         }

         if (_hasSubs(thisSubLay)) {
           var parent = _delSubs(thisSubLay);
           if (_isEmpty(parent)) {
             thisSubLay.locked == true ? thisSubLay.locked = false : '';
             thisSubLay.visible == false ? thisSubLay.visible = true : '';
             thisSubLay.remove();
             i--;
           }
         }
       }
       return lay;
     }

     /**
      * содержит ли слой объекты классов PageItem или Layer
      * @param  {Object} lay - объект класса Layer
      * @return {Boolean} true, если слой пуст
      */
     function _isEmpty(lay) {
       try {
         return lay.pageItems.length == 0 && lay.layers.length == 0;
       } catch (e) {
         return false;
       }
     }

   }

   /**
    * содержит ли слой объекты класса Layer
    * @param  {Object} lay - объект класса Layer
    * @return {Boolean} true, если есть подслои
    */
   function _hasSubs(lay) {
     try {
       return (lay.layers.length > 0);
     } catch (e) {
       return false;
     }
   }

   /**
    * получить коллекцию layers данного layer
    * @param  {Object} lay - объект класса Layer
    * @return {Object/Boolean} - коллекция layers / false
    */
   function _getSubs(lay) {
     try {
       return lay.layers;
     } catch (e) {
       return false;
     }
   }
}


Как установит скрипт.
1. Копируем текст кода ОТ и ДО 
2. Создаем на рабочем столе текстовый файл 
3. Вставляем туда скопированный текст 
4. сохраняем под любым именем и пишем расширение .JSX (тоесть в конце названия файла пишем ".JSX") 
5. Перемещаем файл по пути где лежит иллюстратор. Стандарт это 

Для Windows: C:\Program Files\Adobe\Adobe Illustrator CS6\Presets\en_GB\Scripts 
Для Mac:  Applications / Adobe\Adobe Illustrator CS6\Presets\en_GB\Scripts
 
lazunДата: Среда, 22.10.2014, 09:42 | Сообщение # 36
Группа: Администраторы
Сообщений: 2363
Статус: Offline
Спасибо! Будем тестировать
 
lazunДата: Пятница, 24.10.2014, 10:21 | Сообщение # 37
Группа: Администраторы
Сообщений: 2363
Статус: Offline
Не могу сказать, что скрипт работает устойчиво.
После первого запуска скрипта бывшие символы находящиеся в разных слоях (или в одном слое) собираются группами в верхнем слое и в отдельном подслое. Вторичный запуски скрипта выводит группы из подслоя. OK

Несколько раз были случаи, когда разгруппировываются группы, что очень неприятно. Условия тестирования при этом неизменны. Могут появляться пустые рамки от символов. Насколько я понимаю, для работы скрипта объекты должны быть выделены. В моем случае только так скрипт работает. Тогда непонятно, как он отрабатывает заблокированные слои? Проверял  - не работает.
Скрипт может вести себя не предсказуемо - то работает, то не работает
 
EvilHIRURGДата: Пятница, 24.10.2014, 20:19 | Сообщение # 38
Группа: Человек
Сообщений: 205
Статус: Offline
Цитата lazun ()
После первого запуска скрипта бывшие символы находящиеся в разных слоях (или в одном слое) собираются группами в верхнем слое и в отдельном подслое

Ничего подобного не встречал. вы когда запускаете скрипт будьте уверены в том что у Вас на панели "слои" выделен главный слой. Вернее что бы светился, не нужно делать выделение просто кликнуть. Скрипт вытягивает элементы с того слоя (подслоя) который Вы указали.
Цитата lazun ()
Несколько раз были случаи, когда разгруппировываются группы, что очень неприятно.
 Тоже не замечал.

Цитата lazun ()
Могут появляться пустые рамки от символов.

Протестил - не увидил. smile

Цитата lazun ()
Насколько я понимаю, для работы скрипта объекты должны быть выделены.
 Выделять не надо. Я вообще пакетно обрабатываю екшеном в который вписал запуск скрипта.

Цитата lazun ()
Тогда непонятно, как он отрабатывает заблокированные слои?

Он их розблокрует и вытягивает элементы из подслоя
Цитата lazun ()
Проверял  - не работает.
Может из-за версии ОС?

Если можете скиньте файл мне на почту, я посмотрю работает ли у меня. Если действительно какие то проблемы то я напишу разработчику и он исправит. Он сам настаивал на тестировании и исправления недочётов.


Сообщение отредактировал EvilHIRURG - Пятница, 24.10.2014, 20:20
 
lazunДата: Суббота, 25.10.2014, 10:48 | Сообщение # 39
Группа: Администраторы
Сообщений: 2363
Статус: Offline
Если подсвечивать слой и не выделять никаких объектов, то скрипт работает отлично. Но вы не оговаривали такие условия прежде  wink
Если группа бывшего символа содержит пустую рамку, то она после отработки скрипта будет вынесена за группу. Не думаю, что это большая проблема, но лучше удалять такие объекты автоматически.
 
Форум по Векторной Графике » Общие вопросы по Adobe Illustrator » Adobe Illustrator » Как вытащить объекты символа из подслоев
Страница 3 из 3«123
Поиск:

twitter RSS facebook deviantart feed dribbble
Логин
Пароль
Новости Форума
 
Перепечатка, копирование или воспроизведение информации в каком-либо виде строго запрещены.
Все материалы, которые размещены на этом сайте не подлежат дальнейшему воспроизведению и/или распространению в любой форме, кроме как с письменного разрешения автора.