[PS CC2021] Замена прилинкованного файла на другой при наличии дублей

KDbled

Участник
Топикстартер
Сообщения
134
Реакции
37
Всем привет.

Вставляю в фотошоп смарт-объект как прилинкованный внешний файл.
Дублирую его несколько раз и тут встает задача один из дублей или первичный линк заменить на другой, а остальные не трогать.

Но фотошоп (и это логично) всегда меняет все одинаковые линки, даже если вставить один и тот же файл несколько раз.

Как заменить один линк, а остальные не трогать? В иллюстраторе и индизайне подобная функция работает как надо.
 

ElenaGagulina

Участник
Сообщения
59
Реакции
12
Всем привет.

Вставляю в фотошоп смарт-объект как прилинкованный внешний файл.
Дублирую его несколько раз и тут встает задача один из дублей или первичный линк заменить на другой, а остальные не трогать.

Но фотошоп (и это логично) всегда меняет все одинаковые линки, даже если вставить один и тот же файл несколько раз.

Как заменить один линк, а остальные не трогать? В иллюстраторе и индизайне подобная функция работает как надо.
можно сконвертировать нужный слой в смарт объект, тогда другие дубли не тронет
 

Lucky1978

Участник
Сообщения
157
Реакции
50
Всем привет.

Вставляю в фотошоп смарт-объект как прилинкованный внешний файл.
Дублирую его несколько раз и тут встает задача один из дублей или первичный линк заменить на другой, а остальные не трогать.

Но фотошоп (и это логично) всегда меняет все одинаковые линки, даже если вставить один и тот же файл несколько раз.

Как заменить один линк, а остальные не трогать? В иллюстраторе и индизайне подобная функция работает как надо.
Создать смарт-объект путём копирования этого смарт-объекта?
 
Последнее редактирование:

ElenaGagulina

Участник
Сообщения
59
Реакции
12
А создать смарт-объект путём копирования этого смарт-объекта не помогает в данном случае?
если импортировать файл через "
1626421417623.png
"
тогда функции
1626421445484.png
нет
 

KDbled

Участник
Топикстартер
Сообщения
134
Реакции
37
можно сконвертировать нужный слой в смарт объект, тогда другие дубли не тронет
Способ работает, только масштабирование естесственно слетает и тогда это ничем не отличается от Place Linked? кроме центрирования объекта.
 

ElenaGagulina

Участник
Сообщения
59
Реакции
12
Способ работает, только масштабирование естесственно слетает и тогда это ничем не отличается от Place Linked? кроме центрирования объекта.
Не совсем поняла, Ваше сообщение и немного не понятно какую задачу Вы хотите решить. Изначально в условиях было: как внести изменения во внешний Линк не затронув дубли
 

ElenaGagulina

Участник
Сообщения
59
Реакции
12
Можно вставлять изначально как смарт объект и делать new smart object via copy тогда когда требуется изменить один из дублей, все зависит от того какая это работа и как часто бывают изменения
 

KDbled

Участник
Топикстартер
Сообщения
134
Реакции
37
Не совсем поняла, Ваше сообщение и немного не понятно какую задачу Вы хотите решить. Изначально в условиях было: как внести изменения во внешний Линк не затронув дубли
1626693987962.png


Ромбы с цифрами это иллюстраторовские файлы. Очень часто требуется вместо, например, одно из "v6" вставить "v9".
Но при замене понятно меняются все "v6", а мне нужно оставить их в покое.
 

Любимцев

12 лет на форуме
Сообщения
2 853
Реакции
1 759
Понимаю, что учить жизни не вежливо, и материальная помощЬ много лучше...
но вы точно тот инструмент выбрали для верстки каталога?
особенно если нужно:
из "v6" вставить "v9".
PS: габариты обозначают не буквой "ха", а знаком умножения — ×
 
  • Спасибо
Реакции: Krest, KDbled и Gad

ElenaGagulina

Участник
Сообщения
59
Реакции
12
Посмотреть вложение 144898

Ромбы с цифрами это иллюстраторовские файлы. Очень часто требуется вместо, например, одно из "v6" вставить "v9".
Но при замене понятно меняются все "v6", а мне нужно оставить их в покое.
Возможно в данном случае лучше делать через простой смарт объект (грубо говоря, один раз ctrl с из Иллюстратора, ctrl v в фотошопе) копируйте для одинаковых, а тот что нужно изменить new smart object via copy (надеюсь не ошиблась с формулировкой)
 
  • Спасибо
Реакции: KDbled

KDbled

Участник
Топикстартер
Сообщения
134
Реакции
37
Понимаю, что учить жизни не вежливо, и материальная помощЬ много лучше...
но вы точно тот инструмент выбрали для верстки каталога?
особенно если нужно:

PS: габариты обозначают не буквой "ха", а знаком умножения — ×

Это совсем не каталог, а крупноформатная пленка для печати на стенды и задачи в ней решаются фотошопные, подгонка цветовых плашек под оригиналы. Именно поэтому фотошоп, очень много корректирующих слоев прямо в файле пленки. Я начинал с Adobe Illustrator, но у стал прыгать из программы в программу.

Каталоги, а они есть делаем в Indesign, всё как положено.
 

Любимцев

12 лет на форуме
Сообщения
2 853
Реакции
1 759
у стал прыгать из программы в программу
а че там прыгать? ... Alt+Tab для этого существует.
На Update All Links повешать шоткат (речь про Ид)
Ну и Илл не совсем тот инструмент.
Кстати, давно заметил: если из вектора или ИД сделать PDF и, открыв его ФШ, сохранить в tiff — файл получается весьма легче, чем изначально созданный в ФШ
(без компрессии, но в архиве, тем более)
 
Последнее редактирование:

~RA~

10 лет на форуме
Сообщения
9 535
Реакции
2 730
Последнее редактирование:

Gad

Участник
Сообщения
2 182
Реакции
975
Для одного активного слоя, впишет новый смарт в границы выделенного объекта (выделите к примеру 2 объекта, он их уберет и впишет в границы выделения новый... :) )
Код:
#target photoshop
if (app.documents.length > 0) {
    var doc = app.activeDocument;
    createSmartObject();
    var theLayer = doc.activeLayer;
    var lbRef = doc.activeLayer.bounds;
    if (theLayer.kind != "LayerKind.SMARTOBJECT") {
        alert("selected layer is not a smart object")
    } else {
        if ($.os.search(/windows/i) != -1) {
            var theFiles = File.openDialog("please select files", "*.*", true)
        } else {
            var theFiles = File.openDialog("please select files", getFiles, true)
        };
        if (theFiles) {
            theLayer = replaceContents(theFiles, theLayer);
            var wRef= lbRef[2].value - lbRef[0].value;
            var hRef= lbRef[3].value - lbRef[1].value;
            var lb = theLayer.bounds
            var wl= lb[2].value - lb[0].value;
            var hl= lb[3].value - lb[1].value;
            var w = wRef/wl*100
            var h = hRef/hl*100
            doc.activeLayer.resize( w,  h, AnchorPosition.MIDDLECENTER);
            dX = lbRef[0].value - theLayer.bounds[0].value
            dY = lbRef[3].value - theLayer.bounds[3].value
            doc.activeLayer.translate( dX, dY );
        };
    };
 
};

function getFiles(theFile) {
    if (theFile.name.match(/\.(psd|tif|jpg)$/i) != null || theFile.constructor.name == "Folder") {
        return true
    };
};

function createSmartObject() {
    var idnewPlacedLayer = stringIDToTypeID( 'newPlacedLayer' );
    executeAction(idnewPlacedLayer, undefined, DialogModes.NO);
};

function replaceContents(newFile, theSO) {
    app.activeDocument.activeLayer = theSO;
    var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
    var desc3 = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    desc3.putPath(idnull, new File(newFile));
    var idPgNm = charIDToTypeID("PgNm");
    desc3.putInteger(idPgNm, 1);
    executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
    return app.activeDocument.activeLayer
};
 
  • Спасибо
Реакции: KDbled

KDbled

Участник
Топикстартер
Сообщения
134
Реакции
37
Для одного активного слоя, впишет новый смарт в границы выделенного объекта (выделите к примеру 2 объекта, он их уберет и впишет в границы выделения новый... :) )
...

Интересно работает.

Вместо линка он вставляет смарт-объект встроенный.
При этом конечно всё меняется.

А что если сначала забрать параметры из заменяемого объекта, а после сделать вставку линка и изменить его под предыдущие параметры.
 

Gad

Участник
Сообщения
2 182
Реакции
975
Вместо линка он вставляет смарт-объект встроенный.
Не совсем понял о чем Вы... возможно потому что у меня CS6, а он вроде как не линкует объекты (в понимании связи с файлом). Попробуйте выполнить после замены объекта скриптом Replace Contents штатными средствами на тот-же самый файл, не получится так связать его с файлом?
А что если сначала забрать параметры из заменяемого объекта, а после сделать вставку линка и изменить его под предыдущие параметры.
Не совсем понял о чем Вы :) Скрипт сначала выполняет операцию Convert to Smart Object (чтобы разорвать связь с остальными объектами/дублями) потом запоминает его Bounding box, выполняет Replace Contents и изменяет размер/положение объекта по ранее запомненным параметрам.
Можно попробовать конечно не разрывать связь, а просто помещать новый объект, вгонять его в координаты старого, а старый грохнуть, тогда наверное связь с файлом останется.

Не по теме:
А, догнал, именно это Вы и предлагаете :)
 
Последнее редактирование:
  • Спасибо
Реакции: KDbled

Gad

Участник
Сообщения
2 182
Реакции
975
Добрался до PS 2020 и его референса :) Получилось такое:
Код:
#target photoshop
if (app.documents.length > 0) {
    var doc = app.activeDocument;
    var theLayer = doc.activeLayer;
    var lbRef = theLayer.bounds;
    if (getSelectedLayersIdx().length != 1) {
        alert("Mission Impossible! Select one layer and repeat")
    } else {
        if (theLayer.kind != "LayerKind.SMARTOBJECT") {
            alert("Selected layer is not a smart object")
        } else {
            if ($.os.search(/windows/i) != -1) {
                var theFiles = File.openDialog("please select files", "*.*", true)
            } else {
                var theFiles = File.openDialog("please select files", getFiles, true)
            };
            if (theFiles) {
                replacedLayer = newFile_and_relinkToFile()
                dX = lbRef[0].value - replacedLayer.bounds[0].value
                dY = lbRef[3].value - replacedLayer.bounds[3].value
                replacedLayer.translate( dX, dY );
                theLayer.remove();
            };
        };
    };
};

function getFiles(theFile) {
    if (theFile.name.match(/\.(psd|tif|jpg|ai|pdf)$/i) != null || theFile.constructor.name == "Folder") {
        return true
    };
};

function relinkToFile(newFile) {
    var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerRelinkToFile");
    var desc3 = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    desc3.putPath(idnull, new File(newFile));
    var idPgNm = charIDToTypeID("PgNm");
    desc3.putInteger(idPgNm, 1);
    executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
};

function newFile_and_relinkToFile() {
    app.activeDocument.selection.copy();
    newDoc = documents.add(doc.width, doc.height, doc.resolution);
    newDoc.paste();
    relinkToFile(theFiles);
    app.activeDocument.selection.copy();
    newDoc.close(SaveOptions.DONOTSAVECHANGES);
    app.activeDocument = doc;
    doc.paste();
    return app.activeDocument.activeLayer;
};

function  getSelectedLayersIdx(){
  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++){
    try{
     activeDocument.backgroundLayer;
     selectedLayers.push(  desc.getReference( i ).getIndex() );
    }catch(e){
     selectedLayers.push(  desc.getReference( i ).getIndex()+1 );
    };
    };
   }else{
   var ref = new ActionReference();
   ref.putProperty( charIDToTypeID('Prpr') , charIDToTypeID( 'ItmI' ));
   ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
   try{
    activeDocument.backgroundLayer;
    selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' ))-1);
   }catch(e){
    selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' )));
   };
  };
  return selectedLayers;
};
В принципе можно и как прежде... в смарт, потом RelinkToFile. Но там был существенный недостаток, если перелинкуемый объект будет повернут или с эффектами, то корректной замены не получится :) А так... все останется на месте, хотя мне и не нравится, что через буфер обмена приходится кидать объект туда-сюда :)
 
Последнее редактирование: