2015-08-02 16 views
6

Sto scrivendo uno script per After Effects che raccoglie tutte le proprietà da un livello e le scrive in un file XML. Quando recupero i valori dall'XML, alcuni valori sono readOnly e il toolkit genera un errore.Come verificare se un valore di una proprietà è in sola lettura usando extscript?

C'è un modo per controllarlo, come l'attributo readonly dell'oggetto File? es .: layer.property(). (Readonly || readOnly)

In caso contrario, qualcuno può dirmi quale approccio posso prendere per andare nella giusta direzione?

+0

Credo' Un po 'confuso perché se stai scrivendo i valori con successo nel file XML, allora dovrebbe essere solo un file di testo normale, e dovresti essere in grado di leggere qualsiasi proprietà lì. Se stai recuperando le proprietà, allora tutto ciò che dovresti fare è leggerle. – ariestav

+0

@ariestav: OP non lo menziona ma sembra che voglia metterli in lettura. – usr2564301

+0

Bummer. Stavo per suggerire [Object Reflection] (http://jongware.mit.edu/idcs6js/pc_Reflection.html) e il suo array 'properties' "ReflectionInfo" (che mi ha promesso di dirmi se è "uno sconosciuto, di sola lettura, readwrite, createonly, method o parameter "), ma test su InDesign eccetto' reflect' sembra essere taggato Read/Write - anche per le proprietà * chiaramente * segnato Read Only nelle proprietà dell'oggetto! – usr2564301

risposta

3

Dato che il primo elemento del progetto è un comp con un solido in esso, questo funziona ma è probabilmente kludgey, e avresti bisogno di essere in grado di costruire la (ogni) stringa al fine di fare questo - ma forse si è già impostato per farlo:

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; 
    } 
} 

Tuttavia, c'è un piccolo vaso di Pandora che si aprono qui, in quella "falsa "s non funzionerà se è impostata l'opzione" Abilita Script Debugger ". Quindi è necessario fare una soluzione al fine di verificare la presenza di questa impostazione temporaneamente resettarlo (vedi http://aenhancers.com/viewtopic.php?f=8&t=189&p=554&hilit=debugger#p554)

+0

Era quello che cercavo. Lo controllerò quando tornerà dai giorni festivi. Grazie! – Miguel

+0

Ricorda che in alcuni casi il tuo codice verrà interrotto in alcuni casi. ex: "app.project.items [1] .layers [1] .property ('ADBE Text Properties'). proprietà ('Source Text'). value.justification" - quando il livello testo ha due righe e due giustificazione. – Ziki

+0

Un tentativo di modifica su questo codice ha cambiato "= x;" a "=" + x + ";" ma questo non è corretto x deve essere valutato come x (lo script comprende x come variabile e lo risolverà correttamente in eval), non risolto al suo valore, concatenato e valutato -ed – CRGreen

2

Non penso che tu possa ottenere queste informazioni dall'ESTK.

È possibile utilizzare il "Manuale della guida di script di After Effects" per controllare e creare un oggetto che contiene tutte le proprietà "readonly" e quindi per verificare se l'oggetto include questa proprietà.

Ecco un link per la guida di scripting: After-Effects-CS6-Scripting-Guide

+0

Ho pensato a questo approccio ma sembra essere molto macchinoso. Mi riservo così per ultimo. Grazie! – Miguel

0

Basta provare a ignorare, e tornare indietro, in questo modo:

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; 
}