[ID CC-CC2021] Как скриптом выровнять фрейм по ширине многострочного текста?

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
А можно поподробнее про действие на котором виснет
 

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Все, конечно, хорошо, но на разнодлинных абзацах он все равно неправильно считает...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
А сколько абзацев в вашем фрейме? И почему приложенный кусок кода только два первых проверяет?
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Покажите, что у Вас на данный момент получилось. Весь код.
 
  • Спасибо
Реакции: catpaw

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
я думаю он на чем-то другом умирает, например на бесконечном цикле или еще что. может у вас внешний со счетчиком i, а в нем еще один с i - как вариант. (сам так накалываюсь иногда)
Все, конечно, хорошо, но на разнодлинных абзацах он все равно неправильно считает...

а почему вы в принципе по абзацам считаете, а не по строкам?
 
  • Спасибо
Реакции: catpaw

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Покажите, что у Вас на данный момент получилось. Весь код.
JavaScript:
function main(){
var sel = app.activeDocument.selection[0];
if (app.activeDocument.selection[0].constructor.name == "TextFrame"){
//alert(app.activeDocument.selection[0].constructor.name)
var Frame  = sel;
} else {
if (app.activeDocument.selection[0].constructor.name == "Character"){
//alert(app.activeDocument.selection[0].textFrames[0].constructor.name);
var Frame  = app.activeDocument.selection[0].textFrames[0];
} else {
var Frame  = sel.parentTextFrames[0];
}
}
//
    var GB = Frame.geometricBounds;
    var HOff = Frame.texts[0].paragraphs[0].characters[-1].endHorizontalOffset;
    HOff  = HOff.toFixed(2); GB[3] = GB[3].toFixed(2);
    if ( Frame.texts[0].paragraphs[1].characters[-1].endHorizontalOffset < HOff ){
    HOff = Frame.texts[0].paragraphs[1].endHorizontalOffset; }
    Frame.geometricBounds = [GB[0],GB[1], GB[2], (2*HOff-GB[3])+.05 ];
    Frame.fit(FitOptions.FRAME_TO_CONTENT);
//
} //main

app.doScript(main,undefined,undefined,UndoModes.ENTIRE_SCRIPT);
 

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
я думаю он на чем-то другом умирает, например на бесконечном цикле или еще что. может у вас внешний со счетчиком i, а в нем еще один с i - как вариант. (сам так накалываюсь иногда)


а почему вы в принципе по абзацам считаете, а не по строкам?
просто у меня два маленьких абзаца. частный случай, но до общего я сама не доросла...
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
на разнодлинных абзацах он все равно неправильно считает
Это, похоже, потому, что у Вас условие, сравнивающее длину абзацев, с ног на голову перевёрнуто). Если, конечно, я правильно представил положение короткого и длинного абзацев с выключкой по центру.
 
  • Спасибо
Реакции: catpaw

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Это, похоже, потому, что у Вас условие, сравнивающее длину абзацев, с ног на голову перевёрнуто). Если, конечно, я правильно представил положение короткого и длинного абзацев с выключкой по центру.
а можно точное выравнивание таблицы щипать? У меня с этим кодом все, кажется, получилось...'sory'
JavaScript:
function main(){
var sel = app.activeDocument.selection[0];
if (app.activeDocument.selection[0].constructor.name == "TextFrame"){
//alert(app.activeDocument.selection[0].constructor.name)
var Frame  = sel;
} else {
         if (app.activeDocument.selection[0].constructor.name == "Character"){
//        alert(app.activeDocument.selection[0].textFrames[0].constructor.name);
         var Frame  = app.activeDocument.selection[0].textFrames[0];
          } else {
                   var Frame  = sel.parentTextFrames[0];
                    }
     }

//
     var maxLen = 0;
      var myLen = 0;
       var myLen1 = 0;
    var GB = Frame.geometricBounds;
     myT = Frame.lines;
         for (j=0;j<myT.length;j++){
              var ab = myT[j].insertionPoints[0].horizontalOffset;
               myLen = myT[j].insertionPoints[-1].horizontalOffset - ab;
             try{myLen1 = myT[j].insertionPoints[-2].horizontalOffset - ab;
            }catch(e2){myLen1 = 0;}
             if (myLen1>myLen){myLen=myLen1;}
              if (myLen>maxLen){maxLen = myLen;}
             }//for j

        Frame.geometricBounds = [GB[0],GB[1], GB[2], GB[1]+maxLen+.05 ];
        Frame.fit(FitOptions.FRAME_TO_CONTENT);
//

} //main

app.doScript(main,undefined,undefined,UndoModes.ENTIRE_SCRIPT);
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
  • Спасибо
Реакции: catpaw

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Сообразила, что Индиз при клике на маркер преодолевает overflow даже не вздрогнув, а скрипт сразу в крик...
Индиз что-то скрывает...
 

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Можно прорисовку отключить, например
 

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Сообразила, что Индиз при клике на маркер преодолевает overflow даже не вздрогнув, а скрипт сразу в крик...
Индиз что-то скрывает...
Добавила инструкцию для переполнений. Возможно в универсальном случае фрейм нужно увеличивать не на +1 а побольше.
JavaScript:
function main(){ 
var sel = app.activeDocument.selection[0]; 
if (app.activeDocument.selection[0].constructor.name == "TextFrame"){ 
var Frame  = sel; 
} else {
         if (app.activeDocument.selection[0].constructor.name == "Character"){ 
         var Frame  = app.activeDocument.selection[0].textFrames[0];
          } else {
                var Frame  = sel.parentTextFrames[0];
                }
     }
    var GB = Frame.geometricBounds;
    if (Frame.overflows) {
        Frame.geometricBounds = [GB[0],GB[1], GB[2]+1, GB[3]+1 ];
    }

//
     var maxLen = 0;
     var myLen = 0;
     var myLen1 = 0;
     myT = Frame.lines;
         for (j=0;j<myT.length;j++){
              var ab = myT[j].insertionPoints[0].horizontalOffset;
              myLen = myT[j].insertionPoints[-1].horizontalOffset - ab;
              try{myLen1 = myT[j].insertionPoints[-2].horizontalOffset - ab;
              }catch(e2){myLen1 = 0;}
              if (myLen1>myLen){myLen=myLen1;}
              if (myLen>maxLen){maxLen = myLen;}
             }//for j

        Frame.geometricBounds = [GB[0],GB[1], GB[2], GB[1]+maxLen+.05 ];
        Frame.fit(FitOptions.FRAME_TO_CONTENT);
//


//alert("All done... Maybe...", "Frame Fit");
} //main 

app.doScript(main,undefined,undefined,UndoModes.ENTIRE_SCRIPT);
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
 
  • Спасибо
Реакции: veretragna и Eugenyus