Skip to main content
Known Participant
August 31, 2023
Question

fill with auto creat pattern and fill pattern script

  • August 31, 2023
  • 5 replies
  • 4380 views

Hello guys, I need a bit of help to automate my work.

 

I work with patterns (as a pattern designer), but I need to slightly automate my work.

 

There is this great function now "fill with ... pattern" and then you have scripts for those.

This said what I usually do is that I wokr on a couple of patterns, make the design then test test them on a big format blank file.

so

1. I do my drawing, then

2. click "define as a new pattern" and then

3. I open a fresh new fbig big file and

4. use "fill it with... pattern" and

5. select the last one I created...

So I tried to create an action / script so that I could you know, work in batches, having to decide which of the patterns are good on a big format only later.

AND HERE COMES THE BUG!

 

When I Added exactly the same steps in the actions macro - it will work for the first file, but for the second it will still use the same pattern used previously, as the actions macro sees it as "fill it with pattern XXX" (namely, not as "last one used"), so I land up with all of the pictures in big format filled with the same pattern instead of different ones.

 

I was thinking about then modifying the macro so when I g oto step 4

4. use "fill it with... pattern" and

add " use script" among the scripts loading there, that would define something like "use the last pattern defined" - can be as well a code as "use newest pattern defined" or "use newest pattern added to the lot"

 

I understand the logic but I have no clue how to edit the scripts in this area.

 

This will save me hours of work, so all of your help will be more than appreciated.

This topic has been closed for replies.

5 replies

c.pfaffenbichler
Community Expert
Community Expert
September 1, 2023

What the hey … I’ll try once more: 

MJ STAuthor
Known Participant
October 1, 2023

I can't understand what you are saying.please explain me

c.pfaffenbichler
Community Expert
Community Expert
October 1, 2023

I explained about as clearly as seemed feasible. 

c.pfaffenbichler
Community Expert
Community Expert
August 31, 2023

I saw you started another thread on the issue. 

In general double-threads are discouraged, but on that one you provided a somewhat better description of the process right away and refrained from incorrectly calling something a »bug«, so hopefully someone else will try to help you further. 

 

Good luck! 

MJ STAuthor
Known Participant
August 31, 2023

I am a designer. I have to work in patterns. That's why I need such a script that I make the pattern in the last, the same pattern should be fill. The same pattern should not be fill again and again.

Participant
August 31, 2023

hello, maybe this scripts works for you.

You need to save this script in a .jsx and put in your actions after the pattern creation action, this scripts will aways fill with the lastest pattern created:

 

___________________________________

 

#target photoshop;


main();

function main(){

if(!documents.length) return;

var patt = new File(Folder.temp + "/tempPatterns");

if(patt.exists) patt.remove();

savePatterns(patt);

var patterns = getPatternsFromFile(patt);

fillPattern(patterns[patterns.length-1][0].toString(),patterns[patterns.length-1][1].toString(), 100);

};

function savePatterns(file) {

var desc625 = new ActionDescriptor();

desc625.putPath( charIDToTypeID('null'), new File( file ) );

var ref462 = new ActionReference();

ref462.putProperty( charIDToTypeID('Prpr'), charIDToTypeID('Ptrn') );

ref462.putEnumerated( charIDToTypeID('capp'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );

desc625.putReference( charIDToTypeID('T '), ref462 );

executeAction( charIDToTypeID('setd'), desc625, DialogModes.NO );

};

function getPatternsFromFile(file){


file.open("r");

file.encoding = 'BINARY';

var str = file.read();

file.close();

var patterns=[];

var re = /(\x00\w|\x00\d)(\x00\-|\x00\w|\x00\s|\x00\d)+\x00\x00\$[-a-z\d]+/g;

var parts = str.match(re);

for (var i = 0; i < parts.length; i++) {

var p = parts[i];

var sp = p.replace(/\x00/g, '').split('$');

patterns.push([[sp[0]], [sp[1]]]);

}

return patterns;

};

function fillPattern(name, id, opacity) {

var desc6 = new ActionDescriptor();

desc6.putEnumerated( charIDToTypeID('Usng'), charIDToTypeID('FlCn'), charIDToTypeID('Ptrn') );

var desc7 = new ActionDescriptor();

desc7.putString( charIDToTypeID('Nm '), name );

desc7.putString( charIDToTypeID('Idnt'), id);

desc6.putObject( charIDToTypeID('Ptrn'), charIDToTypeID('Ptrn'), desc7 );

desc6.putUnitDouble( charIDToTypeID('Opct'), charIDToTypeID('#Prc'), opacity );

desc6.putEnumerated( charIDToTypeID('Md '), charIDToTypeID('BlnM'), charIDToTypeID('Nrml') );

try{

executeAction( charIDToTypeID('Fl '), desc6, DialogModes.NO );

}catch(e){}

};

MJ STAuthor
Known Participant
September 2, 2023

sir,This error has occurred.

c.pfaffenbichler
Community Expert
Community Expert
August 31, 2023
quote

AND HERE COMES THE BUG!

What bug? 

Please post a screenshot of the fully expanded Action in the Actions Panel. 

 

Why do you use whatever you mean by »"fill with ... pattern"« instead of creating a Pattern Fill Layer? 

Are you using Scripted Patterns? 

Please post screenshots to illustrate what exactly you are doing. 

MJ STAuthor
Known Participant
August 31, 2023

NO, sir. THis is not write way.

 

When I Added exactly the same steps in the actions macro - it will work for the first file, but for the second it will still use the same pattern used previously, as the actions macro sees it as "fill it with pattern XXX" (namely, not as "last one used"), so I land up with all of the pictures in big format filled with the same pattern instead of different ones.

c.pfaffenbichler
Community Expert
Community Expert
August 31, 2023

If you record using Pattern X then the Action uses Pattern X when played again – that would obviously not be a bug. 

 

Please post the requested screenshots and explain what your process is exactly

How are you filling the larger image with the pattern exactly? 

 

Edit: 

 

// create pattern layer with last pattern;
// 2023, use it at your own risk;
if (app.documents.length > 0) {
try {
var ref = new ActionReference();
ref.putProperty(stringIDToTypeID ("property"), stringIDToTypeID("presetManager") ); 
ref.putEnumerated( charIDToTypeID("capp"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var applicationDesc = executeActionGet(ref);
var presetManager = applicationDesc.getList(stringIDToTypeID("presetManager"));
var patternNames = presetManager.getObjectValue(4).getList(stringIDToTypeID("name"));
var theNames = new Array;
for (m = 0; m < patternNames.count; m++) {
    theNames.push(patternNames.getString(m))
};
makePatternLayer (theNames[theNames.length-1], 100);
} catch (e) {};
};
////// make pattern layer //////
function makePatternLayer (thePatternName, theScale) {
// =======================================================
var idMk = charIDToTypeID( "Mk  " );
	var desc3 = new ActionDescriptor();
	var idnull = charIDToTypeID( "null" );
		var ref1 = new ActionReference();
		var idcontentLayer = stringIDToTypeID( "contentLayer" );
		ref1.putClass( idcontentLayer );
	desc3.putReference( idnull, ref1 );
	var idUsng = charIDToTypeID( "Usng" );
		var desc4 = new ActionDescriptor();
		var idType = charIDToTypeID( "Type" );
			var desc5 = new ActionDescriptor();
			var idScl = charIDToTypeID( "Scl " );
			var idPrc = charIDToTypeID( "#Prc" );
			desc5.putUnitDouble( idScl, idPrc, theScale );
			var idPtrn = charIDToTypeID( "Ptrn" );
				var desc6 = new ActionDescriptor();
				var idNm = charIDToTypeID( "Nm  " );
				desc6.putString( idNm, "rust400x400" );
				var idIdnt = charIDToTypeID( "Nm  " );
				desc6.putString( idIdnt, thePatternName );
			var idPtrn = charIDToTypeID( "Ptrn" );
			desc5.putObject( idPtrn, idPtrn, desc6 );
		var idpatternLayer = stringIDToTypeID( "patternLayer" );
		desc4.putObject( idType, idpatternLayer, desc5 );
	var idcontentLayer = stringIDToTypeID( "contentLayer" );
	desc3.putObject( idUsng, idcontentLayer, desc4 );
executeAction( idMk, desc3, DialogModes.NO );
return app.activeDocument.activeLayer
};

 

MJ STAuthor
Known Participant
August 31, 2023

#target photoshop;

main();

function main(){

if(!documents.length) return;

var patt = new File(Folder.temp + "/tempPatterns");

if(patt.exists) patt.remove();

savePatterns(patt);

var patterns = getPatternsFromFile(patt);

fillPattern(patterns[patterns.length-1][0].toString(),patterns[patterns.length-1][1].toString(), 100);

};

function savePatterns(file) {

var desc625 = new ActionDescriptor();

desc625.putPath( charIDToTypeID('null'), new File( file ) );

var ref462 = new ActionReference();

ref462.putProperty( charIDToTypeID('Prpr'), charIDToTypeID('Ptrn') );

ref462.putEnumerated( charIDToTypeID('capp'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );

desc625.putReference( charIDToTypeID('T   '), ref462 );

executeAction( charIDToTypeID('setd'), desc625, DialogModes.NO );

};

function getPatternsFromFile(file){

  file.open("r");

  file.encoding = 'BINARY';

  var str = file.read();

  file.close();

  var patterns=[];

  var re = /(\x00\w|\x00\d)(\x00\-|\x00\w|\x00\s|\x00\d)+\x00\x00\$[-a-z\d]+/g;

  var parts = str.match(re);

  for (var i = 0; i < parts.length; i++) {

    var p = parts;

    var sp = p.replace(/\x00/g, '').split('$');

     patterns.push([[sp[0]], [sp[1]]]);  

      }

return patterns;

};

function fillPattern(name, id, opacity) {

    var desc6 = new ActionDescriptor();

    desc6.putEnumerated( charIDToTypeID('Usng'), charIDToTypeID('FlCn'), charIDToTypeID('Ptrn') );

        var desc7 = new ActionDescriptor();

        desc7.putString( charIDToTypeID('Nm  '), name );

        desc7.putString( charIDToTypeID('Idnt'), id);

    desc6.putObject( charIDToTypeID('Ptrn'), charIDToTypeID('Ptrn'), desc7 );

    desc6.putUnitDouble( charIDToTypeID('Opct'), charIDToTypeID('#Prc'), opacity );

    desc6.putEnumerated( charIDToTypeID('Md  '), charIDToTypeID('BlnM'), charIDToTypeID('Nrml') );

    try{

    executeAction( charIDToTypeID('Fl  '), desc6, DialogModes.NO );

    }catch(e){}

};

MJ STAuthor
Known Participant
August 31, 2023

I found this script but it doesn't work