[ID CS4-CS6] можно ли получить текстовое представление различных свойств

  • Автор темы Автор темы bossrus
  • Дата начала Дата начала

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
что я имею ввиду:
у разных объектов есть свойства (уже глубокая мысль)
и вот чтобы посмотреть эти самые свойства я делаю вот такой вот простой код:
Код:
alert(img.clippingPath.clippingType);
но вместо ожидаемого "ClippingPathType.NONE" я вижу "1852796517"
или
Код:
alert(img.horizontalScale);
вместо "Flip.HORIZONTAL" показывает "13"

конечно можно и так жить, и я даже так и живу, но вдруг я просто не знаю, а есть простая команда, которая покажет текстовый эквивалент "1852796517", и отлаживать скрипты станет намного проще?
 
но вместо ожидаемого "ClippingPathType.NONE" я вижу "1852796517"
Можно для разнообразия заглянуть в документацию и ознакомиться с энумераторами:
upload_2017-12-8_19-0-59.png
upload_2017-12-8_19-1-23.png


upload_2017-12-8_18-58-58.png
 
  • Спасибо
Реакции: Flame
Скорее всего нет, но есть маленький лайфхак:
1852796517=0x6E6F6E65="none"
Бинго!
 
  • Спасибо
Реакции: bossrus
Можно для разнообразия заглянуть в документацию и ознакомиться с энумераторами:
upload_2017-12-8_19-0-59-png.101486
upload_2017-12-8_19-1-23-png.101487


upload_2017-12-8_18-58-58-png.101485
это-то понятно.
и даже можно сделать процедуру "aalert", которая будет подставлять значения в зависимости от циферки. это всё понятно. а вот встроенного способа такое увидеть нет? чтобы не писать отдельный код для каждого разного вида свойства?

Скорее всего нет, но есть маленький лайфхак:
1852796517=0x6E6F6E65="none"
Бинго!
а функции автоматического перевода десятичного числа в текст через шестнадцатиричное представление есть встроенная? хотя это уже универсальное решение. ща набросаю процедурку :)
 
pspt

написал я процедурку. пользуйтесь, кому ннадо
Код:
function codeToText(txt)
    {
    var dec = Number(txt);
    if (dec==NaN)
        {
        return("нифига это не число!");
        }
    var hexString = dec.toString(16);
    var hex= Array();
    //разбиваем по парам
    for (var i=0;i<hexString.length;i++)
        {
        if ((i+1) % 2 != 0) hex.push(hexString[i])
            else hex[hex.length-1]+=hexString[i];
        }
    //конвертим в "понятную" строку.
    var newTxt="";
    for (var i=0;i<hex.length;i++)
        {
        newTxt+=String.fromCharCode(parseInt(hex[i], 16));
        }
    return newTxt;
    }

тоже то ещё извращение — строку в инт, инт в хекс, хекс разделить побайтово, каждый байт в инт, и оттуда в чар.
мы не ищем лёгких путей :D



ЗЫ. хотя это всё равно не решает главную проблему — получить из кода полную строку типа "ClippingPathType.NONE"
 
Код:
for (i in ClippingPathType) {
$.writeln('ClippingPathType.' + i)
}
это понятно. но кроме "ClippingPathType." есть ещё и "Flip.", "ContentType.", "CornerOptions.", и ещё куча различных свойств, которые начинаются с названия объекта.
хотелось бы таки универсальности.
 
@bossrus, в CS4 ничего толкового не получится, т.к. документация, пренебрежением которой вас попрекали выше, не соответствует действительности (и @Oleg Butrin должен был бы это заметить):
Код:
$.writeln( typeof( app.selection[0].clippingPath.clippingType ));
напишет 'Number'. В то время как в CS5, хотя бы, будет написано "object", что (а) отвечает документации (которая осталась неизменна), и (б) заметно облегчит вам жизнь, т.к. у этого объекта "волшебные" "стрингификация" и "нумификация", попробуйте например так (в CS5+, у меня выбран помещенный имидж с обтравкой "detect edges"):
Код:
$.writeln( app.selection[0].clippingPath.clippingType );
$.writeln( app.selection[0].clippingPath.clippingType === ClippingPathType.DETECT_EDGES );
$.writeln( app.selection[0].clippingPath.clippingType.toString() === 'DETECT_EDGES' );

$.writeln( typeof( ClippingPathType.DETECT_EDGES ));
$.writeln( String( ClippingPathType.DETECT_EDGES ));
$.writeln( Number( ClippingPathType.DETECT_EDGES ));
$.writeln( ClippingPathType.DETECT_EDGES.toString());
$.writeln( + ClippingPathType.DETECT_EDGES );
Собственно, про страшный номер при таком раскладе можно забыть.

тоже то ещё извращение — строку в инт, инт в хекс, хекс разделить побайтово, каждый байт в инт, и оттуда в чар
Попробуйте так, по вкусу (на входе-то всегда номер, вообще-то):
Код:
function foo ( n ) {
    for ( s = ''; n > 0; n = Math.floor( n / 256 )) s = String.fromCharCode( n % 256 ) + s;
    return s;
}

function bar ( n ) {
    s = '';
    do s = String.fromCharCode( n & 255 ) + s while (( n >>>= 8 ) > 0 );
    return s;
}

function baz ( n ) { return decodeURI( n.toString( 16 ).replace( /../g, '%$&' ))}
Второй вариант, вследствие использования битовых операций, ограничен 4-мя байтами, и, в отличие от "foo" и "baz", выдаст неверный ответ для такого, например, аргумента:
Код:
0x10000 * 1852796517 + 0x3132
т.е. 6-ти байт. Дело в том, что у хулиганья из Адоби (а кто же они, с такими "юмористическими" константами) есть небольшой простор, т.к. целые числа хранятся точно, если помещаются в 53 бита мантиссы типа Double. Теоретически они могли использовать в подобных численных константах до 6 букв включительно. Но вряд ли.
 
  • Спасибо
Реакции: bossrus
upload_2017-12-11_16-55-25.png

Прикинь?
Код:
var dec = Number(txt);
    if (dec==NaN)
Так что это фу-фу-фу.
Надо через isNaN проверять.
 
  • Спасибо
Реакции: bossrus
не знаю что в cs4, но в cc2018 например app.selection[0].flip.toString() возвращает 'HORIZONTAL'


за пару секунд поиска набрел на такой вариант
[JS] A way to get enumeration names? | Adobe Community

Код:
Object.prototype.enumName = function(enumId)
{
for ( var p in this )
  if ( this[p] == enumId ) return(p);
return(FALSE);
}
 
// Displays a SpecialCharacter's name (here "EM_SPACE") :
alert( SpecialCharacters.enumName(0x53456D53) );
 
// Displays the current horiz. measurements unit :
var u = app.viewPreferences.horizontalMeasurementUnits;
alert( MeasurementUnits.enumName(u) );

пока не могу только понять, как получение текстовых значений поможет в отладке )
 
Последнее редактирование:
Так что это фу-фу-фу.
Надо через isNaN проверять.
век живи, век учись :)

не знаю что в cs4, но в cc2018 например app.selection[0].flip.toString() возвращает 'HORIZONTAL'
там вона @люди_будущего популярно показал почему CS4 это вам не CS2018 :)

пока не могу только понять, как получение текстовых значений поможет в отладке )
скорость понимания происходящего. когда в голове бродит куча потоков кода, который нужно написать — необходимость расшифровывать результат сбивает. начинаю тормозить и всё такое.
 
Надо через isNaN проверять.
интернет сказал, что функция isNaN работает весьма через оппу.
но! зато есть весьма изящное решение:
Код:
Код:
   var dec = Number(txt);
   if (dec!==dec)
       {
       return("нифига это не число!");
       }
то есть переменная не равна самой себе, только если она NaN. работает волшебно :)
 
  • Спасибо
Реакции: _MBK_