Помогите оптимизировать скрипт для более быстрой и эффективной работы

  • Автор темы Автор темы dudedude1
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

dudedude1

Участник
Топикстартер
Сообщения
4
Реакции
0
Код:
app.scriptPreferences.version = 4;
var scriptName = "Рамки с фигурными углами";
var scriptVer = " 1.7";
// Умолчания
var myParagraphStyle = "рамка";
var myCornerEffect = "rounded";
var myCornerRadius = "3";
var myStyleLine = "Solid";
var myColorLine = "Black";
var myStrokeWeight = 1;
var myInsetSpacing = "1";
var myInsetSpacing1 = "2.5";
var myLayer, myCounter;

function cornerRound (myTextFrame, myPage) {
    myLayer = app.activeDocument.layers.item("Border");
        try{
            myLayerName = myLayer.name;
            if (myClear == true) {
                myLayer.remove();
                myLayer = app.activeDocument.layers.add({name:"Border"});
            }
        }
    catch (myError){
        myLayer = app.activeDocument.layers.add({name:"Border"});
}
// Для каждого абзаца текста
    for (myCounter = 0; myCounter < myTextFrame.paragraphs.length; myCounter++) {
        myPara = myTextFrame.paragraphs[myCounter];
        if (myPara.appliedParagraphStyle.name == myParagraphStyle){
    //Определяем ширину колонки
    var columnWidth = myTextFrame.textFramePreferences.textColumnFixedWidth;
    var myParagraph = myPara.paragraphs[myCounter];
    var myLineStart = myPara.lines[0]; // Первая строка указанного параграфа
    var myLineEnd = myPara.lines[myPara.lines.length-1];
    startline = (myLineStart.baseline - myLineStart.ascent)-0.5;
    endline = (myLineEnd.baseline + myLineEnd.descent)+0.5;
    l = myPara.horizontalOffset-2.0;
    if (myPara.firstLineIndent > 0) {
        l = l - myPara.firstLineIndent;
    }
    var dl=    columnWidth;
    location = l + dl;
        // Вставить текстовый фрейм и применить угловые эффекты
            var myNewTextFrame = myPage.textFrames.add();
            with (myNewTextFrame) {
                strokeWeight = myStrokeWeight;
                strokeType = myStyleLine;
                strokeColor = myColorLine;
                //geometricBounds [y1, x1, y2, x2]
                geometricBounds = [startline, l, endline, location];
                textFramePreferences.insetSpacing = new Array(myInsetSpacing, myInsetSpacing, myInsetSpacing, myInsetSpacing);
                cornerEffect = myCornerEffect;
                cornerRadius = myCornerRadius;
            }
        }
    }
}
with (app) {
    //Проверяем, что у нас выделено
    if ((selection.length == 1)&&((selection[0].constructor.name == "TextFrame") || selection[0].constructor.name == "InsertionPoint")) {
    } else {
        alert("Необходимо вытелить один текстовый фрейм");
        exit();
    }
     var myDoc = activeDocument;  
 //Получаем список стилей абзаца   
    var myStyleNames = new Array();
    var mySelectIndexStyle = 0;
    for (myCounter = 0; myCounter < myDoc.paragraphStyles.length; myCounter++) {
        myStyleNames[myCounter] = myDoc.paragraphStyles[myCounter].name;
        if (myStyleNames[myCounter] == myParagraphStyle) {
            mySelectIndexStyle = myCounter;
        }
    }
    // Создаем список оформления угла
    var myCornerEffectList = new Array ("none", "rounded", "inverse rounded", "inset", "bevel", "fancy");
    var myCornerEffectValue = new Array (1852796517, 1667592804, 1667591798, 1667591795, 1667588726, 1667589742);
    var mySelectIndexCorner = 0;
    for (myCounter = 0; myCounter < myCornerEffectList.length; myCounter++) {
        if (myCornerEffectList[myCounter] == myCornerEffect) {
            mySelectIndexCorner = myCounter;
        }
    }
    //Получаем список стилей линий
    var myStyleLineName = new Array();
    var mySelectIndexStyleLine = 0;
    for (myCounter = 0; myCounter < myDoc.strokeStyles.length; myCounter++) {
        myStyleLineName[myCounter] = myDoc.strokeStyles[myCounter].name;
        if (myStyleLineName[myCounter] == myStyleLine) {
            mySelectIndexStyleLine = myCounter;
        }
    }
    // Получаем список цветов в публикации
    var myColorSwatchesName = new Array();
    var mySelectIndexColor = 0;
    for (myCounter = 0; myCounter < myDoc.swatches.length; myCounter++) {
        myColorSwatchesName[myCounter] = myDoc.swatches.item(myCounter).name;
        if (myColorSwatchesName[myCounter] == myColorLine) {
            mySelectIndexColor = myCounter;
        }
    }
// Морда лица
    // Создаем диалог
    var myDialog = dialogs.add({name:scriptName + scriptVer});
    // Подготовка
    with (myDialog.dialogColumns.add()) {
        with (dialogRows.add().borderPanels.add()) {
            with (dialogColumns.add()) {
                dialogRows.add().staticTexts.add({staticLabel:"Стиль абзаца"});
                dialogRows.add().staticTexts.add({staticLabel:"Оформление углов"});
                dialogRows.add().staticTexts.add({staticLabel:"Радиус углов"});
                dialogRows.add().staticTexts.add({staticLabel:"отступ от краев рам"});
                dialogRows.add().staticTexts.add({staticLabel:"Внутренние отступы"});
                dialogRows.add().staticTexts.add({staticLabel:"Стиль линии"});
                dialogRows.add().staticTexts.add({staticLabel:"Толщина линии"});
                dialogRows.add().staticTexts.add({staticLabel:"Цвет линии"});
            }
            with (dialogColumns.add()) {
                var mySelectStyle = dialogRows.add().dropdowns.add({stringList:myStyleNames, selectedIndex:mySelectIndexStyle});
                var mySelectCorner = dialogRows.add().dropdowns.add({stringList:myCornerEffectList, selectedIndex:mySelectIndexCorner});
                var mySelectCornerRadius = dialogRows.add().measurementEditboxes.add({editContents:myCornerRadius, editUnits:2053991795}); //
                var mySelectInsetSpacing1 = dialogRows.add().measurementEditboxes.add({editContents:myInsetSpacing1, editUnits:2053991795});
                var mySelectInsetSpacing = dialogRows.add().measurementEditboxes.add({editContents:myInsetSpacing, editUnits:2053991795});
                var mySelectStyleLine = dialogRows.add().dropdowns.add({stringList:myStyleLineName, selectedIndex:mySelectIndexStyleLine});
                var mySelectStrokeWeight = dialogRows.add().measurementEditboxes.add({editValue:myStrokeWeight, editUnits:2054188905});
                var mySelectColor = dialogRows.add().dropdowns.add({stringList:myColorSwatchesName, selectedIndex:mySelectIndexColor});
                var myClearVal = checkboxControls.add({staticLabel:"Удалить слой", checkedState:false});
            }
        }
        with (dialogRows.add()) {
            dialogColumns.add().staticTexts.add({staticLabel:""});
        }
    }
    // Показываем
    var myResult = myDialog.show();
    if (!myResult) {
        myDialog.destroy();
        exit();
    }
    myParagraphStyle = myDoc.paragraphStyles[mySelectStyle.selectedIndex].name;
    myCornerEffect = myCornerEffectValue[mySelectCorner.selectedIndex];
    myCornerRadius = Number (mySelectCornerRadius.editContents);
    myStyleLine = myStyleLineName[mySelectStyleLine.selectedIndex];
    myStrokeWeight = mySelectStrokeWeight.editValue;
    myColorLine = myDoc.swatches.item(myColorSwatchesName[mySelectColor.selectedIndex]);
    myInsetSpacing = mySelectInsetSpacing.editContents;
    myInsetSpacing1 = mySelectInsetSpacing.editContents;
    myClear = myClearVal.checkedState;
    //Определяем текст
    switch (selection[0].constructor.name) {
        case "InsertionPoint":
            var myStory = selection[0].parentStory;
            break;
        case "TextFrame":
            var myStory = false;
    }
//    var myStory = selection[0].parentStory;
    if (myStory) {
        for (myTextFramesCount = 0; myTextFramesCount < myStory.textFrames.length; myTextFramesCount++) {
            var myTextFrame = myStory.textFrames[myTextFramesCount];
            var pageNum = myTextFrame.parent.id;
            var myPage = activeDocument.pages.itemByID(pageNum);
            cornerRound (myTextFrame, myPage)
        }
    }
    else {
        myTextFrame = selection[0];
        var pageNum = myTextFrame.parent.id;
        var myPage = activeDocument.pages.itemByID(pageNum);
        cornerRound (myTextFrame, myPage)
    }
}

Скрипт рисует рамки вокруг объявлений. Но как-то долго :( В среднем 6000 абзацев.
 
Почему для рамки не использован отдельный стиль объекта (или несколько разных стилей для разных типов рамок) , где заранее установлены свойства типа настроек углов? В идеале каждая рамка рисуется одной строкой кода и одним действием:
PHP:
page.textFrames.add(undefined, undefined, undefined, {appliedObjectStyle:myObjectStyle, geometricBounds:myBounds})
И для справки: http://wp.me/pp0Xz-6r
 
  • Спасибо
Реакции: boriskasmoscow
Статус
Закрыто для дальнейших ответов.