2011年6月4日土曜日

GetActiveCamera

アクティブなカメラを取得するのに四苦八苦してます。
 これはSpaceNaviが対応しないはずだ・・・。

Softimageは基本の4画面をViews "View Maneger"と扱います。
いわゆる、A,B,C,Dですね。
それぞれ、いろいろな表記を持つんですが通常扱われる3Dの画面は、Viewとよばれ、
その名を ViewA, ViewB, ViewC, ViewDとなります。

カメラを取得するなら
GetValue("Views.ViewA.TopCamera")とかになるわけです。

そして、このAは、その中身を入れ替えることが出来ます。
たとえばレンダーツリーとか、テクスチャエディットとかです。

問題はここからなのですが、
'Object View'だとABCDのなかに("Views.View1.UserCamera")になるようです。英字でなくて数字ですね
どうやら、'Object View'を追加していくとこの末尾の数字が加算されていくだけのようです。
そして、フローティングパレットであろうがなかろうが関係ありません。
View1,View2・・・ と続いていきます。 そして、法則は、作った順番、欠番があれば(途中で閉じた)、
そこに生成されます。

そして、目的のビューのアクティブなView Numberが把握できません

GetValue("Views.View" + num + ".UserCamera")
この番号です。

どなたか、ビューからこの番号の取得の仕方が、あればお教えください orz

現在の、付け焼刃の回避策として、
Viewマネージャーにおける 'Object View' の数を数えてから、
フローティングパレットの数を数えてます。

順番どおりなら、フローティングが一番大きな数字になるはずです(汗

#Python
app = Application
log = app.Logmessage
log("-" * 100)
def getActiveCamera():
 oL = app.DeskTop.ActiveLayOut
 
 #デフォルトビューのチェック
 oV = oL.views("vm")
 abcd = oV.GetAttributeValue("viewportundermouse")
 if oV.Views(abcd).Type == 'Viewer':
  ActiveView = oV.GetAttributeValue("activecamera:" + abcd)
  log(ActiveView)
  if (ActiveView =="User") or (ActiveView =="Top") or (ActiveView =="Front") or (ActiveView =="Right"):
   cam = app.GetValue("Views.View" + abcd + "." + ActiveView + "Camera")
  else:
   cam = app.GetValue(ActiveView)

 #ビューマネージャーにある、オブジェクトビューのチェック 
 num = 0
 for i in range(4):
  if oV.Views(i).Type == 'Object View':
   num += 1
 log("ObjectViewCount : " + str(num))  
 if oV.Views(abcd).Type == 'Object View':
  ActiveView = oV.Views(abcd).GetAttributeValue("Camera")
  ViewName = oV.Views(abcd).FullName
  log(ActiveView)
  log(ViewName)
  if ActiveView == "default":
   cam = app.GetValue("Views.View" + str(num) + ".UserCamera")
  else:
   cam = app.GetValue(ActiveView)
   
 #フローティングのオブジェクトビューの対応 
 for x in oL.Views:
  if x.Type == 'Object View':
   log(x)
   ActiveView = x.GetAttributeValue("Camera")
   if ActiveView == "default":
    cam = app.GetValue("Views.View" + str(num) + ".UserCamera")
   else:
    cam = app.GetValue(ActiveView)
 log(cam)
      
getActiveCamera()

5 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. すいません、ちょっと勘違いな事を書いてしまったので消しときましたw

    返信削除
  3. お世話になってます
     自分も書きながら、説明がうまくないなぁと思いました orz

    View番号の取得の仕方があればよろしくお願いします~(ペコリ

    返信削除
  4. あれですよね
    オブジェクトビューがdefultのときのカメラオブジェクトを取得したいのですよね?
    ざっと見たところ分からなかったですw
    ただ
    set oCams = FindObjects("","{5FC0CCAE-3DC8-11D0-9449-00AA006D3165}")
    でシーン中の全カメラが取得できるのですが
    オブジェクトビューを開く前と後に実行し
    増えた分を調べればそれらがビューに関連するものだと推測できるかもですw
    面倒な上オブジェクトビューを開くときには必ずスクリプトを通す必要がでるので
    どうかと思いますがw

    返信削除
  5. ふむー、難しそうですね〜。
    アクティブなカメラを拾おうとせず、
    FindObjextsでカメラ一覧を取得して選択する方がイイかもしれませんね〜。
    スマートじゃなくなりますががが

    返信削除