2015-08-02 10 views
6

Piszę skrypt dla After Effects, który zbiera wszystkie właściwości z warstwy i zapisuje je w pliku XML. Kiedy pobierze wartości z XML, niektóre wartości są tylko do odczytu, a zestaw narzędzi zgłasza błąd.Jak sprawdzić, czy wartość właściwości jest tylko do odczytu przy użyciu extendscript?

Czy istnieje sposób sprawdzenia go, podobnie jak atrybut readonly obiektu File? ie: layer.property(). (Readonly || readOnly)

Jeśli nie, ktoś może mi powiedzieć, co mogę zrobić, aby iść w dobrym kierunku?

+0

Chyba” Jestem nieco zdezorientowany, ponieważ jeśli zapisujesz wartości z powodzeniem do pliku XML, powinien to być zwykły plik tekstowy, i powinieneś być w stanie odczytać dowolną właściwość tam. Jeśli pobierasz właściwości, wszystko, co powinieneś zrobić, to je przeczytać. – ariestav

+0

@ariestav: OP o tym nie wspomina, ale wydaje się, że chce je ustawić na czytanie. – usr2564301

+0

Bummer. Chciałem zasugerować [Object Reflection] (http://jongware.mit.edu/idcs6js/pc_Reflection.html) i jego "właściwości" tablicy "ReflectionInfo" (która obiecała mi powiedzieć, czy jest to "jedna z niewiadomych, tylko do odczytu, readwrite, createonly, method lub parameter "), ale testowanie w InDesign wszystko oprócz" reflect "wydaje się być oznaczone Read/Write - nawet dla właściwości * wyraźnie * oznaczone Read Only we właściwościach obiektu! – usr2564301

Odpowiedz

3

Biorąc pod uwagę, że pierwsza pozycja w projekcie jest zarys z ciała stałego w nim, to działa, ale jest to prawdopodobnie kludgey, i że trzeba być stanie zbudować ciąg (każdy), aby to zrobić - ale może masz już skonfigurowane, aby to zrobić:

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

istnieje jednak mała puszka Pandory otwierają się tu, że „fałszywy "s nie zadziała, jeśli ustawiona jest opcja" Enable Script Debugger ". Więc trzeba zrobić obejście w celu sprawdzenia tego ustawienia i tymczasowo zresetować go (patrz http://aenhancers.com/viewtopic.php?f=8&t=189&p=554&hilit=debugger#p554)

+0

Tego właśnie szukałem. Sprawdzę to po powrocie z Hollydays. Dzięki! – Miguel

+0

Należy pamiętać, że w niektórych przypadkach kod zostanie w niektórych przypadkach uszkodzony. Przykład: "app.project.items [1] .layers [1] .property (" Właściwości tekstu ADBE ") Właściwość (" Tekst źródłowy "). value.justification" - gdy warstwa tekstu ma dwa wiersze i ma dwa różne usprawiedliwienie. – Ziki

+0

Próba edycji tego kodu zmieniła "= x;" do "=" + x + ";" ale to nie jest poprawne. x powinno zostać ocenione jako x (skrypt rozumie x jako zmienną i rozwiąże je poprawnie w eval), nie rozwiązane na swoją wartość, połączone i eval -pl .: – CRGreen

2

Nie sądzę, że można uzyskać te informacje z ESTK.

Możesz użyć "Podręcznika obsługi skryptów po wykonaniu", aby sprawdzić i utworzyć obiekt zawierający wszystkie właściwości "tylko do odczytu", a następnie sprawdzić, czy obiekt zawiera tę właściwość.

Oto link do przewodnika skryptowego: After-Effects-CS6-Scripting-Guide

+0

Myślałem o tym podejściu, ale wydaje się to bardzo uciążliwe. Rezerwuję w ten sposób jako ostatni. Dzięki! – Miguel

0

Wystarczy spróbować go zastąpić, i przywrócić go z powrotem, tak:

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; 
} 
Powiązane problemy