InDesign CS5 Script: Why does `# targetengine` work incorrectly?

I understand that the declaration #targetengine "myEngineName" will be used for InDesign to remember global variables (information is found here: http://incom.org/post/89818 ).


However, this was not enough for him to remember global variables, as he still raises an error regarding the imgs global variable:

Error Number: 30476

Error line: "if (imgs [i] .itemLink! = Null)" could not be completed because the object no longer exists.

... or something like that. I don't like this particular line in my code and seem to forget how the imgs global variable was created.


So I applied the try-catch statement and restored the imgs variable and reduced the iterator in catch ... Although this did solve the problem, why didnโ€™t #targetengine "myEngineName" solve the problem as intended?

Here is my code:
 #target "InDesign" // this solves the "Error Number: 29446" problem #targetengine "session" // this solves the "Error Number: 30476" problem var imgs; // global variable for the #targetengine "session" to keep track of var document = app.activeDocument; var newFolder = createFolder(document); // if subdirectory images DNE, create this folder with the function below saveAllImages(document, newFolder); // with the function below alert("The file conversion is complete!\n\nAll black & white images have been copied to:\n" + newFolder + "\.\n\nAll color images have been replaced with the new black & white images in the current InDesign document."); //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function createFolder(doc) { try { /* * type-casting the filePath property (of type object) into a String type; * must be a String type to concatenate with the subdirectory variable (also of type String) */ var docPath = String(doc.filePath); var subdirectory = "/BLACK AND WHITE IMAGES"; } catch(e) { alert(e.message + "\n - reload the script, and it should work."); exit(); } var imagesFolder = docPath + subdirectory; // concatenating the two variables if(!Folder(imagesFolder).exists) { Folder(imagesFolder).create(); } return imagesFolder; // for instantiation outside of this function } // end of function createFolder //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function saveAllImages(doc, folder) { imgs = document.allGraphics; // this is a global variable, for the #targetengine "session" to keep track of var fileName = ""; var img = ""; var imgType = ""; for(var i = 0; i < imgs.length; i++) { try { if(imgs[i].itemLink != null) { fileName = imgs[i].itemLink.name; img = new File(folder + "/" + fileName); // each image instantiated here imgType = imgs[i].imageTypeName; // image type is determined here (.tif, .jpg, .png, etc..) //alert("The file \"" + fileName + "\"\n\tis a " + imgType + " file."); // Note: escape characters /* * array for image options, instantiated from the function below; * options[0] is the "MAXIMUM" image quality property, & * options[1] is the "GRAY" image conversion property; */ var options = convertToBlackAndWhite(imgType); // each image exported to the new folder here, by file type switch(imgType) { case "GIF": alert("This script cannot convert and export the GIF file:\n\t" + fileName + " !"); // Note: escape characters break; case "Adobe PDF": break; case "EPS": break; case "Windows Bitmap": break; case "JPEG": break; case "PNG": break; case "TIFF": options[0]; // maximum image quality options[1]; // black & white conversion imgs[i].exportFile(ExportFormat.JPG, img, false); replaceWithNewImage(doc, fileName, img); // with the function below break; default: alert("\tUnlisted image type: " + imgType + "!\nAdd this type to the switch statement."); break; } // end of switch statement } // end of if statement } // end of try statement catch(e) { /* * in case the #targetengine is overloaded, this solves the "Error Number: 30476" problem: * - "The requested action could not be completed because the object no longer exists." * (the second statement #targetengine "session" is also in place to solve this error) */ imgs = document.allGraphics; // global variable reinstantiated in case of error i--; // retry the same iteration again, in case of error (the variable " i " is the iterator in the for loop) } } // end of for loop } // end of function saveAllImages //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function convertToBlackAndWhite(fileType) { // array for image-quality and color-conversion values var settings = []; // each image exported to the new folder here, by file type switch(fileType) { case "Windows Bitmap": break; case "JPEG": break; case "PNG": break; case "TIFF": settings[0] = "app.jpegExportPreferences.jpegQuality = JPEGOptionsQuality.MAXIMUM"; // maximum image quality settings[1] = "app.jpegExportPreferences.jpegColorSpace = JpegColorSpaceEnum.GRAY"; // black & white conversion break; default: break; } // end of switch statement return settings; // for instantiation outside of this function } // end of function convertToBlackAndWhite //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function replaceWithNewImage(doc, imageName, newImage) { var links = doc.links; var link = ""; for(var i = 0; i < links.length; i++) { link = links[i]; if ( (link.status == LinkStatus.NORMAL) && (link.name == imageName) ) { try { link.relink(newImage); link.update(); } catch(e) { } } // end of if statement } // end of for loop } // end of function replaceWithNewImage 


This is the only information I could find regarding this error: http://forums.adobe.com/thread/748419

EDIT -

I am sure the problem has something to do with the replaceWithNewImage function, because this error did not occur without this function, and then there was no need for a try-catch statement ...

0
source share
2 answers

Reading your code, I see something that can be really problematic. You set the link to the document to the active document. But this link remains throughout the session. Fact - if you switch to another document or close the document, then the link will be lost. This may explain why imgs may be undefined at some point, although I think this should lead to an error. Wrap the variables in the function area, and I guarantee that everything will be fine;)

+4
source

First of all, just avoid global variables as much as possible, and especially when using session mechanisms.

If the purpose of your script is a simple link to export / change links / replace links, why do you want constant variables?

In my humble opinion, I will get rid of the engine and just make a regular funcction call

 //myscript.jsx mySuperFunction(); function mySuperFunction() { var doc; if ( app.documents.length == 0 ){ return; } doc = app.activeDocument; //Do all your stuff } 

That should be all you need;)

Loic

0
source

All Articles