ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

XSIコミュのScript研究所

  • mixiチェック
  • このエントリーをはてなブックマークに追加
XSIのスクリプトを
「勉強」
「欲しいスクリプト」
「教えてください!」
「独り言・・」および「完成品」を
お披露目をするトピックです。

デザイナーが苦手な
この数列、
しかし触り続けていると、
あまりの便利さに
病みつきになるかもしれません。

いまから
0から始めるスクリプトなど、
如何でしょうか?

■SDKドキュメント
スクリプトエディタを開いて、「?」マークを押すと
大量のサンプルが掲載された英語SDKドキュメントが立ち上がります。
これの日本語版は以下からダウンロードすることができます。
http://www.softimage.jp/support/download/other.html#6
■XSI道場
デザイナーがどうやってスクリプトを勉強するか?参照で
随時0から始めるユーザーへのポータルとして機能します。
http://eldorado.xrea.jp/xoops/modules/pukiwiki/274.html

コメント(146)

初めて質問させて頂きます。

現在pythonを使ってGUI付きのスクリプトを作ろうと勉強中なのですが、
wxPython(wxWidgets)というGUIモジュールをインポートしたところ、
XSIが落ちてしまいました。

import wx

↑この一文で落ちます。。

wxPythonはXSIから使用する事は可能でしょうか?
よろしくお願いします。

■使用環境
OS : winXP(64bit
XSI : ver6(Ess 32
Python : 2.6.2(32bit
wxPython : wxPython2.8-win32
>ヨ!さん

wxPythonが気になったので試してみたのですが、ぼくのXSIも落ちます冷や汗
ヨ!さんと同じ、import wx この一文で落ちました。謎です。

http://www.lalancelot.com/scripting.html

↑ここのサイトのスクリプト「CITY BUILDER PYTHON SCRIPT FOR/POUR XSI」ではwxPythonを使っていました。

ウィンドウは出てきたのでwzPythonは仕様可能のはずですが、ウィンドウを閉じるとまた落ちますし、スクリプトを実行しても最後には落ちたんですよね。


このスクリプトを調べると何かヒントがわかるのかも知れません。
が、僕の知識ではちょっと難しかったですバッド(下向き矢印)
>えふさん

えふさんの環境でも落ちますか。。。
教えて頂いたCITY BUILDERを試してみたんですが、
ウィンドウを閉じるとXSIが落ちてしまいましたので同じ症状ですね。

しかしわからないのは、CITY BUILDERのソースを見てみると
import wxが成功しているんですよね。。ほんとに謎です^^;


wxPythonだとドラッグアンドドロップが簡単に実現できそうで良かったのですが、
(tkinterでは無理だったので)これだと安定した動作は望めそうに無いですね。。
他の方法を模索してみます。

アドバイスありがとうございました!
スクリプトに関して分からない事があったので質問ですm(_ _)m


シーン内の複数あるレンダーパスの名前をテキストファイルとして保存する事はスクリプトで組めるのでしょうか?

例えば

sampleというシーンがあり中には

color
ao

という二つのレンダーパスがあります
そのパス名の羅列を".txt"として書き出したいのです(汗)

テキストファイルの中身をこうしたいのです↓

color,ao



自分では解決出来なかったのでどなたかスクリプトに詳しい方がいたら教えてくださると幸いですm(_ _)m
>Hikaruさん

レンダーパスの名前が既に取得できているのであれば、ファイル処理って方法で出来ると思います。

Pythonではこの様な感じになります。

Path = "ここに書き出したいtxtのフルパスを入れる"
f = open(Path, 'w')
f.write("color,ao")
f.close()

ファイル処理で検索してみると沢山例が出てきますよ。
>>えふさん
素早いご返答ありがとうございますm(_ _*)m

レンダーパスの取得も出来ていない状態で、本当何もないまっさらな状態から作ろうとしてる次第です(汗)

Pythonをまだ入れていないので後日試してみたいと思います。
ちなみにvbsやjsでも組めるものなのでしょうか?
>Hikaruさん

まずレンダーパスの取得がどういった手続きかによりますね。
これが難しくなければ、後は楽勝だと思います。


ファイル処理はjsでは問題なく出来ます。僕もPhotoShopでよく使っています。
vbsはあまり知識ないんですが、調べてみたらあるようでした。


予想ですけど、多分難しくはないんじゃないかなと思うんですけどね。
頑張ってくださいね指でOK

僕も暇があったら調べてみます。
>えふさん
ご返答ありがとうございます。

jsでも出来るんですね、ちょっと自分でもいろいろ調べてみます!
また分からない事があったら書き込みたいと思います。
>Hikaruさん

ひさびさにやってみました。
vbsはちょっと苦手なので、配列のソートが分からなかったです…。
全て

C:\a.txt

に書き込むようにしてます。
参考にしてみてください〜。

[v]
s = Replace(ActiveProject.ActiveScene.Passes.GetAsText(), "Passes.", "")
set fso = CreateObject("Scripting.FileSystemObject")
set f = fso.CreateTextFile("C:\a.txt",True)
f.WriteLine(s)
f.Close()
LogMessage s

[j]
var a = new Array();
oPass = ActiveProject.ActiveScene.Passes;
for(var i=0;i<oPass.Count;i++) a.push(oPass(i).Name);
a.sort();
s = a.join(",");
var fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.CreateTextFile("C:\\a.txt");
f.WriteLine(s);
f.Close();
LogMessage(s);

[p]
l = list()
for p in Application.ActiveProject.ActiveScene.Passes:
    l.append(p.Name)
l.sort()
s = ",".join(l)
f = open(r"C:\a.txt","w")
f.write(s)
f.close()
Application.LogMessage(s)
>garuさん
おお! ありがとうございます!!!
やりたい事が実現致しました、素晴らしいです(涙)...

これをもとに更に理想のスクリプトを組めれば良いのですが、、、
お力をもう少し貸していただきたいです(汗)
あと二点ありまして。。。


今現在"C:\a.txt"となっているファイル名の"a"の部分をシーンの名前と一緒にすることは可能でしょうか。。。?

使っているのが"sample.scn"でしたら "C:\sample.scn.txt"で吐き出すみたいな事なんですが。

あと一点なんですが、選択してるパスのみの名前を吐き出すことが出来たら理想的だなと思っております。


もし可能であれば教えてくださると助かります(汗)m(_ _)m
>Hikaruさん

シーン名取得はこうです。
言語が分からないので、jscriptで書かせていただきます。

sScn = ActiveProject.ActiveScene.Name

これをストリングで繋げてファイル名にします。

"C:\\" + sScn + ".scn.txt"

選択しているパスのみのやり方はいろいろあるのですが
単純にSelectionを使って2行目を

oPass = Selection

にするだけで万事オーケー。

よろしくどうぞー。
>garuさん
ご返答ありがとうございます!m(_ _)m


上記のスクリプトを入れ込んでみたら見事に出来ました!!
本当にありがとうございます、デザイナーもスクリプトを使えるようにならないとダメですね(汗)

ちょっと自分でいじって、Cドライブ以外に保存しようと"C:\\"を書き換えてみたんですが
そうするとうまく動かないのはどうしてなんでしょうかね(汗)?

シーンが保存してあるフォルダに(ネットワーク上(社内LAN)のフォルダに保存してるのが原因?)
保存は出来るものなのでしょうか?


質問ばかりで申し訳ありませんが、宜しかったらお教えください。
>Hikaruさん

デザイナーがスクリプトを書けるようになるのは、結構大変なことだと思います。

場所はどこでも保存出来るのですが、
シーンが保存してあるフォルダにテキストを書き込むことは可能ですよ。

ActiveProject.ActiveScene.Parameters("Filename").Value + ".txt"

とすれば、シーンのフルパスを得られると思います。
上記の sScn の行は不要になって、少しシンプルになりますね。
これで少し早くなってると思います。
[i.SubElements for i in oCol] とか自分でもよくわからないんですがいろいろやってたらできました。
どうでしょう?


from win32com.client import *
app = Application
log = Application.logmessage

oObj = app.PickElement("object", "Select object", "Select object")
oName = oObj.Value("PickedElement")

oFil = app.Filters("Polygon_Island")
oFacets = oName.ActivePrimitive.Geometry.Polygons
oCol = Dispatch('XSI.Collection')
oCol.AddItems(oFacets)
oCol = oFil.Subset(oCol)
s = set([i.SubElements for i in oCol])

log(str(s))
>マンサクさん

このSDKは古いものみたいですね。
Help > SDKGuide で今使っているのバージョンのSDKガイドが見られますよ。
File > Preference > General のLanguageの Help Language を Japanese にしておけば日本語になります。

CM->OMの対応表はたぶんないと思うんですが、スクリプトをいじり始めたころからなるべくオブジェクトモデルで書くように心がけていたのでだんだんわかってきた気がします。
書くスピードが著しく遅かったりもしましたが。

今回の例では、「Application.Filters」、 「Filter.SubSet()」あたりは全く知らなかったので上記のSDKガイドでしらべて見たら「Subset()」の引数の型が「XSICollection」だったので取得してある「oFacets」をまんま「XSICollection」に入れてみたら入って、「Subset()」も通った、
戻り値「XSICollection」の中を調べてみると「CollectionItem」だったので「CollectionItem.SubElements」を使ってみた、
といった感じです。
ちなみに前回の書き込みをした時は「CollectionItem.SubComponent」がうまく取得できなかったような気がして、「[i.SubElements for i in oCol] とか自分でもよくわからないんですが」と書いたんですが今やってみたらちゃんと取得できました。
なので「SubComponent」を使った方が便利かもしれません。
そのまま選択とか出きますし。

取得したオブジェクトが何者なのかを調べるときには
Application.ClassName(オブジェクト)
を使うといいと思います。
出てきた結果をSDKガイドのキーワードタブに入れるとたいてい引っかかります。
今回で言うと
app.ClassName(oFil) で「Filter」が帰ってきますし、
for i in oCol:
app.ClassName(i)
で「CollectionItem」がずらーっと並びます。
スクリプトに関して分からない事があったので質問です。

プリミティブ > モデル > 2足-リグでアニメーションを付けているのですが、
ViewDにglobalSRT下のシノプティックビューを表示できないかと思いスクリプトを勉強しています。
http://giken.workarea.jp/cg/modtool/dragon02/dragon_head_16.html
こちらのページを見させていただきながらView Attributesがどうやらビューを
操作する部分だとアタリをつけたのですが、具体的にどうすればいいのか全く検討つきません。
シノプティックビューをViewDに表示するにはどんな書き方をしたら良いでしょうか。
>こむさん

結構遠回りですが、可能みたいですね。

内容は、まず、カスタムプロパティにシノプティックを埋め込んで
ViewDにプロパティエディタで表示する。

って感じです。

初めて知った、こんな使い方w

--------------------------------------------------------------------

# Python初期設定
app=Application;log=LogMessage;sel=app.Selection
from win32com.client import constants as c

# シノプティックファイルパス
synfile = r"C:\work\XSI\garu\Synoptic\synp.html"

# シノプティックを貼るためのカスタムプロパティを作成
oPSet = app.ActiveSceneRoot.AddProperty("CustomProperty",False,"SynopticProp")
oPSet.AddParameter3("Syn", c.siString, synfile)
oLayout = oPSet.PPGLayout
oItem = oLayout.AddItem("Syn", "", c.siControlSynoptic)
oItem.SetAttribute(c.siUINoLabel, True)

# シノプティックを選択
sel.SetAsText("SynopticProp")

# ビューDにプロパティエディタをセットし、シノプティックを表示
app.Desktop.ActiveLayout.Views("vm").SetAttributeValue("viewport:d","Property Editor")
続き。

今日ちょっと検証してみました。
表示出来ることは、表示出来るんですが、シーン保存して、XSI立ち上げなおすと、そのプロパティは死んでしまう問題があります。

それを解決するには、シノプティックごとにカスタムプロパティを作る部分をプラグイン化してあげないと、使い物にならないってところですね。

これは面倒ですね。無いッすね。

もう一つは、開きたいときに、このコードを毎回実行する。って感じでしょうか。
現存しているカスタムプロパティがあったら削除して作り直す。っていう処理を入れればOKかな?
これなら、いいかもです。
>garuさん
なんと!こんなやり方があったのですね。
私は質問して数日で早々に諦めてました。冷や汗
早速試してみます。
ここ数カ月mixiして無かったためお礼が遅れましてすみません!
とんでもなく遅くなりましたが回答ありがとうございます。

カスタムプロパティが再起動ごとに死んでしまう仕様は次のバージョン辺りでスパッと直して欲しいですね!
作業中のシーンの保存先のパスを取得する方法は、ないでしょうか?

スクリプトの勉強として、VBSで、以下のような動作のスクリプトを作成しました。

1)シーンを上書き保存
2)oldフォルダを作成。
3)oldフォルダの中に日付フォルダを作成。
4)日付フォルダに、保存したシーンをコピーして、日付と時間をシーン名に追加。

(コメントの文字数制限に引っかかったので、自分の日記に、スクリプトを公開しました)
http://mixi.jp/view_diary.pl?id=1680693595&owner_id=37807



しかし、4)の処理の時に、コピー元のファイル指定に、アクティブのデータベースのPathに"scenes"を追加してpathを作成しているため、
Modelフォルダに保存したシーンを作業している場合、エラーが出てしまいます。
(本来は、Modelフォルダにシーンは保存しないですが・・・・勉強として・・・)
なので、シーンを上書き保存した時のパスが取得できれば、エラーが回避できると考えています。

上書き保存時のパスの取得方法があれば、教えてもらえないでしょうか?
よろしくお願いします。
あと、その他、スクリプトを書く上での、アドバイスなどありましたら、指摘、お願いします。
sPath = ActiveProject.ActiveScene.FileName.Value
LogMessage(sPath)

で現在のシーンのパスが表示されると思います。

アドバイスというとおこがましいんですが、リンク先のスクリプトを見るとすべて並列で書いてらっしゃいますがある程度のまとまり(***で区切られてる範囲くらいでしょうか)で関数にすると見やすくなるしコメントアウトも楽になるので便利ですよ。

例えば


LogMessage "test1"
LogMessage "test2"
・・・
LogMessage "test100"

みたいになってた場合(100行あると思ってください)、この部分をコメントアウトしたかったら100行に「'」をつけなきゃダメですけど関数かしてあると

Sub Log100()
LogMessage "test1"
LogMessage "test2"
・・・
LogMessage "test100"
End Sub

Log100

とかにしとくと「Log100」の1行だけコメントアウトするだけで済みます。
そうすると「今回はテストだからこっちだけ実行」とかもやりやすいと思います。
「あたりまえだろ」って感じだったらすみません。

Softimage的な部分で言うと
'3-01アクティブプロジェクトと、シーン名の取得 の
set oName = Application.ActiveProject.ActiveScene
の行で、ActiveSceneを「名前」として扱っているように見えますが、実際にはシーンオブジェクトだということを意識するといいと思います。
ActiveSceneをLogMessageで表示したり文字列と連結したりするときにシーン名として扱われるのはSoftimageが気をきかせて(?)
ActiveScene.FullName
を返しているからです。
SDKガイドのキーワード検索で「ActiveScene」を検索すると(こちらでは)2つめの選択肢に「ActiveScene」があり、その中をみると「現在アクティブなSceneオブジェクトを戻します。」という表記があります。
「Scene」部分のリンクをたどるとSceneオブジェクトに飛んで、そこでどんな命令や値を持ってるのか見ることができますよ。
「メソッド」が命令(関数)で「プロパティ」が値などです。

勉強がんばってください。
長文失礼しました。
きっしーさん。

ありがとうございます。
関数は、言葉としては、書籍などで知っていたのですが、
初心者には関係ない。と思って、あまり深く考えていませんでした。
どう使うのか、少し理解できた気がします。

>「メソッド」が命令(関数)で「プロパティ」が値などです。
「メソッド」「プロパティ」の意味が、モヤモヤしていて理解しきれていないのですが、(あと、オブジェクトも)
なんか、この説明で、少し、わかった気がします。
特に、メソッドが、全くなんなのかわからなかったのですが、命令と考えれば、いいんですね。

あー、なんか、わかった気になってきた(笑)

上記をもとに、書き直してみます。
ありがとうございました。
選択しているポイントの番号情報を取得するため、

Set oSelpoint = GetValue("SelectionList")
LogMessage oSelpoint

とやってみたのですが、

' INFO : sphere.pnt[0,2-4,9-11,16-18,23-25,30-32,37-39,44,45,51-53]
こういう感じに、ポイント番号2から9を選択。という取得をされてしまいます。

ほしい情報は、
sphere.pnt[0,2,9,16,23]
という感じにポイント番号を取得したいのです。
何か、よい方法は、ないでしょうか?




初めまして、最新の質問が2011年となっていて
見てる人が居るのか不安になりますが質問させて頂きます。
(当方MAYAのMELは幾らか作ってますがXSI-VBSはまだふた月程度仕事しながら勉強した程度のど素人です)

「AnimationEdhitor」上でFCurveの見えてる内容のフォーカス
Explorer>追加...>回転>Y などを階層が深いのでボタン一発でみたいなのを勉強がてら
VBSで作れたらと思ったのですが、正直とっかかりが分からないで困ってます。

MAYAではかなりの動作がスクリプトエディタのログに出てくれるので、出た物を適当にいじってるうちに内容を理解してくる
(もしくは理解しなくても動作してるからOK)となるのですが、XSIでは、かなりの動作がログには出ない
ので正直敷居が高いです。
ログに出る系などでは多少幾つか作ってみたのですが、出てくれないのは、いきなり調べるしかない訳で..


とりあえず
SDKに「Animation Editor」と打って「Animation Editor属性」という項目など(リンクも)を見つけて読んでも
いま一つ目的の方向に合ってるのかもわかりません。


やりたい上記の事を教えて欲しいのは山々なのですが、どちらかというと皆様どの様な手順で調べたりしてるのか
教えて頂けたら助かります。

近い内容で「AnimationEdhitor」の変換チェックで出てくるFCurveのシフトやスケールを
自分の好きな操作感の物を別で作れないかな?などと考えていたりもします。

若干漠然とした内容も含んでいますが、どなたかご教授頂けますと助かります。
>>[137]
こんにちは 僕もそこで凄く悩んでいました

まずはオブジェクト指向の意味が分かると理解が深まります

自分がどのオブジェクトを扱おうとしているのか、これに気が付くと後はSDKを辿って結果に近づいていくかと

オブジェクトを知るには例えば.Typeで調べるとか、コントロール+シフト+4キーで出てくるエクスプローラにも書いてあります

出てくるオブジェクトのタイプが分かれば次はメソッドかパラメータどちらかで自分がやりたいことを見つける作業になります

後はその繰り返しでしょうか

またオブジェクトが分かるとネット検索もヒットしやすいですよ

VBSをお使いのようですがMAYAも今後使われる事があれば、PYTHONもオススメです
>>[138]えふさん
返答ありがとうございます。

>まずはオブジェクト指向の意味が分かると理解が深まります

言葉としては随分以前から聞いた事のある”オブジェクト指向”
そこがやはり一つの壁になってるような気もします


>オブジェクトを知るには例えば.Typeで調べるとか、
>またオブジェクトが分かるとネット検索もヒットしやすいですよ

確かにその辺りがとっかかりになるのなら調べようもあるかも知れませんね。


>VBSをお使いのようですがMAYAも今後使われる事があれば、PYTHONもオススメです

気にはなってるのですが、現状でいくつも覚えようとすると混乱しそうで・・・
でも、確かにPYTHONで覚えれば、SIとMAYAで言語的には共通にはなりますね。


アドバイスを参考に精進してみます、ありがとうございました
SIスクリプト初心者です

一個前>>[137]の質問の続きになってしまうのですが・・

VBSにて「FCurve」カーブをシフトしたりスケールしたいのですが、
(とりあえず「FCurve.Scale」を使ってみようと思って)
SDKの「SetKeys」の例文を参考に、下に一行追加した物が下記なのですが

set oNull = ActiveSceneRoot.AddNull()
set oFCurve = oNull.posx.AddFCurve()
oFCurve.SetKeys( Array( 1, 10, 2, 20, 3, 30 ) )
oFCurve.Scale( 0.5, 0.5, 0.0, 7.5 )

' ERROR : Sub プロシージャを呼び出すときに、かっこを使うことはできません。 - [line 4]
とエラーが出ました適当に下記の様に変えたら

oFCurve.Scale( Array( 0.5, 0.5, 0.0, 7.5 ) )

' ERROR : 型が一致しません。: 'oFCurve.Scale' - [line 4]

少し近づいた気もするのですが、
そもそもSDKの「FCurve」のメソッドの40個の内2個しかVBSの例文が無く
実はVBSでは「FCurve」を制御出来ないって事じゃ無いだろうなあと思いつつも
聞いてみたくなりました。

前の質問からもちょくちょく例になりそうな物を探してるのですが
なかなか見つからない、情報ホント少なくてくじけそうになります。

どなたかご教授頂けますと助かります。
>>[140]

VBだけ制御できないという事はまずないと思います。
何かしら方法があるはずです。というのもPythonはもっと例文がないので、昔僕も同じこと考えたことがあるんですが、結果的にできなかった事はありません

一度
oFCurve.Scale( 0.5, 0.5, 0.0, 7.5 )

oFCurve.Scale( )
といった感じで、何も入れないとどうなるでしょうか?

又は「かっこを使うことはできません」と書かれているなら、もしかしたら かっこなしの

oFCurve.Scale

だけでもいいかもしれません

その場合はもしかすると

oFCurve.Scale 0.5, 0.5, 0.0, 7.5

とかになるのかも・・・

ヘルプをみるとデフォルト値が設定されているみたいなので、何も入れないとデフォルト値が入り込むのかなと思うんですが、これが通れば使えるという事だけでも分かると思います。
>えふさん
返答ありがとうございます!

早速試してみました。
oFCurve.Scale( )
oFCurve.Scale
両方共エラーは出ませんでした。
(もちろん?FCurvに変化はありませんが・・)
(デフォの値が適用されてたとしても変化量が無いかと思いますので)

oFCurve.Scale 0.5, 0.5, 0.0, 7.5
では
' ERROR : 文字が正しくありません。 - [line 4]
となりました。

一応やはり使えるという事ですね、
あとは構文的な問題という感じで、
oFCurve.Scale()
基準辺りで中身を色々変えて試す感じでしょうか?
(と言ってもどう試そうかという感じですが・・)

なかなか高い山ですね〜XSIスクリプトは。
>えふさん

試しに
oFCurve.Scale(2)
って入れてみたら横軸で倍になったみたいです。
もしや光が見えたかも??
もう少し色々試してみます。

アドバイスありがとうございます!





連続投稿すみません
答えは一応↓の方の様でした
oFCurve.Scale 0.5, 0.5, 0.0, 7.5
さっきのは「.Scale」と数値の間が
全角スペースになってた凡ミスでした。
ありがとうございました。

ログインすると、残り114件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

XSI 更新情報

XSIのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング