2015-08-02 2 views
6

J'écris un script pour After Effects qui recueille toutes les propriétés d'un calque et les écrit dans un fichier XML. Lorsque je récupère les valeurs du XML, certaines valeurs sont readOnly et le toolkit renvoie une erreur.Comment vérifier si une valeur de propriété est en lecture seule en utilisant extendScript?

Y at-il un moyen de le vérifier, comme l'attribut readonly de l'objet File? c.-à-d.: Layer.property(). (Readonly || readOnly)

Si ce n'est pas le cas, quelqu'un peut-il me dire quelle approche puis-je prendre pour aller dans la bonne direction?

+0

Je suppose que je Je suis un peu confus parce que si vous écrivez les valeurs avec succès dans le fichier XML, alors cela devrait juste être un fichier texte, et vous devriez être capable de lire n'importe quelle propriété là. Si vous récupérez les propriétés, tout ce que vous devez faire est de les lire. – ariestav

+0

@ariestav: OP ne le mentionne pas mais il semble qu'il veut les mettre en lecture. – usr2564301

+0

Bummer. J'allais suggérer [Object Reflection] (http://jongware.mit.edu/idcs6js/pc_Reflection.html) et son tableau "properties" "ReflectionInfo" (qui promettait de me dire si c'était "un de unknown, readonly, readwrite, createonly, méthode ou paramètre "), mais tester sur InDesign tout sauf' reflect' semble être étiqueté en lecture/écriture - même pour les propriétés * clairement * marqué en lecture seule dans les propriétés de l'objet! – usr2564301

Répondre

3

Étant donné que le premier élément du projet est un échantillon avec un solide en elle, cela fonctionne, mais il est sans doute kludgey, et vous auriez besoin d'être capable de construire la (chaque) chaîne afin de le faire - mais peut-être vous êtes déjà mis en place pour le faire:

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

Cependant, il y a une petite boîte de Pandore d'ouverture ici, dans ce « faux "s ne fonctionnera pas si l'option" Enable Script Debugger "est définie. Donc, vous devez faire une solution de contournement afin de vérifier ce paramètre et réinitialiser temporairement (voir http://aenhancers.com/viewtopic.php?f=8&t=189&p=554&hilit=debugger#p554)

+0

C'est ce que j'ai cherché. Je vais vérifier quand je reviens de vacances. Merci! – Miguel

+0

Sachez que dans certains cas, votre code sera cassé dans certains cas. ex: "app.project.items [1] .layers [1] .property ('Propriétés de texte ADBE'). property ('Texte source'). value.justification" - lorsque la couche de texte comporte deux lignes et deux autres justification. – Ziki

+0

Une modification tentée sur ce code a changé le "= x;" à "=" + x + ";" mais ceci n'est pas correct x devrait être évalué comme x (le script comprend x comme variable et le résoudra correctement dans eval), non résolu à sa valeur, concaténé et eval . -ed – CRGreen

2

Je ne pense pas que vous pouvez obtenir cette information de l'ESTK.

Vous pouvez utiliser le 'Guide du script After Effects' pour vérifier et créer un objet contenant toutes les propriétés 'readonly', puis vérifier si l'objet inclut cette propriété.

Voici un lien pour le guide de script: After-Effects-CS6-Scripting-Guide

+0

J'ai pensé à cette approche, mais il semble être très lourd. Je réserve comme ça en dernier. Merci! – Miguel

0

juste essayer de passer outre, et revenir en arrière, comme ceci:

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