Ausgabe
TL; DR – Ich möchte Code verwenden, um ein benutzerdefiniertes Muster aus der Auswahl in Photoshop mithilfe von Skripten (Extendscript) zu definieren.
Hier ist der Code, den ich bisher habe:
(function () {
var doc = app.activeDocument;
// I put 2 guides in the doc to easily get coords for this test
var guides = doc.guides;
var hGuide = guides[0].coordinate.value;
var vGuide = guides[1].coordinate.value;
// Select whole doc
doc.selection.selectAll();
var sel = doc.selection.bounds;
// Get percentages so we can resize the selection
var xVal = (hGuide / sel[2].value) * 100;
var yVal = (vGuide / sel[3].value) * 100;
doc.selection.resizeBoundary(xVal, yVal, AnchorPosition.TOPLEFT);
cTID = function (s) { return app.charIDToTypeID(s); };
sTID = function (s) { return app.stringIDToTypeID(s); };
// This part is recorded from an ActionListener
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putClass(cTID('Ptrn'));
desc1.putReference(cTID('null'), ref1);
var ref2 = new ActionReference();
ref2.putProperty(cTID('Prpr'), sTID("selection"));
ref2.putEnumerated(cTID('Dcmn'), cTID('Ordn'), cTID('Trgt'));
desc1.putReference(cTID('Usng'), ref2);
desc1.putString(cTID('Nm '), "Leaves");
app.executeAction(cTID('Mk '), desc1, DialogModes.NO);
})();
Dies geschieht manuell in der Benutzeroberfläche, indem Sie mit einem Marquee-Tool eine Auswahl treffen, dann zu Bearbeiten > Muster definieren … gehen, den Namen eingeben und dann auf OK klicken.
Ich habe mich dabei aufgezeichnet und ein Aktionsskript in Javascript erhalten, aber wenn ich es ausführe, sagt mir Extendscript: „Allgemeiner Photoshop-Fehler aufgetreten. Diese Funktionalität ist in dieser Version von Photoshop möglicherweise nicht verfügbar.“
Ich bin nicht so geschickt, wenn es um die Verwendung der ActionDescriptors und ActionReferences geht, daher würde ich mich über etwas Hilfe freuen, damit dies ein benutzerdefiniertes Muster definiert.
Danke im Voraus!
**BEARBEITEN:**Der ActionScript-Code funktioniert, wenn ich die Auswahl manuell treffe, aber wenn ich den obigen Code verwende, um die Auswahl zu treffen, funktioniert es nicht. Warum sollte es einen Unterschied geben, frage ich mich?
Lösung
Ich bin mir nicht sicher, was mit meinem Setup los war, aber als ich die Ps-JavaScript-API verwendet habe, um eine Auswahl zu treffen, ist der Code kaputt gegangen. Aber als ich die Auswahl mit ActionScript getroffen habe, hat es funktioniert. Hier sind die beiden Funktionen, die ich vorgenommen habe, um auszuwählen und dann ein Muster aus der Auswahl zu erstellen:
function setSelection(top, left, bottom, right) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putProperty(app.charIDToTypeID('Chnl'), app.stringIDToTypeID("selection"));
desc1.putReference(app.charIDToTypeID('null'), ref1);
var desc2 = new ActionDescriptor();
desc2.putUnitDouble(app.charIDToTypeID('Top '), app.charIDToTypeID('#Pxl'), top);
desc2.putUnitDouble(app.charIDToTypeID('Left'), app.charIDToTypeID('#Pxl'), left);
desc2.putUnitDouble(app.charIDToTypeID('Btom'), app.charIDToTypeID('#Pxl'), bottom);
desc2.putUnitDouble(app.charIDToTypeID('Rght'), app.charIDToTypeID('#Pxl'), right);
desc1.putObject(app.charIDToTypeID('T '), app.charIDToTypeID('Rctn'), desc2);
executeAction(app.charIDToTypeID('setd'), desc1, DialogModes.NO);
}
function makePatternFromSelection(name) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putClass(app.charIDToTypeID('Ptrn'));
desc1.putReference(app.charIDToTypeID('null'), ref1);
var ref2 = new ActionReference();
ref2.putProperty(app.charIDToTypeID('Prpr'), app.stringIDToTypeID("selection"));
ref2.putEnumerated(app.charIDToTypeID('Dcmn'), app.charIDToTypeID('Ordn'), app.charIDToTypeID('Trgt'));
desc1.putReference(app.charIDToTypeID('Usng'), ref2);
desc1.putString(app.charIDToTypeID('Nm '), name);
executeAction(app.charIDToTypeID('Mk '), desc1, DialogModes.NO);
}
Beantwortet von – Casey
Antwort geprüft von – Mildred Charles (FixError Admin)