写的不好啊,好多是 好久以前写的. 刚刚看了一下 优化了一下
PHP 代码:
//当前文档
var doc = app.activeDocument;
//被选中的图形
var arr = doc.selection;
//容差
var rc = 50;
//经过一系列计算 获取最终的列表
var fArr = sortRectList(arr,rc);
//画板自适应列表里面的图形
shapeListToArtboard(fArr);
/** 就像表格一样排序 */
function sortRectList(){
var finishaArr = new Array();
/**死循环 一排一排拿矩形
*拿了放在新的列表里面
*并且移除arr里面的元素
*直至arr里面的元素拿完 结束循环
*/
while(arr.length>0){
var rect = new Rect(arr);
// 取出最下面一排矩形 容差 50以内
var bottomList = new Array();
for(var i=0;i<arr.length;i++){
if(Math.abs(rect.minBottom-arr[i].geometricBounds[rect.bottom])<rc){
bottomList.push(arr[i]);
}
}
//从左至右 排序 最下面一排矩形
bottomList = sortArr(bottomList);
//把最下面一排 矩形放到 总的列表里面
for(var i=0;i<bottomList.length;i++){
finishaArr.push(bottomList[i]);
}
//删除原数组中 最下面一排矩形
for(var i=0;i<bottomList.length;i++){
for(var j=0;j<arr.length;j++){
if(bottomList[i].left==arr[j].left&&
bottomList[i].right==arr[j].right&&
bottomList[i].top==arr[j].top&&
bottomList[i].bottom==arr[j].bottom
){
arr.splice(j,1);
break;
}
}
}
}
return finishaArr;
}
/** 根据列表设置画板 */
function shapeListToArtboard(shapeList){
//删除画板
delArtboards();
for (i = shapeList.length - 1; i >= 0; i--) { //把选中的画板改成矩形
if (i != shapeList.length - 1) {
doc.artboards.add(shapeList[i].geometricBounds); //新增画板,位置等于矩形
} else {
doc.artboards[0].artboardRect = shapeList[i].geometricBounds; //第一个画板的坐标与尺寸等于第一个矩形
}
}
}
/**数组排序 */
function sortArr(arr2){
for(var i=0;i<arr2.length-1;i++){//确定轮数
for(var j=0;j<arr2.length-i-1;j++){//确定每次比较的次数
if(arr2[j].left<arr2[j+1].left){
tem = arr2[j];
arr2[j] = arr2[j+1];
arr2[j+1] = tem;
}
}
}
return arr2;
}
/**
* 删除画板
*/
function delArtboards(){
for (var i = doc.artboards.length - 1; i >= 1; i--) {
doc.artboards[i].remove();
}
}
/**
* 获取极限坐标 蒙版对象会错
* [MENTION=343005]para[/MENTION]m {图形列表 可以是你选中的图形 doc.selection} shapeList
* [MENTION=343005]para[/MENTION]m {bounds的下标} index
* [MENTION=343005]para[/MENTION]m {取最大值还是最小值 true 表示最大值 false表示最小值} minOrMax
* [MENTION=48433]return[/MENTION]s
*/
function getMaxPosition(shapeList,index,minOrMax){
var tempx = shapeList[0].geometricBounds[index];//第一个图形 的极限坐标
if(minOrMax){
for(i=1;i<shapeList.length;i++){
if(tempx<shapeList[i].geometricBounds[index]){
tempx = shapeList[i].geometricBounds[index];
}
}
}else{
for(i=1;i<shapeList.length;i++){
if(tempx>shapeList[i].geometricBounds[index]){
tempx = shapeList[i].geometricBounds[index];
}
}
}
return tempx;
}
/** 矩形类 */
function Rect(arr){
this.left = 0;
this.right = 2;
this.top = 1;
this.bottom = 3;
this.min = false;
this.max = true;
this.maxLeft = getMaxPosition(arr,this.left,this.min);
this.maxRight = getMaxPosition(arr,this.right,this.max);
this.maxTop = getMaxPosition(arr,this.top,this.max);
this.minBottom = getMaxPosition(arr,this.bottom,this.min);
}
这个 貌似不好改. 你下载一个画板增加 2mm的代码应该就可以了