選択したものを表のようにあつかうため?のクラス(多方向対応/インデザイン・イラストレーター対応版)

うまく説明できないけど、多分便利だと思います。
インデザインイラストレーター両方で動きま〜す。


サンプル用の書類はこんな感じ。


右上原点:右上から左下へ順番に処理。

/*
#includepath 'path of lib'
*/
#include 'hvg.js';

i = 1;
hvg(app.activeDocument.selection,1).each(function(a){
a.contents = i.toString();
i++;
});


左上原点:左上から右下へ順番に処理。

/*
#includepath 'path of lib'
*/
#include 'hvg.js';
var x = 
i = 1;
hvg(app.activeDocument.selection,0).each(function(a){
a.contents = i.toString();
i++;
});

書き直したスクリプト本体はこちら。

//
var hvg = function(sel,LN){
//sel object
//LN  0:横,1:縦......
    return new hvg.prototype.init(sel,LN);
}
hvg.fn = hvg.prototype  = {
    'init'  :     function (sel,LN){
    if(typeof sel == 'undefined'){
        sel = app.activeDocument.selection;
    }
    if(sel.length == 0){
        alert ("please select something");
        return {'getItems' : function(){}, 'next': function(){} ,'each': function(){}};
    }
            this.group = [];
            //$.writeln(app.name);
            this.p_x = 0;
            this.p_y = 0;
            var slen = sel.length;
            var hl = new Number();
            var grouping = new Array();
            //layout pattern 
            var LN = typeof LN == 'number' ? LN  : 0;
            var getOrder = function(num){
            switch(num){
                case 0 : return function(a,b){return b.geometricBounds[1] - a.geometricBounds[1];}  // ai sort top
                case 1 : return function(a,b){return a.geometricBounds[0] - b.geometricBounds[0];}  // ai sort left
                case 2 : return function(a,b){return a.geometricBounds[1] - b.geometricBounds[1];}  // ai sort bottom
                case 3 : return function(a,b){return b.geometricBounds[0] - a.geometricBounds[0];}  // ai sort right
                
                case 4 : return function(a,b){return a.geometricBounds[0] - b.geometricBounds[0];} //indd sort top
                case 5 : return function(a,b){return a.geometricBounds[1] - b.geometricBounds[1];} //ind sort left
                case 6 : return function(a,b){return b.geometricBounds[0] - a.geometricBounds[0];} //indd sort bottom
                case 7 : return function(a,b){return b.geometricBounds[1] - a.geometricBounds[1];} //ind sort right
                default:
            switch(app.name){
                case 'Adobe Illustrator' : return getOrder(0);
                case 'Adobe InDesign' : return getOrder(4); 
            }
            };
            };
            var getgOrder = function(num){
            switch(num){
                case 0 : return function(a,b){return b['n'] - a['n'];}
                case 1 : return function(a,b){return a['n'] - b['n'];}    
                }
        }
            var getHlx = function(num){
            switch(num){
                case 0 : return function(x){return Math.abs(x.geometricBounds[1]-x.geometricBounds[3]);}
                case 1 : return function(x){return Math.abs(x.geometricBounds[2]-x.geometricBounds[0]);}
            }
        }
            var getGetIC = function(num){
            switch(num){
                case 0 : return function(x){return (x.visibleBounds[3]+x.visibleBounds[1])/2;}
                case 1 : return function(x){return (x.visibleBounds[2]+x.visibleBounds[0])/2;}
            }
        }
            
            //LayOut Pattern
            //ここを増していろんな方向に対応。
            //
            var layout = {
            'Adobe Illustrator' : [
            [1,0,0], //0:左上->右下
            [0,0,1], //1:右上->左下
            [3,0,0],
            [2,0,1],
                ],
            'Adobe InDesign' : [
            [5,1,1], //0:左上ー>右下
            [4,0,0], //1:右上->左下
            [7,1,1],
            [6,0,0],
                ]
                }
            
            switch(app.name){
            case 'Adobe Illustrator' :
            var order = getOrder(layout[app.name][LN][0]);
            var gorder = getgOrder(layout[app.name][LN][1]);
            var hlx = getHlx(layout[app.name][LN][2]);
            var getIC = getGetIC(layout[app.name][LN][2]);
            break;
            case 'Adobe InDesign' :
            var order = getOrder(layout[app.name][LN][0]);
            var gorder = getgOrder(layout[app.name][LN][1])
            var hlx = getHlx(layout[app.name][LN][2]);
            var getIC = getGetIC(layout[app.name][LN][2]);
            break;        
            };
            

    
        for(var i = 0; i <slen ; i++)hl += hlx(sel[i]);
        var hl = hl/slen;
        
        var test = function (x){
        var ic = getIC(x);
        for(var j = 0; j < grouping.length ; j ++){
        if(Math.abs(ic - grouping[j].n) < hl ){
        grouping[j].item.push(sel[i]);
        return;
        }
        }
        grouping.push({n :ic , item : [sel[i]]});
        return ;
        }

        for(var i = 0; i < slen ; i++)test(sel[i]);

        for(var i = 0; i < grouping.length; i++){
        temp = new Array();
        for(var j = 0; j < grouping[i].item.length;j++){temp.push(grouping[i].item[j])}
        grouping[i].item = temp.sort (order);
        }
        this.group = grouping.sort(gorder);
        return this;
        },
//get Item to X,Y position
    'getItem' :     function(y,x){
        try{
        return this.group[y].item[x];
        }catch(e){
        return false;    
        }
        },
    'next' :     function(){
            if(this.group[this.p_y].item.length > this.p_x){
        var get = this.getItem(this.p_y,this.p_x);
        this.p_x++;
            }else{
        this.p_y++;
        this.p_x = 0;
        if(this.group.length > this.p_y){
            var get = this.getItem(this.p_y,this.p_x);
            this.p_x++;
        }else{
            return false;
        }
            }
            return get;
        },
    'each' : function(fnc,args){
        var i;
        if(typeof fnc == 'function')while(i = this.next())fnc.call(i,i,args);
        this.p_x = 0;
        this.p_y = 0;
        return this;
       }
}
hvg.prototype.init.prototype = hvg.prototype;
//