2015-08-02 9 views
6

Я пишу скрипт для After Effects, который собирает все свойства со слоя и записывает их в файл XML. Когда я извлекаю значения из XML, , некоторые значения считываются только тогда, и набор инструментов вызывает ошибку.Как проверить, является ли значение свойства readonly с помощью extendscript?

Есть ли способ проверить это, как атрибут readonly объекта File? ie: layer.property(). (Readonly || readOnly)

Если нет, кто-то может сказать мне, с каким aproach я могу пойти, чтобы идти в правильном направлении?

+0

Я предполагаю, что я» m немного запутался, потому что, если вы успешно записываете значения в файл XML, это должно быть просто текстовым файлом, и вы должны иметь возможность читать любое свойство там. Если вы извлекаете свойства, то все, что вам нужно сделать, это прочитать их. – ariestav

+0

@ariestav: ОП не упоминает об этом, но, похоже, он хочет настроить их на чтение. – usr2564301

+0

Bummer. Я собирался предложить [Object Reflection] (http://jongware.mit.edu/idcs6js/pc_Reflection.html) и его массив свойств «ReflectionInfo» (который обещал рассказать мне, является ли это «одним из неизвестных, readwrite, createonly, method или parameter "), но тестирование на InDesign все, кроме' reflect', похоже, помечено. Чтение/запись - даже для свойств * четко * отмечено только для чтения в свойствах объекта! – usr2564301

ответ

3

Учитывая, что первый элемент в проекте комп с твердым телом в нем, это работает, но это, возможно, kludgey, и вы должны были бы быть в состоянии построить (каждую) строку для того, чтобы сделать это - но, возможно, вы уже настроены сделать:

var r; 
r = testForReadability("app.project.items[1].layers[1].enabled"); 
alert(r); 
r = testForReadability("app.project.items[1].layers[1].width");//a solid's width is NOT writable 
alert(r); 

function testForReadability(thisProperty) { 
    var x; 
    try { 
     x = eval(thisProperty); 
     eval(thisProperty + " = x;"); 
     return true; 
    } catch(e) { 
     return false; 
    } 
} 

Однако есть небольшая банка червей, открывающихся здесь, в том, что «лжи «s не будет работать, если установлена ​​опция« Включить отладчик сценариев ». Так что вам нужно сделать обходной путь для проверки этого параметра и временно сбросить его (см http://aenhancers.com/viewtopic.php?f=8&t=189&p=554&hilit=debugger#p554)

+0

Вот что я искал. Я проверю его, когда вернусь из Холлиндса. Благодаря! – Miguel

+0

Помните, что в некоторых случаях ваш код будет поврежден в некоторых случаях. ex: «app.project.items [1] .layers [1] .property (« Свойства текста ADBE »). Свойство (« Исходный текст »). value.justification» - когда текстовый слой имеет две строки и имеет два разных обоснование. – Ziki

+0

Попытка редактирования этого кода изменила значение «= x;» to "=" + x + ";", но это неверно. x должен быть оценен как x (скрипт понимает x как переменную и правильно ее разрешит в eval), не разрешен к его значению, конкатенирован и eval -ed. – CRGreen

2

Я не думаю, что вы можете получить эту информацию от ESTK.

Вы можете использовать «Руководство по написанию сценариев после эффектов», чтобы проверить и создать объект, содержащий все свойства «readonly», а затем проверить, включает ли этот объект это свойство.

Вот ссылка для руководства сценариев: After-Effects-CS6-Scripting-Guide

+0

Я думал об этом, но это кажется очень громоздким. Я резервирую этот путь как последний. Благодаря! – Miguel

0

Просто попробуйте изменить его и вернуть его обратно, как это:

isReadOnly("platform", navigator) // true, navigator.platform is read only 
isReadOnly("parent", window) // false, window.parent is not read only 

function isReadOnly(value, container){ 
    var tmp = container[value]; 
    var tmp2; 
    var coolString = "cool"; 
    container[value] = "cool"; 
    tmp2 = container[value]; 
    container[value] = tmp; 
    return coolString != tmp2; 
}