Render.ru

Distribute Spacing для объектов с маской и внутри

#1
Выкладываю пару скриптов для "корректного" распределения объектов. Это аналог стандартной "Distribute Spacing", но она, как известно, при распределении учитывает содержимое под Clipping Mask. При применении же скриптов, если среди распределяемых объектов есть "маскированные", то в расчёт берётся только размер маски. Так же, не имеет значения, разгруппирован ли этот объект, или находится внутри друой группы (Compound Path и т.п...). Внимание: если выделена вся группа, то объектом для операции считается вся группа, а не отдельные объекты внутри неё.

// Распределение по горизонтали:
mySelection = activeDocument.selection;
function defWidth(obj){
if(obj.typename=='GroupItem'){
if(obj.clipped){
wi=obj.pageItems[0].width;
}else{
wi=obj.width;
}
}else{
wi=obj.width;
}
return wi;
}
function rightSide(obj){
if(obj.typename=='GroupItem'){
if(obj.clipped){
ri=obj.pageItems[0].position[0]+obj.pageItems[0].width;
}else{
ri=obj.position[0]+obj.width;
}
}else{
ri=obj.position[0]+obj.width;
}
return ri;
}
function leftSide(obj){
if(obj.typename=='GroupItem'){
if(obj.clipped){
left=obj.pageItems[0].position[0];
}else{
left=obj.position[0];
}
}else{
left=obj.position[0];
}
return left;
}
function positionLeft(a,b){
return leftSide(a)-leftSide(b);
}
function positionRight(a,b){
return rightSide(b)-rightSide(a);
}

if (mySelection.length>0){
if (mySelection instanceof Array){
ObjArr=new Array();
ObjArr=mySelection;
ObjArr.sort(positionRight);
second=ObjArr[0];
ObjArr.sort(positionLeft);
first=ObjArr[0];
len=leftSide(second)-rightSide(first);
SumWidths=0;
for(i=0;i<ObjArr.length;i++){
if((ObjArr!=first)&&(ObjArr!=second)){
SumWidths+=defWidth(ObjArr);
}
}
otr=(len-SumWidths)/(ObjArr.length-1);
for(i=1;i<(ObjArr.length);i++){
if((ObjArr!=first)&&(ObjArr!=second)){
difr=leftSide(ObjArr)-ObjArr.position[0];
q=i
if(ObjArr[i-1]==second){
q--;
}
ObjArr.position=Array((rightSide(ObjArr[q-1])+(otr-difr)),(ObjArr.position[1]));
}
}
}
}


//Распределение по вертикали
mySelection = activeDocument.selection;
function defHeight(obj){
if(obj.typename=='GroupItem'){
if(obj.clipped){
he=obj.pageItems[0].height;
}else{
he=obj.height;
}
}else{
he=obj.height;
}
return he;
}
function bottomSide(obj){
if(obj.typename=='GroupItem'){
if(obj.clipped){
bot=obj.pageItems[0].position[1]-obj.pageItems[0].height;
}else{
bot=obj.position[1]-obj.height;
}
}else{
bot=obj.position[1]-obj.height;
}
return bot;
}
function topSide(obj){
if(obj.typename=='GroupItem'){
if(obj.clipped){
top=obj.pageItems[0].position[1];
}else{
top=obj.position[1];
}
}else{
top=obj.position[1];
}
return top;
}
function positionTop(a,b){
return topSide(b)-topSide(a);
}
function positionBottom(a,b){
return bottomSide(a)-bottomSide(b);
}

if (mySelection.length>0){
if (mySelection instanceof Array){
ObjArr=new Array();
ObjArr=mySelection;
ObjArr.sort(positionBottom);
second=ObjArr[0];
ObjArr.sort(positionTop);
first=ObjArr[0];
len=bottomSide(first)-topSide(second);
SumHeights=0;
for(i=0;i<ObjArr.length;i++){
if((ObjArr!=first)&&(ObjArr!=second)){
SumHeights+=defHeight(ObjArr);
}
}
otr=(len-SumHeights)/(ObjArr.length-1);
for(i=1;i<(ObjArr.length);i++){
if((ObjArr!=first)&&(ObjArr!=second)){
difr=ObjArr.position[1]-topSide(ObjArr);
q=i;
if(ObjArr[i-1]==second){
q--;
}
ObjArr.position=Array((ObjArr.position[0]),(bottomSide(ObjArr[q-1])-(otr-difr)));
}
}
}
}
 
#2
Доделка. Теперь работает с группами любой глубины волженности


// Распределение по горизонтали:
mySelection = activeDocument.selection;
function defWidth(obj){
if(obj.typename=='GroupItem'){
width=0;
for(a=0;a<obj.groupItems.length;a++){
objIn=obj.groupItems[a];
if(objIn.clipped){
wi=objIn.pageItems[0].width;
}else{
wi=defWidth(objIn);
}
if(wi>width){
width=wi
}
}
}else{
wi=obj.width;
}
return width;
}
function rightSide(obj){
if(obj.typename=='GroupItem'){
right=obj.position[0];
for(a=0;a<obj.groupItems.length;a++){
objIn=obj.groupItems[a];
if(objIn.clipped){
ri=objIn.pageItems[0].position[0]+objIn.pageItems[0].width;
}else{
ri=rightSide(objIn)
}
if(ri>right){
right=ri
}
}
}else{
right=obj.position[0]+obj.width;
}
return right;
}
function leftSide(obj){
if(obj.typename=='GroupItem'){
left=obj.position[0]+obj.width;
for(a=0;a<obj.groupItems.length;a++){
objIn=obj.groupItems[a];
if(objIn.clipped){
le=objIn.pageItems[0].position[0];
}else{
le=leftSide(objIn);
}
if(le<left){
left=le
}
}
}else{
left=obj.position[0];
}
return left;
}
function positionLeft(a,b){
return leftSide(a)-leftSide(b);
}
function positionRight(a,b){
return rightSide(b)-rightSide(a);
}

if (mySelection.length>0){
if (mySelection instanceof Array){
ObjArr=new Array();
ObjArr=mySelection;
ObjArr.sort(positionRight);
second=ObjArr[0];
ObjArr.sort(positionLeft);
first=ObjArr[0];
len=leftSide(second)-rightSide(first);
SumWidths=0;
for(i=0;i<ObjArr.length;i++){
if((ObjArr!=first)&&(ObjArr!=second)){
SumWidths+=defWidth(ObjArr);
}
}
otr=(len-SumWidths)/(ObjArr.length-1);
for(i=1;i<(ObjArr.length);i++){
if((ObjArr!=first)&&(ObjArr!=second)){
difr=leftSide(ObjArr)-ObjArr.position[0];
q=i
if(ObjArr[i-1]==second){
q--;
}
ObjArr.position=Array((rightSide(ObjArr[q-1])+(otr-difr)),(ObjArr.position[1]));
}
}
}
}



//Распределение по вертикали
mySelection = activeDocument.selection;
function defHeight(obj){
if(obj.typename=='GroupItem'){
height=0;
for(a=0;a<obj.groupItems.length;a++){
objIn=obj.groupItems[a];
if(objIn.clipped){
he=objIn.pageItems[0].height;
}else{
he=defHeight(objIn)
}
if(he>height){
height=he
}
}
}else{
height=obj.height;
}
return height;
}
function bottomSide(obj){
if(obj.typename=='GroupItem'){
bottom=obj.position[1];
for(a=0;a<obj.groupItems.length;a++){
objIn=obj.groupItems[a];
if(objIn.clipped){
bot=objIn.pageItems[0].position[1]-objIn.pageItems[0].height;
}else{
bot=bottomSide(objIn)
}
if(bot<bottom){
bottom=bot
}
}
}else{
bottom=obj.position[1]-obj.height;
}
return bottom;
}
function topSide(obj){
if(obj.typename=='GroupItem'){
top=obj.position[1]-obj.height;
for(a=0;a<obj.groupItems.length;a++){
objIn=obj.groupItems[a];
if(objIn.clipped){
t=objIn.pageItems[0].position[1];
}else{
t=topSide(objIn)
}
if(t>top){
top=t
}
}
}else{
top=obj.position[1];
}
return top;
}
function positionTop(a,b){
return topSide(b)-topSide(a);
}
function positionBottom(a,b){
return bottomSide(a)-bottomSide(b);
}

if (mySelection.length>0){
if (mySelection instanceof Array){
ObjArr=new Array();
ObjArr=mySelection;
ObjArr.sort(positionBottom);
second=ObjArr[0];
ObjArr.sort(positionTop);
first=ObjArr[0];
len=bottomSide(first)-topSide(second);
SumHeights=0;
for(i=0;i<ObjArr.length;i++){
if((ObjArr!=first)&&(ObjArr!=second)){
SumHeights+=defHeight(ObjArr);
}
}
otr=(len-SumHeights)/(ObjArr.length-1);
for(i=1;i<(ObjArr.length);i++){
if((ObjArr!=first)&&(ObjArr!=second)){
difr=ObjArr.position[1]-topSide(ObjArr);
q=i;
if(ObjArr[i-1]==second){
q--;
}
ObjArr.position=Array((ObjArr.position[0]),(bottomSide(ObjArr[q-1])-(otr-difr)));
}
}
}
}
 
Сверху