Partager l'article ! Contexte de Calque: LAYERCTX.JSX: /************************ LAYERCTX.JSX ************************ 18/12/2011 Habaki ...
/************************
LAYERCTX.JSX
************************
18/12/2011 Habaki V1r02b: Ignore Opacity
30/05/2010 Habaki V1r02 : Replace some events
09/05/2010 Habaki V1r01 : Creation
************************/
var ScriptName = "Layer context, (c) Habaki 2010-2011";
var Verbose = 0; // 0:mute, 1: All msgs and ask for context creation
var Verbose2 = 0; // Just context (0:mute, 1:In, 2:Out)
var Verberr = 1; // Errors (0:mute)
/************************
/*----------------------*
Current
*----------------------*/
var Layers;
var LayerCur = "";
var ToolCur = "";
var BrushCur = "";
var BrushDiameterCur = 0.0;
var BrushOpacityCur = 100;
var ColorFGCur = "";
var ColorBGCur = "";
var BrushSelectOk = 0;
/*----------------------*
Replace brushes
*----------------------*/
function brush_ListReplace(FPath // .doc path
)
{
var FPath2;
if (FPath == "") {
FPath2 = String(activeDocument.fullName);
} else FPath2 = String(FPath);
FPath2 = FPath2.slice(0, FPath2.lastIndexOf(".")) + ".ABR";
if (Verbose & 1) alert("Load:" + FPath2, "Brushes");
if (!(new File(FPath2)).exists) {
alert(FPath2 + " not Found !\nKeep current Brushes","Brushes");
return;
}
var idsetd = charIDToTypeID( "setd" );
var desc10 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idPrpr = charIDToTypeID( "Prpr" );
var idBrsh = charIDToTypeID( "Brsh" );
ref1.putProperty( idPrpr, idBrsh );
var idcapp = charIDToTypeID( "capp" );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref1.putEnumerated( idcapp, idOrdn, idTrgt );
desc10.putReference( idnull, ref1 );
var idT = charIDToTypeID( "T " );
desc10.putPath( idT, new File( FPath2 ) );
executeAction( idsetd, desc10, DialogModes.NO );
}
/*----------------------*
Store brushes
*----------------------*/
function brush_ListStore(FPath // doc file
)
{
var FPath2;
if (FPath == "") {
FPath2 = String(activeDocument.fullName);
} else FPath2 = String(FPath);
FPath2 = FPath2.slice(0, FPath2.lastIndexOf(".")) + ".ABR";
if (Verbose & 1) alert("Stores:" + FPath2, "Brushes");
var AD = new ActionDescriptor();
AD.putPath( charIDToTypeID( "null" ), new File( FPath2) );
var AR = new ActionReference();
var idPrpr = charIDToTypeID( "Prpr" );
var idBrsh = charIDToTypeID( "Brsh" );
AR.putProperty( idPrpr, idBrsh );
var idcapp = charIDToTypeID( "capp" );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
AR.putEnumerated( idcapp, idOrdn, idTrgt );
AD.putReference( charIDToTypeID( "T " ), AR );
executeAction(charIDToTypeID( "setd" ), AD, DialogModes.NO );
}
/*----------------------*
Layer Properties
*----------------------*/
// New for current
function LayerPropNew() {
return(activeDocument.activeLayer.name + ";;;;;;");
}
// Select
function LayerPropSelect(Prop)
{
//if (Verbose) alert("PropSelect: " +Prop[0]+";"+Prop[1]+";"+Prop[2]+";"+Prop[3]+";"+Prop[4]+";"+Prop[5]+";", ScriptName);
if (Prop[1]) ToolSelect(Prop[1]);
if (Prop[2]) BrushSelect(Prop[2]);
if (Prop[3]) ColorFGSelect(Prop[3]);
if (Prop[4]) ColorBGSelect(Prop[4]);
if (Prop[5]) BrushDiameterSelect(parseFloat(Prop[5]));
if (Prop[6]) BrushOpacitySelect(parseFloat(Prop[6]));
}
// Selected
function LayerPropSelected(Prop)
{
LayerCur = Prop[0];
ToolCur = Prop[1];
BrushCur = Prop[2];
ColorFGCur = Prop[3];
ColorBGCur = Prop[4];
BrushDiameterCur = parseFloat(Prop[5]);
BrushOpacityCur = parseFloat(Prop[6]);
if (LayerCur != activeDocument.activeLayer.name) {
if (Verbose) alert("Wrong LayerCur:" + LayerCur);
LayerSelected("");
}
}
// Build
function LayerProp(LName) // Layer name
{
if (LName)
return(LName + ";"
+ ToolCur + ";"
+ BrushCur + ";"
+ ColorFGCur + ";"
+ ColorBGCur + ";"
+ String(BrushDiameterCur) + ";"
+ String(BrushOpacityCur) + ";"
);
else
return("");
}
//--------------------
function LayerIndex(Name)
{
var i;
var Prop;
for (i=2; i < Layers.length;i++) {
Prop = Layers[i].split(";");
if (Prop[0]==Name) {
return(i);
}
}
return(0);
}
/*----------------------*
Layer
*----------------------*/
function LayerSelected(Name)
{
var Prop;
var Idx;
if (Name == "") Name = activeDocument.activeLayer.name;
if (Verbose) alert("Layer selected:" + Name, ScriptName);
if (Name==LayerCur) Idx = 1; //ex: select document
else
Idx = LayerIndex(Name);
if (Idx) {
Prop = Layers[Idx].split(";");
if (Idx > 1) Layers[Idx] = LayerProp(LayerCur);
LayerPropSelect(Prop);
} else{
Layers[Layers.length] = LayerProp(LayerCur);
}
LayerCur = Name;
}
//--------------------
function LayerRenamed(Name) // Current
{
if (Verbose) alert("Layer renamed: " + Name, ScriptName);
LayerCur = Name;
}
//--------------------
function LayerDeleted() // Current
{
// Keep the layer in the list in case of alt_ctrl_z
if (Verbose) alert("Layer deleted: " + LayerCur, ScriptName);
LayerSelected("");
}
/*----------------------*
Colors
*----------------------*/
function ColorFGSelect(Color)
{
ColorFGCur = Color;
if (Verbose) alert("Foreground Color: " + ColorFGCur, ScriptName);
foregroundColor.rgb.hexValue = ColorFGCur;
}
//--------------------
function ColorFGGet()
{
return(foregroundColor.rgb.hexValue);
}
//--------------------
function ColorBGSelect(Color)
{
ColorBGCur = Color;
if (Verbose) alert("Background Color: " + ColorBGCur, ScriptName);
backgroundColor.rgb.hexValue = ColorBGCur;
}
//--------------------
function ColorBGGet()
{
return(backgroundColor.rgb.hexValue);
}
/*----------------------*
Tool
*----------------------*/
function ToolSelected(Name)
{
if (Name == "historyState") {
LayerSelected("");
return;
}
ToolCur = Name;
if (Verbose) alert("Tool selected:" + Name, ScriptName);
if (ToolCur =="paintbrushTool") {
BrushSelect(BrushCur);
BrushDiameterSelect(BrushDiameterCur);
BrushOpacitySelect(BrushOpacityCur);
}
}
//--------------------
function ToolSelect(Name)
{
var AD = new ActionDescriptor();
var AR = new ActionReference();
if (Verbose) alert("Tool select:" + Name, ScriptName);
AR.putClass(stringIDToTypeID(Name));
AD.putReference(charIDToTypeID("null"), AR);
executeAction(charIDToTypeID("slct"), AD, DialogModes.NO);
ToolCur = Name;
}
/*----------------------*
Paint Brush
*----------------------*/
function BrushSelected(Name)
{
if (ToolCur != "paintbrushTool") return;
BrushCur = Name;
if (Verbose) alert("Brush selected:" + Name, ScriptName);
BrushDiameterCur = 0.0;
}
//--------------------
function BrushSelect(Name)
{
var AD = new ActionDescriptor();
var AR = new ActionReference();
if (BrushSelectOk) return;
if (!Name) return;
if (Verbose) alert("Brush select:" + Name, ScriptName);
try{
AR.putName(charIDToTypeID("Brsh"), Name);
AD.putReference(charIDToTypeID("null"), AR);
executeAction(charIDToTypeID("slct"), AD, DialogModes.NO );
BrushSelectOk = 1;
BrushCur = Name;
} catch(ex) {
if (ex && Verberr) alert("UNKNOWN BRUSH: " + Name + "\n", ScriptName);
}
}
//--------------------
function BrushDiameterSelected(Diam)
{
if (ToolCur != "paintbrushTool") return;
BrushDiameterCur = Diam;
if (Verbose) alert("Brush Diameter selected:" + Diam, ScriptName);
}
//--------------------
function BrushDiameterSelect(/* float */ Diam)
{
var AD = new ActionDescriptor();
var AR = new ActionReference();
var AD2 = new ActionDescriptor();
if (Verbose) alert("Brush Diameter select:" + Diam, ScriptName);
if (Diam && ToolCur == "paintbrushTool") {
AR.putEnumerated(charIDToTypeID("Brsh"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
AD.putReference(charIDToTypeID("null"), AR);
AD2.putUnitDouble(stringIDToTypeID("masterDiameter"),
charIDToTypeID("#Pxl"), Diam);
AD.putObject(charIDToTypeID("T "), charIDToTypeID("Brsh"), AD2);
executeAction(charIDToTypeID("setd"), AD, DialogModes.NO );
}
BrushDiameterCur = Diam;
}
/*-----------------------------------------------*
Brush
Opacity
*-----------------------------------------------*/
function BrushOpacityGet()
{
if (ToolCur != "paintbrushTool") return(100);
return(100);
/* Useless : Select is not available
var AR = new ActionReference();
AR.putEnumerated(charIDToTypeID("capp"),
charIDToTypeID("Ordn"),
charIDToTypeID("Trgt")
);
var AD = executeActionGet(AR);
AD = AD.getObjectValue(stringIDToTypeID("currentToolOptions"));
return(AD.getInteger(stringIDToTypeID("opacity")));
*/
}
//--------------------
function BrushOpacitySelected(Percent)
{
if (ToolCur != "paintbrushTool") return;
BrushOpacityCur = Percent;
if (Verbose) alert("Brush Opacity selected:" + Percent, ScriptName);
}
//--------------------
function BrushOpacitySelect(/* float */ Percent)
{
if (ToolCur != "paintbrushTool") return;
if (BrushOpacityCur == BrushOpacityGet()) return;
if (Verbose) alert("Brush Opacity select:" + Percent, ScriptName);
// No script available
}
/*----------------------*
Form
*----------------------*/
function FormSelected(Class, Name)
{
Class = typeIDToCharID(Class);
/* Layer is selected with activeLayer
if (Class == 'Lyr ') {
LayerSelected(Name);
}
else
*/
if (Class == 'Brsh') {
ToolCur ="paintbrushTool";
BrushSelected(Name);
}
}
/*----------------------*
Main
*----------------------*/
try{
var i, j, L, Prop;
var St = "";
var Ref, Class;
var Key, KeySt, Type, Val;
var Key1St ="";
var TypeSt = "?";
var ValSt = "?";
var NoArgs=0;
try{ arguments } catch(e) {NoArgs = 1;}
if (NoArgs || arguments.length < 2) {
alert("For Install/Uninstall execute Install.jsx", ScriptName);
throw(0);
}
var AD = arguments[0];
var EventName = typeIDToStringID(arguments[1]);
var AR, Form, Class, ClassSt;
var Info;
if (Verbose) alert("Event: " + EventName, ScriptName);
// Load Context (WRNG: on close doc is no more here)
if (EventName != "close") {
if (documents.length==0) throw(0);
Info = activeDocument.info;
St = Info.instructions; // Metadata
if (St == undefined) St == "";
if (Verbose2 & 1) alert("->Ctx(" + St + ")", ScriptName);
// Load Layers
Layers = St.split("\n");
if (Layers[0] != "LCtx" || Layers[1] == "") {
if (Layers[0] && Layers[0] != "LCtx" && Verbose==0) {
throw(0);
}
if (!confirm("Create Contexts for the Layers of this document ?", true, ScriptName)) {
Info.instructions = "LCtx=No\n";
throw(0);
}
Layers = new Array();
Layers[0] = "LCtx"; // Magic word
Layers[1] = LayerPropNew();
if (Verbose) alert("New Context", ScriptName);
}
Prop = Layers[1].split(";");
LayerPropSelected(Prop); // Restore current
}
// Parse Event
if (EventName == "select") {
Key = AD.getKey(0);
KeySt= typeIDToStringID(Key);
Type = AD.getType(Key);
if (KeySt=="null") {
if (Type == DescValueType.CLASSTYPE) {
Type = AD.getClass(Key);
ToolSelected(typeIDToStringID(Type));
}
else
if (Type == DescValueType.REFERENCETYPE) {
AR = AD.getReference(Key);
Form = AR.getForm();
Class = AR.getDesiredClass();
ClassSt = typeIDToStringID(AR.getDesiredClass());
if (ClassSt == "document") {
LayerSelected("");
}
else
if (Form == ReferenceFormType.NAME) {
FormSelected(Class, AR.getName());
}
else
if (Form == ReferenceFormType.CLASSTYPE) {
ToolSelected(ClassSt);
}
}
}
}
else
if (EventName == "open") {
Key = AD.getKey(0);
KeySt= typeIDToStringID(Key);
Type = AD.getType(Key);
if (KeySt=="null") {
if (Type == DescValueType.ALIASTYPE) {
// Open document
brush_ListReplace(AD.getPath(Key));
LayerSelected("");
}
}
}
else
if (EventName == "close" && AD.count >=1) {
// close document: only event arg is available
try{
Key = AD.getKey(1);
KeySt= typeIDToStringID(Key);
Type = AD.getType(Key);
if (KeySt == "in" && Type == DescValueType.ALIASTYPE) {
brush_ListStore(AD.getPath(Key));
}
} catch(e) {}
}
else
if (EventName == "set") {
Key = AD.getKey(0);
KeySt= typeIDToStringID(Key);
Type = AD.getType(Key);
if (KeySt=="null") {
if (Type == DescValueType.REFERENCETYPE) {
AR = AD.getReference(Key);
ClassSt = typeIDToStringID(AR.getDesiredClass());
if (ClassSt == "brush" || ClassSt == "layer") {
Key = AD.getKey(1);
KeySt= typeIDToStringID(Key);
Type = AD.getType(Key);
if (KeySt == "to") {
if (Type == DescValueType.OBJECTTYPE) {
Type = AD.getObjectType(Key);
TypeSt = typeIDToStringID(Type);
AD = AD.getObjectValue(Key);
if (TypeSt == "brush" || TypeSt == "layer") {
Key = AD.getKey(0);
Type = AD.getType(Key);
if (typeIDToStringID(Key) == "masterDiameter")
{
if (Type == DescValueType.UNITDOUBLE)
{
// Type =
AD.getUnitDoubleType(Key);
// typeIDToStringID(Type) ==
pixelUnit
BrushDiameterSelected(AD.getUnitDoubleValue(Key));
}
}
else
if (typeIDToStringID(Key) == "name" && TypeSt ==
"layer") {
if (Type == DescValueType.STRINGTYPE)
{
//Type =
AD.getUnitDoubleType(Key);
// typeIDToStringID(Type) ==
pixelUnit
LayerRenamed(AD.getString(Key));
}
}
}
}
}
}
}
}
}
// Other Events that need to be catched
// make, copyToLayer, delete
//else throw(0);
// Save Context
if (EventName != "close") {
ColorFGCur = ColorFGGet();
ColorBGCur = ColorBGGet();
BrushOpacityCur = BrushOpacityGet();
St = "LCtx\n" + LayerProp(LayerCur) + "\n";
for (i=2;i < Layers.length;i++) {
if (Layers[i]) St += Layers[i] + "\n";
} // for
// Save config
if (Verbose2 & 2) alert("<-Ctx(" + St + ")", ScriptName);
Info.instructions = St;
}
} catch(ex) {
if (ex && Verberr) alert(ex.message, ScriptName);
}