[ID CS4-CS6] Определение имени класса объекта [Решение]

Статус
Закрыто для дальнейших ответов.

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Не знаю, как граждане, а я вот никак не мог найти себе надежный способ определить, что у меня за объект InDesign-а при итерации массива или коллекции объектов.
Вроде бы есть Object.constructor.name, но если, например, начать перебирать PageItems на странице, то вполне рядовая ситуация, когда constructor.name стабильно возвращает "PageItem".
Вроде бы есть более винторезное решение: Object.getElements()[0].constructor.name. В большинстве случаев оно позволяет получить реальное имя объекта. Но, как это обычно бывает с Adobe, всегда есть случаи, когда вернется-таки "PageItem" несмотря на то, что перед нами Rectangle.
А мне, как ордынцу и несостоявшемуся прапорщику, неоднозначность хуже горькой редьки.
Нарвавшись вчера в очередной раз на эти грабли, я-таки, как мне кажется, нашел решение, коим и хочу поделиться. Вдруг пригодится кому.
Код:
var getObjectClassName = function(item) {
    var i = eval(item.toSource());
    return i.constructor.name;
}
 
Код:
item.getElements()[0].constructor.name;
 
@Oleg Butrin, я выше написал, что нарвался на ситуацию, когда это не работает.
 
Есть еще один вариант, не знаю - будет ли он работать в яваскрипт, но на питоне, который я использую, он работает - сознательно организовать структуру программы через вызов ошибки, в питоне можно перехватывать ошибки и обрабатывать их. Поэтому можно обращаться к каждому PageItem как к Group и начинать перебирать объекты внутри, а если это вызовет ошибку, то значит перед нами не группа, если нужен Rectangle, то обращаться к каждому объекту как к Rectangle, до тех пор пока он-таки не найдется.
 
Возможно, ты будешь удивлен, но объект Rectangle тоже может содержать .rectangles, к примеру.
Кроме того, в JS можно тупо проверить на .hasOwnProperty (есть или нет у объекта такое свойство). Но проблема-то в том, что при итерации allPageItems может возвращаться не Group вместо Rectangle, а PageItem.
Я тут вспомнил, на чем окончательно меня добило странное поведение "Object.getElements()[0].constructor.name" — периодически возникает ошибка обращение к getElements, типа текущее состояние объекта не позволяет это сделать.
 
нормально, но можно еще строчку toSource() распарсить - искомое после двойного слэш и перед [

resolve("/document[@id=1]//text-frame[@id=284816]")

resolve("/document[@id=1]//rectangle[@id=258894]")
 
@Skvoznyak, это был первый вариант.
upload_2016-6-10_21-31-46.png
 
Статус
Закрыто для дальнейших ответов.