//Separate Masks in Layers// by Christopher R. Green// version 2 adds the ability to name masks quickly using user-given string and delimiter// Comments? Suggestions? Praise? Post on aenhancers.com, or send me an email via the crgreen website// left to do: try faster version ...///////////////////////////mainMaskSep();///////////////////////////function compareNums(a, b) {return a - b;}function getAndSortVerts(newLayer, thisAxis){	v_Array = new Array;	vv = newLayer.mask(1).property("ADBE Mask Shape").value.vertices;	for (v = 0; v < vv.length; v++) {		thisVert = vv[v];		v_Array[v_Array.length] = thisVert[thisAxis];	}	// sort that mutha	sortedArray = v_Array.sort(compareNums);	return sortedArray;}function getNewCenter(vx_Array, vy_Array){	//discover 'bounding box' and its center:	xLen = vx_Array[vx_Array.length-1] - vx_Array[0];	yLen = vy_Array[vy_Array.length-1] - vy_Array[0];	return [ (vx_Array[0]+(xLen/2) ), (vy_Array[0]+(yLen/2)) ];}function recenterMask(theL) {	// checks for position and anchor point difference, and	// adds offset for that	startingPos = theL.position.value;	startingAP = theL.anchorPoint.value;	posOffset = [0, 0];		if (startingPos != startingAP) { posOffset = -1 * (startingAP - startingPos); }		vx_Array = getAndSortVerts(theL, 0);	vy_Array = getAndSortVerts(theL, 1);	newCenter = getNewCenter(vx_Array, vy_Array);	theL.anchorPoint.setValue(newCenter);	theL.position.setValue(newCenter + posOffset);	}function mainMaskSep(){	// make sure a comp is selected	var activeItem = app.project.activeItem;	if (activeItem == null || !(activeItem instanceof CompItem)){		alert("You need to select one layer first.");	} else {				// make sure just one layer is selected		var selectedLayers = activeItem.selectedLayers;		var selNum = activeItem.selectedLayers.length;		if (!(selNum == 1)) {			if (selNum == 0) {selNum = "No"} 			alert(selNum + " layers selected. You need to select one layer.");		} else {						// make sure it is not a light, camera; must be solid or footage item			if (selectedLayers[0].adjustmentLayer == undefined) {				alert("Selected layer not valid (camera or light?).");							} else {								//final check: how many masks?				baseLayer = selectedLayers[0];				mm = baseLayer.Masks.numProperties;								if (mm < 2) {					alert("Selected layer must have at least two masks.");				} else {										app.beginUndoGroup("Mask-separation");					var reCenterMs = (confirm("Give each layer new anchor point based on its mask?"));					s = prompt("If you want to give each layer a name, enter text strings separated by a character. " +						"Start what you enter here with\n" +						"this character (make sure the character is only used as a separator (not in your layer name strings).\n\n" +							"Example:\n\n" + "/name1/name2/slash/is/separator\n\n" +							"will result in the layers named as:\n\n" +							"name1\nname2\nslash\nis\nseparator\n\n" + 							"Leave blank or hit Cancel to use existing mask names.", "");					userNameFlag = false;					if (s != null && ( s.length > 3 ) ) {						sepr = s.charAt(0);						// make array by splitting string using user-supplied delimiter						// keep in mind the zero-th element should be ignored (it will be nothing); start with nameArray[1]						nameArray = s.split(sepr);						nameCount = nameArray.length;						userNameFlag = true;					}					vx_Array = new Array;					vy_Array = new Array;										for (i = 1; i < mm; i++) {						clearOutput();							writeLn("Layer #" + i + " of " + mm + ":");							writeLn("Removing redundant masks ... ");						newLayer = baseLayer.duplicate();						for (m = mm; m > 0; m--) {							if (i != m) { newLayer.mask(m).remove(); }						}												if (reCenterMs) {recenterMask(newLayer);}						newLayer.mask(1).maskMode = MaskMode.ADD;												///////////////new naming scheme////////////////						// ignores empty names (sepr immediately followed by sepr).						// mismatched counts of user-given names and masks/layers are taken care of by						//   simply using existing mask names or ignoring user-given name overflow												if ( (userNameFlag) && (i <= (nameCount-1)) && (nameArray[i] != "") ) {							newLayer.name = nameArray[i];						} else {							newLayer.name = newLayer.mask(1).name;						}						////////////////////////////////////////////////					}						clearOutput();					//////   now do the original layer:					for (m = mm; m > 0; m--) {						if (m != mm) {baseLayer.mask(m).remove();}					}										if (reCenterMs) {recenterMask(baseLayer);}					baseLayer.mask(1).maskMode = MaskMode.ADD;										///////////////new naming scheme////////////////					if ( (userNameFlag) && (i <= (nameCount-1)) && (nameArray[i] != "") ) {						//alert(i);						baseLayer.name = nameArray[i];					} else {						baseLayer.name = baseLayer.mask(1).name;					}					////////////////////////////////////////////////					app.endUndoGroup();									}			}		}	}}