```
/**
This class represents the main class of the script;
it is used to create the user interface which allows to place each character of the selected text layer on its own layer
@class Main class of the script
*/
function DecomposeText()
{
// Variable used to keep track of 'this' reference
var decomposeText = this;
// Create an instance of the utils class to use its functions
var utils = new DecomposeTextUtils();
// Script infos
this.scriptMinSupportVersion = "8.0";
this.scriptName = "分解文字.jsx";
this.scriptVersion = "2.0";
this.scriptTitle = "分解文字脚本";
this.scriptCopyright = "展翅鹰汉化 感谢原版作者 Charles Bordenave";
this.scriptHomepage = "http://blog.sina.com.cn/ykcmgzs";
this.scriptDescription = {en: "保持字符的位置\" 保持字符在原来的位置, 由于创建的文字层的字符的数量等于原始文字层的字符的数量 (它们的中心点和原始层的中心点是一致的).\\r\\r\"适配中心点\" 创建的文字层只包含一个字符 (它们的中心点被设置在段落的边缘), 因此它创建的文字层在同样的位置.", fr:"Ce script place chaque caractère d\\'un calque texte sur son propre calque.\\r\\rLa méthode \"Préserver la position des caractères\" laisse les caractères à leur position actuelle mais elle crée des calques texte ayant le même nombre de caractères que le calque original (par conséquent leur point d\\'ancrage est le même que celui du calque original).\\r\\rLa méthode \"Point d\\'ancrage approprié\" crée des calques texte contenant un seul caractère (par conséquent leur point d\\'ancrage est comme défini dans le panneau Paragraphe), mais elle superpose tous les calques au centre de la comp."};
this.scriptAbout = {en:this.scriptName + ", v" + this.scriptVersion + "\\r\\r" + this.scriptCopyright + "\\r" + this.scriptHomepage + "\\r\\r" + utils.loc(this.scriptDescription), fr:this.scriptName + ", v" + this.scriptVersion + "\\r\\r" + this.scriptCopyright + "\\r" + this.scriptHomepage + "\\r\\r" + utils.loc(this.scriptDescription)};
// Errors
this.requirementErr = {en:"This script requires After Effects CS3 or later.", fr:"Ce script nécessite After Effects CS3 ou supérieur."};
this.noCompErr = {en:"要有一个合成被激活.", fr:"Une composition doit être active."};
this.noLayerErr = {en:"只选择一个文字图层.", fr:"Sélectionnez exactement un calque texte."};
this.badSelLayerErr = {en:"只选择一个文字图层.", fr:"Sélectionnez exactement un calque texte."};
// UI strings & default settings
this.aboutBtnName = "关于";
this.methodStName = {en:"方式:", fr:"Méthode:"};
this.methodLstChoices = {en:'["保持字符的位置", "适配中心点"]', fr:'["Préserver la position des caractères", "Ancrage approprié"]'};
this.methodLstSelDflt = 0;
this.methodLstHlp = {en:"\"保持字符的位置\" 保持字符在原来的位置, 但是创建的文字的层的数量等于原始文字层的字符的数量 (因此它们的中心点和原始层的中心点是一致的).\\r\\r\"适配中心点\" 创建的文字层只包含一个字符 (因此它们的中心点被设置在段落的边缘), 因此它创建的文字层在同样的位置.", fr:"\"Préserver la position des caractères\" maintient les caractères à leur position actuelle, mais cela crée des calques texte ayant le même nombre de caractères que le calque original (par conséquent leur point d\\'ancrage est identique au point d\\'ancrage du calque original).\\r\\r\"Ancrage approprié\" crée des calques texte contenant un seul caractère (par conséquent leur point d\\'ancrage est identique à celui spécifié dans le panneau Paragraphe), mais cela superpose tous les calques texte."};
this.runBtnName = {en:"分解", fr:"Décompose"};
/**
Creates and displays the script interface
@param {Object} thisObj A Panel object if the script is launched from the Window menu, null otherwise
*/
this.buildUI = function (thisObj)
{
// dockable panel or palette
var pal = (thisObj instanceof Panel) ? thisObj : new Window("palette", this.scriptTitle, undefined, {resizeable:false});
// resource specifications
var res =
"group { orientation:'column', alignment:['left','top'], alignChildren:['right','top'], \
gr1: Group { \
aboutBtn: Button { text:'" + this.aboutBtnName + "', preferredSize:[35,20] } \
}, \
gr2: Group { \
methodSt: StaticText { text:'" + utils.loc(this.methodStName) + "' }, \
methodLst: DropDownList { properties:{items:" + utils.loc(this.methodLstChoices) + "}, helpTip:'" + utils.loc(this.methodLstHlp) + "' } \
}, \
gr3: Group { orientation:'row', alignment:['fill','top'], \
runBtn: Button { text:'" + utils.loc(this.runBtnName) + "', alignment:['right','center'] } \
} \
}";
pal.gr = pal.add(res);
pal.gr.gr2.methodLst.selection = this.methodLstSelDflt;
pal.gr.gr2.methodLst.graphics.foregroundColor = pal.graphics.newPen(pal.graphics.BrushType.SOLID_COLOR, [0,0,0], 1);
// event callbacks
pal.gr.gr1.aboutBtn.onClick = function ()
{
utils.createAboutDlg(decomposeText.scriptAbout);
};
pal.gr.gr3.runBtn.onClick = function ()
{
decomposeText.decompose(pal);
};
// show user interface
if (pal instanceof Window)
{
pal.center();
pal.show();
}
else
{
pal.layout.layout(true);
}
};
/**
Determines whether the active item is a composition
@return True if the active item is not a composition, False otherwise
*/
this.checkActiveItem = function ()
{
var err = false;
var comp = app.project.activeItem;
if (!comp || !(comp instanceof CompItem))
{
err = true;
}
return err;
};
/**
Determines whether a given layer is a text layer
@return True if the layer is not a text layer, False otherwise
*/
this.checkLayerType = function (layer)
{
return !(layer instanceof TextLayer);
}
/**
Functional part of the script: places each character of the selected text layer on its own layer
@param {Object} pal A palette or a dockable panel containing all user parameters
*/
this.decompose = function (pal)
{
try
{
var comp = app.project.activeItem;
var err = this.noCompErr;
if (this.checkActiveItem(comp)) throw(err);
var layer = comp.selectedLayers[0];
var err = this.noLayerErr;
if (!layer) throw(err);
var err = this.badSelLayerErr;
if (this.checkLayerType(layer)) throw(err);
var txt = layer.sourceText.value.toString();
app.beginUndoGroup(this.scriptTitle);
for (var i = 0; i < txt.length; i++)
{
// "Preserve characters location"
if (pal.gr.gr2.methodLst.selection.index == 0)
{
var newLayer = layer.duplicate();
newLayer.name = txt.charAt(i);
var animator = newLayer.property("ADBE Text Properties").property("ADBE Text Animators").addProperty("ADBE Text Animator");
var opacityProp = animator.property("ADBE Text Animator Properties").addProperty("ADBE Text Opacity");
var expressionSelector = animator.property("ADBE Text Selectors").addProperty("ADBE Text Expressible Selector");
opacityProp.setValue(0);
expressionSelector.property("ADBE Text Expressible Amount").expression = "selectorValue * (textIndex != " + (i+1) + ");";
}
// "Appropriate anchor point"
else
{
var curChar = txt.charAt(i);
if (curChar != ' ')
{
var newLayer = layer.duplicate();
newLayer.sourceText.numKeys ? newLayer.sourceText.setValueAtTime(comp.time,curChar) : newLayer.sourceText.setValue(curChar);
}
}
}
layer.enabled = false;
layer.selected = false;
app.endUndoGroup();
}
catch(err)
{
utils.throwErr(err);
}
};
/**
Runs the script
@param {Object} thisObj A Panel object if the script is launched from the Window menu, null otherwise
*/
this.run = function (thisObj)
{
if (parseFloat(app.version) < parseFloat(this.scriptMinSupportVersion))
{
this.throwErr(this.requirementErr);
}
else
{
this.buildUI(thisObj);
}
};
}
/**
This class provides some utility functions used by DecomposeText
@class Some utility functions grouped in a class
*/
function DecomposeTextUtils()
{
/**
String localization function: english and french languages are supported
@param {Object} str A localization object containing the localized versions of a string
@return Appropriate localized version of str
*/
this.loc = function (str)
{
return app.language == Language.FRENCH ? str.fr : str.en;
};
/**
Displays a window containg a localized error message
@param {Object} err A localization object containing the localized versions of an error message
*/
this.throwErr = function (err)
{
var wndTitle = $.fileName.substring($.fileName.lastIndexOf("/")+1, $.fileName.lastIndexOf("."));
Window.alert("Script error:\r" + this.loc(err), wndTitle, true);
};
/**
Displays a customized window containg the About text
@param {String} aboutStr The text to display
*/
this.createAboutDlg = function (aboutStr)
{
eval(unescape('%20%20%20%20%20%20%20%20/**%20%0D%0A%20%20%20%20%20%20%20%20%20Draw%20some%20random%20rectangles%20%28position%2C%20size%2C%20color%2C%20alpha%29%20on%20the%20window%20background%0D%0A%20%20%20%20%20%20%20%20%20@ignore%20%0D%0A%20%20%20%20%20%20%20%20*/%0D%0A%20%20%20%20%20%20%20%20function%20addNabscriptsBackgroundSignature%28wnd%29%0D%0A%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20numRect%20%3D%2024%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20minOpacity%20%3D%200.05%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20maxOpacity%20%3D%200.15%3B%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20leftEdge%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20topEdge%20%3D%200%3B%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20rightEdge%20%3D%20wnd.windowBounds.width%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20bottomEdge%20%3D%20wnd.windowBounds.height%3B%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%20%3B%20i%20%3C%20numRect%3B%20i++%29%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20xLoc%20%3D%2010%20+%20%28rightEdge%20-%2020%29%20*%20Math.random%28%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20yLoc%20%3D%2010%20+%20%28bottomEdge%20-%2020%29%20*%20Math.random%28%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20width%20%3D%205%20+%2015%20*%20Math.random%28%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20height%20%3D%205%20+%2015%20*%20Math.random%28%29%3B%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20borderWidth%20%3D%201%20+%204%20*%20Math.random%28%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20borderColor%20%3D%20%5BMath.random%28%29%2C%20Math.random%28%29%2C%20Math.random%28%29%2C%20minOpacity%20+%20%28maxOpacity%20-%20minOpacity%29%20*%20Math.random%28%29%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20colorBrush%20%3D%20wnd.graphics.newBrush%28wnd.graphics.BrushType.SOLID_COLOR%2C%20borderColor%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g1%20%3D%20wnd.add%28%22group%22%2C%20%5BxLoc%2C%20yLoc%2C%20xLoc%20+%20width%2C%20yLoc%20+%20borderWidth%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g2%20%3D%20wnd.add%28%22group%22%2C%20%5BxLoc%2C%20yLoc%20+%20height%20-%20borderWidth%2C%20xLoc%20+%20width%2C%20yLoc%20+%20height%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g3%20%3D%20wnd.add%28%22group%22%2C%20%5BxLoc%2C%20yLoc%20+%20borderWidth%2C%20xLoc%20+%20borderWidth%2C%20yLoc%20+%20height%20-%20borderWidth%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g4%20%3D%20wnd.add%28%22group%22%2C%20%5BxLoc%20+%20width%20-%20borderWidth%2C%20yLoc%20+%20borderWidth%2C%20xLoc%20+%20width%2C%20yLoc%20+%20height%20-%20borderWidth%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g1.graphics.backgroundColor%20%3D%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g2.graphics.backgroundColor%20%3D%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g3.graphics.backgroundColor%20%3D%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wnd.g4.graphics.backgroundColor%20%3D%20colorBrush%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20var%20dlg%20%3D%20new%20Window%28%22dialog%22%2C%20%22%u5173%u4E8E%22%29%3B%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20//%20panel%20borderStyle%3A%20one%20of%20black%2C%20etched%2C%20gray%2C%20raised%2C%20sunken.%20Default%20is%20etched.%0D%0A%20%20%20%20%20%20%20%20//%20resource%20specifications%0D%0A%20%20%20%20%20%20%20%20var%20res%20%3D%0D%0A%20%20%20%20%20%20%20%20%22group%20%7B%20orientation%3A%27column%27%2C%20alignment%3A%5B%27fill%27%2C%27fill%27%5D%2C%20%5C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20aboutPnl%3A%20Panel%20%7B%20properties%3A%7B%20borderStyle%3A%27sunken%27%20%7D%2C%20%5C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aboutEt%3A%20EditText%20%7B%20text%3A%27%22%20+%20this.loc%28aboutStr%29%20+%20%22%27%2C%20properties%3A%7Bmultiline%3Atrue%7D%2C%20preferredSize%3A%5B280%2C150%5D%2C%20alignment%3A%5B%27right%27%2C%27center%27%5D%20%7D%20%5C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20%5C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20btnsGr%3A%20Group%20%7B%20alignment%3A%5B%27fill%27%2C%27fill%27%5D%2C%20%5C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20visitBtn%3A%20Button%20%7B%20text%3A%27%u6211%u7684%u535A%u5BA2%27%2C%20alignment%3A%5B%27left%27%2C%27center%27%5D%20%7D%2C%20%5C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20okBtn%3A%20Button%20%7B%20text%3A%27Ok%27%2C%20alignment%3A%5B%27right%27%2C%27center%27%5D%20%7D%20%5C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%5C%0D%0A%20%20%20%20%20%20%20%20%7D%22%3B%20%0D%0A%20%20%20%20%20%20%20%20dlg.gr%20%3D%20dlg.add%28res%29%3B%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20//%20on%20Mac%20we%20can%20disable%20edit%20text%20while%20allowing%20scrolling%2C%20on%20Windows%20we%20can%27t%0D%0A%20%20%20%20%20%20%20%20dlg.gr.aboutPnl.aboutEt.enabled%20%3D%20%28%24.os.indexOf%28%22Win%22%29%20%21%3D%20-1%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20//%20draw%20random%20background%20color%20%28grayscale%29%0D%0A%20%20%20%20%20%20%20%20if%20%28parseFloat%28app.version%29%20%3E%3D%209.0%29%20//%20CS4%20or%20later%0D%0A%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20whiteBrush%20%3D%20dlg.graphics.newBrush%28dlg.graphics.BrushType.SOLID_COLOR%2C%20%5B1%2C%201%2C%201%2C%201%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20rand%20%3D%20Math.random%28%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20bgBrush%20%3D%20dlg.graphics.newBrush%28dlg.graphics.BrushType.SOLID_COLOR%2C%20%5Brand%2C%20rand%2C%20rand%2C%201%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20dlg.graphics.backgroundColor%20%3D%20bgBrush%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20dlg.gr.aboutPnl.graphics.backgroundColor%20%3D%20whiteBrush%3B%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20dlg.layout.layout%28true%29%3B%20//%20to%20get%20window%20bounds%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20addNabscriptsBackgroundSignature%28dlg%29%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20dlg.gr.btnsGr.okBtn.onClick%20%3D%20function%20%28%29%20%7B%20dlg.close%28%29%3B%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20//%20open%20homepage%20url%0D%0A%20%20%20%20%20%20%20%20dlg.gr.btnsGr.visitBtn.onClick%20%3D%20function%20%28%29%20%0D%0A%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20cmd%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20url%20%3D%20%22http%3A//blog.sina.com.cn/ykcmgzs/%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%24.os.indexOf%28%22Win%22%29%20%21%3D%20-1%29%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28File%28%22C%3A/Program%20Files/Mozilla%20Firefox/firefox.exe%22%29.exists%29%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%09%09%09%09%09cmd%20+%3D%20%22C%3A/Program%20Files/Mozilla%20Firefox/firefox.exe%20%22%20+%20url%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09cmd%20+%3D%20%22C%3A/Program%20Files/Internet%20Explorer/iexplore.exe%20%22%20+%20url%3B%0D%0A%09%09%09%09%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%09cmd%20+%3D%20%22open%20%5C%22%22%20+%20url%20+%20%22%5C%22%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20try%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%09%09%09%09system.callSystem%28cmd%29%3B%0D%0A%09%09%09%7D%0D%0A%09%09%09catch%28e%29%0D%0A%09%09%09%7B%0D%0A%09%09%09%09alert%28e%29%3B%0D%0A%09%09%09%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20dlg.center%28%29%3B%0D%0A%20%20%20%20%20%20%20%20dlg.show%28%29%3B'));
};
}
/**
Creates an instance of the main class and run it
*/
new DecomposeText().run(this);
```
- 脚本管理器
- 读取文件夹内文件
- 层层时间线偏移Sequencer.jsx
- 层层随机时间偏移
- 文字分离char_separate_1.3
- 分解文字 把一个文字层分成若干个文字层
- 快速导入Smart Import
- 查找与替换字符 Find and Replace Text.jsx
- 层改名Selected_Layers_Renamer.jsx
- 创建灯光为选择的三维层.jsx
- 创建摄像机为选择的三维图层.jsx
- 创建调节图层CreateTrimmedAdjustmentLayer.jsx
- 创建调节图层多个CreateSeveralTrimmedAdjustmentLayers.jsx
- 创建一个空物体到选择的层Add Parented Null to Selected Layers.jsx
- 文字分离DecomposeText
- 修改渲染输出文件位置Change Render Locations
- AE脚本读取txt文档并写入数组
- AE脚本把数组写入到txt文档中
- AE提取字幕脚本
- AE批量用txt内容替换字幕脚本