diff --git a/wc_helper.jsx b/wc_helper.jsx new file mode 100644 index 0000000..456ffa5 --- /dev/null +++ b/wc_helper.jsx @@ -0,0 +1,1251 @@ +/* + Wild Card Helper Panel v.0.1 + + by Jorge Vásquez Pérez + yorchWyorchnet.com + https://yorchnet.com/ + https://github.com/jorgevasquezp + + Changes 0.3: - Added a Letterbox tool. + + TODO: + - Get artist initials in Windows too. +*/ + +// Define the Panel +(function wcHelperPanel (thisObj) { + /* Build UI */ + function buildUI(thisObj) { + + var windowTitle = "WC Artist Helper"; + + var btnTxtIncrement = "+1"; + var btnTxtOwn = "own"; + var btnTxtRender = "render"; + var btnTxtRenamer = "rename"; + var btnTxtResizer = "resize comp"; + var btnTxtCenterRef = "cntr ref"; + var btnTxtLetterbox = "+letterbox"; + var ddlTxtAspects =[ "16:9" , "1:1" , "4:5" , "9:16" , "-" , "1.85:1" , "1.9:1" , "2:1" , "2.2:1" , "21:9" , "2.35:1" , "2.39:1" , "2.4:1" ] + var ddlTxtShapes =[ "UHD" , "HD", "1x1" , "4x5" , "9x16" , "-" , "CUSTOM" ] + var ddlTxtCenterRef =[ "V+H" , "V" , "H", ] + var btnTxtAlignAnchorPoint = "align ap" + var btnTxtAlignToLayer = "align 2 lyr" + var btnTxtFlatten = "flatten" + var ddlTxtMode = ["Offline","Finishing"] + + var win = (thisObj instanceof Panel)? thisObj : new Window('palette', windowTitle); + + var myProjectGroup = win.add ("group"); + win.projectPathLabel = myProjectGroup.add("statictext"); + var myArtistGroup = win.add ("group"); + var artistNameLabel= myArtistGroup.add("statictext"); + win.artistName= myArtistGroup.add("statictext"); + var artistRoleLabel= myArtistGroup.add("statictext"); + win.artistRole= myArtistGroup.add( "dropdownlist" , undefined , ddlTxtMode ) + win.artistRole.selection = 0; + win.projectPathLabel.text = "000000000000000000000000000000000000000000000000000"; + artistNameLabel.text = "Artist:"; + artistRoleLabel.text = "Role:"; + win.artistName.text = system.callSystem("whoami"); + var myButtonGroup = win.add ("group"); + myButtonGroup.orientation = "row"; + win.checkbox1 = myButtonGroup.add( "checkbox", undefined, "Dupli:") + win.checkbox1.value = true; + + //Increment + win.button1 = myButtonGroup.add ("button", undefined, btnTxtIncrement); + win.button1.preferredSize = [45,28] + + //Owner + win.button2 = myButtonGroup.add ("button", undefined, btnTxtOwn); + win.button2.preferredSize = [45,28] + + var myButtonGroup2 = win.add ("group"); + myButtonGroup2.alignment = "center"; + myButtonGroup2.alignChildren = "center"; + + //Render + win.button3 = myButtonGroup2.add ("button", undefined, btnTxtRender); + win.button3.preferredSize = [45,28] + + //Rename + win.button4 = myButtonGroup2.add ("button", undefined, btnTxtRenamer); + win.button4a = myButtonGroup2.add ("button", undefined, btnTxtFlatten); + win.button4.preferredSize = [55,28] + win.button4a.preferredSize = [45,28] + + //Resizer + var myButtonGroup3 = win.add ("group"); + var mySizeGroup = myButtonGroup3.add ("group"); + win.resizeWidth = mySizeGroup.add ("edittext", undefined, 1920); + win.resizeWidth.enabled = false; + mySizeGroup.add ("statictext", undefined, "x"); + win.resizeHeight = mySizeGroup.add ("edittext", undefined, 1080); + win.resizeHeight.enabled = false; + //mySizeGroup.hide(); + var myButtonGroup4 = win.add ("group"); + win.ddlShapes= myButtonGroup4.add( "dropdownlist" , undefined , ddlTxtShapes ) + win.ddlShapes.selection = 1; + win.button5 = myButtonGroup4.add ("button", undefined, btnTxtResizer); + + //Letterbox + var myButtonGroup4 = win.add ("group"); + win.ddlAspects= myButtonGroup4.add( "dropdownlist" , undefined , ddlTxtAspects ) + win.ddlAspects.selection = 2 + + win.button6 = myButtonGroup4.add ("button", undefined, btnTxtLetterbox); + + //Center Reference + var myButtonGroup4a = win.add ("group"); + win.ddlCenterRef= myButtonGroup4a.add( "dropdownlist" , undefined , ddlTxtCenterRef ) + win.ddlCenterRef.selection = 0 + + win.btnCenterRef = myButtonGroup4a.add ("button", undefined, btnTxtCenterRef); + + //Anchor Alignment tools + var myButtonGroup5 = win.add ("group"); + win.btnAlgnAP = myButtonGroup5.add ("button", undefined, btnTxtAlignAnchorPoint); + win.btnAlgn2Lyr = myButtonGroup5.add ("button", undefined, btnTxtAlignToLayer); + + //Render Markers + var myButtonGroup7 = win.add ("group"); + win.btnRenderMarkers = myButtonGroup7.add ("button", undefined, "render marker"); + + win.spacing = 0; + win.margins = 1; + myButtonGroup.spacing = 4; + myButtonGroup.margins = 4; + + win.button1.onClick = function(){ + btnPlus1(); + //versionUpSelectedComps(1); + } + win.button2.onClick = function(){ + btnOwn(); + } + win.button3.onClick = function(){ + btnRender(); + } + win.button4.onClick = function(){ + btnHerd(); + } + win.button4a.onClick = function(){ + yFlattenSelectedFolderContents(); + } + win.button5.onClick = function(){ + var newSize = [ parseInt(w.resizeWidth.text) , parseInt(w.resizeHeight.text) ] ; + resizeCompsCanvasCentered( newSize , true ) + } + win.button6.onClick = function(){ + var aspect = String(win.ddlAspects.selection) + btnAddLetterbox( aspect ); + } + win.onResizing = function(){ + updateProjectPath(); + } + win.ddlShapes.onChange = function(){ + var sel = String(this.selection); + var cust_sel = (sel == "CUSTOM") + win.resizeHeight.enabled = cust_sel; + win.resizeWidth.enabled = cust_sel; + + var newSize = [ win.resizeHeight.text,win.resizeWidth.text] + if ( sel == "UHD" ){ + newSize = [3840,2160]; + } else if ( sel == "HD" ){ + newSize = [1920,1080]; + } else if ( sel == "1x1" ){ + newSize = [1080,1080]; + } else if ( sel == "4x5" ){ + newSize = [1080,1350]; + } else if ( sel == "9x16" ){ + newSize = [1080,1920]; + } + /* + if ( sel == "CUSTOM" ){ + mySizeGroup.show(); + win.layout.resize(); + } else { + + mySizeGroup.hide(); + mySizeGroup.layout.resize(); + } + */ + $.writeln($.includePath); + + } + win.btnAlgnAP.onClick = function(){ + AlgnAP(); + } + win.btnAlgn2Lyr.onClick = function(){ + Algn2Lyr(); + } + win.btnRenderMarkers.onClick = function(){ + //alert( app.project.renderQueue.items[1].outputModule(1).getSetting("Output File Info") ); + renderMarkers(this.name); + } + win.btnCenterRef.onClick = function(){ + var option = String(win.ddlCenterRef.selection) + btnAddCenterRef( option ) + } + win.layout.layout(true); + + return win +} + + +// Show the Panel +var w = buildUI(thisObj); +if (w.toString() == "[object Panel]") { + w; +} else { + w.show(); +} + +/* General functions */ +w.pad = function ( n, i ){ //pad n with zeroes up to i places. + if (String(n).length>=i){ + return String(n) + }else{ + var dif = i- (String(n)).length; + var padding = ""; + for (p=0;p= 1 ; i -- ){ + item = p.item(i); + if ( item.typeName == "Folder" ){ + if ( item.numItems <= 0 ){ + item.remove(); + } + } + } + + //app.endUndoGroup() +} +function flatten( items, root ){ + app.beginUndoGroup("Flatten Selected Folder Contents") + for ( var i = 0; i < items.length ; i ++){ + item = items[i]; + item.parentFolder = root; + } + app.endUndoGroup() + purgeEmptyFolders(); + return +} +function yFlattenSelectedFolderContents(){ + flatten( getAllItems( getSelectedProjectItems()[0] ) , getSelectedProjectItems()[0] ); +} + +/* Project Specific functions */ +function getSelectedProjectItems(){ + var items = []; + var p = app.project; + for ( var i = 1 ; i <= p.numItems ; i ++ ){ + var item = p.item(i); + if ( item.selected ){ + items.push(item); + } + } + return items; +} +function getCompLayersByParented( aComp, isParented ){ + + /* TODO + not use activeItem. but have the function take a comp as an argument, to avoid activItem becoming obsolete. + */ + var active_comp = aComp; + var filtered_layers = []; + + for ( var i = 1; i <= active_comp.layers.length ; i ++ ) + { + var my_layer = active_comp.layers[i]; + + if ( (my_layer.parent == null) != isParented ) + { + filtered_layers.push( my_layer ); + }; + } + + return filtered_layers +} +function resizeCompCanvas( comp, new_size ){ + comp.width = new_size[0]; + comp.height = new_size[1]; +}; +function resizeCompCanvasCentered( my_comp, new_size, keep_scaler ){ + /* TO DO AVOID SUCCESEIVE RESCALES TO ADD MORE AND MORE NULLS */ + + var n = my_comp.layers.addNull(); + + //center null on actual comp size + n.position.setValue([my_comp.width/2,my_comp.height/2]); + + resizeCompCanvas( my_comp , new_size ); + + + var unparenterLayers = getCompLayersByParented( my_comp , false ); + + //parent unparented layers to MAIN_SCALER + + for ( var i = 0; i < unparenterLayers.length ; i ++ ){ + var current_layer = unparenterLayers[i]; + + if ( (current_layer != n) && ( true )) { + current_layer.locked = false; + current_layer.parent = n; + current_layer.locked = true; + } + } + + // center null to new comp size + n.position.setValue(new_size/2); + + //get rid of scaling null or not. + if (keep_scaler) + { + n.name = 'MAIN_SCALER'; + }else{ + n.remove() + } + +} +function resizeCompsCanvasCentered( new_size, keep_scaler ){ + app.beginUndoGroup("Resize Comps' Canvas Centered") + var myComps = getSelectedProjectItems(); + for ( var i = 0 ; i < myComps.length ; i ++){ + var myComp = myComps[i]; + resizeCompCanvasCentered( myComp, new_size, keep_scaler ); + } + app.endUndoGroup(); +} +function setFPS( comp, newFPS ){ + comp.frameDuration = 1/newFPS; +}; +function getOfflineRevCode( myComp ){ + + //var regex = /[0-9]{2}[a-z]{2}/g; //Maixmum rev number 99 + var regex = /[0-9]{2}[a-z]{2}/g; //Maixmum rev number 99 + var offlineRevCode = myComp.name.match(regex)[0]; + return offlineRevCode; +} +function getFinishingRevCode( myComp ){ + + var regex = /[0-9]{2}[a-z]{2}[FINCHK]{3}/g; //Maixmum rev number 99 + var offlineRevCode = myComp.name.match(regex)[0]; + return offlineRevCode; +} +function getItemPath( projectItem ){ + //not too useful right now as AE's paths aren't unique./ + var walkPath ="" + currentItem = projectItem; + + while ( currentItem.parentFolder.name != "Root"){ + walkPath = currentItem.name +"/"+ walkPath; + currentItem = currentItem.parentFolder; + } + walkPath = currentItem.name +"/"+ walkPath; + walkPath = "/"+ walkPath; + + return walkPath +} +function getArtistInitials(){ + + //mac only for now ? + var userName = w.artistName.text; + + //coder's exceptionalism + if ( userName = "jperez" ){ + userName = "jvasquez"; + } + + artistInitials = userName.substring(0,2); + + return artistInitials; +} +function versionUpSelectedComps( inc ){ + //really selected items, might be worth to restrict to just comps ? + var selectedComps = getSelectedProjectItems(); + for ( var i = 0 ; i < selectedComps.length ; i ++ ) + { + versionUpComp( selectedComps[i], inc ); + } + + +} +function versionUpComp( myComp, inc ){ + role = w.artistRole; + + if ( role.selection.index == 0 ){ + //offline + var revCode = getOfflineRevCode( myComp ); + }else if ( role.selection.index == 1 ){ + //finishing + var revCode = getFinishingRevCode( myComp ); + } + + splitName = myComp.name.split( revCode ); + + var ver = parseInt(revCode.substring(0,3)); + //alert(ver); + //var oldArtistInitials = offlineRevCode.substring(2,5); + + var newArtistInitials = getArtistInitials(); + role = w.artistRole; + + if ( role.selection.index == 1 ){ + newArtistInitials = newArtistInitials+"FIN" + } + myComp.name = splitName[0]+w.pad(ver+inc,2)+newArtistInitials+splitName[1] ; +} +function getOutputBasePath(){ + + var f = app.project.file; + var f_path = String( f ); + + var output_base = "6_Output"; + var offline_output_extra = "1_Offline"; + var finishing_output_extra = "2_Finishing"; + var ae_string = "0_After_Effects"; + var offline_string = "1_Offline"; + var finishing_string = "2_Finish"; + + var search_offline = f_path.search(offline_string); + var search_finishing = f_path.search(finishing_string); + var search_ae = f_path.search(ae_string); + + var base_path = f_path.substr(0,search_ae)+output_base; + + if( f_path == "null"){ + base_path="~/Desktop"; + } + + if ( search_offline != -1 ){ + //offline + base_path = base_path+"/"+offline_output_extra; + } + if ( search_finishing != -1 ){ + //finishing + base_path = base_path+"/"+finishing_output_extra; + } + + // alert(base_path + "/" + getTodayString()); + return base_path + "/" + getTodayString(); +} +function setRenderToProjectPath( rqItem , extra_path ){ + + var uiPath = updateProjectPath(); + //alert(uiPath); + //updateProjectPath(); + //alert(rqItem); + // alert( rqItem ); + if ( (rqItem.status == 3015) || (rqItem.status == 3013) ){ + for ( var j = 1 ; j <= rqItem.numOutputModules ; j ++ ){ + o_module = rqItem.outputModule(j); + var old_name = rqItem.comp.name.replace(".","_"); + //alert(old_name); + if ( o_module.file != null ){ + if ( extra_path != undefined ) + { + var new_path = uiPath + "/" +extra_path; + } + else + { + var new_path = uiPath; + } + + var new_folder = Folder( new_path ); + if ( !new_folder.exists ){ + new_folder.create(); + } + //alert(new_path + "/" + old_name) + var new_file = new File( new_path + "/" + old_name ); + o_module.file = new_file ; + //alert ( new_path ); + //o_module.file= new_file; + + } + var p = String( o_module.file.path ).split("/"); + p.splice(0,3); + var s = ""; + for ( var i = 0 ; i < p.length ; i ++ ){ + s += "\n"+p[i]; + } + //alert( "Rendering to :" + "\n" + s + "\n\n" + o_module.file.name ); + } + } +} +function setRendersToProjectPath(){ + updateProjectPath() + var q = app.project.renderQueue; + //check the render queue item is not already rendered. + for ( var i = 1 ; i <= q.numItems ; i ++ ){ + item = q.item(i); + //3015 is QUEUED + //3013 is NEEDS_OUTPUT + + if ( (item.status == 3015) || (item.status == 3013) ){ + setRenderToProjectPath( item ); + } + } +} +function renderSelectedToProjectPath(){; + updateProjectPath() + var q = app.project.renderQueue; + var items = getSelectedProjectItems(); + // alert( items ); + + for ( var i = 0 ; i < items.length; i ++){ + + if( items[i].typeName == "Composition" ){ + var item = items[i]; + rqItem = q.items.add(item); + setRenderToProjectPath(rqItem); + } + //alert(items); + if( items[i].typeName == "Folder" ){ + var folder = items[i]; + for ( var j = 1 ; j <= folder.numItems ; j ++ ) + { + var item = folder.items[j]; + rqItem = q.items.add(item); + setRenderToProjectPath(rqItem, item.parentFolder.name ); + } + } + } +} +function versiounUpTodaySelectedComps( inc ){ + var myComps = getSelectedProjectItems(); + for ( var i = 0 ; i < myComps.length ; i ++ ){ + var myComp = myComps[i]; + versiounUpTodaySelectedComp( myComp,inc ); + } +} +function itemIndexInCollection( itemCollection , itemName ){ + var indexInCollection = -1; + for ( var i = 1; i <= itemCollection.length ; i ++){ + if ( itemCollection[i].name == itemName ){ + indexInCollection = i; + } + } + return indexInCollection; +} +function versiounUpTodaySelectedComp( myComp, inc ){ + //var my_item = getSelectedProjectItems()[0]; + + var t = getItemTrunk(myComp); + + var date_re = "[0-9\_]{8}" + + var next_n // for folder creation + var new_folder; + var date_pos + //create new folder under date folder's parent. + for ( var i = 0 ; i < t.length ; i ++ ) + { + var date_search = t[i].name.search(date_re); + + if ( date_search == 0 ) + { + var date_pos = i; + var date_string = getTodayString(); + //Check if a dated folder already exists. + new_folder = getItemByName( date_string ); + if ( new_folder == null ){ + new_folder = t[i].parentFolder.items.addFolder( date_string ) + } + }; + } + //alert(date_search); + //create same branch structure as trunk under new date folder. + var next_folder = new_folder; + for ( var i = date_pos-1 ; i >= 0 ; i -- ) + { + var next_folder_name = t[i].name; + //todo make sure that the folder doesnt exist yet. + var next_folder_index = itemIndexInCollection( next_folder.items , next_folder_name ); + //alert(next_folder_index); + if ( next_folder_index == -1 ){ + next_folder = next_folder.items.addFolder(next_folder_name); + }else{ + next_folder = next_folder.items[next_folder_index]; + } + + + } + new_comp = myComp.duplicate(); + new_comp.name = myComp.name; + versionUpComp( new_comp, inc ); + new_comp.parentFolder = next_folder; + //myComp.selected = false; + //app.project.activeItem = new_comp; + myComp.selected = false; + new_comp.selected = true; +} +function addLetterbox( aspect ){ + var LetterboxLayer = app.project.activeItem.layers.addShape() + var aspectControl = LetterboxLayer.property("Effects").addProperty("ADBE Slider Control") + aspectControl.name = "Aspect Ratio" + var aspectDimensions = aspect.split(":") + aspectControl.property("Slider").setValue( aspectDimensions[0] / aspectDimensions[1] ) + var colorControl = LetterboxLayer.property("Effects").addProperty("ADBE Color Control") + colorControl.name = "Color" + colorControl.property("Color").setValue([0,0,0,1]) + LetterboxLayer.name = String(aspect) + " Letterbox" + var compFrame = LetterboxLayer.property("Contents").addProperty("ADBE Vector Shape - Rect") + compFrame.name = "CompFrame" + compFrame.property("Size").expression = "[ thisComp.width , thisComp.height ]" + var letterboxRect = LetterboxLayer.property("Contents").addProperty("ADBE Vector Shape - Rect") + letterboxRect.name = "Letterbox" + letterboxRect.property("Size").expression = 'w = thisComp.width;\ + h = thisComp.height;\ + compAspect = w / h ;\ + aspect = effect("Aspect Ratio")("Slider");\ + if (compAspect <= aspect ) {\ + [ w, w / aspect ]\ + }else{\ + [ h*aspect , h ]\ + }' + var letterboxMerge = LetterboxLayer.property("Contents").addProperty("ADBE Vector Filter - Merge") + letterboxMerge.mode.setValue(3) + var letterboxFill = LetterboxLayer.property("Contents").addProperty("ADBE Vector Graphic - Fill") + letterboxFill.property("Color").expression = 'effect("Color")("Color")' +} +function Algn2Lyr(){ + var exp = '/* 0 center | 1 right | 2 left | 3 top | 4 bottom | 5 top right | 6 top left | 7 bottom right | 8 bottom left */\ + function getAbsScale( myLayer ){\ + s = [1,1];\ + while( myLayer.hasParent == true ){\ + s = [s[0] * (myLayer.transform.scale[0]/100),s[1] * (myLayer.transform.scale[1]/100)];\ + \ + myLayer = myLayer.parent;\ + }\ + if( myLayer .hasParent == false ){\ + s = [s[0] * (myLayer.transform.scale[0]/100),s[1] * (myLayer.transform.scale[1]/100)];\ + }\ + return s*100\ + }\ + function centerTextLayerAnchor( n ){\ + myAnchorLayer = effect("Anchor To Layer")("Layer");\ + r = myAnchorLayer.sourceRectAtTime();\ + t = r.top; \ + h = r.height; \ + myAnchorLayerAncP = myAnchorLayer.transform.anchorPoint;\ + myAnchorLayerPos = myAnchorLayer.toComp(myAnchorLayerAncP);\ + myAnchorScale = getAbsScale( myAnchorLayer )[0]/100;\ + \ + x = myAnchorLayerPos[0];\ + y = myAnchorLayerPos[1];\ + \ + myMargins = effect("Anchor To Margins")("Point");\ + \ + switch (n){\ + case 0 :\ + offset = [0,0];\ + break;\ + case 1 :\ + offset = [ r.width/2 , 0 , 0];\ + break;\ + case 2 :\ + offset = [ -r.width/2 , 0 , 0];\ + break;\ + case 3 :\ + offset = [0 , -r.height/2 , 0];\ + break;\ + case 4 :\ + offset = [0 , r.height/2 , 0];\ + break;\ + case 5 :\ + offset = [ r.width/2 , -r.height/2 , 0];\ + break;\ + case 6 :\ + offset = [ -r.width/2 , -r.height/2 , 0];\ + break;\ + case 7 :\ + offset = [ r.width/2 , r.height/2 , 0];\ + break;\ + case 8 :\ + offset = [ -r.width/2 , r.height/2 , 0];\ + break;\ + }\ + newAnchor = [ x , y ] + (myAnchorScale*offset) +myMargins ;\ + \ + return newAnchor\ + }\ + \ + anchor_index = effect("Anchor To")("Menu") - 1;\ + centerTextLayerAnchor(anchor_index);' + + var layers = app.project.activeItem.selectedLayers ; + for ( var i = 0; i < layers.length ; i++ ){ + var fx = layers[i].property("Effects"); + var j = fx.addProperty("ADBE Layer Control").propertyIndex; + fx.property(j).name = "Anchor To Layer"; + var j = fx.addProperty("ADBE Dropdown Control").propertyIndex; //Fucking don't call properties by name, it gets messy, use propertyIndex whenever possible. + fx.property(j).property("Menu").setPropertyParameters( ["center","right","left","top","bottom","top_right","top_left","bottom_right","bottom_left"] ); + fx.property(j).name = "Anchor To"; + j = layers[i].property("Effects").addProperty("ADBE Point Control").propertyIndex; + fx.property(j).property("Point").setValue([0,0]); + fx.property(j).name = "Anchor To Margins"; + layers[i].property("Position").expression = exp; + } +} +function AlgnAP(){ + var exp = '/* 0 center | 1 right | 2 left | 3 top | 4 bottom | 5 top right | 6 top left | 7 bottom right | 8 bottom left */\ +function centerTextLayerAnchor( n ){\ + alignToStill = effect("Align to Still")("Checkbox") == true;\ + if (alignToStill){\ + still_time = thisComp.marker.key("Still").time;\ + r = thisLayer.sourceRectAtTime(still_time);\ + }else{\ + r = thisLayer.sourceRectAtTime();\ + }\ + t = r.top; \ + h = r.height\ + x = r.left + (r.width/2);\ + y = (t-( t-h)+(t*2))/2;\ + switch (n){\ + case 0 :\ + offset = [0,0]; \ + break;\ + case 1 :\ + offset = [ r.width/2 , 0 , 0];\ + break;\ + case 2 :\ + offset = [ -r.width/2 , 0 , 0];\ + break;\ + case 3 :\ + offset = [0 , -r.height/2 , 0];\ + break;\ + case 4 :\ + offset = [0 , r.height/2 , 0];\ + break;\ + case 5 :\ + offset = [ r.width/2 , -r.height/2 , 0];\ + break;\ + case 6 :\ + offset = [ -r.width/2 , -r.height/2 , 0];\ + break;\ + case 7 :\ + offset = [ r.width/2 , r.height/2 , 0];\ + break;\ + case 8 :\ + offset = [ -r.width/2 , r.height/2 , 0];\ + break;\ + }\ + newAnchor = [ x , y ] + offset;\ + return newAnchor\ +}\ +anchor_index = effect("Anchor Point Alignment")("Menu") - 1;\ +centerTextLayerAnchor(anchor_index);' + + var layers = app.project.activeItem.selectedLayers ; + for ( var i = 0; i < layers.length ; i++ ){ + var fx = layers[i].property("Effects"); + var j = fx.addProperty("ADBE Dropdown Control").propertyIndex; //Fucking don't call properties by name, it gets messy, use propertyIndex whenever possible. + fx.property(j).property("Menu").setPropertyParameters( ["center","right","left","top","bottom","top_right","top_left","bottom_right","bottom_left"] ); + fx.property(j).name = "Anchor Point Alignment"; + j = layers[i].property("Effects").addProperty("ADBE Checkbox Control").propertyIndex; + fx.property(j).name = "Align to Still"; + layers[i].property("Anchor Point").expression = exp; + } +} +function renderMarkers( ){ + var rq = app.project.renderQueue; + + var comp = app.project.activeItem; + var p = comp.markerProperty; + + /* + alert( p.name ); + alert( p.isEffect ); + alert( p.matchName ); + alert( p.numKeys ); + alert( p.propertyDepth ); + alert( p.propertyGroup ); + alert( p.propertyType ); + alert( p.value ); + alert(p[0].name) + */ + + var nKeys = p.numKeys; //Number of markers in the comp. + + for ( var i = 1 ; i <= nKeys ; i ++ ) + { + + var mrkr = p.valueAtTime(p.keyTime(i),true); // each markers + var mrkr_time = p.keyTime(i); // time is not saved in the marker object itself so, to keep track of it save it here. + + //add each marker to the queue and set it's path. + var rqi = rq.items.add(comp); + rqi.timeSpanStart= mrkr_time; + rqi.timeSpanDuration = comp.frameDuration; + var output_module = rqi.outputModule(1); + output_module.applyTemplate("05 - JPEG"); + var comp_old_name = comp.name; + + //Change the name template to the one STILLS or NOT_SEQUENCES have. + var seq_temp = 'Template":"[compName]_[#####].[fileextension]'; + var new_temp = 'Template":"[compName]_'+ mrkr.comment+'.[fileextension]'; + + /*var s1 = output_module.getSettings(); + for (i in s1){ + alert(i); + } + */ + + //alert( output_module.getSetting("Format") ); + //alert( output_module.getSetting("Use Comp Frame Number") ); + + var set = output_module.getSetting("Output File Info"); // <--- This is the Settings Object where the file template lives. + output_module.setSetting("Output File Info", set.replace( seq_temp , new_temp ) ); + + //set = output_module.getSetting("Output File Info"); + } +} +function AddCenterRef ( option ){ + activeComp = app.project.activeItem + var CenterRefLayer = activeComp.layers.addShape() + CenterRefLayer.guideLayer = true; + CenterRefLayer.name = String( option ) + " Center Ref" + + var heightControl = CenterRefLayer.property("Effects").addProperty("ADBE Slider Control") + heightControl.name = "Height" + var heightRef = CenterRefLayer.property("Contents").addProperty("ADBE Vector Shape - Rect") + //heightRef.property("Slider").setValue(activeComp.height/3); + heightRef.name = "Height Ref" + heightRef.property("Size").expression = 'w = thisComp.width;\ + h = thisComp.height;\ + [w,thisComp.layer("'+ CenterRefLayer.name +'").effect("Height")("Slider")]' + + var widthControl = CenterRefLayer.property("Effects").addProperty("ADBE Slider Control") + widthControl.name = "Width" + var widthRef = CenterRefLayer.property("Contents").addProperty("ADBE Vector Shape - Rect") + //widthRef.property("Slider").setValue(activeComp.width/3); + widthRef.name = "Width Ref" + widthRef.property("Size").expression = 'w = thisComp.width;\ + h = thisComp.height;\ + [thisComp.layer("'+ CenterRefLayer.name +'").effect("Width")("Slider"),h]' + + var CenterRefStroke = CenterRefLayer.property("Contents").addProperty("ADBE Vector Graphic - Stroke") + + //alert ( option ); +} + +/* UI Buttons */ +function btnPlus1(){ + var dupli = w.checkbox1.value == true; + if ( dupli ){ + app.beginUndoGroup("Create copies of selected Comps for today and increment.") + versiounUpTodaySelectedComps( 1 ); + }else{ + app.beginUndoGroup("Increment selected Comps.") + versionUpSelectedComps( 1 ); + } + app.endUndoGroup() +} +function btnOwn(){ + var dupli = w.checkbox1.value == true; + if ( dupli ){ + app.beginUndoGroup("Own duplicates of selected Comps.") + versiounUpTodaySelectedComps( 0 ); + }else{ + app.beginUndoGroup("Own selected Comps.") + versionUpSelectedComps( 0 ); + } +} +function btnRender(){ + updateProjectPath(); + renderSelectedToProjectPath(); +} +function btnHerd(){ + compHerder = new CompHerder(); + compHerder.activate(); + //alert("Nothing to test right now.") +} +function btnAddLetterbox( aspect ){ + addLetterbox( aspect ); + /* + app.beginUndoGroup("Add Letterbox") + addLetterbox( ); + app.endUndoGroup() + */ +} +function CompHerder(){ + this.methods ={ + pad : function ( n , pad ) { + zeros = ""; + for ( i = 0 ; i < pad ; i ++ ) + { + zeros+="0"; + } + n = String(n); + padded = zeros.substr( 0, pad - n.length ) + String(n) ; + return padded + }, + replace: function( items , string , newString ){ + for ( i = 0 ; i < items.length ; i ++ ){ + var item = items[i]; + item.name = item.name.replace( string , newString ); + } + return true; + }, + getSelectedProjectItems: function (){ + var items = []; + var p = app.project; + for ( var i = 1 ; i <= p.numItems ; i ++ ){ + var item = p.item(i); + if ( item.selected ){ + items.push(item); + } + } + //items = items.concat( app.project.activeItem.selectedItems ); + return items; + }, + suffix: function ( items , suffix ){ + for ( i = 0 ; i < items.length ; i ++ ){ + var item = items[i]; + if ( item.name.search( suffix ) != (item.name.length - suffix.length) ){ + item.name+= "_"+suffix; + } + + } + return true; + }, + prefix : function( items , prefix ){ + for ( i = 0 ; i < items.length ; i ++ ) + { + var item = items[i]; + if ( item.name.search( prefix ) != 0 ){ + item.name = prefix + "_" + item.name; + } + } + return true; + }, + rename: function ( items , new_name ){ + for ( i = 0 ; i < items.length ; i ++ ){ + var item = items[i]; + item.name = new_name + "_" + i; + } + + }, + insert: function ( position , insert_text ){ + compHerder.methods.insertAtSelectedItemsNames(insert_text, position ); + }, + insertAt: function ( text , insertText, pos ){ + var myText = text; + var insertText = insertText; + var myPos = pos; + var newText; + if( myPos >= 0 ){ + newText= myText.substr(0,myPos)+"_"+insertText+myText.substr(myPos); + }else{ + newText= myText.substr(0,myText.length+myPos)+insertText+"_"+myText.substr(myText.length+myPos); + } + return newText + }, + insertAtSelectedItemsNames: function ( text, pos){ + var my_comps = getSelectedProjectItems(); + + for ( var i = 0; i < my_comps.length ; i ++ ){ + var myComp = my_comps[i]; + myComp.name = compHerder.methods.insertAt( myComp.name , text , pos); + } + } + + + } + this.init = function init() + { + // this.btnLauyout = + // "button\ + // {\ + // preferredSize: ['" + this.appearence.buttonWidth + "','" + this.appearence.buttonHeight + "'],\ + // text:'" + this.info.name + "',\ + // helpTip:'" + this.info.description + "'\ + // }"; + + // this. res = + // "window\ + // {\ + // type:'palette',\ + // text:'" + this.info.name + ' ' + this.info.ver + ' ' + this.info.stage + "',\ + // info: Group \ + // {\ + // alignment:['center','bottom'],\ + // icon: Image \ + // {\ + // icon:'" + this.resources.icon.path + '/' + this.resources.icon.name + "',\ + // preferredSize: [15, 18]\ + // },\ + // website: StaticText\ + // {\ + // text:'" + this.info.url + "',\ + // alignment:['fill','center']\ + // },\ + // }\ + // }"; + } + this.createUI = function createUI( ) + { + var myUI = this; + var res = + "window { \ + text: 'CompHerder',\ + alignment: ['fill','fill'], \ + alignChildren: ['center','top'], \ + orientation: 'column', \ + resizeable: 'true',\ + tabs: Panel {\ + type: 'tabbedpanel',\ + alignment: ['fill','fill'], \ + alignChildren: ['center','top'], \ + search_tab: Panel {\ + type: 'tab',\ + text: 'Search & Replace',\ + orientation: 'column', \ + alignChildren: ['center','top'], \ + searchGrp: Group {\ + alignment: ['fill','fill'], \ + alignChildren: ['center','top'], \ + orientation: 'column', \ + searchString: EditText {text:'SEARCH FOR TEXT',alignment: ['fill','center']}, \ + },\ + replaceGrp: Group {\ + alignment: ['fill','fill'], \ + alignChildren: ['center','center'], \ + orientation: 'column', \ + replaceString: EditText {text:'REPLACE WITH TEXT',alignment: ['fill','center']}, \ + }\ + doItBtn: Button {text: 'Replace in selected Comps', alignment: ['center','center']} , \ + }\ + suprefix: Panel {\ + type: 'tab',\ + text: 'Suffix / Prefix',\ + orientation: 'column', \ + suprefixGrp: Group {\ + alignment: ['fill','fill'], \ + alignChildren: ['left','center'], \ + orientation: 'column', \ + pre:Group {\ + alignment: ['fill','fill'], \ + alignChildren: ['left','center'], \ + orientation: 'row', \ + prefixString: EditText {text:'PREFIX',alignment: ['fill','center']}, \ + prefixBtn: Button {text: 'Preffix'} , \ + },\ + su:Group{\ + alignment: ['fill','fill'], \ + alignChildren: ['left','center'], \ + orientation: 'row', \ + sufixString: EditText {text:'SUFIX',alignment: ['fill','center']}, \ + sufixBtn: Button {text: 'Sufix'} , \ + }\ + },\ + },\ + rename_tab: Panel {\ + type: 'tab',\ + text: 'Rename',\ + renameGrp: Group {\ + alignment: ['fill','fill'], \ + alignChildren: ['left','center'], \ + orientation: 'row', \ + renameString: EditText {text:'NEW NAME',alignment: ['fill','center']}, \ + renameBtn: Button {text: 'Rename'} ,\ + }\ + },\ + insert_tab: Panel {\ + type: 'tab',\ + text: 'Insert',\ + insertGrp: Group {\ + alignment: ['fill','fill'], \ + alignChildren: ['left','center'], \ + orientation: 'row', \ + insertStart: EditText {text:'INSERT AT',alignment: ['fill','center']}, \ + insertText: EditText {text:'INSERT TEXT',alignment: ['fill','center']}, \ + insertBtn: Button {text: 'Insert'} ,\ + }\ + },\ + trim_tab: Panel {\ + type: 'tab',\ + text: 'Trim',\ + trimGrp: Group {\ + alignment: ['fill','fill'], \ + alignChildren: ['left','center'], \ + orientation: 'row', \ + trimStartEnabled: Checkbox {alignment: ['fill','center']}, \ + trimStart: EditText {text:'TRIM START', enabled : False, alignment: ['fill','center']}, \ + trimEndEnabled: Checkbox {alignment: ['fill','center']}, \ + trimEnd: EditText {text:'TRIM END', enabled : False, alignment: ['fill','center']}, \ + trimBtn: Button {text: 'Trim'} ,\ + }\ + },\ + },\ + },\ + }"; + + myUI.window = new Window( res ); + myUI.window.layout.layout(true); + + myUI.window.show(); + + myUI.window.layout.onResizing = myUI.window.layout.onResize = function () { myUI.layout.resize();} + + //CLEAR FIELDS + myUI.window.tabs.search_tab.searchGrp.searchString.onActivate = function(){ + myUI.window.tabs.search_tab.searchGrp.searchString.text = ""; + } + myUI.window.tabs.search_tab.replaceGrp.replaceString.onActivate = function(){ + myUI.window.tabs.search_tab.replaceGrp.replaceString.text = ""; + } + + //EVENT HANDLERS + myUI.window.tabs.search_tab.doItBtn.onClick = function(){ + var search_str = myUI.window.tabs.search_tab.searchGrp.searchString.text; + var replace_str = myUI.window.tabs.search_tab.replaceGrp.replaceString.text; + myUI.methods.replace( myUI.methods.getSelectedProjectItems() , search_str , replace_str ); + }; + myUI.window.tabs.suprefix.suprefixGrp.pre.prefixBtn.onClick = function(){ + var pre = myUI.window.tabs.suprefix.suprefixGrp.pre.prefixString.text; + myUI.methods.prefix( myUI.methods.getSelectedProjectItems() , pre ); + }; + myUI.window.tabs.suprefix.suprefixGrp.su.sufixBtn.onClick = function(){ + var su = myUI.window.tabs.suprefix.suprefixGrp.su.sufixString.text; + myUI.methods.suffix( myUI.methods.getSelectedProjectItems() , su ); + }; + myUI.window.tabs.rename_tab.renameGrp.renameBtn.onClick = function(){ + var new_name = myUI.window.tabs.rename_tab.renameGrp.renameString.text; + myUI.methods.rename( myUI.methods.getSelectedProjectItems() , new_name ); + }; + myUI.window.tabs.insert_tab.insertGrp.insertBtn.onClick = function(){ + + var insert_at = parseInt(myUI.window.tabs.insert_tab.insertGrp.insertStart.text); + var insert_text = myUI.window.tabs.insert_tab.insertGrp.insertText.text; + + myUI.methods.insert( insert_at , insert_text ); + + // myUI.methods.rename( myUI.methods.getSelectedProjectItems() , new_name ); + }; + myUI.window.tabs.trim_tab.trimGrp.trimBtn.onClick = function(){ + var startTrim = parseInt(myUI.window.tabs.trim_tab.trimGrp.trimStart.text); + var endTrim = parseInt(myUI.window.tabs.trim_tab.trimGrp.trimEnd.text); + alert( startTrim +","+ endTrim ); + + // var new_name = myUI.window.tabs.rename_tab.renameGrp.renameString.text; + // myUI.methods.rename( myUI.methods.getSelectedProjectItems() , new_name ); + }; + + return(this); + } + + this.activate = function activate() + { + w = this.createUI(); + } + + this.init(); + return this; +} +function btnFlatten(){ + yFlattenSelectedFolderContents(); +} +function btnAddCenterRef( option ){ + AddCenterRef( option ) +} + +})(this); \ No newline at end of file diff --git a/wc_helper/struct.txt b/wc_helper/struct.txt new file mode 100644 index 0000000..37497bd --- /dev/null +++ b/wc_helper/struct.txt @@ -0,0 +1,19 @@ +1_Images + 1_PSD + 2_Textures +2_Vector +3_Footage + 1_Shots + 2_Stock + 3_Prerender +4_3D_Renders + MM_DD_YY +5_Reference + 1_Cut + 2_R+D +Solids +z_Comps + YEAR + MM_DD_YY + _pre +zz_AE_Import \ No newline at end of file