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

  • Автор темы Автор темы catpaw
  • Дата начала Дата начала
А можно поподробнее про действие на котором виснет
 
Все, конечно, хорошо, но на разнодлинных абзацах он все равно неправильно считает...
 
А сколько абзацев в вашем фрейме? И почему приложенный кусок кода только два первых проверяет?
 
Покажите, что у Вас на данный момент получилось. Весь код.
 
  • Спасибо
Реакции: catpaw
я думаю он на чем-то другом умирает, например на бесконечном цикле или еще что. может у вас внешний со счетчиком i, а в нем еще один с i - как вариант. (сам так накалываюсь иногда)
Все, конечно, хорошо, но на разнодлинных абзацах он все равно неправильно считает...

а почему вы в принципе по абзацам считаете, а не по строкам?
 
  • Спасибо
Реакции: catpaw
Покажите, что у Вас на данный момент получилось. Весь код.
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);
 
я думаю он на чем-то другом умирает, например на бесконечном цикле или еще что. может у вас внешний со счетчиком i, а в нем еще один с i - как вариант. (сам так накалываюсь иногда)


а почему вы в принципе по абзацам считаете, а не по строкам?
просто у меня два маленьких абзаца. частный случай, но до общего я сама не доросла...
 
на разнодлинных абзацах он все равно неправильно считает
Это, похоже, потому, что у Вас условие, сравнивающее длину абзацев, с ног на голову перевёрнуто). Если, конечно, я правильно представил положение короткого и длинного абзацев с выключкой по центру.
 
  • Спасибо
Реакции: catpaw
Это, похоже, потому, что у Вас условие, сравнивающее длину абзацев, с ног на голову перевёрнуто). Если, конечно, я правильно представил положение короткого и длинного абзацев с выключкой по центру.
а можно точное выравнивание таблицы щипать? У меня с этим кодом все, кажется, получилось...'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);
 
  • Спасибо
Реакции: catpaw
Сообразила, что Индиз при клике на маркер преодолевает overflow даже не вздрогнув, а скрипт сразу в крик...
Индиз что-то скрывает...
 
Можно прорисовку отключить, например
 
Сообразила, что Индиз при клике на маркер преодолевает 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);
 
 
  • Спасибо
Реакции: veretragna и Eugenyus