去年に作成したラインのやり取りアニメーションスクリプト公開しときます。
とりあえずコードだけアップしておきます。
CSVのフォーマットに記入するだけで、自動でラインのやり取りを作ってくれるやつです。
line
var thisFile = new File(this); //jsxのファイルを取得
var thisFolderPath = thisFile.path; //jsxのフォルダパスを取得
//~ ライブラリ読み込み
#include '/d/Dropbox/aftereffects%20script/lib/ytLib.jsxinc'
{//==============================変数宣言==============================
var myCsvFile = new Object();//CSVファイル
var csv= [];//全データ
var iconGrp = [];
var icon_button_Text = []; //UIのset Picture icon Panel内 名前
var icon_button = [];//UIのset Picture icon Panel内 ボタン
var date = new Date; // CreateTime
var UI = {
defaultName : 'Unknown : ',
};
var Num ={
icon_Default_Set : Number (5),
}
}//==============================変数宣言==============================
{//==============================ScriptUI Panel==============================
{//初期ウィンドウ
var winObj = (this instanceof Panel) ? this : new Window('palette', 'Line auto TimeLine', undefined, {resizeable: true});
}
{//コンテンツグループ
var contentsGrp = winObj.add('group',undefined,'contentsGrp');
contentsGrp.orientation = 'column';
}
{//バナー表示
try{
var myBannerPath = new File (thisFolderPath+'/youtool_common/Ae_Script_banner.png');
var banner = contentsGrp.add('image',undefined,myBannerPath);
banner.alignment = [ScriptUI.Alignment.LEFT,ScriptUI.Alignment.CENTER];
}
catch(e){
}
}//バナー表示
{//CSVの読み込みボタン
var csv_Grp = contentsGrp.add('group',undefined,'csv_Grp');
csv_Grp.orientation = 'row';
csv_Grp.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
var csv_Grp_stTxt = csv_Grp.add('statictext',undefined,'CSVFile:');
//csv_Grp_stTxt.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
var csv_button = csv_Grp.add('button',undefined,'ImportCsv');
csv_button.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
}//CSVの読み込みボタン
{//背景画像を選択
var Icon_UI_Grp = contentsGrp.add('panel',undefined,'set Picture icons');
Icon_UI_Grp.orientation = 'column';
Icon_UI_Grp.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
for ( var i = 0 ; i < Num.icon_Default_Set ; i ++ ){
iconGrp[i]=Icon_UI_Grp.add('group',undefined,'');
iconGrp[i].orientation = 'row';
iconGrp[i].alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
icon_button_Text[i]=iconGrp[i].add('staticText',undefined,UI.defaultName);
icon_button_Text_a =iconGrp[i].add('staticText',undefined,':');
icon_button[i]=iconGrp[i].add('button',undefined,'Select Picture');
icon_button[i].alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
}
Icon_UI_Grp.enabled = false;
}//背景画像を選択
{//LINE背景画像読み込みボタン
var BG_UI_Grp = contentsGrp.add('group',undefined,'csv_Grp');
BG_UI_Grp.orientation = 'row';
BG_UI_Grp.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
var BG_UI_Grp_button = BG_UI_Grp.add('button',undefined,'背景画像を選択');
BG_UI_Grp_button.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
}//LINE背景画像読み込みボタン
{//音設定
var sound_Setting_Grp = contentsGrp.add('group',undefined,'contentsGrp');
sound_Setting_Grp.orientation = 'row';
sound_Setting_Grp.alignment = [ScriptUI.Alignment.LEFT,ScriptUI.Alignment.CENTER];
var sound_Setting_Checkbox = sound_Setting_Grp.add('checkbox');
var sound_Setting_infTxt = sound_Setting_Grp.add('statictext',undefined,'着信音を設定する')
var sound_Button_Grp = contentsGrp.add('group',undefined,'contentsGrp');
var receive_button = sound_Button_Grp.add('button',undefined,'相手の音');
var send_button = sound_Button_Grp.add('button',undefined,'自分の音');
var information_button = sound_Button_Grp.add('button',undefined,'コメントの音');
sound_Button_Grp.enabled = false;
}//音設定
{//MSG投稿の時間の設定
var time_Setting_Grp = contentsGrp.add('group',undefined,'contentsGrp');
time_Setting_Grp.orientation = 'row';
time_Setting_Grp.alignment = [ScriptUI.Alignment.LEFT,ScriptUI.Alignment.CENTER];
var time_Setting_Checkbox = time_Setting_Grp.add('checkbox');
var time_Setting_infTxt = time_Setting_Grp.add('statictext',undefined,'TimeSetting')
time_Setting_Checkbox.value = false;
var time_Setting_add_Grp = time_Setting_Grp.add('group',undefined,'contentsGrp');
time_Setting_add_Grp.orientation = 'row';
time_Setting_add_Grp.alignment = [ScriptUI.Alignment.LEFT,ScriptUI.Alignment.CENTER];
var time_Setting_Etxt_hours = time_Setting_add_Grp.add('edittext',undefined,'23');
var time_Setting_STxt_Hours = time_Setting_add_Grp.add('statictext',undefined,'H');
time_Setting_add_Grp.enabled = false;
}//MSG投稿の時間の設定
{
var buttonGrp = contentsGrp.add('group',undefined,'csv_Grp');
buttonGrp.orientation = 'row';
buttonGrp.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
}
{//リセットボタン
var Reset_Grp = buttonGrp.add('group',undefined,'csv_Grp');
Reset_Grp.orientation = 'row';
Reset_Grp.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
var Reset_Grp_button = Reset_Grp.add('button',undefined,'Clear');
Reset_Grp_button.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
}//リセットボタン
{//確認用ボタン
var Check_Grp = buttonGrp.add('group',undefined,'csv_Grp');
Check_Grp.orientation = 'row';
Check_Grp.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
var Check_Grp_button = Check_Grp.add('button',undefined,'Do it');
Check_Grp_button.alignment = [ScriptUI.Alignment.FILL,ScriptUI.Alignment.CENTER];
}//確認用ボタン
{//winObj表示に関して
winObj.onResizing = winObj.onResize = function () {this.layout.resize();};
if (winObj instanceof Window) {
winObj.center();
winObj.show();
}
else {
winObj.layout.layout(true);
winObj.layout.resize();
}
}//winObj表示に関して
}//~==============================ScriptUI Panel==============================
{//==============================ScriptUI Actions==============================
//CSVの読み込みボタン
csv_button.onClick = function(){
csvAllCheck();
doit_csv_Obj()
buttonEdit()
}
//リセットボタン
Reset_Grp_button.onClick = function(){
myCsvFile= new File();//myCsvFileの中身を空にする
csv= [];//空にする
csv_button.text = 'ImportCsv'//ボタンの名前を初期化
NameReset();
Icon_UI_Grp.enabled = false;
icon_Pics = [] ;
bg_pics = new File();
BG_UI_Grp_button.text = '背景画像を選択';
soundFile.receive = new Object();
soundFile.send = new Object();
soundFile.information = new Object();
receive_button.text ='相手の音';
send_button.text ='自分の音';
information_button.text ='コメントの音';
sound_Button_Grp.enabled = false;
}
//確認用ボタン
Check_Grp_button.onClick = function(){
Ae()
}
//背景画像を選択 Button
BG_UI_Grp_button.onClick = function(){
(function load(){
bg_pics = new File();
var fileName = File.openDialog("Select csv file","");
if (fileName){
bg_pics= new File(fileName);
}
else{
bg_pics = false;
}
return bg_pics;
})();
BG_UI_Grp_button.text = textOvershort(decodeURI($ytLib.getPathName(bg_pics,1)),10);
}
//MSG投稿の時間の設定ボタン
time_Setting_Checkbox.onClick = function(){
if (time_Setting_Checkbox.value){
time_Setting_add_Grp.enabled = true;
}
else{
time_Setting_add_Grp.enabled = false;
}
}
sound_Setting_Checkbox.onClick = function(){
if (sound_Setting_Checkbox.value){
sound_Button_Grp.enabled = true;
}
else{
sound_Button_Grp.enabled = false;
}
}
{//select icon picture Button
for (var i = 0 ; i < Num.icon_Default_Set ; i ++){
icon_buttonOnClick(i)
}
function icon_buttonOnClick(n){
icon_button[n].onClick=function(){
icon_Picture_File (n);
icon_button[n].text = textOvershort(decodeURI($ytLib.getPathName(icon_Pics[n],1)),10);
}
function icon_Picture_File (n){
var fileName = File.openDialog("Select csv file","");
if (fileName){
icon_Pics[n]= new File(fileName);
}
else{
false;
}
}
}
}//select icon picture Button
{//音源ボタン
receive_button.onClick = function(){
var tmpfile ;
tmpfile= new Object();
tmpfile = FileOpen ();
receive_button.text = textOvershort(decodeURI($ytLib.getPathName(tmpfile,1)),10);
AE_sound_Path[0]=tmpfile;
}
send_button.onClick = function(){
var tmpfile ;
tmpfile= new Object();
tmpfile = FileOpen ();
send_button.text = textOvershort(decodeURI($ytLib.getPathName(tmpfile,1)),10);
AE_sound_Path[1]=tmpfile;
}
information_button.onClick = function(){
var tmpfile ;
tmpfile= new Object();
tmpfile = FileOpen ();
information_button.text = textOvershort(decodeURI($ytLib.getPathName(tmpfile,1)),10);
AE_sound_Path[2]=tmpfile;
}
function FileOpen (str){
var tmp;
var fileName = File.openDialog(str,"");
if (fileName){
tmp= new File(fileName);
}
else{
tmp = false;
}
return tmp;
}
}//select icon picture Button
}//==============================ScriptUI Actions==============================
{//==============================Functions==============================
{//★★★★CSVデータのチェック
function csvAllCheck(){
/*
①myCsvFileにオブジェクトを入れる
②csv_buttonの名前を変更する
*/
csvFile ();//csvファイルを読み込む
if ( !myCsvFile ){ return false ;}//csvFile()でbooleanを求める trueなら次へ
var shotrNameFile = textOvershort(decodeURI($ytLib.getPathName(myCsvFile,1)),20);
if ( myCsvFile ){csv_button.text = shotrNameFile ;}else{ return false;}//ボタンの名前を変更
}//csvAllCheck()
}//★★★★CSVデータのチェック
{//myCsvFileを配列CSVに格納
function doit_csv_Obj(){
var myText= '';
if (myCsvFile.open("r")){
while(!myCsvFile.eof){
var tempLine = myCsvFile.readln();
if(countStr(tempLine,"\"")%2 == 0) {
myText = myText + tempLine+"\n";
}
else {
myText = myText + tempLine+"\r";
while(true){
tempLine = myCsvFile.readln();
if(countStr(tempLine,"\"")%2 == 1) {
myText = myText + tempLine+"\n";
break;
}
else {
myText = myText + tempLine+"\r";
}
}
}
}
myCsvFile.close();
}
function countStr(str,seq) {
return str.split(seq).length - 1;
}
var tmp = myText.replace(/"/g,"").split("\n");
for( var i=0 ; i < tmp.length ; i ++ ){
csv[i] = tmp[i].split(',');
};
}//myCsvFileを配列CSVに格納
}
{//文字列を制限して末尾に...を追加する
function textOvershort(target,n){
var resultStr = '';
var tempArray = [];
var count = 0 ;
for (var i = 0 ; i < target.length ; i ++){
count = count + getLen(target[i]);
if (count <= n){
tempArray.push(new Array (target[i]))
}else{
tempArray.push('...')
break ;
}
}
resultStr = resultStr + tempArray.toString().replace(/,/g,'')
return resultStr;
}
}//文字列を制限して末尾に...を追加する
{ //ScriptUIの名前を変更とボタン無効と有効
function buttonEdit(){
NameReset()//一度名前をリセットする
var tempName = [];
for ( var i = 7 ; i < csv[2].length ; i++){
if (csv[2][i] !== ''){
tempName.push(csv[2][i]);
}
else{
false;
}
};
//~ arrCheck1(tempName)
for (var i = 0 ; i < tempName.length ; i++){
icon_button_Text[i].text = tempName[i]
};
Icon_UI_Grp.enabled = true; //パネルをアクティブにする
//人数の分だけgrpをアクティブにする
for ( var i = 0 ; i < Num.icon_Default_Set ; i++){
if ( i < tempName.length-1 ){
iconGrp[i].enabled = true;
}
else{
iconGrp[i].enabled = false;
}
};
};
} //ScriptUIの名前を変更とボタン数削除
{//名前を全てリセット
function NameReset(){
icon_Pics=[];
for (var i = 0 ; i < Num.icon_Default_Set ; i++){
icon_button_Text[i].text = UI.defaultName;
icon_button[i].text = 'Select Picture';
}
};
}//名前を全てリセット
{//CSV load
function csvFile (){
myCsvFile = new File();
var fileName = File.openDialog("Select csv file","");
if ( $ytLib.getPathName(fileName,2) == 'csv'){
myCsvFile= new File(fileName);
}
else{
alert('csvファイルを選択して下さい。');
myCsvFile = false;
}
return myCsvFile;
};
}//CSV load
}//==============================Functions==============================
{//============================== Method ==============================
{//全角半角の文字をカウント
function getLen(str){ //引数文字列
var result = 0;
for(var i=0;i<str.length;i++){
var chr = str.charCodeAt(i);
if((chr >= 0x00 && chr < 0x81) ||
(chr === 0xf8f0) ||
(chr >= 0xff61 && chr < 0xffa0) ||
(chr >= 0xf8f1 && chr < 0xf8f4)){
//半角文字の場合は1を加算
result += 1;
}else{
//それ以外の文字の場合は2を加算
result += 2;
}
}
//結果を返す
return result;
};
}//全角半角の文字をカウント
{//文字列を制限して末尾に...を追加する
function textOvershort(target,n){
var resultStr = '';
var tempArray = [];
var count = 0 ;
for (var i = 0 ; i < target.length ; i ++){
count = count + getLen(target[i]);
if (count <= n){
tempArray.push(new Array (target[i]))
}else{
tempArray.push('...')
break ;
}
}
resultStr = resultStr + tempArray.toString().replace(/,/g,'')
return resultStr;
};
}//文字列を制限して末尾に...を追加する
function arrCheck (target){
for (var i = 0 ; i < target.length ; i ++ ){
for ( var j = 0 ; j <target[i].length ; j ++){
//~ $.writeln('['+i+']['+j+']'+target[i][j]);
}
}
}
function arrCheck1 (target){
for (var i = 0 ; i < target.length ; i ++ ){
//~ $.writeln('['+i+']'+target[i]);
}
}
function icon_Pics_check(){
for ( var i = 0 ; i < Num.icon_Default_Set ; i++){
//~ $.writeln('icon_Pics['+i+']='+icon_Pics[i])
}
}
}//============================== Method ==============================
{//============================== AE 変数 ==============================
var AeName ={
commonFolder : new Object(),
soundFolder : '_sounds',
image : '_images',
};
var AeObj = {
soundFolderObj : new Object(),
imageFolderObj : new Object(),
backgroundObj : new Object(),
overRayObj : new Object(),
};
var soundFile ={
receive : new Object(),
send : new Object(),
information : new Object(),
};
var AeComp = {
Final : new Object(),
}
var AeFolder = {
main : new Object(),
comp : new Object(),
Final : new Object(),
msg : new Object(),
icon : new Object(),
};
var common = {
shortSpel : 30 ,
shortSpel01 : 15 ,
textSpeed : 0.2,
};
var padding = {
grp1: 55 ,
grp3 : 12, //アイコンの位置 パディング
grp5 : 130, //名前レイヤーのパディング
ShapeL: 150, //左からのmargin★
text_Rect_margin : 60 ,
Top : 5 ,
ShapeR : 50, //左からのmargin★
roundness : 40,//contents areaの角丸
arrow : 30,
ArrowR :30, //コメントシェイプのパディング(自分)
tlm :10, //time layer margin
};
var icon_Pics = [] ;//アイコン用の配列
var bg_pics = new File();//背景
var personsFolder = [];
var icon_pics_Obj_Path = [];
var AE_sound_Path = [];
var AE_sound_Obj = [];
var personName =[] ; //名前
var icon_Comp_Obj = [];
var resultDateArray = [] ;//投稿時間
var fSize = {
timeline : Number (45),
name : Number (30),
infomation : Number (35),
kidoku : Number (30),
title :Number (57),
};
var fill = {
color1: $ytLib.Color ('FFFFFF'),
color2 :$ytLib.Color ('000000'),
bgComp: $ytLib.Color ('6E9E82'),
myMassage :$ytLib.Color( 'B2ED8B'),
infomation: $ytLib.Color('365177'),
receive : $ytLib.Color ('FFFFFF'),
}
var fontF = {
main: String ("rounded-l-mplus-2p-medium"),
info :String ("GenShinGothic-Heavy"),
}
}//============================== AE 変数 ==============================
{//============================== AE expression ==============================
var expression = new Object();
expression.position = String(
'var CinLNum = thisComp.numLayers;\
var myIndexNum = thisLayer.index;\
var firstposition = 260;\
var bottomPosition = 1750;\
var pad = 25;\
\
for ( var i = myIndexNum ; i <= CinLNum ; i++){\
try{\
var layerRefer = thisComp.layer(i+1);\
var check = layerRefer.name.split(/\\\s+/)[0];\
if ( check == \'msg\' && layerRefer.active){\
var temp = layerRefer.height/2;\
var x = thisLayer.width/2;\
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;\
[x,y]\
break;\
}\
}\
catch (e){\
e \
}\
if (xxx() > bottomPosition-pad ){\
[thisLayer.width/2,firstposition+bottomPosition -xxx()]\
}\
else{\
[thisLayer.width/2,firstposition+thisLayer.height/2]\
}\
}\
function xxx(){\
var temp = 0;\
for ( var i = myIndexNum ; i >= 1 ; i--){\
var layerRefer = thisComp.layer(i);\
var check = layerRefer.name.split(/\\\s+/)[0];\
if ( check == \'msg\' && layerRefer.active){\
temp = temp + layerRefer.height+ pad;\
}\
}\
return temp+firstposition/2+pad*2;\
}'
);
expression.rect = String (
'var CinLNum = thisComp.numLayers;\
var result ;\
\
for ( var i = 1 ; i <= CinLNum ; i++ ){\
try{\
var layerRefer = thisComp.layer(i);\
var check = layerRefer.name.split(/\\\s+/)[0];\
if ( check == \'target\' ){\
result = i;\
break;\
}\
}\
catch ( e ){\
e\
} \
}\
result\
\
pad = '+padding.text_Rect_margin+';\
src = thisComp.layer(result)//テキストレイヤーを指定\
box = src.sourceRectAtTime(time - src.inPoint);\
[box.width+pad,box.height+pad]'
);
expression.timeLayer = String (
'src = thisLayer;\
box = src.sourceRectAtTime(src.inPoint)\
x = value[0];\
y=thisComp.height-box.height;\
[x,y]'
);
}//============================== AE expression ==============================
{//============================== AE Actions ==============================
function Ae(){
addFolders();
addComps();
loadImage(icon_Pics);
get_Name();
create_Icon_Comp();
//⑦サウンドファイルをインポートしてオブジェクトにいれる。
if (sound_Setting_Checkbox.value){
soundInAEObj();
}
loadImageBG(bg_pics);
timeSetting(); //ランダム時間か指定時間で時間を作る
msg();
overRayImport();
title();
AeComp.Final.openInViewer()
}
}//============================== AE Actions ==============================
{//============================== AE Functions ==============================
//フォルダを作成
function addFolders(){
//①フォルダ作成
AeFolder.main = app.project.items.addFolder(decodeURI($ytLib.getPathName(myCsvFile,1)));
//②音源の設定がオンであればサウンドフォルダを作成
if ( sound_Setting_Checkbox.value ){
AeObj.soundFolderObj = app.project.items.addFolder(AeName.soundFolder);
AeObj.soundFolderObj.parentFolder = AeFolder.main;
}
//compフォルダの作成
(function compFolder(){
AeFolder.comp = app.project.items.addFolder('_Comp');
AeFolder.comp.parentFolder = AeFolder.main;
})();
//Finalフォルダの作成
(function FinalFolder(){
AeFolder.Final = app.project.items.addFolder('_Final');
AeFolder.Final.parentFolder = AeFolder.comp;
})();
//msgフォルダの作成
(function msgFolder(){
AeFolder.msg = app.project.items.addFolder('_msg');
AeFolder.msg.parentFolder = AeFolder.comp;
})();
//msgフォルダの作成
(function iconFolder(){
AeFolder.icon = app.project.items.addFolder('_icon');
AeFolder.icon.parentFolder = AeFolder.comp;
})();
(function imgFolder (){
AeObj.imageFolderObj= app.project.items.addFolder(AeName.image);
AeObj.imageFolderObj.parentFolder = AeFolder.main;
})();
}
//コンポジションを作成
function addComps(){
AeComp.Final = app.project.items.addComp(decodeURI($ytLib.getPathName (myCsvFile,1))+"_final",1080,1920,1.0,600,30);
AeComp.Final.parentFolder = AeFolder.Final;
}
function loadImage(target){//アイコン写真をインポートしてAEオブジェクトをicon_pics_Obj_Pathに配列
icon_pics_Obj_Path = [];
for ( var i = 0 ; i < target.length ; i ++ ){
var imp = new ImportOptions();
imp.file = new File(target[i]);
var myFiles = app.project.importFile(imp);
myFiles.parentFolder=AeObj.imageFolderObj;
icon_pics_Obj_Path.push(myFiles);
}
}
function get_Name(){//名前を配列
personName =[] ;
for ( var i = 7 ; i < csv[2].length-1 ; i++){
if (csv[2][i] !== ''){
personName.push(csv[2][i]);
}
}
}
function create_Icon_Comp(){
icon_Comp_Obj = [];
for ( var i = 0 ; i < personName.length ; i ++){
icon_Comp_Obj.push ( app.project.items.addComp(personName[i]+'_Icon',100,100,1.0,600,30));
icon_Comp_Obj[i].parentFolder= AeFolder.icon;
var picsLayer = icon_Comp_Obj[i].layers.add(icon_pics_Obj_Path[i]);
//コンポジションい入ったimgのスケールを設定
var pics_Scall =picsLayer.property("ADBE Transform Group").property("ADBE Scale");
pics_Scall.setValue([fixSize(icon_Comp_Obj[i],picsLayer)[0],fixSize(icon_Comp_Obj[i],picsLayer)[1]]);
shapeEllipse_Setting(icon_Comp_Obj[i],icon_Comp_Obj[i].width);
picsLayer.trackMatteType = TrackMatteType.ALPHA;
}
}
function loadImageBG(target){//アイコン写真をインポートしてAEオブジェクトをicon_pics_Obj_Pathに配列
var imp = new ImportOptions();
imp.file = new File(target);
AeObj.backgroundObj = app.project.importFile(imp);
AeObj.backgroundObj.parentFolder=AeObj.imageFolderObj;
AeComp.Final.layers.add(AeObj.backgroundObj);
}
function overRayImport(){
var overRayPaty;
try{
overRayPaty = new File (thisFolderPath+'/youtool_common/line/overray.png');
var imp = new ImportOptions();
imp.file = new File(overRayPaty);
AeObj.overRayObj = app.project.importFile(imp);
AeObj.overRayObj.parentFolder=AeObj.imageFolderObj;
AeComp.Final.layers.add(AeObj.overRayObj);
}
catch(e){
alert('オーバーレイ画像が見つかりません。\rオーバーレイ画像を選択するか'+decodeURI(thisFolderPath)+'/youtool_common/line/フォルダにoverray.pngを追加して下さい。')
overRayPaty = FileOpen ('オーバーレイ画像を選択して下さい');
var imp = new ImportOptions();
imp.file = new File(overRayPaty);
AeObj.overRayObj = app.project.importFile(imp);
AeObj.overRayObj.parentFolder=AeObj.imageFolderObj;
AeComp.Final.layers.add(AeObj.overRayObj);
}
}
function soundImport(target){
var imp = new ImportOptions();
imp.file = new File(target);
var temp = app.project.importFile(imp);
temp.parentFolder=AeObj.soundFolderObj;
return temp;
}
function soundInAEObj(){
try{
soundFile.receive = soundImport(AE_sound_Path[0]);
soundFile.send = soundImport(AE_sound_Path[1]);
soundFile.information = soundImport(AE_sound_Path[2]);
}catch (e){}
}
function finalComp(){
AeComp.Final = app.project.items.addComp(decodeURI($ytLib.getPathName (myCsvFile,1))+"_final",1080,1920,1.0,600,30);
}
function msg(){
{//関数内変数
var count = 0 ;
var inTime = 0 ;
var msgComp;
var CompTitle ;
var msgCompInFinalComp;
var AE_Icon_Obj;
var NameLayer;
var NameLayerSize;
var NameLayerSizeH;
var massageLayer;
var msgLayerSize;
var msgLayerSizeH;
var shapeLayer;
var shapeLayerSize;
var arrowLayer;
var arrowLayerSize;
var mySound;
var txtlength = [0];
var msgLayerSizeW;
var msgLayerSizeH;
var arrowLayer;
var kidokuTextLayer;
var timeLayer;
var timeLayerSize;
}
for ( var i = 0 ; i < csv.length ; i++ ){
for ( var j = 0 ; j < csv[i].length ; j ++ ){
if (csv[i][j] !== '' && csv[i][0] !=='※'){
if ( i >= 3 && j >= 7){
if ( j < csv[i].length-1 ){
//~ $.writeln('相手ののメッセージ='+csv[i][j]);
count = count +1;
CompTitle = 'msg / ' +zeropaddingNum(csv,count)+ '_'+csv[i][j];
msgComp = app.project.items.addComp(textOvershort(CompTitle,common.shortSpel),1080,100,1.0,600,30);
//NameLayerテキストレイヤー
NameLayer = msgComp.layers.addText(personName[(j-8)]);
textLayerSetting (msgComp,NameLayer,fSize.name,fill.color1,fontF.main);//フォントサイズ+塗+フォントファミリー+アンカーポイント
NameLayerSize = $ytLib.get_layer_size(msgComp,NameLayer);
NameLayer.property("ADBE Transform Group").property("ADBE Position").setValue([NameLayerSize[0]/2+padding.grp5,NameLayerSize[1]/2]); //名前レイヤーの位置変更
NameLayerSizeH = layerheight(msgComp,NameLayer);
//msgテキストレイヤー
massageLayer = msgComp.layers.addText(textNumSplit(csv[i][j],28)); //一行15文字でテキストレイヤーを追加
massageLayer.name = 'target / '+textOvershort(csv[i][j],common.shortSpel01);
textLayerSetting (msgComp,massageLayer,fSize.timeline,fill.color2,fontF.main);
msgLayerSize = $ytLib.get_layer_size(msgComp,massageLayer);
msgLayerSizeH = layerheight(msgComp,massageLayer)
massageLayer.property("ADBE Transform Group").property("ADBE Position").setValue([msgLayerSize[0]/2+padding.ShapeL+(padding.text_Rect_margin/2),(msgLayerSize[1]/2)+NameLayerSizeH+padding.Top+(padding.text_Rect_margin/2)]);
//コンポジションのサイズを変更
msgComp.height = Math.floor(layerheight(msgComp,massageLayer)+padding.text_Rect_margin);
//シェイプレイヤー作成
shapeLayer = msgComp.layers.addShape(); // adding shape layer
shapeRect_Setting(msgComp,shapeLayer,fill.receive);
shapeLayerSize = $ytLib.get_layer_size(msgComp,shapeLayer);
shapeLayer.property("ADBE Transform Group").property("ADBE Position").setValue([shapeLayerSize[0]/2+padding.ShapeL,(shapeLayerSize[1]/2)+NameLayerSizeH+padding.Top]);
//矢印
arrowLayer = msgComp.layers.addShape();
shapeArrow(msgComp,arrowLayer,1);
arrowLayerSize = $ytLib.get_layer_size(msgComp,arrowLayer);
arrowLayer.property("ADBE Transform Group").property("ADBE Position").setValue([arrowLayerSize[0]+icon_Comp_Obj[j-8].width+15,(arrowLayerSize[1]/2)+padding.arrow]);//arrowの位置設定
//時間のテキストレイヤー
timeLayer = msgComp.layers.addText(resultDateArray[i-3]);
textLayerSetting (msgComp,timeLayer,fSize.name,fill.color1,fontF.main);//フォントサイズ+塗+フォントファミリー+アンカーポイント
timeLayerSize = $ytLib.get_layer_size(msgComp,timeLayer);
timeLayer.property("ADBE Transform Group").property("ADBE Position").setValue([msgLayerSize[0]+padding.ShapeL+timeLayerSize[0]+padding.tlm,msgLayerSize[1]]);
timeLayer.property("ADBE Transform Group").property("ADBE Position").expression = expression.timeLayer;
//最終コンポジションの高さ再設定
msgComp.height = Math.floor(NameLayerSizeH+shapeLayerSize[1]+padding.Top )//コンポジションのサイズを変更
//音声ファイルの追加
if (sound_Setting_Checkbox.value){//着信音を設定するにチェックが入っていたら
try{
mySound = msgComp.layers.add(soundFile.receive);
mySound.moveToEnd();
}
catch (e){
}
}
}
else{
count = count +1;
//~ $.writeln('自分のメッセージ='+csv[i][j])
CompTitle = 'msg / ' +zeropaddingNum(csv,count)+ '_'+csv[i][j];
msgComp = app.project.items.addComp(textOvershort(CompTitle,common.shortSpel),1080,100,1.0,600,30);
//msgテキストレイヤー=====================================================================================================================================
massageLayer = msgComp.layers.addText(textNumSplit(csv[i][j],28)); //一行15文字でテキストレイヤーを追加
massageLayer.name = 'target / '+textOvershort(csv[i][j],common.shortSpel);
textLayerSetting (msgComp,massageLayer,fSize.timeline,fill.color2,fontF.main);//テキスト属性の変更 テキストレイヤー作成直後とシェイプレイヤーを作成する前に適用
msgLayerSize = $ytLib.get_layer_size(msgComp,massageLayer)+[padding.grp1,padding.grp1];
msgLayerSizeW = layerWidth(msgComp,massageLayer);
msgLayerSizeH = layerheight(msgComp,massageLayer);
massageLayer.property("ADBE Transform Group").property("ADBE Position").setValue([msgComp.width-(msgLayerSizeW/2)-padding.ShapeR-(padding.text_Rect_margin/2),(msgLayerSizeH/2)+(padding.text_Rect_margin/2)]);
//コンポジションのサイズを変更
msgComp.height = Math.floor(layerheight(msgComp,massageLayer)+padding.text_Rect_margin);
//シェイプレイヤー作成
shapeLayer = msgComp.layers.addShape(); // adding shape layer
shapeRect_Setting(msgComp,shapeLayer,fill.myMassage);
shapeLayerSize = $ytLib.get_layer_size(msgComp,shapeLayer);
shapeLayer.property("ADBE Transform Group").property("ADBE Position").setValue([msgComp.width-(shapeLayerSize[0]/2)-padding.ShapeR,(shapeLayerSize[1]/2)]);
//矢印
arrowLayer = msgComp.layers.addShape();
shapeArrow(msgComp,arrowLayer,2);
arrowLayerSize = $ytLib.get_layer_size(msgComp,arrowLayer);
arrowLayer.property("ADBE Transform Group").property("ADBE Position").setValue([msgComp.width-arrowLayerSize[0]-15,padding.ArrowR]);//arrowの位置設定
//既読テキストレイヤー
kidokuTextLayer = msgComp.layers.addText('既読');
textLayerSetting(msgComp,kidokuTextLayer,fSize.kidoku,fill.color1,fontF.main);
var kidokuTextLayerW = layerWidth(msgComp,kidokuTextLayer);
var kidokuTextLayerH = layerheight(msgComp,kidokuTextLayer);
var resultKidokuPosX = msgComp.width-msgLayerSizeW-padding.ShapeR-(padding.text_Rect_margin/2)-kidokuTextLayerW-10;
var resultKidokuPosY = msgComp.height-kidokuTextLayerH/2;
kidokuTextLayer.property("ADBE Transform Group").property("ADBE Position").setValue([resultKidokuPosX,resultKidokuPosY]);
kidokuTextLayer.startTime = csv[i][j].length*0.1;
//時間のテキストレイヤー
timeLayer = msgComp.layers.addText(resultDateArray[i-3]);
textLayerSetting (msgComp,timeLayer,fSize.name,fill.color1,fontF.main);//フォントサイズ+塗+フォントファミリー+アンカーポイント
var timeLayerW = layerWidth(msgComp,timeLayer);
var timeLayerH = layerheight(msgComp,timeLayer);
var resulttimeLayerPosX = msgComp.width-msgLayerSizeW-padding.ShapeR-padding.text_Rect_margin-(timeLayerW/2)-10;
var resulttimeLayerPosY = msgComp.height-timeLayerH/2;
timeLayer.property("ADBE Transform Group").property("ADBE Position").setValue([resulttimeLayerPosX,resulttimeLayerPosY-50]);
if (sound_Setting_Checkbox.value){//着信音を設定するにチェックが入っていたら
try{
mySound = msgComp.layers.add(soundFile.send);
mySound.moveToEnd();
}
catch (e){
}
}
}
//共通の設定
msgComp.parentFolder=AeFolder.msg;
msgCompInFinalComp = AeComp.Final.layers.add(msgComp);
msgCompInFinalComp.property("ADBE Transform Group").property("ADBE Position").expression = expression.position;
if ( j != csv[i].length-1){//アイコンのコンプを入れる
AE_Icon_Obj = msgComp.layers.add(icon_Comp_Obj[j-8]);
//AE_Icon_Obj.property("ADBE Transform Group").property("ADBE Position").setValue([msgComp.width/2+padding.grp3,msgComp.height/2]);//アイコンの位置設定
AE_Icon_Obj.property("ADBE Transform Group").property("ADBE Position").setValue([AE_Icon_Obj.width/2+padding.grp3,AE_Icon_Obj.height/2]);//アイコンの位置設定
}
//文字数をプッシュ
txtlength.push(csv[i][j].length)
//~ $.writeln (txtlength)
//時間の追加
inTime = inTime+ Number ( csv[i][2] ) +(txtlength[i-3]*common.textSpeed);
msgCompInFinalComp.startTime = inTime;
}
}
else if (csv[i][j] !== '' && j == 7){
//共通の設定
count = count +1;
//~ $.writeln('コメントです='+csv[i][7])
CompTitle = 'msg / ' +zeropaddingNum(csv,count)+ '_'+csv[i][j];
msgComp = app.project.items.addComp(textOvershort(CompTitle,common.shortSpel),1080,100,1.0,600,30);
//msglayer
massageLayer = msgComp.layers.addText(textNumSplit(csv[i][j],36));
massageLayer.name = 'target / '+textOvershort(csv[i][j],common.shortSpel);
textLayerSetting (msgComp,massageLayer,fSize.timeline,fill.color1,fontF.main);//テキスト属性の変更 テキストレイヤー作成直後とシェイプレイヤーを作成する前に適用
msgLayerSize = $ytLib.get_layer_size(msgComp,massageLayer)+[padding.grp1,padding.grp1];
msgComp.height = Math.floor(layerheight(msgComp,massageLayer)+padding.text_Rect_margin)//コンポジションのサイズを変更
massageLayer.property("ADBE Transform Group").property("ADBE Position").setValue([msgComp.width/2,msgComp.height/2]);
//シェイプレイヤー作成
shapeLayer = msgComp.layers.addShape(); // adding shape layer
shapeRect_Setting(msgComp,shapeLayer,fill.infomation);
msgComp.parentFolder=AeFolder.msg;
msgCompInFinalComp = AeComp.Final.layers.add(msgComp);
msgCompInFinalComp.property("ADBE Transform Group").property("ADBE Position").expression = expression.position;
inTime = inTime+ Number ( csv[i][1] ) +(txtlength[i-3]*common.textSpeed);
//文字数をプッシュ
txtlength.push(csv[i][j].length)
//~ $.writeln (txtlength)
//時間の追加
msgCompInFinalComp.startTime = inTime;
//~ =======================================
if (sound_Setting_Checkbox.value){//着信音を設定するにチェックが入っていたら
try{
mySound = msgComp.layers.add(soundFile.information);
mySound.moveToEnd();
}
catch (e){
}
}
//~ =======================================
}
}
}
}
//コメントの投稿時間を配列に入れる。
function timeSetting(){
date = new Date(); // CreateTime
if ( !time_Setting_Checkbox.value ){//random
date.setHours ( Math.round( Math.random()*23 ))
date.setMinutes ( Math.round( Math.random()*60 ))
}
else{//fix
date.setHours (time_Setting_Etxt_hours.text)
date.setMinutes ( Math.round( Math.random()*60 ))
}
var resultTimeStompArray = [] ;
for ( var i = 0 ; i < csv.length ; i++ ){
for ( var j = 0 ; j < csv[i].length ; j ++ ){
if ( i >= 3 && j == 6){
if (csv[i][j] == ""){
resultTimeStompArray.push( addminutes() )
}
else{
resultTimeStompArray.push(Number ( csv[i][j]) )
}
}
}
}
resultDateArray = [];
for ( var i = 0 ; i < resultTimeStompArray.length ; i++ ){
resultTime_Set(date,resultTimeStompArray[i]);
//~ $.writeln(date);
//~ $.writeln( resultTimeHours(date.getHours()) + ':' + ('0'+date.getMinutes()).slice(-2) )
resultDateArray.push( resultTimeHours(date.getHours()) + ':' + ('0'+date.getMinutes()).slice(-2) )
//~ $.writeln(resultDateArray[i]);
}
//関数
function addminutes(){
var min = Number ( csv[2][4] );
var max =Number ( csv[2][5] );
var random= Math.floor( Math.random() * (max - min+ 1 ) ) + min ;
return random;
}
//時間の追加
function resultTime_Set(targetDate,sum){
date.setHours( targetDate.getHours() );
date.setMinutes( targetDate.getMinutes()+sum );
return date;
}
//時間の表示を治す
function resultTimeHours (n){
var str01 = '';
if (n >= 12){
return str = '午後'+n % 12;
}
else{
return str = '午前'+n % 12;
}
return str01;
}
}
function title(){
var textLayer = AeComp.Final.layers.addText(textOvershort(csv[1][2],20));
textLayerSetting (AeComp.Final,textLayer,fSize.title,fill.color1,fontF.main)
//~ $.writeln(layerheight(AeComp.Final,textLayer));
var textWidth = layerWidth(AeComp.Final,textLayer);
var textheight = layerheight(AeComp.Final,textLayer);
textLayer.property("ADBE Transform Group").property("ADBE Position").setValue([textWidth/2+100,textheight/2+47]);
}
}//============================== AE Functions ==============================
{//============================== AE Method ==============================
//文字列を制限して末尾に...を追加する
//例)「私の名前は山田太郎です」という文字列を「私の名前は...」に変換する。
function textOvershort(target,n){
var resultStr = '';
var tempArray = [];
var count = 0 ;
for (var i = 0 ; i < target.length ; i ++){
count = count + getLen(target[i]);
if (count <= n){
tempArray.push(new Array (target[i]))
}else{
tempArray.push('...')
break ;
}
}
resultStr = resultStr + tempArray.toString().replace(/,/g,'')
return resultStr;
}
//配列ゼロパディング
function zeropaddingNum(targetArray,thisNum){
var zerocount = ''
var temp = String(targetArray.length);
var toNum = Number (temp.length);
for (var i = 0 ; i < toNum; i++ ){
zerocount = zerocount+'0';
}
return ( String ( zerocount + String ( thisNum ) ). slice(- (toNum+1) ) )
}
function textLayerSetting (targetComp,targetlayer,sizeNum,color,font){
var temp = targetlayer.property("ADBE Text Properties").property("ADBE Text Document").value;
temp.fontSize = sizeNum;
temp.fillColor = color;
temp.font = font;
temp.tracking = 0;
targetlayer.property("ADBE Text Properties").property("ADBE Text Document").setValue(temp);
anchorCenter(targetComp,targetlayer);//アンカーポイントをセンターへ
}
//アンカーポイントを真ん中に
function anchorCenter(targetComp,Layertext){
//小数点整理
function roundFloat(number) {
var _pow = Math.pow( 10 , 4 );
return Math.round( number * _pow ) / _pow;
}
var curTime = targetComp.time;
var myAnchor = Layertext.property("ADBE Transform Group").property("ADBE Anchor Point");
var tl = Layertext.sourceRectAtTime(curTime, false).left; //テキストの左側の座標 l
var tw =Layertext.sourceRectAtTime(curTime, false).width; //テキストの全体の幅 b
var tt = Layertext.sourceRectAtTime(curTime, false).top;//テキスト上の座標 c
var th = Layertext.sourceRectAtTime(curTime, false).height; //テキスト全体の高さ d
var setX=roundFloat((tw/2)+tl);
var setY=roundFloat((th/2)+tt);
var setA = myAnchor.setValue([setX,setY]);
}
//テキストレイヤーのhaightを取得
function layerheight(targetComp,target){
var curTime = targetComp.time;
var temp = target.sourceRectAtTime(curTime, false).height;
var _pow = Math.pow( 10 , 4 );
return Math.round( temp * _pow ) / _pow;
}
//テキストレイヤーのwidthを取得
function layerWidth(targetComp,target){
var curTime = targetComp.time;
var temp = target.sourceRectAtTime(curTime, false).width;
var _pow = Math.pow( 10 , 4 );
return Math.round( temp * _pow ) / _pow;
}
//テキスト折り返し
function textNumSplit(target,n){
var resultStr = '';
var tempArray;
var temp = target.split(/\r\n|\n|\r/);
for ( var i = 0 ; i < temp.length ; i++ ){
var count = 0 ;
tempArray = [];
for ( var j = 0 ; j < temp[i].length ; j++){
count = count + getLen(temp[i][j]);
tempArray.push(new Array ( temp[i][j]) );
if ( count > n){
tempArray.push(new Array ( '\r' ) );
count = 0 ;
}
}
resultStr = resultStr + tempArray.toString().replace(/,/g,'')+"\r";
}
return resultStr;
}
//シェイプレイヤーを作成
function shapeRect_Setting(targetcomp,target,color){
target.name = "contentsArea"; // name the shape layer
var shapeGroup1 = target.property("Contents").addProperty("ADBE Vector Group"); // creating a group1
shapeGroup1.name = "contentsArea"; //name the group1
var shapeRect = shapeGroup1.property("Contents").addProperty("ADBE Vector Shape - Rect").property("ADBE Vector Rect Size"); // adding rectangle to the group1
var rectFill = shapeGroup1.property("Contents").addProperty("ADBE Vector Graphic - Fill");
var fill_Color = rectFill.property("ADBE Vector Fill Color").setValue(color);
var rectSize = target.property("ADBE Root Vectors Group").property("ADBE Vector Group").property("ADBE Vectors Group").property("ADBE Vector Shape - Rect").property("ADBE Vector Rect Size");
var roundness = target.property("ADBE Root Vectors Group").property("ADBE Vector Group").property("ADBE Vectors Group").property("ADBE Vector Shape - Rect").property("ADBE Vector Rect Roundness");
roundness.setValue(padding.roundness);
rectSize.expression = expression.rect;
target.moveToEnd();
}
//吹き出しの矢印
function shapeArrow(targetComp,target,direction){//direction 1 = Right 2=Left
// create a new shape layer with path and stroke
target.name = "arrow"; // name the shape layer
myShapeGroup = target.property("ADBE Root Vectors Group"); // select the vector shapes PropertyGroup object
myShapeGroup.addProperty("ADBE Vector Shape - Group"); // add a path
var color = myShapeGroup.addProperty("ADBE Vector Graphic - Fill"); // add a fill
// create a temporary shape object and set the values
var myShape = new Shape();
if (direction == 1){
myShape.vertices = [[-19.5,-16],[19.5,-8],[18.5,16]];
myShape.inTangents = [[1.10491943359375,26.583984375],[-7.00799560546875,-0.3436279296875],[0,0]];
myShape.outTangents = [[15.9326171875,12.5942993164063],[0,19.0562133789063],[0,0]];
color.property("ADBE Vector Fill Color").setValue(fill.color1);
}
else{
myShape.vertices = [[19.5,-16],[-19.5,-8],[-18.5,16]];
myShape.inTangents = [[-1.10491943359375,26.583984375],[7.00799560546875,-0.3436279296875],[0,0]];
myShape.outTangents = [[-15.9326171875,12.5942993164063],[0,19.0562133789063],[0,0]];
color.property("ADBE Vector Fill Color").setValue(fill.myMassage);
}
myShape.closed = true;
// set the value of the path too the shape object
myShapeGroup.property(1).property("ADBE Vector Shape").setValue(myShape);
target.moveToEnd();
}
//時間作成
function myDate(flag,hour){//引数はUIパネルから
if ( !flag ){//random
date.setHours ( Math.round( Math.random()*23 ))
date.setMinutes ( Math.round( Math.random()*60 ))
}
else{//fix
date.setHours (hour)
date.setMinutes ( Math.round( Math.random()*60 ))
}
}
function fixSize(targetComp,targetPics){
var setw = targetComp.width/targetPics.width*100;
var seth = targetComp.height/targetPics.height*100;
if (targetPics.width > targetPics.height){
return [seth,seth];
}
else if(targetPics.width < targetPics.height){
return [setw,setw];
}
else if (targetPics.width == targetPics.height){
return [setw,setw];
}
}
function shapeEllipse_Setting(targetcomp,SizeValue){
var shapeLayer = targetcomp.layers.addShape(); // adding shape layer
shapeLayer.name = "alph"; // name the shape layer
var shapeGroup1 = shapeLayer.property("Contents").addProperty("ADBE Vector Group"); // creating a group1
shapeGroup1.name = "contentsArea"; //name the group1
var shapeRect = shapeGroup1.property("Contents").addProperty("ADBE Vector Shape - Ellipse").property("ADBE Vector Ellipse Size"); // adding rectangle to the group1
var EllipseFill = shapeGroup1.property("Contents").addProperty("ADBE Vector Graphic - Fill");
var EllipseSize = shapeLayer.property("ADBE Root Vectors Group").property("ADBE Vector Group").property("ADBE Vectors Group").property("ADBE Vector Shape - Ellipse").property("ADBE Vector Ellipse Size");
EllipseSize.setValue([SizeValue,SizeValue])
}
}//============================== AE Method ==============================