{"id":81,"date":"2011-02-25T19:08:00","date_gmt":"2011-02-25T19:08:00","guid":{"rendered":"http:\/\/factualfiction.com\/lighthouse\/2011\/02\/25\/exceptional-storyboarding-tutorial-by-louie-del-carmen-and-incremental-save-script-for-photoshop-and-bridge-workflow\/"},"modified":"2013-06-29T14:48:24","modified_gmt":"2013-06-29T18:48:24","slug":"exceptional-storyboarding-tutorial-by-louie-del-carmen-and-incremental-save-script-for-photoshop-and-bridge-workflow","status":"publish","type":"post","link":"https:\/\/factualfiction.com\/lighthouse\/2011\/02\/25\/exceptional-storyboarding-tutorial-by-louie-del-carmen-and-incremental-save-script-for-photoshop-and-bridge-workflow\/","title":{"rendered":"Exceptional Storyboarding Tutorial by Louie del Carmen (and &#8216;Incremental Save&#8217; Script for Photoshop and Bridge Workflow)"},"content":{"rendered":"<div><a href=\"http:\/\/www.cgmwonline.com\/Louie-Del-Carmen.html\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" alt=\"\" src=\"http:\/\/1.bp.blogspot.com\/-PXIjRxYyTX8\/TWfi1REpmOI\/AAAAAAAABYc\/xE_thW8wFGU\/s400\/Screen+shot+2011-02-21+at+6.05.00+PM.png\" width=\"400\" height=\"147\" border=\"0\" \/><\/a><\/div>\n<div style=\"text-align: center;\"><span style=\"font-size: x-small;\">(previz from Louie del Carmen&#8217;s tutorial)<\/span><\/div>\n<div style=\"text-align: center;\"><span style=\"font-size: x-small;\">\u00a0<\/span><\/div>\n<p>Digital artists are generous: community forums for sharing tips in our evolving medium have become small industries. Whether for Flash, Photoshop, or Maya &#8212; or whatever the next program will be &#8212; all of us are ultimately self-taught; each of us has our own techniques and workflows &#8212; those who share, nurture our community and profit from feedback in turn.<\/p>\n<p>Story Artists are generous but with such a complex workflow it can be difficult to ask the right questions.\u00a0Boards included in &#8220;Art of&#8221; books accompanying the release of films often only highlight polished &#8220;Hallmark&#8221; shots; novice storyboards are notoriously overwrought. (For an informative discussion on production vs polished boards watch this <a href=\"http:\/\/ericmachmer.blogspot.com\/2011\/01\/storymation-roger-allers-interviews-ted.html\"><span>video<\/span><\/a>.)<\/p>\n<p>Louie del Carmen&#8217;s comprehensive storyboarding <a href=\"http:\/\/www.cgmwonline.com\/Louie-Del-Carmen.html\">tutorial<\/a> changes the discussion. From script to sequence\u00a0viewers are lead through production quality boarding\u00a0in a straightforward, accessible manner. If you have been scouring the internet for tips this tutorial is a treasure.<\/p>\n<div><a href=\"http:\/\/2.bp.blogspot.com\/-t0ohu4Pr4hw\/TWf1oq6G7RI\/AAAAAAAABYg\/aMb2fFJa_6g\/s1600\/bridge.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" alt=\"\" src=\"http:\/\/2.bp.blogspot.com\/-t0ohu4Pr4hw\/TWf1oq6G7RI\/AAAAAAAABYg\/aMb2fFJa_6g\/s400\/bridge.png\" width=\"400\" height=\"352\" border=\"0\" \/><\/a><\/div>\n<p>Louie&#8217;s tutorial will pay for itself within minutes if you are not yet using Adobe Bridge. $25 is a gift&#8230;wish more Story Artists were as generous as:\u00a0<span style=\"font-size: small;\"><a href=\"http:\/\/www.cgmwonline.com\/Louie-Del-Carmen.html\">http:\/\/www.cgmwonline.com\/Louie-Del-Carmen.html<\/a><\/span><\/p>\n<p>__________<\/p>\n<p>Here&#8217;s a Photoshop script which works well with a Bridge workflow. The cool thing is it makes accidentally over-writing sequential files difficult: as you continue working from a single authoring file activating this script saves filenames in increments of 10. (At the very least it will speed up your workflow by eliminating the need to hand edit filenames.)<\/p>\n<p><span>Paste the code below into a new file in ExtendScript Toolkit<\/span> (part of Photoshop\u2019s installation found here: Applications\/Utilities\/Adobe Utilities\/ExtendScript Toolkit CS4 or \/Applications\/Utilities\/Adobe Utilities-CS5\/ExtendScript Toolkit CS5), save it as a jsx-file into Photoshop\u2019s Presets\/Scripts-folder.<\/p>\n<p>After restarting Photoshop the Script should be available under File &gt; Scripts and can be assigned a Keyboard Shortcut, recorded into an Action, used in a Configurator-Panel, or started from the ExtendScript Toolkit itself.<\/p>\n<p>Default installations of Photoshop leave the Keyboard Shortcut ctrl+command+shit+S unassigned. By assigning this or another shortcut key you can then map a button on your Cintique to activate the script.<\/p>\n<p><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ saves psd copies in rising four digit numbers appended to the authoring file&#8217;s name;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">#target photoshop<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">if (app.documents.length &gt; 0) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ get properties;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">var thedoc = app.activeDocument;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">var docName = thedoc.name;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">var basename = docName.match(\/(.*)\\.[^\\.]+$\/)[1];<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">var docPath = thedoc.path;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ psd options;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">psdOpts = new PhotoshopSaveOptions();<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">psdOpts.embedColorProfile = true;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">psdOpts.alphaChannels = false;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ change this to true if you want all the layers in the copy;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">psdOpts.layers = true; \u00a0 \u00a0\u00a0<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">psdOpts.spotColors = true;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ get neighboring \u00a0psdf iles;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">var theFiles = retrievePSDFiles (Folder (docPath));<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ collect numbers;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">var theNumbers = new Array;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">for (var m = 0; m &lt; theFiles.length; m++) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 if (theFiles[m].name.match(basename+&#8221;_&#8221;+&#8221;[0-9]{1,4}&#8221;+&#8221;.psd&#8221;)) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0var thisNumber = Number(theFiles[m].name.slice(0, theFiles[m].name.length &#8211; 4).match(\/\\d{1,4}$\/));<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0theNumbers.push(thisNumber);<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 };<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ get largest number;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">if (theNumbers.length &gt; 0) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 var number = Number(theLargestNumber(theNumbers));<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 var theNumber = bufferNumberWithZeros(number + 10, 4)<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 }<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">else {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 var theNumber = &#8220;0010&#8221;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 };<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/ save copy;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">thedoc.saveAs((new File(docPath+&#8217;\/&#8217;+basename+&#8221;_&#8221;+theNumber+&#8221;.psd&#8221;)),psdOpts,true);<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">};<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/\/\/\/\/ buffer number with zeros \/\/\/\/\/\/<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">function bufferNumberWithZeros (number, places) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 var theNumberString = String(number);<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 for (var o = 0; o &lt; (places &#8211; String(number).length); o++) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0theNumberString = String(&#8220;0&#8221; + theNumberString)<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0};<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 return theNumberString<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 };<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/\/\/\/\/ get from subfolders \/\/\/\/\/\/<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">function retrievePSDFiles (theFolder, theFiles) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 if (!theFiles) {var theFiles = []};<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 var theContent = theFolder.getFiles();<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 for (var n = 0; n &lt; theContent.length; n++) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0var theObject = theContent[n];<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0if (theObject.constructor.name == &#8220;Folder&#8221;) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 theFiles = retrievePSDFiles(theObject, theFiles)<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 };<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0if (theObject.name.slice(-4) == &#8220;.psd&#8221;) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 theFiles = theFiles.concat(theObject)<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0};<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 return theFiles<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 };<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\/\/\/\/\/\/ function to get the biggest number;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">function theLargestNumber (numbersArray) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 var x = new Array;<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 x = x.concat(numbersArray);<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 while (x.length &gt; 1) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0if (x[0] &gt;= x[x.length-1]) {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var a = x.pop()<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0else {<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var a = x.shift()<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 return x<\/span><br \/><span style=\"font-family: 'courier new', courier; color: #808080;\">\u00a0\u00a0 \u00a0 };<\/span><\/p>\n<div style=\"text-align: center;\"><span style=\"font-family: 'courier new', courier; color: #808080;\">Feedback welcome: <a href=\"mailto:EricMachmer@FactualFiction.com\"><span style=\"color: #808080;\">EricMachmer@FactualFiction.com<\/span><\/a> Twitter: @<a href=\"http:\/\/twitter.com\/#!\/oceanbluesky\"><span style=\"color: #808080;\">oceanbluesky<\/span><\/a><\/span><\/div>\n","protected":false},"excerpt":{"rendered":"<p>(previz from Louie del Carmen&#8217;s tutorial) \u00a0 Digital artists are generous: community forums for sharing tips in our evolving medium have become small industries. Whether for Flash, Photoshop, or Maya &#8212; or whatever the next program will be &#8212; all of us are ultimately self-taught; each of us has our own techniques and workflows &#8212; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,25,19,11,36],"tags":[],"class_list":["post-81","post","type-post","status-publish","format-standard","hentry","category-animation","category-storyboards","category-storytelling","category-studio","category-tech-tip"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/posts\/81"}],"collection":[{"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/comments?post=81"}],"version-history":[{"count":4,"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/posts\/81\/revisions"}],"predecessor-version":[{"id":835,"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/posts\/81\/revisions\/835"}],"wp:attachment":[{"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/media?parent=81"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/categories?post=81"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/factualfiction.com\/lighthouse\/wp-json\/wp\/v2\/tags?post=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}