Ausgabe
Ich arbeite an einem Skript, das ein Photoshop-Dokument durchlaufen und alle sichtbaren verknüpften Objekte mit einer neuen angegebenen Datei neu verknüpfen soll. Ich habe die Schleife so zum Laufen gebracht, dass sie jede Ebene durchläuft und nur die sichtbaren Ebenen sammelt, aber ich kann für mein ganzes Leben nicht finden, ob es eine Methode gibt, um ein intelligentes Objekt neu zu verknüpfen. Das nächste, was ich gefunden habe, ist dieses Skript:
https://gist.github.com/laryn/0a1f6bf0dab5b713395a835f9bfa805c
aber wenn es zu kommt desc3.putPath(idnull, new File(newFile));
, spuckt es einen Fehler aus, der darauf hinweist, dass die Funktionalität in der aktuellen Photoshop-Version möglicherweise nicht vorhanden ist. Das Skript selbst ist 4 Jahre alt und daher möglicherweise veraltet.
Jede Hilfe wäre willkommen!
MEIN Skript, wie es aussieht, ist unten:
// SELECT FILE //
var files = File.openDialog("Please select new linked file");
var selectedFile = files[0];
// GET ALL LAYERS //
var doc = app.activeDocument;
var allLayers = [];
var allLayers = collectAllLayers(doc, allLayers);
function collectAllLayers (doc, allLayers)
{
for (var m = 0; m < doc.layers.length; m++)
{
var theLayer = doc.layers[m];
if (theLayer.typename === "ArtLayer")
{
allLayers.push(theLayer);
}
else
{
collectAllLayers(theLayer, allLayers);
}
}
return allLayers;
}
// GET VISIBLE LAYERS //
var visibleLayers = [];
for (i = 0; i < allLayers.length; i++)
{
var layer = allLayers[i];
if (layer.visible && layer.kind == LayerKind.SMARTOBJECT)
{
visibleLayers.push(layer);
}
}
// REPLACE LAYERS
for (i = 0; i < visibleLayers.length; i++)
{
var layer = visibleLayers[i];
//--> REPLACE THE FILE HERE
}
Hinweis: Mir ist bewusst, dass dieses Skript derzeit fehleranfällig sein kann, wenn Sie nicht genau wissen, wie es funktioniert; Ich habe nicht vor, es zu diesem Zeitpunkt zu veröffentlichen, also mache ich mir im Moment keine großen Sorgen darüber. Meistens brauche ich nur die Kernfunktionalität, um zu funktionieren.
Lösung
Ich habe eine AM-Funktion verwendet, um sichtbare intelligente Objekte zu erhalten – sie funktioniert viel schneller. Aber wenn du willst, kannst du deine benutzen. Das Wichtige ist relinkSO(path);
: Es funktioniert auch in Ihrem Skript (vergessen Sie nur nicht, eine Ebene auszuwählen: activeDocument.activeLayer = visibleLayers[i];
)
Beachten Sie, dass es ähnlich wie der Photoshop Relink to File
-Befehl funktioniert – wenn es auf einer Instanz von Smart Object verwendet wird, werden alle Instanzen neu verknüpft. Wenn Sie nur bestimmte Ebenen neu verknüpfen möchten, müssen Sie zuerst die Instanzierung unterbrechen (wahrscheinlich mit dem New Smart Object via Copy
Befehl) .
function main() {
var myFile = Folder.myDocuments.openDlg('Load file', undefined, false);
if (myFile == null) return false;
// gets IDs of all smart objects
var lyrs = getLyrs();
for (var i = 0; i < lyrs.length; i++) {
// for each SO id...
// select it
selectById(lyrs[i]);
// relink SO to file
relinkSO(myFile);
// embed linked if you want
embedLinked()
}
function getLyrs() {
var ids = [];
var layers, desc, vis, type, id;
try
{
activeDocument.backgroundLayer;
layers = 0;
}
catch (e)
{
layers = 1;
}
while (true)
{
ref = new ActionReference();
ref.putIndex(charIDToTypeID('Lyr '), layers);
try
{
desc = executeActionGet(ref);
}
catch (err)
{
break;
}
vis = desc.getBoolean(charIDToTypeID("Vsbl"));
type = desc.getInteger(stringIDToTypeID("layerKind"));
id = desc.getInteger(stringIDToTypeID("layerID"));
if (type == 5 && vis) ids.push(id);
layers++;
}
return ids;
} // end of getLyrs()
function selectById(id) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putIdentifier(charIDToTypeID('Lyr '), id);
desc.putReference(charIDToTypeID('null'), ref);
executeAction(charIDToTypeID('slct'), desc, DialogModes.NO);
} // end of selectById()
function relinkSO(path) {
var desc = new ActionDescriptor();
desc.putPath( charIDToTypeID('null'), new File( path ) );
executeAction( stringIDToTypeID('placedLayerRelinkToFile'), desc, DialogModes.NO );
} // end of relinkSO()
function embedLinked() {
executeAction( stringIDToTypeID('placedLayerConvertToEmbedded'), undefined, DialogModes.NO );
} // end of embedLinked()
}
app.activeDocument.suspendHistory("relink SOs", "main()");
Beantwortet von – Sergey Kritskiy
Antwort geprüft von – Gilberto Lyons (FixError Admin)