Skip to main content
andreasf
Inspiring
October 2, 2015
Answered

Is it possible to script brush opacity?

  • October 2, 2015
  • 3 replies
  • 4979 views

I would like to script the current brush's opacity to 20%. Have done a lot of googling but cant find a clear answer. Is this possible?

On a Mac with Photoshop CS6

This topic has been closed for replies.
Correct answer d1g1talphyre

from script listener.  The following code will create the preset.  I just tested it in CS6 OSX

// =======================================================

var idMk = charIDToTypeID( "Mk  " );

    var desc4 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref2 = new ActionReference();

        var idBrsh = charIDToTypeID( "Brsh" );

        ref2.putClass( idBrsh );

    desc4.putReference( idnull, ref2 );

    var idUsng = charIDToTypeID( "Usng" );

        var ref3 = new ActionReference();

        var idPrpr = charIDToTypeID( "Prpr" );

        var idCrnT = charIDToTypeID( "CrnT" );

        ref3.putProperty( idPrpr, idCrnT );

        var idcapp = charIDToTypeID( "capp" );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref3.putEnumerated( idcapp, idOrdn, idTrgt );

    desc4.putReference( idUsng, ref3 );

executeAction( idMk, desc4, DialogModes.NO );

3 replies

Tom Ruark
Inspiring
September 15, 2016
JJMack
Community Expert
Community Expert
September 15, 2016

Thank you Tom

Being a cut  and paste hacker like I am this may help others a little collection

// SetPaintBrush Script 2016 Tom Ruark and others like Mike Hale (RIP) cut and paste  by JJMack

// Set the options for the paint brush tool like on the tool option bar

// Round Brush Tip Features Diameter,Hardness,Angle,Roundness,Spacing,Flipy,Flipx

// blend modes, opacity, flow and pressure control

// Note: can also retrieve round brush tip features

// So if you retrieve the current brush tip features

// you can select Brush Presets to toggle while brush dynamic setting

// and the restore the tip features so presets does not size shape hardness etc

if (documents.length == 0) { var d = documents.add();}

else { var d = activeDocument;}

// At least two layers so behind and clear are available

if (d.layers.length == 1) { d.artLayers.add(); }

setTool('paintbrushTool');

// blend modes for paint brush

var bmsS = ["normal", "dissolve", "behind", "clearEnum",

            "darken", "multiply", "colorBurn", "linearBurn", "darkerColor",

            "lighten", "screen", "colorDodge", "linearDodge", "lighterColor",

            "overlay", "softLight", "hardLight", "vividLight", "linearLight", "pinLight", "hardMix",

            "difference", "exclusion", "blendSubtraction", "blendDivide",

            "hue", "saturation", "color", "luminosity",  ];

try {

  /* parameters (Diameter,Hardness,Angle,Roundness,Spacing,Flipy,Flipx) all are required

  Diameter  range 1 to 5000

  Hardness  range 0 to 100

  Angle     range 0 to + or - 180

  Roundness range 1 to 100

  Spacing   range 1 to 1000

  Flipy     range 0 or 1 false or true

    Flipx     range 0 or 1 false or true

  */

  setBrushFeatures(13,0,0,100,25,0,0);       //Adobe Defaults

  // parameters (mode character string, opacity %, flow %, penopacity boolean, pensize boolean, penair boolean) all are required

  SetPaintBrush(bmsS[0],100,100,0,0,0);     // Adobe Defaults

  /* Toggle Brtsh dynamivcs with  ON  and OFF  brtsh presets this is commented out the Preset need to be made

  var PresetName1 = "Brush Dynamics ON";    // Name of tool preset

  var PresetName2 = "Brush Dynamics OFF";   // Name of tool preset

  var PT = $.getenv("PanelDynamics");

  var saveFeatures = getBrushFeatures();

  // CHECK TOOL PRESET Dynamics STATE

  if(PT == null || PT == "OFF"){

  $.setenv("PanelDynamics","ON");

  SelectToolPreset(PresetName2);

  }

  else{

  $.setenv("PanelDynamics","OFF");

  SelectToolPreset(PresetName1);

  }

  setBrushFeatures(saveFeatures[0],saveFeatures[1],saveFeatures[2],saveFeatures[3],saveFeatures[4],saveFeatures[5],saveFeatures[6]);

  */

}

catch(e){

  //Something went wrong

  alert(e + ': on line ' + e.line, 'Script Error', true);

  //alert ("An unexpected error occurred and the script did not complete!");

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////

//==============================================================================================//

function setTool(tool) {

  var desc9 = new ActionDescriptor();

  var ref7 = new ActionReference();

  ref7.putClass( app.stringIDToTypeID(tool) );

  desc9.putReference( app.charIDToTypeID('null'), ref7 );

  executeAction( app.charIDToTypeID('slct'), desc9, DialogModes.NO );

  }

function getBrushFeatures (){

  //A Brush tool must be the current tool

    if (!app.toolSupportsBrushes(app.currentTool)) selectBrush();  //CC 2014

    var ref = new ActionReference(); 

    ref.putEnumerated( charIDToTypeID("capp"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") ); 

    var appDesc = executeActionGet(ref); 

    var toolDesc = appDesc.getObjectValue(stringIDToTypeID('currentToolOptions')); 

    var brushDesc = toolDesc.getObjectValue(stringIDToTypeID('brush'));

    var currDiameter = brushDesc.getDouble(stringIDToTypeID('diameter')); 

    var currHardness = brushDesc.getDouble(stringIDToTypeID('hardness')); 

    var currAngle = brushDesc.getDouble(stringIDToTypeID('angle')); 

    var currRoundness = brushDesc.getDouble(stringIDToTypeID('roundness')); 

    var currSpacing = brushDesc.getDouble(stringIDToTypeID('spacing')); 

    var currFlipy = brushDesc.getBoolean(stringIDToTypeID('flipY')); 

    var currFlipx = brushDesc.getBoolean(stringIDToTypeID('flipX'));

  var currentFeatures = new Array( currDiameter, currHardness, currAngle, currRoundness, currSpacing, currFlipy, currFlipx );

    return currentFeatures

}

function setBrushFeatures (Diameter,Hardness,Angle,Roundness,Spacing,Flipy,Flipx) { 

    var desc = new ActionDescriptor(); 

    var ref = new ActionReference(); 

    ref.putEnumerated( charIDToTypeID( "Brsh" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) ); 

    desc.putReference( charIDToTypeID( "null" ), ref ); 

    var desc1 = new ActionDescriptor(); 

    desc1.putDouble(stringIDToTypeID('diameter'), Diameter); 

    desc1.putDouble(stringIDToTypeID('hardness'), Hardness); 

    desc1.putDouble(stringIDToTypeID('angle'), Angle); 

    desc1.putDouble(stringIDToTypeID('roundness'), Roundness); 

    desc1.putUnitDouble( stringIDToTypeID('spacing'), charIDToTypeID('#Prc'), Spacing); 

    desc1.putBoolean(stringIDToTypeID('flipY'), Flipy); 

    desc1.putBoolean(stringIDToTypeID('flipX'), Flipx); 

    desc.putObject( stringIDToTypeID('to'), charIDToTypeID( "Brsh" ), desc1 ); 

    executeAction( charIDToTypeID( "setd" ), desc, DialogModes.NO ); 

}

function SetPaintBrush(mode,opacity,flow,penopacity,pensize,penair) {

  var idset = stringIDToTypeID( "set" );

  var desc226 = new ActionDescriptor();

  var idnull = stringIDToTypeID( "null" );

  var ref170 = new ActionReference();

    var idPbTl = stringIDToTypeID( "paintbrushTool" );

    ref170.putClass( idPbTl );

    desc226.putReference( idnull, ref170 );

    var id12 = stringIDToTypeID( "to" );

    var desc5 = new ActionDescriptor();

    // opacity

    var id13 = stringIDToTypeID( "opacity" );

    var id14 = stringIDToTypeID( "percentUnit" );

  desc5.putUnitDouble( id13, id14, opacity );

    // blend mode

    var id15 = stringIDToTypeID( "mode" );

    var id16 = stringIDToTypeID( "blendModel" );

  var id17 = stringIDToTypeID( mode );

    desc5.putEnumerated( id15, id16, id17 );

    // flow

    var id19 = stringIDToTypeID( "flow" );

  desc5.putUnitDouble( id19, id14, flow );

    // pressure for opacity

    desc5.putBoolean( stringIDToTypeID( "usePressureOverridesOpacity" ), penopacity );

    // pressure for size

    desc5.putBoolean( stringIDToTypeID( "usePressureOverridesSize" ), pensize );

    // enable air brush

    desc5.putBoolean( stringIDToTypeID( "repeat" ), penair );

    var id18 = stringIDToTypeID( "null" );

    desc226.putObject( id12, id18, desc5 );

  executeAction( idset, desc226, DialogModes.NO );

  }

function SelectToolPreset(PresetName) {

  var idslct = charIDToTypeID( "slct" );

  var desc14 = new ActionDescriptor();

  var idnull = charIDToTypeID( "null" );

  var ref10 = new ActionReference();

  var idtoolPreset = stringIDToTypeID( "toolPreset" );

  ref10.putName( idtoolPreset, PresetName);

  desc14.putReference( idnull, ref10 );

  executeAction( idslct, desc14, DialogModes.NO );

  }

JJMack
Inspiring
August 29, 2018

This is really useful, but where did you find all those string IDs in the getBrushFeatures() function? 

brush

diameter

hardness

etc

Yes, they make sense, but so does "brushDiameter" instead of "diameter" and it's hard to know what PS is looking for with string IDs.

d1g1talphyre
Inspiring
October 2, 2015

Have you tried using the script listener pluging? ADOBE PHOTOSHOP SCRIPTING. It will record everything you do in photoshop, except changing zoom levels. Turn it on, turn your opacity down, turn it off. Check your desktop for a log file named something like "Scriptlistener.log" and inside there will be the code to do whatever you've just done inside of photoshop.

andreasf
andreasfAuthor
Inspiring
October 2, 2015

I guess after more googling the only way is to select a tool preset. Problem is that I want to share the action with coworkers not having to worry about if they have the same tool-presets as me (or rename/delete them).

 

Would it be possible to modify this script to set a tool preset for brus 150px and opacity 20% ? I can try myself but I am kind of new in scripting so I need som guidance.

 

Script and burn tool

d1g1talphyre
d1g1talphyreCorrect answer
Inspiring
October 2, 2015

from script listener.  The following code will create the preset.  I just tested it in CS6 OSX

// =======================================================

var idMk = charIDToTypeID( "Mk  " );

    var desc4 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref2 = new ActionReference();

        var idBrsh = charIDToTypeID( "Brsh" );

        ref2.putClass( idBrsh );

    desc4.putReference( idnull, ref2 );

    var idUsng = charIDToTypeID( "Usng" );

        var ref3 = new ActionReference();

        var idPrpr = charIDToTypeID( "Prpr" );

        var idCrnT = charIDToTypeID( "CrnT" );

        ref3.putProperty( idPrpr, idCrnT );

        var idcapp = charIDToTypeID( "capp" );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref3.putEnumerated( idcapp, idOrdn, idTrgt );

    desc4.putReference( idUsng, ref3 );

executeAction( idMk, desc4, DialogModes.NO );