AE　去年作成したLINEのやりとり画面作成スクリプト

去年に作成したラインのやり取りアニメーションスクリプト公開しときます。
とりあえずコードだけアップしておきます。
CSVのフォーマットに記入するだけで、自動でラインのやり取りを作ってくれるやつです。

#line

```jsx
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 ==============================




```