Найти и заменить в именах слоев

Статус
Закрыто для дальнейших ответов.

quux

Участник
Топикстартер
Сообщения
33
Реакции
0
Добрый день.

Хочу переименовать много слоев со словом (копия) в имени.

Код:
parLayer = app.activeDocument.layers.getByName("data");
if(parLayer.layers.length>0)
    {
        for(var k=0; k<parLayer.layers.length; k++)
        {
            nameLayer = parLayer.layers[k].name;
          
        }
    }

подскажите функцию которая мне поможет это сделать.
 
Последнее редактирование:

dumbm1

10 лет на форуме
Сообщения
421
Реакции
196
Поясните, пожалуйста:
Вы хотите заменить какое-то слово, если оно встречается в именах слоев, на другое слово?
т.е. например, слой #1 наз. "Мой слой 1", слой #2 наз. "Мой слой 2" и т.д.,
а Вы хотите заменить слово "Мой" на "Их",
т.е. в результате получится "Их слой 1", "Их слой 2" и т.д.
Такая задача?
 

dumbm1

10 лет на форуме
Сообщения
421
Реакции
196
Это подойдет, посмотрите:
PHP:
// поменять слово Layer на Sheet во всех именах слоев
renameLayers('Layer', 'Sheet');

/**
* Ф-ция замены слова в именах слоёв:
* регистрозависима! и меняет только первое вхождение!
* param {String} oldStr - искомая подстрока
* param {String} newStr - новая подстрока
*/
function renameLayers(oldStr/*чо менять*/, newStr/*на чо менять*/) {
  var lays = activeDocument.layers; // коллекция слоев

  for (var i = 0; i < lays.length; i++) {
    var layName = lays[i].name
    var pos = layName.indexOf(oldStr); // позиция, где найдено совпадение
    if (~pos) { // если искомое слово найдено в имени слоя
      // создать новое имя
      var newName = layName.slice(0, pos);
      newName += newStr + layName.slice(pos + oldStr.length);
      lays[i].name = newName;  // переименовать слой
    }
  }
}
Так как имена слоев - это строки, вот полезная статья по функционалу для работы со строками в javascript: http://learn.javascript.ru/string
 

quux

Участник
Топикстартер
Сообщения
33
Реакции
0
Спасибо, буду разбираться 'cooll)'
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
Как вариант, для поиска и замены можно использовать регулярные выражения
 

dumbm1

10 лет на форуме
Сообщения
421
Реакции
196
quux, Прошу прощения, я только сейчас заметил, что Вы конкретно указали какое слово менять - "...со словом (копия)...". А на что надо менять?
qsedftghk, да, здесь как раз правильно использовать регулярные выражения, но я еще не до конца в них разобрался...хотя тут вроде простой случай.
 

dumbm1

10 лет на форуме
Сообщения
421
Реакции
196
PHP:
// поменять слово "копия" на "copy" во всех именах слоев
renameLays('копия', 'copy');

/**
* Ф-ция замены слова в именах слоёв: регистроЗависима и меняет ВСЕ вхождения
*/
function renameLays(target/*чо менять*/, newSubStr/*на чо менять*/) {

  if (target == newSubStr) return; // чтобы случайно не зациклилась ;)

  var lays = activeDocument.layers; // коллекция слоев

  for (var i = 0; i < lays.length; i++) {
    var layName = lays[i].name // очередное имя слоя
    var pos = layName.indexOf(target); // позиция, где найдено совпадение

    if (~pos) { // если искомое слово найдено в имени слоя
      // то создать новое имя
      var newLayName = layName.slice(0, pos) + newSubStr + layName.slice(pos + target.length);
      lays[i].name = newLayName; // присвоить слою новое имя

      i--; // возвратить счетчик
      continue; // проверить имя слоя еще раз на предмет повторений
    }
  }
}
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
Если менять только слово, я бы сделал как-то так: (Внимание! Должно, по-идее, менять все слова "копия" на "copy"в названии слоя, сколько бы их не было, - лень проверять, я спать хочу =)) )

Код:
var lays = activeDocument.layers;
for (var i = 0; i < lays.length; i++) {
var layName = lays[i].name
lays[i].name=layName.replace(new RegExp('копия','g'),'copy');  }
 
  • Спасибо
Реакции: dumbm1

quux

Участник
Топикстартер
Сообщения
33
Реакции
0
@dumbm1, спасибо за код, сделал так:
Код:
renameLayers(' (копия)', '');

function renameLayers(oldStr/*чо менять*/, newStr/*на чо менять*/) {
  var lays = app.activeDocument.layers.getByName("data"); // коллекция слоев

  for (var i = 0; i < lays.layers.length; i++) {
    var layName = lays.layers[i].name
    var pos = layName.indexOf(oldStr); // позиция, где найдено совпадение
    if (~pos) { // если искомое слово найдено в имени слоя
      // создать новое имя
      var newName = layName.slice(0, pos);
      newName += newStr + layName.slice(pos + oldStr.length);
      lays.layers[i].name = newName;  // переименовать слой
    }
  }
}

Все получилось.
 

dumbm1

10 лет на форуме
Сообщения
421
Реакции
196
Отлично! Но код qsedftghk короче и проще.

Не по теме:
Кстати, quux, можете нажать кнопку "спасибо" в нижнем правом углу ;)
 

svlasov

Администратор
20 лет на форуме
Сообщения
2 228
Реакции
4 933

Не по теме:
Кстати, @dumbm1, для того, чтобы вставить в сообщение ник участника, можно нажать кнопку «Ник в ответ» в правом нижнем углу :)
 
  • Спасибо
Реакции: dumbm1
Статус
Закрыто для дальнейших ответов.