<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>覚書き</title>
  <link>https://yonta.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://yonta.blog.shinobi.jp/RSS/" />
  <description>個人的覚書き/つぶやきetc.</description>
  <lastBuildDate>Wed, 21 Oct 2009 17:14:34 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>Audioのインポート</title>
    <description>
    <![CDATA[Audioファイル(*.wavなど)をインポートってどうやんじゃろとアレコレやってたら<br />
<br />
audiofile = FBAudioClip(path)<br />
<br />
ってやるだけで、シーンにインポートされていたことに気がついてびっくりした。<br />
<br />
FBNoteなんて、一回オブジェクト作ったあとにシーンにアタッチしなきゃいけないのにお手軽すぎるでしょう･･･。<br />
まぁ、わかったのでいいですけどねぇ。<br />
<br type="_moz" />]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/audio%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88</link>
    <pubDate>Wed, 21 Oct 2009 17:14:34 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/11</guid>
  </item>
    <item>
    <title>クラスを使え</title>
    <description>
    <![CDATA[class Header(HBoxLayout):
<div style="margin-left: 40px;">def _onClickCallback(self, control, event):</div>
<div style="margin-left: 80px;">print '%s::%s'%(self.e.Text, control.Name)</div>
<div style="margin-left: 40px;">&nbsp;</div>
<div style="margin-left: 40px;">def __init__(self):</div>
<div style="margin-left: 80px;">HBoxLayout.__init__(self)<br />
self.b = FBButton()<br />
self.b.Caption = 'OK'<br />
self.e = FBEdit()<br />
self.Add(self.b,100)<br />
self.Add(self.e,150)<br />
<br />
self.b.OnClick.Add(_onClickCallback)</div>
<div>・・・<br />
header&nbsp; =&nbsp; Header()<br />
t.SetControl(region,header)<br />
・・・<br />
<br />
なんて感じで使うといい。<br />
ここでは、ツールのヘッダー部分を丸ごと一つのクラス化して、その中の出来事を管理している。<br />
こうすることで、FBButtonのOnClick内で本来関係ないFBEditのTextをさらりと使うことも可能になる。<br />
<br />
さらに、うえのようにHBoxLayoutを継承させて一つのVisualComponentみたいにしてしまえば、見方によっては新しいVisualComponentとも言えるわけで、自分好みのものをカスタマイズしてパーツ化しておくのも悪くない。<br />
<br />
例えばFBVector3dクラスは以下のような操作は実装されている。<br />
&nbsp;</div>
<div style="margin-left: 40px;">&gt;&gt;&gt; vec1 = FBVector3d( 1.0 , 2.0 , 3.0 )<br />
&gt;&gt;&gt; vec2 = FBVector3d( 10.0 , 20.0 , 30.0 )<br />
&gt;&gt;&gt; vec1 + vec2</div>
<div style="margin-left: 80px;">FBVector3d(11,22,33)</div>
<div><br />
しかし以下のようなものは対応していない。</div>
<div style="margin-left: 40px;">&gt;&gt;&gt; vec1 * vec2<br />
<br />
<br />
<br />
（かきかけ）</div>
<div>&nbsp;</div>]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%88</link>
    <pubDate>Fri, 21 Aug 2009 14:52:49 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/10</guid>
  </item>
    <item>
    <title>Attatch</title>
    <description>
    <![CDATA[<a target="_blank" href="//yonta.blog.shinobi.jp/File/aa.gif"><img width="150" height="93" border="0" alt="aa.gif" src="//yonta.blog.shinobi.jp/Img/1248793644/" /></a><br />
FBAddRegionParamで設定するx,y,w,hは上で示すものに対応しております。<br />
<br />
また、FBAｄｄRegionParamで設定するFBAttatchTypeで何か設定すると(kFBAttatchNone)、たとえば以下のような関係になります。(下の図はkFBAttatchRight)<br />
<a target="_blank" href="//yonta.blog.shinobi.jp/File/bb.gif"><img width="150" height="75" border="0" alt="bb.gif" src="//yonta.blog.shinobi.jp/Img/1248793668/" /></a><br />
<br />
<br />
<br type="_moz" />]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/attatch</link>
    <pubDate>Tue, 28 Jul 2009 15:27:36 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/8</guid>
  </item>
    <item>
    <title>FBAｄｄRegionParam</title>
    <description>
    <![CDATA[ちょっと時間が空いてしまいましたがFBAddRegionParamです。<br />
<br />
リファレンス読んでも書いていない（ORSDKにも書かれてない）FBAddRegionParamとはなんぞや。<br />
これは、FBLayout.AddRegionを実行してエラーを出してみると分かります。<br />
<br />
AddRegion(class PYFBSDK：：FBLayout_Wrapper｛value｝,char* ,char* ,struct PYFBSDK::FBLayout_Wrapper::AddRegionParam* ,･･･<br />
<br />
みたいな表記が見つかると思います。<br />
これは引数のタイプエラーや指定順番を無視した時に、実装がこうなってるから、この順番、タイプで指定してねっていうシステム側からの答えの一部ですが、エラー文は良く読んでみると中身が見えてくるので、リファレンスがカスいMoBuでは貴重な資料になります。<br />
上のエラーを見る限り、Pythonリファレンスに書かれているような横縦幅高さパラメータは、各々をAddRegionParamに固めてあげてから渡す実装のようです。<br />
<br />
まぁ、サンプルのAttatch.pyなんか見て適当にコピペしてるだけでもいいかもですが、こうやって掘り下げていくと、後々楽になれるのでもう少し続けようと思います。<br type="_moz" />]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/fba%EF%BD%84%EF%BD%84regionparam</link>
    <pubDate>Sat, 25 Jul 2009 08:50:35 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/7</guid>
  </item>
    <item>
    <title>FBLayoutの続き</title>
    <description>
    <![CDATA[FBLayoutはリージョン管理がメインということでした。<br />
では実際どのようにリージョンを管理しているのかを見て行きます。<br />
<br />
MotionBuilder2009では以前までの反省により、サンプルスクリプトが大量に付属しています。<br />
特に、今回追加されたUI構築部分に関して、コントロール毎にサンプルが用意されています。<br />
その中身をいくつか覗いてみると、PopulateLayoutに必ず下のような記述が書かれていると思います。<br />
<br />
x = AddRegionParam(0,FBAttachType.kFBAttachLeft,&quot;&quot;)<br />
<br />
これは何だろうなぁと思いその後を見ていくと、<br />
<br />
mainLyt.AddRegion(&quot;main&quot;,&quot;main&quot;,x,y,w,h)<br />
<br />
みたいな記述があると思います。この場合全体の記述としては<br />
<br />
def PopulateLayout(mainLyt):<br />
x = AddRegionParam(0,FBAttachType.kFBAttachLeft,&quot;&quot;)<br />
（中略）<br />
mainLyt.AddRegion(&quot;main&quot;,&quot;main&quot;,x,y,w,h)<br />
（中略）<br />
def CreateTool():<br />
tool = CreateUniqueTool(&quot;Name&quot;)<br />
PopulateLayout(tool)<br />
<br />
という感じになっています。<br />
つまりmainLytというのはCreateTool内で作成されたFBToolオブジェクトであり<br />
AddRegionはリファレンス見ると、FBLayoutのメンバー関数になっています。<br />
以前見たように、FBToolはFBLayoutを継承してますので問題ありません。<br />
で、AddRegionとは何かを見てみると<br />
<br />
AddRegion (str pName, str pTitle,<br />
int pX, FBAttachType pXType, str pXRelative, float pMultX,<br />
int pY, FBAttachType pYType, str pYRelative, float pMultY,<br />
int pW, FBAttachType pWType, str pWRelative, float pMultW,<br />
int pH, FBAttachType pHType, str pHRelative, float pMultH)<br />
<br />
Add a region to the layout. <br />
<br />
とあり、レイアウトにリージョンを追加するメンバー関数であると分かります。<br />
ここで素朴な疑問としては、AddRegionParamとは何なのかでしょうか。<br />
リファレンスを見る限りAddRegionするときにAddRegionParamを引数に取ることはなさそうです。<br />
&nbsp;<br />
そこらへんの謎はまた次回に。<br />
---<br />
このブログでコードとかを綺麗に見せるにはどうしたらいいのかわからない。<br />
他のブログ見てると、綺麗にインデントとかできてるのにっ。<br />
<br type="_moz" />]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/fblayout%E3%81%AE%E7%B6%9A%E3%81%8D</link>
    <pubDate>Tue, 14 Jul 2009 21:39:17 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/6</guid>
  </item>
    <item>
    <title>FBLayoutって何だろう</title>
    <description>
    <![CDATA[FBLayoutってそもそも何をしているのか、っていうのを見るためにリファレンスをゴソゴソしてみたところ冒頭に  <br />
<br />
User interface layout class.<br />
<br />
という簡潔なお言葉が書かれていました。<br />
まぁ、これで大体イメージは出来てしまうのですが、少し説明を読んでいくと<br />
<br />
Layouts are responsible for managing areas of the screen called regions.  <br />
<br />
とあるので、どうやらリージョンってのを管理してるらしいと分かる。<br />
<br />
UI components such as buttons, viewers, and edit boxes are bound to regions.  <br />
<br />
そして、このリージョンっていうものに、UIコンポーネント（ボタンとか）がバインドされると書いてあります。<br />
<br />
In other words, when a UI component is bound to a region, the region defines how big it is and how it behaves when the layout is resized.<br />
<br />
そして、リージョンの大きさやリサイズされたときのふるまいも設定するみたいです。  <br />
まぁ、ここまでは理解したのですがその後削っておけっていう。<br />
<br />
Types of Layouts With the different types of plugins available, there are different kinds of layouts, depending on where the plugin fits into the MOTIONBUILDER architecture.  The following types of layouts exist: Device layouts. Constraint layouts. Manipulator layouts. Shader layouts.<br />
<br />
これはプラグイン関連じゃないのか。 ORSDKを丸コピしてるだけなので、稀に良くこういうPythonに関係ないと思われる記述があるが、たまに本当は関係あったりとか、完全に表記ミスじゃないときがあって、結局全部理解しておこうとORSDKのリファレンスも見ないといけなかったり。  <br />
<br />
横道にそれましたが、FBLayoutの実体はリージョンの管理である、というのが分かれば良いのじゃないかなぁ、と思います。]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/fblayout%E3%81%A3%E3%81%A6%E4%BD%95%E3%81%A0%E3%82%8D%E3%81%86</link>
    <pubDate>Sun, 12 Jul 2009 00:23:47 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/5</guid>
  </item>
    <item>
    <title>もう少し進んで</title>
    <description>
    <![CDATA[リファレンスでFBToolを見てみると、FBLayoutを継承している。<br />
そういえば、サンプルスクリプトを覗いていると、CreateToolからPopulateLayoutに投げられると<br />
toolがmainLytだかlytだかの引数になってたのもうなずけます。<br />
<br />
さて、またpyfbsdk_additions.pyを覗いてみます。<br />
57行目から始まるのがLayoutに関する記述です。<br />
ここにはButtonGroup、TabLayout、BoxLayout、HBoxLayout、VBoxLayout、GridLayoutに関する記述があります。<br />
TabLayoutを見てみると、<br />
<br />
class TabLayout（pyfbsdk.FBLayout）:<br />
<br />
となっており、FBLayoutを継承しているのがわかります。<br />
他のLayoutを見ても同様です。HBoxとVBoxは直接継承してませんが、Boxを継承しているので同じです。<br />
このように、FBLayoutっていうクラスがUI構築時、そこかしこに顔を覗かせているわけですが、これっていったい何でしょう。ってのが次回ちゃんと分かるといいなぁ。<br />
<br />
ところで、pyfbsdk_additions.pyをながめていたら<br />
<br />
_NotityToolListner()<br />
<br />
って記述があるのだけど、このNotityってNotifyの間違いじゃないのだろうか。<br type="_moz" />]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/%E3%82%82%E3%81%86%E5%B0%91%E3%81%97%E9%80%B2%E3%82%93%E3%81%A7</link>
    <pubDate>Fri, 10 Jul 2009 19:48:05 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/4</guid>
  </item>
    <item>
    <title>CreateUniqueToolの正体</title>
    <description>
    <![CDATA[MoBuのpythonリファレンスを見ると、CreateToolとCreateUniqueToolがあるのが分かります。<br />
前回、コピペ用スケルトンを書いたが、そこではCreateUniqueToolを使っていました。<br />
この２つの違いって何だろうかと思い、pyfbsdk_additions.pyを覗いてみます。<br />
CreateUniqueToolの記述を見ると<br />
<br />
def CreateUniqueTool ( name ):<br />
&nbsp;&nbsp;&nbsp; DestroyToolByName( name )<br />
&nbsp;&nbsp;&nbsp; return CreateTool( name )<br />
<br />
これから作るツールの名前に競合するものを壊して、CreateToolを実行して戻り値を返すということをしています。<br />
<br />
これは、MayaでUI作るとき、window名がバッティングしないように<br />
<br />
if (maya.cmds.window( name , ex=1 )) :&nbsp; maya.cmds.deleteUI( name )<br />
<br />
とかやるのと一緒ですね。<br />
<br />
というわけで、基本的にCreateUniqueToolを使用する方が、何かと不具合なくていいと思われますね。<br />
<br />
ところでこのCreateTool。<br />
まぁCreateToolっていうくらいだからToolをCreateしてくれてるんだよね、って思いますが実行しただけでウィンドウが表示されます。Tool = Windowってのがちょっと違和感ありますが、そこらへんのことについてはまた次回。<br />
<br />]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/createuniquetool%E3%81%AE%E6%AD%A3%E4%BD%93</link>
    <pubDate>Thu, 09 Jul 2009 20:24:20 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/3</guid>
  </item>
    <item>
    <title>MotionBuilder2009の場合</title>
    <description>
    <![CDATA[MoBu7.5までは、MoBuPython(pyfbsdk)上で提供されたUIというのはなかったが 2009からはUIが構築できます。と聞いてユーザーはMayaみたいに出来るようになるんだと、非常に喜んでいたわけですが、蓋を開けてみると、やっぱりMoBuはMoBuなんですね。  ということで、MoBu2009で実装されたUIですが、以下コピペ<br />
###<br />
from pyfbsdk import *<br />
from pyfbsdk_additions import *<br />
def PopulateLayout(tool):<br />
### UI ①<br />
<br />
def CreateTool():<br />
tool = CreateUniqueTool(&quot;Name&quot;)<br />
tool.StartSizeX = int    　　　　#②<br />
tool.StartSizeY = int　　　　    #<br />
PopulateLayout(tool)<br />
ShowTool(tool)<br />
<br />
CreateTool()<br />
###<br />
<br />
①のところにコントロールの設定とか色々書いていけばよい <br />
他はそのままコピペでも。<br />
②の部分はintを好きな数字にどうぞ。<br />
最初にウィンドウ表示したときの幅(StartSizeX)と高さ(StartSizeY)です。 <br />
ちなみに、ウィンドウ最大値設定(MaxSizeX/MaxSizeY) と 最小値設定(MinSizeX/Y) というアトリビュートがありますが、最大値の方はバグなのか値を入れても反映されません。<br />
こういうのは、MoBuのpythonではよくあるのでグっとこらえましょう。]]>
    </description>
    <category>MotionBuilder</category>
    <link>https://yonta.blog.shinobi.jp/motionbuilder/motionbuilder2009%E3%81%AE%E5%A0%B4%E5%90%88</link>
    <pubDate>Tue, 07 Jul 2009 15:02:56 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/2</guid>
  </item>
    <item>
    <title>wxPython覚書き</title>
    <description>
    <![CDATA[家のpythonを全部削除して会社（MoBu/Maya）と環境あわせた。<br />
python2.51<br />
wxPython2.81<br />
---<br />
PythonからMoBuに通信するためのおまじない<br />
#本体<br />
<code> </code>def mbPipe(command):<br />
&nbsp;&nbsp;&nbsp;&nbsp; host.read_until('&gt;&gt;&gt;', .01)<br />
&nbsp;&nbsp;&nbsp;&nbsp; host.write(command + '\n')<br />
&nbsp;&nbsp;&nbsp;&nbsp; raw = str(host.read_until('&gt;&gt;&gt;', .1))<br />
&nbsp;&nbsp;&nbsp;&nbsp; raw = raw.replace('\n\r&gt;&gt;&gt;','')<br />
&nbsp;&nbsp;&nbsp;&nbsp; raw = raw.replace('\r','')<br />
&nbsp;&nbsp;&nbsp;&nbsp; rawArr = raw.split('\n')<br />
&nbsp;&nbsp;&nbsp;&nbsp; return rawArr<br />
<br />
#呼び出し<br />
mbPipe('### python script&nbsp; ###')<br />
<br />
※MoBuのPythonConsoleのRemoteServerチェック必須<br />
※GL描画のリフレッシュはフォーカスがMoBuにうつらないと無理なのが痛い<br />
<br type="_moz" />]]>
    </description>
    <category>python</category>
    <link>https://yonta.blog.shinobi.jp/python/wxpython%E8%A6%9A%E6%9B%B8%E3%81%8D</link>
    <pubDate>Mon, 06 Jul 2009 14:45:17 GMT</pubDate>
    <guid isPermaLink="false">yonta.blog.shinobi.jp://entry/1</guid>
  </item>

    </channel>
</rss>