ねこまたぎ お道具箱 目次

■掲示板に戻る■ 全部 1- 101- 最新50

何でも質問箱

1 :kiyo :05/11/14 20:58:35 ID:CfPDLIKk
よいしょソレキタ、質問箱だ。何でも聞いてチョ

答えられることは答えるヨ

私が知らないことは、きっとここを見ている誰かが教えてくれるサ
…よろしくね>誰か

知っていても教えるわけには行かないこと…も時々あるので それは聞かないでほしい


15 :ランダムな移動量の集計 1/3 :05/11/18 13:11:02 ID:???

えーと、その計算はあまりエクスプレッション向きじゃありません。
おそらくは

var 合計=0;
for(myFrame=start;myFrame<end;MyFrame++){
値= valuAtTime(myFrame)-valueAtTime(myFrame+1);
合計+=値;
}

こんなカンジの処理ではないかと推測しますが…これ実は、動かないざんす

エクスプレッションは、全てのフレームが独立で処理されるので、このルーチンだと
「第一フレームの計算をする為に第一フレームを含む全てのフレームの値が必要」という
よくある矛盾に突入してしまうのです。(名前がついていて「循環参照」と言います。)

解決の方法は、おおきくわけて2つあります。

16 :ランダムな移動量の集計 2/3 :05/11/18 13:11:39 ID:???
その1
エクスプレッション向きじゃないのでエクスプレッションはやめてほかの方法を探す。
もしも「合計の値が欲しい」だけなら、スクリプト(jsx)で計算すれば、計算のメモリ空間が
コンポジションの外にあるので 合計でも平均でも何でもコイです。
値だけテキストに書きだして、表計算ソフトとかでザックリ計算してもおっけーだと思うでス。
エクスプレッション的には、メモリ空間を別にするために。

合計計算だけする(レンダリングしない)別のコンポを作って

comp("ターゲットのコンポ").layer("ターゲットレイヤ").position.valueAtTime(タイム)

ってなふうにアクセスすれば良い鴨


17 :ランダムな移動量の集計 ens/3 :05/11/18 13:12:22 ID:???
その2
ちょっと力技でも良いから、がんばる。
「レイヤの制御に使いたいので、やっぱり同じコンポ内で欲しい。」ってなばあいは、
以下のようにすればおっけ

//エクスプレッションの中で、全てのフレーム分の配列を作る。
var myAllValues= new Array(MaxFrames);
//この配列に全フレームの値を作ってしまう。
for(fr=0;fr<MaxFrames;fr++){myAllValues.push(なんかランダムに作った値);}
/*
この配列があれば、全合計でも中間合計でも何でもコイなので必要な値を出す
*/
//で、最後の一行で必要なレイヤの値をコンポに渡す。
myAllValues[time/thisComp.frameduration];

こんなカンジ。これもスクリプトでやったほうがラクかも…でも出来る…重いけど

18 :kiyo :05/11/18 13:44:24 ID:???
と、書き込んだ後でサイトをチェックしたら…

なるほど、そうだったのですな。ははは 目的は集計では無かったのね。
じゃ、ずいぶんと解法の方向性が違うねぇ。

先に読んどけば良かった…

19 :hey :05/11/18 16:13:50 ID:zQ7v9Ybc
ありがとうございます。
エクスプレッションを使っている割に、今一歩仕組みを理解できていないので
解説していただくと大変に勉強になります。
失敗しても、なぜ失敗しているのか?が、わからない事がままあります。

メモリ空間を別にする等は、やはり仕組みがわかっていないと想像すらできない解です。(汗
スクリプトも覚えていこうと思っていますので、今後ともご指導お願いいたします。

20 :kiyo :05/12/03 19:00:08 ID:???
>ありがとうございます
といわれるとおもはゆい

最近エクスプレッションに舞い戻って来たのは良いけれど…

>>15 の記述は「ウソでした」

valueAtTime のアクセスは、「循環参照」にはならないで完了します。

ナニやらうまくすり換えてあるのか、はたまたエクスプレッションから
エクスプレッションの結果に対するアクセスが制限されているのか…
気になって試してみたら「集計出来ちゃいました」

思い込みでウソ言っちゃダメだー>わし

いや、ま エクスプレッションでその処理をしちゃうと全てのフレームで全てのフレームの計算をする必要があるので、
ちょっと複雑なコンポである程度の尺になったら…タイムアウトにはなる…よね

いやどうもゴメンナサイです。これから気をつけます。とほ

21 :はる :06/05/11 21:35:32 ID:+6MxOLW2
お疲れ様です。
すいません、初の書き込みから質問とは
ぶしつけかと思いますが
スクリプリトの記述に関してご教授ねがいます。


抜粋ですが
targetID = finditemID("720*486");
if (targetID){app.project.item(targetID).duration =xxx};
といわゆる
「720*486」というコンポの名からindexを割り出して
そいつの尺をいじる、といったことなのですが

ここの
720*486の*がどうも文字列として認識されません。
演算子*として720*486=349920で代入されているかというと
そうでもなく構文がそのままスルーされている感じです。

試しにnew String(720*486);の一文も噛ませて見ましたが
どうもうまくいきません。

*の記述をやめたら良いだけの話なのですが
なんだか引っ掛かります。
付け焼刃的な知識でスクリプトを使い始めたばかりです。
もしよろしければご指導ご鞭撻のほどを。


22 :kiyo :06/05/12 01:56:43 ID:ffPXNCwI
こんばんは、はる様ようこそです

>文字列として認識されません。

んーと、一般的には "720*486"は、たぶん文字列として認識できている様な気がしますです。

文字列として認識しているか否かは、引数をわたされた関数の冒頭で

function finditemID(myName){
//こんな文を挿入↓
alert(myName +" : "+ (typeof myName));
//本来の関数
}

こんな感じで引数を確認していただくとはっきりします。

たぶん "720*486 : string" と表示されます。
このように表示されればちゃんと文字列になってます。

関数から正常な戻り値が得られない(undefined が戻っているとか)等ならば、関数内のルーチンに問題があるカモです

スクリプト自体がだんまり(動作が止まる)状態ならば正規表現絡みのバグの可能性も

…が、これ以上はさすがにソースがないとなんとも


余談ですが、名前でアイテムを検索すると AEでは 名前の重複が認められているので
二個目以降の同名のアイテムが指定できなくなったりします。ご注意くださいね

23 :kiyo :06/05/12 03:11:40 ID:ffPXNCwI
//
app.project.getItemByName=function(itemName)
{
if (! itemName) return false;
if ((typeof itemName)!="string" ) itemName=itemName.toString();
var result=new Array();//戻り値を初期化
// アイテムを一回りチェックして名前がマッチしたらリザルトに積む
for (idx=1 ; idx <=this.items.length ; idx ++)
{
if (this.items[idx].name === itemName) {result.push(this.items[idx]);};
}
// リザルトなしなら false
if (result.length==0) return false;
// リザルト1個ならアイテム自身を返す
if (result.length==1) return result[0];
// それ以外は、アイテムの配列を返す
return result;
}


さて、こんなものを作ってみました。
これを実行すると、
app.project.getItemByName() メソッドができます。
戻り値は
アイテムがなければ false
アイテムが1個ならそのアイテム自身
複数アイテムがあればアイテムの配列が返ります

使い方は、こんな感じ

myItem = app.project.getItemByName("720*486");
if (myItem && myItem.length==1 && myItem.typeName="コンポジション")
{
if (myItem.length==1) { myItem.duration=3 }
}


即席ですが、こんな感じでどですか?
おやすみなさい

24 :はる :06/05/13 16:29:17 ID:DChX5qg+
わわ。
一昨日のレスのほう今みました・・

すいません、とりあえず検証、作成のお礼だけ言わせていただきます!
いまからじっくり試してみたいと思います。
その後また報告させていただきますー。



25 :はる :06/05/13 17:52:11 ID:???
ざっとやって見た感じですが、
720*486はstringとして認識はされているようです。
検証用の構文、ありがとうございました。

ただそこからコンポの名前としてどうも読み取ってくれません。
*を_とかに変えただけで通常どおり認識できるようなので
関数自体に問題があるとは思えないのですが
なにせ浅い知識なのでまだよくわかりません。

次のレスにソースの文を載せますので
お時間あるときに添削していただけたら幸いです。

用途は「768*576」と「最終レンダーのコンポ」を
もとからある「01_comp」というコンポのNYSC尺からPAL方式の尺に換算しなおす。
というだけのものです。
その他雑多な文が色々混じっているのはご容赦ください。

作成頂いた
app.project.getItemByName() メソッドでも試してみました。

if (myItem && myItem.length==1 && myItem.typeName="コンポジション")

の一文でエラーがでるようです。
「上書き禁止のため代入式の左辺におくことができません。」と出ます。
そしてifの条件をさておくとして改築してためしたところやはりコンポ名がスルーされてしまいます。

配列で帰ってくるのはいいですね。
プリコンポーズするのに複数選択したレイヤーをどう配列化したらいいか悩んでました。
ヒントになりそうです。





26 :はる :06/05/13 17:55:30 ID:DChX5qg+
//ID特定の為の関数//


function finditemID(str){
var num=0;
var compname = new RegExp(str,"gi");
for (var i=1; i<=app.project.items.length ; i++){
if (app.project.item(i).name.match(compname)) num = i;}
return num;}



//コンポの尺調整//
motoID= finditemID("01_compo");
var NTSCdur = app.project.item(motoID).duration

var AlreadyName = app.project.renderQueue.items[1].comp.name; //レンダーキューにあるのがラストコンポだから
targetID = finditemID(AlreadyName); //そのラストコンポを探し出し、
var NTSCdurLAST = app.project.item(targetID).duration;


//PAL方式のためのコンポ//


targetID = finditemID("768*576");
if (targetID){app.project.item(targetID).duration =NTSCdur};


var takenum = AlreadyName.indexOf("t",0);
var Cutnum = AlreadyName.substring(6,takenum);

var PALname = "C"+Cutnum+"_1";
targetID = finditemID("C000_1"); //PALのラストコンポを探し出し、
if (targetID){app.project.item(targetID).name = PALname;}; //ここで名付ける。


targetID = finditemID(PALname);
if (targetID){app.project.item(targetID).duration =NTSCdurLAST};  //PALラストコンポの尺調整。



27 :kiyo :06/05/13 20:29:24 ID:???
いらっしゃい

>「上書き禁止のため代入式の左辺におくことができません。」
はは、失礼しました。これは私のタイプミスです

if (myItem && myItem.length==1 && myItem.typeName="コンポジション")
正しくは
if (myItem && myItem.length==1 && myItem.typeName=="コンポジション")
ですね…もちろん 代入しちゃいけませんやな

>スルー
されるのは、関数 finditemID()の

var compname = new RegExp(str,"gi");
if (app.project.item(i).name.match(compname)) num = i;}

この部分のためです
mutch()メソッドで 正規表現オブジェクトを使用しているので

〜.match(/720*486/gi)

として解釈されるために 文字列"720*486" とはマッチしません。

"*"が直前文字0回以上の繰り返しにマッチするメタ文字なので、この状態でマッチする文字列は

"72486" "720486" "72000000486" "number720486123" 等になります。

名前マッチでメタ文字が含まれる場合、または含まれる可能性がある場合でメタ文字にマッチさせたければ、
メタ文字自身を"\(バックスラッシュ…円記号に見えるかも)"でエスケープしてやる必要が有ります。
さらに実装にもよりますが、"\"自身もメタ文字なので与え方によっては

"\\\*" こんな風に何度か繰り返す必要の有るケースもよくあります。

コンポ名の一部分でマッチさせるので無ければ、if("文字列"=="比較文字列")で判断したほうが楽ですね。

部分一致が必要ならば、メタ文字を使わないようにするかメタ文字を置換する処理を挟む必要が有ります。
正規表現のデバッグを別レベルで考えると良いかと思うです。

でした

28 :kiyo :06/05/14 12:16:38 ID:3o+xgIAk
追伸 かきわすれです。

>>26 のケースの場合は
targetID = finditemID("768*576");
この行を

targetID = finditemID("768\\*576");
こう、エスケープするだけでも一応用は足ります。

この場合は、文字列内でのエスケープ記号である"\"自身を正規表現コンストラクタにわたすために
"\"のふたつ重ねになります。

直接match()に書き込む場合は str.match(/768\*576/) こんなカンジです。

このスクリプトの finditemID() の場合 文字列の中に1回でもマッチがあれば良いので
RexExp の g(グローバル)オプションは、付けない方がよろしいかも。

このオプションは対象文字列中を何度でもマッチしますから 計算パワーを無駄食いします。
matchで使うケースは少ないですね。一般的には、replace() で使うことの多いオプションです。


29 :はる :06/05/16 19:45:17 ID:NCOFYcYs
またも遅ればせながら
ありがとうございました。
>計算パワーを無駄食いします。
そうなのですか、リファレンスと首っ引きで書きあげてることもあり
愚直に書いている次第です。


重ね重ねありがとうございました。
またちょくちょく聞かせていただきます。
色んな人が書き込んで質疑応答の場になれば
参考にできることが沢山みえてくるんですけどね。

30 :kiyo :06/05/17 00:42:54 ID:51oc7hTs
いらさい

>ありがとうございました。

どういたしまして

>>計算パワーを無駄食いします。
>そうなのですか、リファレンスと首っ引きで書きあげてることもあり
>愚直に書いている次第です。

あー、まぁ 言うほどたいした差でもないです。 が、違うのもたしかなので
ぽちぽちと無駄ない方向でがんばってください。

>またちょくちょく聞かせていただきます。

またどうぞ、ご遠慮なく

>色んな人が書き込んで質疑応答の場になれば

いっぱい人がくれば良いな と思ってます。
…あんまりたくさんくるとniftyのサーバでは役不足になるかも知れませんが
ま、そのときはその時ってことで

では

31 :ハマ :06/06/02 20:44:44 ID:Iyl/xACY
初めまして
スクリプトで作業を効率化しようと目論んでるのですが
いかんせんプログラムの経験が浅いので
スクリプティングガイドと格闘の毎日です。。

質問なのですが
スクリプトの中にプリコンポーズする作業を取り入れようとガイドを調べたら

app.project.item(index).layers.precompose(layerIndicies,name,moveAllAttributes);

なるものがあったのですが
どうも何をどうしたらいいのやら分からず止まってしまいました・・・
よろしければご教授おねがいしますm(_ _)m

32 :kiyo :06/06/03 00:56:36 ID:???
いらっさい ハマさん

あーこれは、私もまだ使った事のないメソッドですね。
ガイドによればこんなカンジで使うメソッドですか?

app.project.item(アイテムID).layers([レイヤID,レイヤID,レイヤID],"新しいコンポの名前",属性を全部コピー)

コンポのレイヤIDを配列に入れて新しいコンポ名を指定すると現在のコンポからレイヤをプリコンポして
新しいコンポができるって寸法ですね。
その時、当然元のコンポではプリコンポされたコンポが元のレイヤ位置にはいる…と

うん、いまためしたらそんな風に動作しますね。
最後の引数は true/falseで全ての属性をプリコンポに渡すかどうかのオプションです。

こんなカンジ
myComp=app.project.item(5);
myPreComp=myComp.layers.precompose([1,2,3,4],"プリコンポ_1-4",true);

ガイドの "indices(索引)"は、わかりにくい表現ですねぇ。
困ったもんだ"Array of LayerIDs" とか書いてくれれば良いのに…

またどーぞ

33 :ハマ :06/06/05 13:27:22 ID:6tpG2mtg
ありがとうございます!
プリコンポーズ出来ました。
感謝感激です。

もうひとつ質問なのですがlayerIndiciesの値なのですが
配列の値は入らないのでしょうか?
例えばコンポ名とレイヤー数を入力して
プリコンポーズする場合なのですが


layer_count=prompt("レイヤー数は?",4);
comp_name=prompt("コンポ名は?","コンポ 1");
LayerArrayMax=Number(layer_count)
PreComp=new Array(LayerArrayMax);

for(var i=0;i<LayerArrayMax;i++)PreComp[i]=i+1;

function Index(Name){
for (i=1;i<=app.project.items.length;i++)if(app.project.items[i].name==Name)return i;
}

myComp=app.project.item(Index(comp_name));

>>↓が上手くいきません。。
myPreComp=myComp.layers.precompose([PreComp],"プリコンポ1-"+LayerArrayMax,true);
>>myPreComp=myComp.layers.precompose([1,2,3,4],"プリコンポ1-"+LayerArrayMax,true);


alert(PreComp);
alert(Index(comp_name));


と、書いてみたのですがどうにも上手くいかないようで・・・

数値入力なら(1,2,3,4.....)実行できるのですが。
alertを見る限りでも1,2,3,4....というような数値は入ってるみたいで、、、

またまたすいませんがご教授お願いしますm(_ _)m

34 :Higematsu :06/06/05 17:10:02 ID:4wQNJbO6
こんにちはHigematsu@dA-toolsです。
precompose()の第一引数indicesはIndexの複数形なので配列のことでは無いと思います。
以下のようIndexを並べる必要があるようです。

precompose([PreComp[0],PreComp[1]],"プリコンポ1-"+LayerArrayMax,true);

35 :Higematsu :06/06/05 17:23:09 ID:4wQNJbO6
前の修正です。
配列を[ ]で括るなければいいだけですね。失礼しました。

precompose(PreComp,"プリコンポ1-"+LayerArrayMax,true);

36 :ハマ :06/06/05 17:38:24 ID:6tpG2mtg
そうですね!
[]取ることに昼休みに気が付いて修正してみたらできました。
急いでここに書き込もうと思いましたら
お先に一本取られたみたいで(笑)

なんとも簡単なミスですいません

37 :kiyo :06/06/05 17:41:10 ID:WqiYnG12
// いらさい
//…ふむはむ 大きな間違いはひとつだけですが 気になる点もチラホラ

layer_count=prompt("レイヤー数は?",4);
comp_name=prompt("コンポ名は?","コンポ 1");
LayerArrayMax=Number(layer_count)
// ↑セミコロンは書き忘れても改行があれば動くです…けどご注意ね

PreComp=new Array(LayerArrayMax);
// 配列を作成する時に要素数を指定して作ると 初期値が「不定(undefined)」ですのでご注意

// PreComp=new Array(); または PreComp=new Array;
// ↑こうやって無要素の配列で初期化した方が一般に副作用が少ないです。
// ↓の行で値を代入した時に要素を作るので充分でしょう。
for(var i=0;i<LayerArrayMax;i++)PreComp[i]=i+1;
// あと、ループの範囲をしっかり意識するためにたとえ命令ひとつであっても
// { 囲んだ方が } 良いでしょう。

function Index(Name){
for (i=1;i<=app.project.items.length;i++)if(app.project.items[i].name==Name)return i;

// この関数は 「ループで一度もマッチがなかった時」の戻り値が考慮されていない様です。
// ループを抜けた場合「失敗」なので「失敗の始末」を書いておきましょう。
return false;//<こんなふうに
}
myComp=app.project.item(Index(comp_name));
// ↑関数から正常な戻りの値があった時だけ処理を続行した方がよりよいプログラムです。↓

if (myComp){
// ここに処理を書く
myPreComp=myComp.layers.precompose([PreComp],"プリコンポ1-"+LayerArrayMax,true);

// これは 配列指定の間違いですね。
// "[PreComp]" < こう書くと 「 0番要素が配列"PreComp"である 要素数1個 の 無名配列 」のことです。
// 単に↓こう書かないと、配列PreCompの指定になりません。
myPreComp=myComp.layers.precompose(PreComp,"プリコンポ1-"+LayerArrayMax,true);

alert(PreComp);
alert(Index(comp_name));
}else{
// エラー時の処理を考えておきましょう
alert("レイヤ "+comp_name+" が、ありませんでした");
}

// こんなカンジです。 では

38 :Higematsu :06/06/05 18:34:26 ID:4wQNJbO6
うわあ。添削してくれるんだ。いいなあ。

私が読んでいて気になったのは複合型の変数名に規則性が無いことです。
layer_countはlayerCount
LayerArrayMaxはlayerArryMax のほうが良いかと。
Expressionでもアンダースコアは使わなくなってきているし。

確かにエラー処理で経験値が分かりますよね。

失礼しました。m(_ _)m

39 :ハマ :06/06/05 20:06:31 ID:6tpG2mtg
まさか添削していただけるとは・・・感激です!
おかげさまで作業時間短縮できそうです。
まだまだやっつけのプログラム書いてしまってるので
経験を積んで
キチっと打てるように精進したいと思うしだいです。
エラー処理やif(myComp)や変数名、etc
勉強になります!ありがとうございました

40 :kiyo :06/06/05 21:23:15 ID:???
アレ、ちょうど書いている間にレスが増えてる…
書き込んですぐに外にでたので今気づきました。

Higematsu様・ハマ様 どもです

>添削
ちょうど時間があったのでコマコマ書いちゃいました。

>変数名
先のレスでは触れませんでしたが、
Javascript的には以下のルールに従うとスッキリ感が増すかと思います。

- ユーザ変数名、ユーザオブジェクト名は小文字で開始する(myComp myLayer …)
- システムオブジェクトやクラス名は大文字で開始する(Composition,Layer,Number …)
- 複合単語の境界は次の単語の頭文字を大文字。("_"でセパレートも個人的にはアリだと思います)

て、最近のオブジェクト指向の言語は皆こんなカンジを推奨中…

私も始めの頃のコードはヘナヘナな関数名とか…互換性の為にまだ生きてたりして…

では、またどーぞ

41 :はる :06/06/14 05:20:02 ID:Z9MvPayY
皆様お疲れ様です。

前述のプリコンポーズのスクリプトですが
任意のレイヤーのみプリコンポーズしたい場合、
つまりコンポの中にあるレイヤーをこちらで選択しておいて(クリックしておいて)
そこでプリコンポーズから始まるスクリプトにしたいのですが

まあ素直にショートカットでプリコンポしたらいいのですが
それきっかけで始まるスクリプトが欲しいので一考したのですが
どうもうまくないです。

概要としては前述のスクリプトをなぞらえていますが


var activeItem = app.project.activeItem;
var activeComp = activeItem;
var selectLayer = activeItem.selectedLayers;


PreComp=new Array();

for (var i = 1; i <= activeItem.layers.length; i++){
if(activeItem.layer(i).selected==true){ PreComp[i-1]=i; };
else{false;};
}
↑ここで各レイヤーに、お前は選択されているのか?と聞いてまわっているのですが
レイヤーのindexは返ってきてもそれを配列に収納するのに苦労しています。

コンポに存在するレイヤーを飛び飛びに選択していくことも考えられるので
返ってくるindexと配列の要素との関係性がうまく捉えられません。

説明下手ですいません。
何か良いアイデアないでしょうか?


42 :kiyo :06/06/14 07:37:40 ID:tR5UppF+
いらっさい
チョト気になりましたので

var activeItem = app.project.activeItem;
// メソッドと同名の変数はあとで読むときにまぎらわしいので避けたほうが良いかと思うのです。
var activeComp = activeItem;
// 同じアイテムを参照している別名の変数はいらないですね。このコードだけだとそう見えます。
var selectLayer = activeItem.selectedLayers;
// 何度も使用しない場合は、変数にしないほうがメモリの節約になります。
// 名前を付けるとメモリ内に残ってちょっとずつ動作が重くなってゆくのです。

このコードだけだと判断できないのですが、名前を付ける必要のない参照は
なるべく元のオブジェクトを直接参照する方がAEの場合望ましいプログラムかと

PreComp=new Array();

for (var i = 1; i <= activeItem.layers.length; i++){
if(activeItem.layer(i).selected==true){ PreComp[i-1]=i; };
else{false;};
}
// 実は、この操作は不要です。
続きますね


43 :kiyo :06/06/14 07:39:54 ID:tR5UppF+
続きです

この操作(選択したレイヤが欲しい)は、必要なケースの多い操作なので
あらかじめプロパティが用意されています。

(compItem).selectedLayers ←コレです。前の方のコードにでてますね。

ひとつづつ問い合わせなくてもこのプロパティをアクセスれば現在コンポで選択されている
レイヤの配列を取り出すことが出来ます。

得られる配列は、「レイヤのID」ではなく「レイヤオブジェクト」なので、
プリコンポの場合はこの配列からレイヤIDの配列を作ります。

myPreComp=new Aray();//引数用の配列
for (idx=app.project.acteiveItem.activeLayers.lengh-1; idx>=0; idx++){
myPreComp.push(app.project.activeItem.activeLayers[idx].index);
};

こんなカンジです。
myArray.push(要素);
pushメソッドを使うと配列に連続して要素を追加する事が出来ます。
インデックスを加算しながら代入するよりもスマートなカンジです。

さらにここでは、activeLayers プロパティにインデックスの大きい順に
レイヤが入っているみたいなので、逆順でレイヤを取り出してあります。

ケースによっては別の情報からリストを作成する場合も考えられます。
正順や順不同で取り出した場合は、配列のsortメソッドで並べ直すと良いと思います。

sortedArray=myArray.sort();
その場合sortメソッドはこんな風に使います。

今回の目的ならばプリコンポの引数に直接ソート付きで書き込んでも良いでしょう。
newPreComp=app.project.activeItem.layers.precompose(myPreComp.sort(),"プリコンポ",true);

実はこうすると、ちびっとだけメモリが節約できます。(無名オブジェクトなのですぐにメモリが開放されます)

色々トライしてみてくださいね。では!

44 :kiyo :06/06/14 07:54:56 ID:tR5UppF+
あれれ!? 思いっきりタイプミスだらけだ。

myPreComp=new Array();//引数用の配列
for (idx=app.project.activeItem.selectedLayers.length-1; idx>=0; idx--){
myPreComp.push(app.project.activeItem.selectedLayers[idx].index);
};

Aray とか ActiveLayers とかわけのわかんないオブジェクトが並んでる
減算したつもりで加算のままだし…なはは

どもすみましぇん こちらが正解版


45 :kiyo :06/06/14 08:15:53 ID:tR5UppF+
もう寝ようっと

46 :はる :06/06/14 23:22:48 ID:QGC3VQnU
ああっ。なるほど。
alert(selectedLayers)で試したときに
そういえば[AVLayer][AVLayer][AVLayer]とレイヤーの数だけ表示されてたのを
思い出しました。

なんでそこから気づかなかったんだろう。
indexを問いかけてあげれば
そこから答えは得られたのですねorz

すいません、ありがとうございます。
オブジェクトリスト、いつも便利に使わせていただいてます。

47 :kiyo :06/06/16 02:03:39 ID:Imqh/EFY
いらっしゃい

>>オブジェクトリスト
ご利用どもです。間違いとか見つけたらお知らせください。
直接書き直していただいてもOKです。Wikiですから

よろしくね ではでは

48 :tetu :06/11/15 16:46:23 ID:hE0h83MI
はじめまして。
AE7のスクリプトについてお聞きします。
やりたい事は、選択されたレイヤーのプロパティを取得しファイルへ出力です。
レイヤーの位置等は以下の処理で取得出来るのですが、選択したレイヤーが
連番のファイル(c00_01_[1-14].bmp)を使用していた場合、下記aiのフレームで使用
しているファイル名を取得する方法が分かりません。
ご指導お願いいたします。

layObj = app.project.activeItem.selectedLayers[0];
ai = layObj.inPoint;
an = layObj.position.valueAtTime( ai, false ) ;<< この時点で使用しているファイルを
取得したいのですが。。。


宜しくお願いします。



49 :kiyo :06/11/16 08:57:43 ID:vHj2ELZk
tetu様 いらっさいまし

なかなか困難そうなオーダーかも。
AEのシーケンスの扱いが問題になりますね。

AE側では(たぶん)統一的なアクセス方法は用意されていませんので
以下のようなルーチンを自分で組む必要がありそうです。

まず、レイヤソースがファイルソースであることを確認します
レイヤがソリッド(平面)やコンポの場合は、ファイルソースが無いので除外です。

var myLayer=app.project.activeItem.selectedLayers[0];
if(myLayer.source.mainSource instanceof FileSource){
//ファイルソースであれば次はファイルの特定
}else{
//フィルソースでない場合の処理
}

ファイルであった場合考えられる状況はまず大きく2つ
静止画ファイルである場合は、ファイルの特定は簡単で単純に mainSource.file プロパティを見る事で解決しますし
ムービーである場合それが単独のムービーファイルであれば、静止画と同じ方法で特定できます。

問題は、質問の通りシーケンスである場合ですが、これはムービーファイルの使用フレームを特定する作業と同じになります。
つづく


50 :kiyo :06/11/16 08:58:16 ID:vHj2ELZk
つづきました
AEでは、シーケンスファイルの第一フレームを代表ファイルとして記録して、連番1増加あたり1フレームのムービーとして
扱ってるはず(経験的にそうなっているとしか思えない)なので、

まず代表ファイルを取得してシーケンスプレフィクスと開始ファイル番号を取得します。

startFileName=Layer.source.mainSource.file.name; プロクシを避けてメインソースオブジェクトを参照
if(startFileName.match(/(.*[^0-9])([0-9]+)(\.[^\.]*)$/))
{
seqPrefix=RegExp.$1;
seqStartNumber=RegExp.$2;
seqPostfix=RegExp.$3;
}
;//プレフィクス、開始番号、ポストフィクスを拾い出す。

で、タイムから数値部分を計算

currentNumber=seqStartNumber+Math.floor(ai/myLayer.source.frameDuration);

あとは、組み合わせてファイル名を作成

myFileName=seqPrefilx+currentNumber+seqPostfix;

…ってとコでしょうか?こんな方法しか無いような気がしますね。


あと実用的には、0をそろえて桁番あわせとか、タイムリマップしていた場合の元フレームの取得とかも必要ですね。
なかなか大変そうです。がんばってください。


51 :tetu :06/11/16 12:07:52 ID:uugoaNME
kiyo様、回答有り難うございます。
細かいソースまで乗せていただき感謝です。
ファイル名の生成さえ出来れば、今回の問題は解決できそうです。
ファイル名の生成が駄目でも1フレーム1連番の法則がはっきりしたので
連番を添付して、何とか出来そうです。

ついでに質問ですが
>AEでは、シーケンスファイルの第一フレームを代表ファイルとして記録して、
>連番1増加あたり1フレームのムービーとして
>扱ってるはず(経験的にそうなっているとしか思えない)
コンポの場合も基のコンポを連番1増加あたり1フレームとして扱っている様で
すが、あってますか?

矢継ぎ早の質問で失礼します。
AE7.0の1ヶ月トライアル版での検証(AEスクリプトで、ある問題をクリア
出来るのか?)なので、宜しくお願いします。


52 :tetu :06/11/16 17:31:14 ID:uugoaNME
こんばんは。

レイヤーを選択後、そのレイヤーに使用しているファイル名、位置などは取得
出来るようにはなりましたが、フレーム上のマーカー名(1とか2とか)を
取得する方法はありますか?
質問ばかりで恐縮ですが、よろしくお願いします。


53 :kiyo :06/11/17 03:06:54 ID:51oc7hTs
ハイ、こんばんはです

>コンポの場合も基のコンポを連番1増加あたり1フレームとして扱っている様で
すが、あってますか?

だいたいあってます。
フッテージやコンポのフレームレートが一致している限りそういう扱いで問題ないです…が
フレームレートが一致していない場合は、ケースごとに実時間を参照して変換が行われますので

1.実時間を参照して自前で変換する。
または
2.フレームレートが異なっている場合処理しない。

とかなんとか処置しておいた方が良いかと思います。

>マーカーの名前
名前…と言うかcommentプロパティですね。
マーカーは、他のプロパティと同様にレイヤのプロパティとして扱いますです。
myComment=Layer.property("Marker").keyValue(1).comment;//一番目のマーカーのコメント
myURL=Layer.property("Marker").valueAtTime(1.0,true).url;//1秒めのマーカーのURL

プロパティが保持している値はMarkerValueオブジェクトです。MarkerValueコンストラクタで初期化できます。

myMarker=new MarkerValue("myComment","myChapter","ttp://myURL/","myframeTarget");
Layer.property("Marker").setValueAtTime(1.0,myMarker);
こんな感じ。

でした。

54 :tetu :06/11/17 09:54:22 ID:RQG8hMO6
kiyo様、いつも詳しく教えていただき有り難うございます。

>マーカーの名前
>名前…と言うかcommentプロパティですね。
すいません、コンポジションタイムマーカーの番号を取得したかったのです。。。


以前教えていただいたファイルソースの確認ですが、シーケンスファイルの判別を
下記の様に行っています。
コンポジション等は typeName で判別します。
シーケンスファイルの判別方法でもこのようなプロパティがありますでしょうか?


//ファイルソースの確認
var sLayObj = app.project.activeItem.selectedLayers[0]; // 選択された最初のレイヤー
if( sLayObj.source.mainSource instanceof FileSource ) {

startFileName = sLayObj.source.mainSource.file.name ; // 代表ファイルを取得

// シーケンスファイルかどうかをチェック
if ( startFileName == sLayObj.name )
{
seqFile = false;
} else {
seqFile = true;
}
} else {

//フィルソースでない場合の処理
if( sLayObj.source.typeName == "コンポジション" ) {
alert("コンポジション選択");
}
}

宜しくお願いします。

55 :kiyo :06/11/17 12:48:46 ID:51oc7hTs
どもです

>コンポジションタイムマーカー

ああ、そうですね「番号」ってくらいですから、そっちですね

残念、そちらに関してはスクリプトから操作するオブジェクトは用意されていないモヨウです。
以前探しましたが発見できませんでした。

エクスプレッションからは参照できる様なので、裏技的ですが「タイムマーカー参照用レイヤ」
とかを設置すれば値を取得するだけはできそうですね。

>シーケンスファイルの判別方法
専用のプロパティはないみたいです。アイテム的には「ムービー形式のひとつ」の扱いですね。

私なら、Item.source.isStill と 拡張子(ファイル形式)の組み合わせで判別するあたりでしょうか?
インポート直後(ソース名の変更がない状態)ならば、source.name と mainSource.file.name の比較でも可能ですね。

if((! Layer.source.isStill)&&(Layer.source.name==Layer.source.mainSource.file.name)){
//名前が一致しているのでアイテムはムービーファイル(単独ファイル)
}else{
//アイテムはシーケンスファイル(複数ファイル)
}
ソース名が変更可能なので一般性はないです。
なにか他にあると良いですが…

でした。

56 :tetu :06/11/17 13:12:47 ID:RQG8hMO6
kiyo様、回答有り難うございます。

>残念、そちらに関してはスクリプトから操作するオブジェクトは用意されていないモヨウです。
>以前探しましたが発見できませんでした。
そうですか。残念。

>インポート直後(ソース名の変更がない状態)ならば、source.name と mainSource.file.name の
比較でも可能ですね。
なるほど、ソース名の変更が無い事が条件ですね。

いろいろ有り難うございます。

57 :orita :07/12/25 23:50:42 ID:FTDbIvKw
始めましてoritaと申します。
最近スクリプトを触り始めた初心者です。

applyPresets( )ついての質問なのですが、
スクリプトを使って
「一つのセルレイヤーから複数個複製して、それぞれに別のアニメーションプリセットを適用する」
と、いったスクリプトを組みたいと思い試してみたのですが、
プリセットは「指定したレイヤー」ではなく、
「選択したレイヤー」に適用されていて、
一つのレイヤーにプリセットが多重かけされたモノが出来上がってしまいます。
これを回避して、
それぞれのレイヤーにプリセットを適用するにはどのようにすれば良いでしょうか?

また、プリセットの「.ffx」のファイルは
appプロジェクトと同じフォルダ内に無いとダメなようなのですが
こういったモノなのでしょうか?

当方、AE7.0でwin環境です
掲示板などに書き込みをするのは初めての経験なので
失礼をしていたら申し訳ございません。
質問内容と用語の使い方が稚拙であったと思いますが
よろしくお願い致します。長文失礼致しました。

58 :えずQ :07/12/26 21:20:31 ID:p/tn+zWw
こんにちは。私も7.0でのapplyPreset()のバグ(?)に悩まされておりまして、
しょうがないので、対象レイヤーを無理やりに選択状態にしてapplyPreset()を
実行して不具合を回避しています。

ちなみにこのバグはCS3でも修正されておらず‥‥皆さんはどのように対処
しておられるのでしょうか?


>appプロジェクトと同じフォルダ内に無いとダメなようなのですが

ffxファイルは単にapplyPreset(File('ファイルのパス'))で自由に指定
できると思いましたが‥。

59 :orita :07/12/27 17:13:27 ID:JGLteouY
えずQ様、せっかくお答え頂いたのに返信が遅く失礼致しました。


>対象レイヤーを無理やりに選択状態

スクリプティングガイドの中で
「PropertyBase selected attribute」なるモノを見つけ、
対象レイヤーを何とか選択することが出来て、
望んでいた「それぞれに別々のapplyPreset()を実行」することが出来ました。
出来た事は出来たのですが、この対処方法で合っているのでしょうか?
また、皆様はどのように対処されているのでしょうか?
ご意見・ご感想を伺えたら嬉しいです。


>ちなみにこのバグはCS3でも修正されておらず‥‥

自分の周りはCS3人口が少ないので知らなかったのですが、
バグが直っていないのでは、バージョンアップの意味が...と思ってしまいます。
applyPreset()は使っていきたい局面が多いだけに非常に残念です。


>applyPreset(File('ファイルのパス'))で自由に指定できる

ファイルパスをちゃんと指定すると、
何の問題も無く自由に指定することが出来ました。
勉強不足でお恥ずかしい質問をしてしまいました。

60 :えずQ :07/12/27 23:57:27 ID:HuDZkEmQ
こんにちは。

>PropertyBase selected attribute
>対象レイヤーを何とか選択することが出来て、

Layerオブジェクトの項には記載がありませんが、実は「selected」プロ
パティが使えるようです。(itemオブジェクトからの継承?)

コンプアイテム.layer(1).selected=true;//レイヤーを選択状態にする

CS3で検証してみて、未だに選択レイヤーにapplyPreset()されてしまうのが
直っていないのは、驚きでした。
う〜む。。。こまめにadobeにフィードバックしていくしかないかも知れませんね。



61 :kiyo :07/12/29 02:01:14 ID:gDWwGpuI
遅ればせながら こんばんは
>orita様へ
所々の事情によりレスが遅れました。
もう大方のお話は済んでいるようですが

>applyPreset()
…実は殆ど使用したことがありません。

担当作品の環境がAE6.5であったために互換部分ばかりを操作しております。
そのバグの件は聞き及んでおりますが、現在の所あらかじめターゲットのレイヤをセレクトしておく事で回避するしか方法は無さそうです。

当方では、相当の処理が必要な場合はAE6.5での使用のため
スクリプト内で必要なプロパティを直接打ち込む方法で対処しています。
別に用意したテンプレートを編集しての各処理ごとの作業なので「けっこう手間」な上に
スクリプトから操作できないエフェクト(テキスト・カーブ等)があるので時々困っています。
ただし、アニメーションプリセットではできない処理もできますのでそこは一長一短でしょうか?

何か汎用性のある機能を乙女に持たせても良いかと考えていますが、現在はちょっとばかり開発休止中なので…

AE7-8用のバグ回避コードを乙女に組み込んで見ようかな?とかちょっと思案中

62 :えずQ :07/12/29 17:30:59 ID:0MGvLuMc
こんばんは。

スクリプトで一時的に対象レイヤーを選択状態にしてapplyPreset()し、
もとの選択状態に戻す方法の欠点は、アンドゥバッファにスクリプトの
経過が残留してしまう点です。

なので「あ、間違ったffxを指定しちゃった」と言う場面でアンドゥする際、
アンドゥ一発で元に戻せない(=レイヤーの数と処理工程が多いほど面倒)
状況となります。

やっぱり、ちゃんとlayer(num).applyPreset()が正常動作するのが一番なん
ですよね‥‥。

63 :kiyo :07/12/29 23:54:07 ID:gDWwGpuI
こんばんはぁ
いま、ぽけっと考えているのは
レイヤのLayer.applyPresetメソッドをオーバーライドして以下のようなメソッドをのせる事です。

0.undoグループを立ち上げる
1.呼ばれたら、現在のコンポのセレクト状態を控える
2.自分自身をセレクトしてコンストラクタのメソッドを呼んでプリセットをかける
3.セレクト状態を復帰してundoグループを閉じる

こんな感じ、うまくできたら外からは正常な動作に見えるはずですの。

まだ試してないのでどこかでつまづくかも知れませんけどね。
今は例のペイント周りをちくちく作業中なので来週くらいなか?
それともezQさんが書きます?

64 :kiyo :07/12/30 12:08:02 ID:8a8Qgrko
はあ、ほれはら 少し気になったのでテストしてみたです。
元来存在するメソッドのオーバーライドはできませんでした。

Layer.prototype.applyPreset=function(){alert("test")};

これをやってもオリジナルのapplyPresetが呼び出されるので
>>63
の処理はできないみたいっぽい。
ただ下のように未定義のメソッドを作成することが可能なので前述の処理を代用メソッドにする事は可能
//
Layer.prototype.aplPreset=function(){alert("test")};
//上のようにすると下のコードが実行できるぞぞ
app.project.item(1).layer(1).aplPreset();
うーん、後でなんか書きます。

65 :えずQ :07/12/30 12:26:31 ID:ryctyVa2
>beginUndoGroup()

たはは。確かにこれを使えば悩みは解決しますね。
begenほにゃららは、SuppressDialogsしか使っておりませんでした。

function myApplyPreset(v){
app.beginUndoGroup('applyPreset');
var cc=this.containingComp.selectedLayers;
for(var i=0;i<cc.length;i++){cc[i].selected=false;}
this.selected=true;this.applyPreset(v);this.selected=false;
for(var i=0;i<cc.length;i++){cc[i].selected=true;}
app.endUndoGroup();
}

まんま、kiyo様の0〜3の手順ですね‥‥。

66 :えずQ :07/12/30 12:34:54 ID:ryctyVa2
>オリジナルのapplyPresetが呼び出される

‥‥のようですね。
私もテストの際に気がつきました。なのでapplyPreset2みたいな名前で
メソッドを追加してテストしてみました。

またプロトタイプではなく、オブジェクト個々にapplyPresetを上書き
したところ、applyPresetで呼び出せるのですが、undoの際「グループ」
が一致しない」との警告がでました。
オリジナルapplyPresetのundoGroupとの衝突なんかな?‥‥と思いつつ。


67 :kiyo :07/12/30 16:49:30 ID:8a8Qgrko
いらっさい
「グループ一致シナイ」 エラーは、何らかの理由でundoGroupを閉じそこねた時に良く見かけます。
たとえばグループ内の処理がエラーで中断された時やループミスで”endUndoGroup()”をパスしてしまったときなどです。
入れ子もダメっぽい。
結構うっとおしいので
  グループ内の処理は、なるたけ短く。
  エラーがでないように事前にデータの検査をしておく。
とかの処置をしておくとハッピーセットっぽいでございます。

じゃ、カブリ分は消しときますね。

68 :orita :07/12/30 20:51:07 ID:4wjbFp2c
えずQ様、kiyo様へ>
返信が遅れ大変失礼致しました。
話しの流れを止めるようで恐縮なのですが……。

丁寧にお答え頂き、とても参考になりました。
本当にありがとうございました。

69 :kiyo :07/12/30 22:37:28 ID:8a8Qgrko
>>68
orita様へ
>流れを
お気になさらず、またどうぞ

良く考えたら、質問スレッドからずれているのは私たちだったりして…だはは

70 :えずQ :07/12/31 16:28:25 ID:Ws/QzosE
>処理がエラーで中断された時

ああ、これですね‥‥。
smoothの期限切れ(時事ネタ)でダイアログが出てしまったので、そこで‥‥ですね。

71 :kiyo :08/01/02 21:04:31 ID:???
どもども
>期限切れ
それっぽいですね。
一応エラー回避代用メソッドをアップロードしました。
ただ、前述のような「適用したプラグインがだすエラー」は、さすがにフックできない。

というか、AEご本家のエラーでもtry catchで捕捉出来ないヤツが結構あるので、時々困ります。

ま、あるていどは「しょうがない」よう〜

72 :tag :08/01/18 13:59:01 ID:8tUrSK/+
初めまして。
AEのエフェクト置換プログラムを探してたどり着き、早速ダウンロードさせていただきました。
AE6.5上でダウンロードしたままのスクリプトを走らせたところ、
NASライブラリが定義されていない、というエラーが出たため、
NAS関連部分をコメントアウトしてみたところ、
今度は133行目で、対応する閉じかっこがない、というエラーが出ました。

NASライブラリが無い状態でこのスクリプトを使いたいのですが、どのように
カスタムしたら良いのでしょうか。
スクリプト初心者のため、根本的なところがわかっていない可能性が高いのですが、
教えていただけると幸いです。

また、使用するエフェクトのmatchNameを知るにはどうすれば良いのですか?
エフェクトファイル名とも違うようですし、AE上の表示名とも違うようですが…。


73 :kiyo :08/01/18 18:20:25 ID:JAnGxsXE
>>72
tagさん いらっしゃいませ

どうやら私のミスです。判定を間違えていました。
あとで修正版をだしますが、お急ぎでしたらプログラム冒頭に以下の行を追加して実行してください。

try{if(nas){;}}catch(err){var nas=new Object();nas.biteClip=false;}

"matchName"は、プロパティを識別する為の文字列でレイヤ名などのように
ユーザが自由に変更する事はできない 内部での固定文字列です。

以下のようにすると「コンポ ほげほげ」「レイヤ ふがふが」の 「もげもげエフェクト」のmatchNameが取得できます。

alert(app.project.item(ほげほげ).layer(ふがふが).property("エフェクト").property(もげもげ).matchName)

"matchName AE "で検索した方がはやいかも知れませんが…

またどうぞ

74 :kiyo :08/01/18 18:35:47 ID:JAnGxsXE
↑ てなわけで
修正版と元の奴を入れ替えました。

ttp://hpcgi2.nifty.com/Nekomata/control.cgi?PAGE=85&ITEM=071118

どうもすみませんでした。



75 :tag :08/01/20 12:55:37 ID:VoL1MzBA
>kiyo様
ありがとうございます!助かりました。
修正版のほうもダウンロードさせていただき、問題なく動作しました。
これを機にスクリプトの勉強もしてみたいと思いました。
また質問に上がるかもしれませんが、そのときもよろしくお願いします!

76 :kiyo :08/01/20 16:09:50 ID:Arrz8BDk
>>75
どういたしまして。
教えてもらわなかったらミスしたまま放置していたと思いますので、
こちらこそご報告感謝でございます。

重複分は消しておきました。

またどうぞ

77 :hide-i :08/11/09 13:23:44 ID:6FAJ+U9c
はじめまして。

ttp://www.pati-tool.com/
遊技機向けに色々と開発を行っており、
AEと他のソフトの連携や、Director向けのツールを作っているものです。

>>48-56のシーケンス連番作成に関して問題があり、
解決にこちらのサイトの情報が役に立ちましたので、
報告させて頂きたいと思います。
例のDurationのバグと同系統の問題で、タイムリマップにsetValueするときに、
(フレーム数/Layer.source.frameRate)の小数は切捨てされるのですが、
(整数 - 1/256) 内の範囲だと、繰り上がります。
そのためシーケンス番号を生成の際に、単純にMath.floor()すると、
表示上より1少ない番号ができてしまいます。

> どうもAE7…「きちんと数値を認識」しているのではなくて、
> 「ある程度まで近似値になった指定を無理やりフレームの変化点にする」
> 処置をしているみたいです。

なぜ1/256なのかの根拠は不明なのですが、うちのAEのバージョンが7.0なので、
これに引っかかって、繰り上がってるのかもしれません。
ただ、1/256の範囲とは関係なくずれるケースもありました。
発生率は1/10000以下で、得た数値も(1/n)や1/(2^2)に該当しないので、
原因を突き止めることはできませんでした。

他、フレームレートを変えても発生率に差異は確認できませんでした。
以下、テスト用に使ったコードです。

78 :hide - i :08/11/09 13:25:57 ID:6FAJ+U9c
p = 256;
coe = 1/p;
targetItem = app.project.item(1);
layObj = targetItem.layer(1);
setLayObj = targetItem.layer(2);
layObj.timeRemapEnabled = true;
setLayObj.timeRemapEnabled = true;
timeObj = layObj.property("timeRemap");
setTimeObj = setLayObj.property("timeRemap");
compStartframe = Math.round(targetItem.workAreaStart/targetItem.frameDuration);
compEndframe = Math.round((targetItem.workAreaStart + targetItem.workAreaDuration)/targetItem.frameDuration);
for(var f=compStartframe; f<compEndframe; f++){
//毎回タイムを生成しないとずれる
var t = f/targetItem.frameRate;
remapTime = timeObj.valueAtTime(t,false);
r = remapTime * layObj.source.frameRate;
fr = Math.floor(r);
//marginは必ずプラスにする
margin = fr+1 - r;
if(margin<=coe&&margin>0){
seqNum = Math.round(r);
}else{
seqNum = Math.floor(r);
}
setTime = setTimeObj.setValueAtTime(t,seqNum/layObj.source.frameRate);
}
alert("Fin");

79 :kiyo :08/11/12 08:59:51 ID:???
hide-i 様へ
どうも書き込みありがとうございます。
最近はスクリプトまわりのプログラムにすっかりご無沙汰のねこまたやです。
シーケンス番号の特定は、当方の仕事だとほとんど発生しないので
この件は以前の話題のあと手つかずでございました。
が、なんだか難儀そうな障害がありますねぇ 1/256…気にしておくことにいたします。

AEのフレーム代表点は表示時間の冒頭なので、
当方ではフレーム番号からAEのタイムリマップの値をつくるさいに
timeRemapValue=(frameNumber*frameDuration)+(frameDuration*0.5);
こんなふうに半フレーム後方へずらせてフレーム番号の不安定さを
回避することがあります。ご参考までに
----
AEまわりのスクリプトやエクスプレッションを書いていて気になる点のひとつは、
ECMAスクリプトの環境にAE本来のオブジェクトがDOMで実装されている為、
データの振舞いがアプリケーション内部とスクリプトまわりで違うことです。
要するに JavaScriptとDOM側の値がズレるのが怖いので可能ならば最近は
本体オブジェクトのプロパティの参照を優先して外部の操作用変数を
あまり作らないで処理するように心がけております。

避> var myPosition=app.project.item(1).layer(1).position;//値を控える
myDestination=[myPosition[0],myPosition[1]/2];

望> var myTarget=app.project.item(1).layer(1);//参照を作る
myDestination=[myTarget.position[0],myTarget.position[1]/2];

以前のコードにはそうなっていない部分も多々ありますが〜 でへへ
よろしければまたどうぞ。

80 :hide-i :08/11/12 16:10:22 ID:c4FyCKzk
返信ありがとうございます。

ttp://bry-ful.ddo.jp/BRY/software/FsPlugins/Plugins_Development_diary/index.html
bryful様のページの固定小数の項が原因なのかなと思い始めています。

256に関係する数値での現象ですし、関係のない部分でずれるのは、
オーバーフロー回避の説明のように小数部の精度を犠牲にされているのかなと…
まぁ現状の発生率で1コマずれるだけなら、大きな問題ではないので、
この辺で追及は終わりにします。

なんちゃってスクリプターなので、浮動小数やbitを意識した数値が出てくると、
もう何がなんやらです。
また何かあった時はよろしくお願いします。

81 :curryegg :09/08/01 18:37:54 ID:XqAgAnSQ
以前、photoshopでのレイヤーの複数選択について書き込みさせていただいた者です。
その節は、ありがとうございました。


今回、AE6.5 のスクリプトについて質問させてください。

コンポ内のレイヤーを別のソースのフッテージアイテムと入れ替える時に、
CS4 では "replaceSource()" でソースの入れ替えが出来ますが、
6.5 ではどういった記述をすればいいのか、わかりませんでした。

調べてみてもうまく見つけられなかったので、もしご存知でしたら
教えていただけますでしょうか?
(マウス操作で言うところの、Option[Alt] + ドラッグ です)


お忙しいとは思いますが、もしお分かりでしたら宜しくお願い致します。

82 :kiyo :09/08/05 12:09:30 ID:???
いらっしゃい
AVLayer.replaceSource()は CS3からのメソッドですね。
いま手元に6.5がないので確言はできませんが、それ以前のバージョンだと
スクリプトから一回でそっくり置き換えることはできないと思います。

考えられるのは、
 新しいソースのレイヤを元のレイヤに近接させて作成・配置
 必要なプロパティをコピー
 元のレイヤを非表示または削除
というわりと迂遠な手順です。

とりいそぎ

83 :curryegg :09/08/05 20:23:08 ID:I/HOs2ck
ご返答ありがとうございます。

何か他のやり方でいい方法があればと思っていたのですが、
直接入れ替えることは出来ないのですね。残念。

元のレイヤーの全ての要素をコピーさせることも考えてはいたのですが
何かのプロパティにキーフレームがあったりする場合を考えたりすると、
ちょっと面倒なことになりそうですね・・・・

いろいろと思案してみることにします。

お忙しい中、ありがとうございました。



84 :cob :10/03/05 22:36:09 ID:d9XQlVKk
お疲れ様です。
初心者的な質問で申し訳ないのですが
上記の

> 新しいソースのレイヤを元のレイヤに近接させて作成・配置
  必要なプロパティをコピー
  元のレイヤを非表示または削除

をやってみようと試みているのですが
レイヤーをコンポ内でindex移動するところですでに
戸惑っています。
リファレンス等でmoveTo(integer index)であればいけるのかなと
ためしているのですが、
移動先indexを入れたらいいのだろうと入力しても

>>親が INDEXED_GROUP ではないので
(parentProperty.propertyType != PropertyType.INDEXED_GROUP なので)、
このプロパティに対して「moveTo」は使えません。

とエディタ上失敗のメッセージが出ます。
この場合親とは何なのでしょうか。
moveTo以外には適当な式がないのでこの壁をクリアする以外ないと思うのですが
行き詰ってしまいました。

ご教授ねがえれば幸いです。

85 :kiyo :10/03/06 22:12:01 ID:DbbUBUVE
いらっしゃい
たしかに怪しいエラーがでますね。
moveTo は使用していなかったので気づきませんでした。

レイヤの移動には
moveAfter(ターゲットレイヤ)
moveBefore(ターゲットレイヤ)
moveToBeginning()

86 :kiyo :10/03/06 22:15:03 ID:DbbUBUVE
moveToEnd()
などが使えます。
ターゲットのレイヤの上や下へ移動することができるのでもっぱらこちらを使ってます。

AEのリファレンスは結構誤記が多いので困りますよね

87 :cob :10/06/15 13:18:55 ID:YEc++SEM
お疲れ様です。
ご教授願おうと思いまして
書き込みさせていただきます。

After EffectsのCS4を導入したのですが
スクリプト周りが不具合の連続でどうにも困っております・・。

1)まず「ExtendScript Toolkit_CS4」(以下エディタ)の場合、
 UI表示などで日本語を使いたい場合、日本語が文字化けしてしまうのは
 しょうがないのでしょうか。
 英語表記にするならそれでもよいのですが
 前バージョン(7.0)ではできたのに、何故。という思いです。

2)スクリプトの実行からはちゃんとscriptファイルを実行するのに
 なぜかエディタを経由するとエラーで止まります。
 エラーが表示されている部分も構文的にはなんでもないところで
 7.0時は正常に動作していたところが
 引っかかるのが解せません。

 ただ、いまのところ引っかかる構文自体は同じもののようです。
 app.project
 このオブジェクトで引っかかります。
 しかしエディタを介さずスクリプト実行するときには
 正常なので不思議なのです。

ネット上でも同業者の方々の文献よみましたが
同じ事例はなさそうでした。
なにかこちらのシステム環境に問題があるのか
なにかヒントなりしを与えていただければと
おもいます。





88 :kiyo :10/06/15 14:40:01 ID:+PcSUGLk
いらっしゃい
仕事の都合でAE-CS3環境で留まっているので使い込んではいませんが
その症状はエンコーディング関連のようにも見受けられます。
以前(CS2=AE7あたりまで)はエンコーディングがUTF-8決め打ちでしたが、
CS3あたりからはスクリプト環境全体でマルチランゲージの対応をはじめている印象を持ってます。
(実際には突っ込んで調べてはいません…すみません)
CS5ではまたさらに各部の変更が伝えられているようですがこちらはまだ未見です。

あまりお役に立てずにすみません


89 :ユウ :10/12/13 22:06:27 ID:57voaOtk
初めまして。
ユウと申します。

今回エクスプレッションもままらない状態でスクリプトをやる事になってしまったのですが、
完全に混乱してしまった為、ご指導頂きたく質問させて頂きました。

やろうとしている事は、AEのプロジェクトウインドウ上で名前を変更した素材に対し、
ソースフッテージのファイル名も同じ名前に変更し、
且つファイルパスのリンクが切れないように処理するというのが目的です。
一応、以下の様にフッテージのみを対象にして
アイテム名とソース名の違う箇所のみ変更し入れ換える…
という感じで書いてみたのですが上手くいきません。
…というより現状ではエラーで止まってしまいます。

for(var i=1; i<=app.project.items.length; i++){
var oldName = app.project.item(i).file.name; // ソースフッテージ名
var newName =app.project.item(i).name; // AE上で変更したアイテム名

if(app.project.item(i) instanceof FootageItem){
if(newName != oldName){
oldFileObj = new File(oldName);
newFileObj = oldFileObj.rename(newName);
app.project.item(i).replace(newFileObj);
}
}
}

根本的な間違いをしている気もするのですが
何かしらヒントでも頂けたら幸いです。
こちらの環境はWinXP AfterEffectsCS4 ExtendScript Toolkitです。

お手数かと思われますが宜しくお願い致します。

90 :kiyo :10/12/23 00:31:57 ID:q9eYeT6g
いらっしゃい。>ユウさん
しばらく忙しくてサイトのチェックをしていなかったので1週間以上遅Resで失礼します。

ええと、このコードにはけっこう問題があります。
多分途中のエラーでループが終了しないと思います。

91 :kiyo :10/12/23 00:32:43 ID:q9eYeT6g

for(var i=1; i<=app.project.items.length; i++){
// ここでアイテムが総当たりになっているので
var oldName = app.project.item(i).file.name; // ソースフッテージ名
// fileプロパティを持たないアイテムではここで止まります
// 先にFootageItemの判定を行わないといけません
// アイテムのfileはプロクシが有効な場合はプロクシを指しているはずなので
// そこでも誤動作の可能性があります
var newName =app.project.item(i).name; // AE上で変更したアイテム名


if(app.project.item(i) instanceof FootageItem){
if(newName != oldName){
oldFileObj = new File(oldName);
// Fileオブジェクトをファイル名だけで初期化するにはカレントフォルダをファイルのあるフォルダに移動する必要があります。
// このコードではファイルが正常にハンドリング出来ない可能性が高いです。
// オリジナルのファイルを参照しておいた方が良いです。
// myFile=new File(myItem.mainSource.file.fsName) 等の方が良いでしょう。
// リネームしたあとでも myFileは該当ファイルの参照が可能です
// つまり myItem.replace(myFile) として使えるので newFileObjを作る必要はありません
newFileObj = oldFileObj.rename(newName);

//リネームした時点でソースファイルをロストしますので、注意が必要です
app.project.item(i).replace(newFileObj);
// replaceメソッドでファイルを置き換える場合は、注意が必要です。
// ファイルが連番の場合やPSD等のファイルオブジェクトのみでは素材が特定出来ないケースがあります
}
}
}
という感じです。参考になれば

92 :ユウ :10/12/24 13:21:10 ID:qJZ54Ow+
kiyo様

お世話になります。
何だかお恥ずかしいスクリプトを見せてしまいまして恐縮です…
書き込み後も色々試しまして、ソースのリネームまで漕ぎ着けたのですが
ファイルパスの差し換えのreplace()でつっかえてしまい、
一旦、パスを文字列に分解など試していた所でした。

今回、添削して頂いた部分を参考に再度挑戦してみます。

完成しましたら追ってご報告致します。
ありがとうございました。


93 :ユウ :11/01/28 21:24:27 ID:9/367vkQ
kiyo様

ご報告が遅くなりましたが、ご指摘部分を参考に
拙いながらもスクリプトが完成しました。
ありがとうございました。

94 :SRX :11/09/15 17:48:02 ID:ARBw0/SQ
kiyo様。はじめまして。

もっていないプラグインが適用されたエフェクトの調べ方がわかりません・・・。
プラグイン自体はもってなくても、
エフェクトの下に「見つかりません」と表示されますが、
これがスクリプトでは名前も取得できて、
canAddPropertyでもエラーにならないのです。

もし何か御存知でしたら御教授ください。
よろしくおねがいします。

95 :kiyo :11/09/24 10:23:11 ID:WUFBaqoE
いらっしゃいSRXさん
しばらく忙しくてBBSをチェックしていなかったので遅くなりました。

どういう処理が必要かで対処は変わるかと思います。
存在しないエフェクトはエラーにはならないで処理がスルーされる
だけなので、個別に対処が必要かと思います。

特定のエフェクトを削除するのが目的ならmatchNameで検索するのが
良いと思います。

汎用的に持っていないエフェクトを抽出するのが目的ならば、
読み込み直後に名前に「見つかりません」が含まれている事を
利用すれば検出可能かなと思います。

if(hoge.isEffects)&&(hoge.name.indexof("見つかりません")>=0)

↑こんなカンジで処理するくらいでしょうか

…もう解決しちゃったかもしれませんが


96 :SRX :11/09/26 14:36:47 ID:uWd4NSM2
お忙しい中、回答ありがとうございます。

御指導に基づきためしてみましたところ、
hoge.nameでは 【 :(コロン) 】 より手前の部分を
バッサリと捨て去っているようで、indexOfでも当然拾えませんでした。
つまり「見つかりません:NAIYO EF」では「NAIYO EF」だけが表示されます。
(ここで見つかりませんが表示されていれば、ここまで苦しんでなかったわけですが...)

hoge.instanceName みたいなプロパティがあるのでしょうか。。。

・・・まだ解決しちゃってないのです...。 

97 :SRX :11/10/14 13:54:46 ID:5kg1zdh2
解決したわけではないのですが、CS5.5に追加された
app.effects オブジェクトの存在が、まさに私の求めていたソレでした。
・・・つまり、CS4では実現が難しい事だったのですね ;_;

泥臭いというか、回りくどいというか、プラグインフォルダにある
プラグインのバイナリをサーチしてインデックスを作る方向で考えてみます。

ひとまずありがとうございました。

98 :WACHI :14/07/06 12:46:56 ID:JXM84N6Y
初歩的な質問で申し訳ないのですが、
タイムシートの適用方法がわかりません。

チュートリアルビデオを見ながらやってみたのですが、「編集をポチ」の編集とはどこでしょうか?
PsAXEで「XPS編集」を押して設定画面を出すところまではできるのですが…
あとそれを繰り返しているとXPSビューアで開くことが出来ませんと出るようになり、設定画面も出なくなります。

りまぴんとFirefoxはインストール済みです。
よろしくお願いします。

99 :kiyo :14/07/07 11:10:10 ID:rh19OGow
WACHIさん ようこそ
ご質問の件です

AIR版の「りまぴん」のインストールは、なされたでしょうか?

拡張子xpsのデータは、現在の標準的なWindows環境ではマイクロソフトのデータファイルに関連付けられています。
「XPSビューア」はその表示用アプリケーションです。

「りまぴん」の拡張子はこれとカブっています。

AIR版の「りまぴん」をインストールするとこの設定を上書きして、拡張子XPSのデータを「りまぴん」側に関連付けできます。
拡張子の関連づけの警告が出る場合は、「りまぴん」側を有効にする必要があります。

現状ではPsAxeをフルスペックでインストールするのはちょっと複雑なので、どうもすみませんです
来週辺りに配信でインストールをやろうかと思ってます

100 :WACHI :14/07/08 01:59:35 ID:3bKQo6Q+
最初AIR版ではないりまぴんをインストールしてしまい、その後AIR版をインストールし直しました。

そのうち配信でインストールをなさるとのことですので、それを待ちます。
ツイッターなどで告知されますか?

ありがとうございました!

101 :1 :22/03/02 21:32:47 ID:/ayCtnt2
555

62KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail(省略可)

0ch BBS 2004-10-30 (+Nekomataya/2005-02-17)