[AI CC-CC2021] Прошу помощи с написанием (исправлением) части скрипта

VAN1985

Участник
Топикстартер
Сообщения
20
Реакции
0
Доброго времени суток.
И снова я со своими глупыми вопросами... есть такой скрипт для иллюстратора:

JavaScript:
var docRef= app.activeDocument;
if ( app.documents.length > 0 )
{
    var keepRegistration = true;
    var keepNoColor = true;
    var brag = 1;
    var skipSwatches = 0;
    var swtsRem = 0;
    deleteUnusedSwatches();
        if(brag == 1){
        var msg = "";
        var msg1 = "";
        if(swtsRem>0){msg1 = swtsRem+" unused swatches.\n"}
        if(swtsRem>0){msg = msg1;
        } else {msg = "Nothing.\n(Nothing to Remove.)";}
    }
}
function deleteUnusedSwatches(){
    killed = "";
    saved = "";
    var usedSwatches = findUsedSwatches();
    //alert("UsedSwatchesLength = "+usedSwatches.length);
    var x = lastIndex = app.activeDocument.swatches.length;
    total = x;
    var isSpotReg = 0;
    /*
            
                */
    try
    {
        while(x > skipSwatches){
        var lastIndex = app.activeDocument.swatches.length - 1;
            var swatchToDelete = app.activeDocument.swatches[x-1];
            //initialize vars to 0
            save = ulen = noSwt = regSwt = 0;
            try
            {isSpotReg =    swatchToDelete.color.spot.colorType == ColorModel.REGISTRATION;}
            catch (e)
            {// do nothing, we don't care if it fails, only if it succeeds.
            }
            for (var u in usedSwatches)
            {
                ulen ++;
                if (compareColors(usedSwatches[u],swatchToDelete.color) )
                {
                    saved+= swatchToDelete+"\n";
                    save = 1;
                    x--
                }
            }
            if (isSpotReg && keepRegistration)
            {   // For Registration swatch..
                saved+= swatchToDelete+"\n";
                save = 1;
                x--;
                //resetting variable to 0 because every subsequent "try" will fail
                isSpotReg = 0;
                regSwt=1;

            } else if (swatchToDelete.color.typename == "NoColor" && keepNoColor)
            
            {// for "NoColor" swatch
                saved+= swatchToDelete+"\n";
                save = 1;
                x--;
                noSwt=1;
                
            }
            if (save == 0)
            {
                killed += swatchToDelete+"\n";
                swatchToDelete.remove();
                x--;
                
            }
        }
        // for tracking...
        swtsRem =total-(ulen+noSwt+regSwt);
    }
    catch (e)
    {
        alert( e+"\nThe specified swatch doesn't exist. x = " +x);
    }
 }
 function findUsedSwatches(){
    allitems = activeDocument.pageItems.length;

    var found = [];
    while (allitems > 0)
        {
        
        if(activeDocument.pageItems[allitems-1].stroked == true){
            stk = activeDocument.pageItems[allitems-1].strokeColor;
            if (!inList(stk,found))
            {
                found.push(stk);
            }

        }
        if(activeDocument.pageItems[allitems-1].filled == true){
            fil = activeDocument.pageItems[allitems-1].fillColor;
            if (!inList(fil,found))
            {
                found.push(fil);
            }
        } else if(activeDocument.pageItems[allitems-1].typename == "TextFrame"){
            
            fil = activeDocument.pageItems[allitems-1].textRange.fillColor;
            if (!inList(fil,found))
            {
                found.push(fil);
            }
        }
        allitems--;
        }
    return(found);
}
function inList(a, b) {
    if (b.length == 0) {
        return false;
    }
    for (var all in b) {
        if (compareColors(a, b[all])) {
            return true;
        }
    }
    return false;
}

function compareColors(a, b) {
    //    No need to check for "none" because the calling function only passes hits.
    if (a.pattern == b.pattern && a.pattern != undefined) {
        //Compare patterns
        return true;
    } else if (a.gradient == b.gradient && a.gradient != undefined) {
        //Compare gradients
        return true;
    } else {
        //innocent until proven guilty..
        answer = true;
        //Compare contents...
        for (var each in a) {
            if (a[each] != b[each] && each != "tint") {
                //if anything doesn"t match:
                answer = false;
            }
        }
        return answer;
    }
}

он для удаления не используемых свотчей. первоначально он работал, позже перестал и появилась ошибка:

result:Error 1220: Illegal Argument
Line: 108
-> fil = activeDocument.pageItems[allitems-1].textRange.fillColor;

я понимаю что ошибка на 108 строке или в чем-то с ней связанной но не пойму как исправить... подскажите плиз.

Заранее спасибо!
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Да все что угодно. Может отсутствовать pageitem c индексом allitems-1 ; он может быть не текстовым объектом ; textrange у него может быть не покрашен или покрашен в кучу цветов и т д
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Резонно. А главное - скрипт, по идее, должен удалять дофига лишних свотчей, ибо не все реально используемые свотчи можно вот так просто взять и перебрать через объектную модель
 

aporiy zenonov

12 лет на форуме
Сообщения
115
Реакции
60
А штатный 'Delete unused items' чем плох?
Так его и записать )) Это в любом случае гораздо менее радикальное решение, чем писать скрипт ))
Ну и бонусом то, что несколько движений мыши и два клика заменяются на одно нажатие клавиши/клавиш
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

aporiy zenonov

12 лет на форуме
Сообщения
115
Реакции
60
Вп
Зачем? Он уже есть в штатной поставке и хоткей на него вешается без танцев и бубнов :)
Впервые заглянул в штатные экшэны... :) 'cooll)'
Да, есть такой. Но он же все неиспользованное выметает, а вопрос был про свотчи... ))
PS. Невнимательно прочитал первый ваш комментарий - подумал, что речь как раз идет о действии в панели свотчей.
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

dosp

Участник
Сообщения
1 143
Реакции
369
01.png
У меня вот такой работает.
 

glugoff

Участник
Сообщения
611
Реакции
93
Столкнулся с той же ситуацией, что и @VAN1985
Безобидный кусок кода:

Код:
var doc = app.activeDocument;
var tfs = doc.textFrames;

for (var i=0; i < tfs.length; i++) {

var tfill = tfs[i].textRange.fillColor;
var tstroke = tfs[i].textRange.strokeColor;

Выпадает в вот такую ошибку:
1590490071961.png

При этом всём - в AI 2015 (20.1.0) всё превосходно работает. Проблема появилась в 2020 (24.1.1)

Что это может быть?
 

glugoff

Участник
Сообщения
611
Реакции
93

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Не вижу проблемы
Проверять перед присвоением tfsх[i].textRange надо
 
Последнее редактирование:

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Но.. На одном и том же файле, на 2015 все работает, на 2020 - ошибка.. Мне подумалось, что может чего в новой версии изменилось?

ну проверьте что за фрейм и что в нем, это же быстрее, чем нам тут гадать )