pythonでのコーディングは便利でいいですが、やはりmelにはmelの良さがあるし、melのほうが手っ取り早いこともあります。
ただ、melはやっぱりpythonと比べると、文字分割関連がめんどくさい…。
たとえば、文字列…
"aaa/bbb/ccc.bmp"
で、"bbb"を抜き出したい場合、おそらく普通にmelでコーディングすると…
string $temp[] = stringToSTringArray("aaa/bbb/ccc.bmp","/");
string $result = $temp[1] ;
など、stringToStringArrayを使わない場合でも、一度配列に出してから抜き出さないと、だと思います。
今日試してみたのが、pythonを挟む方法です。
string $result = python('aaa/bbb/ccc.bmp'.split('/')[-2]);
…一行で済むというね!
しばらくこちらを試してみようと思います。
2016年6月19日日曜日
pythonソース もう一度importするには??
melのsourdeと違って、pythonの場合、ソースを更新して再度importコマンドを行っても更新されることがありません。
この場合、reload()関数を使うと解決できます。
⇒reload関数()
ほかにも、読み込んだモジュールを削除して再度importする方法を採用している方もいるようです。
⇒.pyファイルの再import
とくにもんだいなければ、reload関数を使うのがよさそうです。
この場合、reload()関数を使うと解決できます。
⇒reload関数()
ほかにも、読み込んだモジュールを削除して再度importする方法を採用している方もいるようです。
⇒.pyファイルの再import
とくにもんだいなければ、reload関数を使うのがよさそうです。
2016年6月17日金曜日
melで、指定パス以下のフォルダ・ファイル階層を取得する。
子供が熱でた~ … ということで、家で作業しております。
Toolを作っている際、データ集合をフォルダ階層に分けて管理・Tool上にそのツリーを表示したい…などというケースは少なくないと思います。
簡単ですが、再帰処理による、「指定パス以下のフォルダ・ファイル階層を取得するmel」を作成しました。
メモ代わりに貼り付けます。 treeListerかなんかでフォルダを列挙したいときなんか便利かも。
Toolを作っている際、データ集合をフォルダ階層に分けて管理・Tool上にそのツリーを表示したい…などというケースは少なくないと思います。
簡単ですが、再帰処理による、「指定パス以下のフォルダ・ファイル階層を取得するmel」を作成しました。
メモ代わりに貼り付けます。 treeListerかなんかでフォルダを列挙したいときなんか便利かも。
2016年6月12日日曜日
任意のフォルダのpythonファイルをimport コマンドから持ってくる
Toolのソースを、特定のフォルダの特定階層に整理したいのに、melファイルのsourceコマンドとは違って、pythonのimportコマンドは、あらかじめpythonパスが通っているところしか見てくれない。
そういう場合は、環境変数に書き込むか、一時的リリースのToolなんかだったら、一時的にpythonパスをソースから追加することでインポートが可能です。
サンプルソース; これでpythonパスを一時的に追加できるので、この後importコマンドを走らせればいい
そういう場合は、環境変数に書き込むか、一時的リリースのToolなんかだったら、一時的にpythonパスをソースから追加することでインポートが可能です。
サンプルソース; これでpythonパスを一時的に追加できるので、この後importコマンドを走らせればいい
2016年2月11日木曜日
選択したキーフレームのリストを取得する
基礎の話なのですが、恥ずかしながらつい先日知ったことを、こちらにも載せておきます。
通常、グラフエディタで選択したキーフレームは、
keyframe -q -sl;
で取得できますが、これは単に、選択したフレーム=time(時間)のリストを返すだけで、
たとえば、複数アトリビュートのキーを同時選択していたとしても、いっしょくたに値が返されます。
アトリビュートとノードのリストは、
keyframe -q -n;
から取得可能ですが、それぞれ別々に実行すると、キーフレームとアトリビュートが関連していません。
このままでは、たとえば「選択したキーすべてにある処理を加える」などの処理がしにくい。。
方法を探していたのですが、何のことはない、「keyframe -q -sl;」の時、そのカーブの名前を指定してあげればよかったのでした。。
つまりは…
…で、各アニメーションカーブごとに、各々選択したキーフレームが取得できました。
…基礎です。(恥
通常、グラフエディタで選択したキーフレームは、
keyframe -q -sl;
で取得できますが、これは単に、選択したフレーム=time(時間)のリストを返すだけで、
たとえば、複数アトリビュートのキーを同時選択していたとしても、いっしょくたに値が返されます。
アトリビュートとノードのリストは、
keyframe -q -n;
から取得可能ですが、それぞれ別々に実行すると、キーフレームとアトリビュートが関連していません。
このままでは、たとえば「選択したキーすべてにある処理を加える」などの処理がしにくい。。
方法を探していたのですが、何のことはない、「keyframe -q -sl;」の時、そのカーブの名前を指定してあげればよかったのでした。。
つまりは…
…で、各アニメーションカーブごとに、各々選択したキーフレームが取得できました。
…基礎です。(恥
2016年1月5日火曜日
【Maya】 【python】ポリゴンの凹面を判別する。
少し前からですが、アーティストの方から割と要望をいただく件として、
「ポリゴンメッシュの凹面を自動判別する機能」があります。
早めに開発着手したかったのですが、なかなか手が空かず、
時間ばかりいただいてしまいました。。
で、ちょうど年末年始、数学に強い従兄の助言もいただき、
時間のあるこの時期に大体形にしてみたので、こちらでも紹介します。
■どうやって凹凸を判別するか?
チェックするポリゴンは4頂点の4角形であることが前提です。
そもそも3角形だったら平面だし。5角形だったらそもそもポリゴン割れし。
で、仕組みはこうです。
ずばり内積と外積を使います。
ベクトルの内積と外積を使って、4頂点のうち、
3頂点の平面から見た残りの1点の位置を判別します。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
かんたんに外積:
2つのベクトルに垂直なベクトルを算出します。
かんたんに内積:
ベクトルAをベクトルBに成分分解したときの、そのベクトルの長さを求めます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
その手順は…、
①3頂点で作る、1点から伸びる2本のベクトルの外積を出して、
この3角形に垂直なベクトルを算出します。

②残り1頂点で作るベクトルと、①の三角形に垂直なベクトルの内積を求めます。

この内積の値が正か負かで、残りの1点の位置が算出できるはずです。
■しかし、ポリゴンのみかたで凹か凸かが変わってしまう。
この4頂点ですが…
こうみるか

こうみるかで、凹か凸かが変わってしまいます。
要は、どの頂点を判別するのか、準点を定める必要があるわけです。
ここは、判別の基準をアーティストさんに確認する必要がありますが、、、
とりあえず、一度Triangulateをかけた時の形状が、凹か凸かを判別するように
考えることにしました。
要は、このポリゴンを…

Triangulateをかけて…

この3角形に含まれない頂点…

つまり、この頂点を判別することにします。

■melに便利なコマンドが
melにズバリ、内積・外積を算出するコマンドがあるので、これを使うっきゃない。
外積:cross http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/cross.html
内積:dot http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/dot.html
しかし、頂点計算など、数が多い処理は全てmelで処理するには重たすぎるので、
基本はすべてpythonで書くことにし、pythonからmelプロシージャを呼び出すようにします。
そんな感じで、ぱっと作ってみました。
※使用方法は、mel文を先に実行しておくか、sourceコマンドで読んでおいた上で
ポリゴンを選択し、python文を実行します。
すると、凹んだ角形のみが選択された状態で終了します。
実際にまだ使っていないので、信頼性は低いですが。
いろいろテストなどして、ブラッシュアップしていこうと思います。
以下ソース
「ポリゴンメッシュの凹面を自動判別する機能」があります。
早めに開発着手したかったのですが、なかなか手が空かず、
時間ばかりいただいてしまいました。。
で、ちょうど年末年始、数学に強い従兄の助言もいただき、
時間のあるこの時期に大体形にしてみたので、こちらでも紹介します。
■どうやって凹凸を判別するか?
チェックするポリゴンは4頂点の4角形であることが前提です。
そもそも3角形だったら平面だし。5角形だったらそもそもポリゴン割れし。
で、仕組みはこうです。
ずばり内積と外積を使います。
ベクトルの内積と外積を使って、4頂点のうち、
3頂点の平面から見た残りの1点の位置を判別します。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
かんたんに外積:

かんたんに内積:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
その手順は…、
①3頂点で作る、1点から伸びる2本のベクトルの外積を出して、
この3角形に垂直なベクトルを算出します。

②残り1頂点で作るベクトルと、①の三角形に垂直なベクトルの内積を求めます。

この内積の値が正か負かで、残りの1点の位置が算出できるはずです。
■しかし、ポリゴンのみかたで凹か凸かが変わってしまう。
この4頂点ですが…


こうみるかで、凹か凸かが変わってしまいます。
要は、どの頂点を判別するのか、準点を定める必要があるわけです。
ここは、判別の基準をアーティストさんに確認する必要がありますが、、、
とりあえず、一度Triangulateをかけた時の形状が、凹か凸かを判別するように
考えることにしました。
要は、このポリゴンを…

Triangulateをかけて…

この3角形に含まれない頂点…

つまり、この頂点を判別することにします。

■melに便利なコマンドが
melにズバリ、内積・外積を算出するコマンドがあるので、これを使うっきゃない。
外積:cross http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/cross.html
内積:dot http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/dot.html
しかし、頂点計算など、数が多い処理は全てmelで処理するには重たすぎるので、
基本はすべてpythonで書くことにし、pythonからmelプロシージャを呼び出すようにします。
そんな感じで、ぱっと作ってみました。
※使用方法は、mel文を先に実行しておくか、sourceコマンドで読んでおいた上で
ポリゴンを選択し、python文を実行します。
すると、凹んだ角形のみが選択された状態で終了します。
実際にまだ使っていないので、信頼性は低いですが。
いろいろテストなどして、ブラッシュアップしていこうと思います。
以下ソース
ラベル:
cross product,
dot product,
Maya,
mel,
polygone,
python,
vector,
vertex
2016年1月4日月曜日
centos7 rc.localからだと起動スクリプトがうごかない。。。
以前svnserveを導入した際、rc.localにsvnserveの起動スクリプトを記述して、
サーバーの起動時にsvnserveが自動的に立ち上がるように設定したのですが、
単にこれだけだと、自動起動してくれないことが分かりました。
実は、centos7から従来のrc.localにとる起動スクリプト管理ではなく、systemedにて
起動スクリプトの管理を行うようになったようです。
…てか、本にもそう書いてあった。全然読んでないじゃん。orz
起動スクリプトの管理方法は、他サイト様にていろいろ紹介されてありますが、
方法は2つ。
①rc.localを従来通り使うか
②systemedに乗り換えるか
です。
①に関しては、単にrc.localに実行権限を与えてあげるだけでOK。
実際やってみて、OKでした。
chmod u+x /etc/rc.d/rc.local
参考サイト:http://kantaro-cgi.com/blog/etc-server/cant_run_rclocal_centos7.html
②に関しては、
・専用シェルスクリプトを用意し、
・「/etc/systemd/systemの下に、拡張子が .serviceのテキストファイルを作る。」
→参考サイト:tire.retire ガジェット好きおじさんの日記 より引用
・systemedに登録してあげる。
参考サイト:http://tire-retire.blogspot.jp/2014/12/centos7rclocal.html
参考サイト:http://motw.mods.jp/shellscript/tutorial.html
僕は①を試したのち、今後のことも考えて、systemedの対応を進めてみました。
シェルスクリプトは書いたことがありませんでしたが、初心者の自分にも難しくはなかったです。
ただ、現状まだうまく自動起動設定ができていない状態です。
systemedはサービスの起動順序をいろいろ指定できるのですが、依存関係にあるサービスが立ち上がる前にsvnserveの自動起動スクリプトが実行されているのではないか、と考えています。
今のところ、現状サーバー再起動時に再度立ち上げないといけないものは少ないので、
しばらく手動で対応しますが、頃合いをみて再挑戦したいところです。
サーバーの起動時にsvnserveが自動的に立ち上がるように設定したのですが、
単にこれだけだと、自動起動してくれないことが分かりました。
実は、centos7から従来のrc.localにとる起動スクリプト管理ではなく、systemedにて
起動スクリプトの管理を行うようになったようです。
…てか、本にもそう書いてあった。全然読んでないじゃん。orz
起動スクリプトの管理方法は、他サイト様にていろいろ紹介されてありますが、
方法は2つ。
①rc.localを従来通り使うか
②systemedに乗り換えるか
です。
①に関しては、単にrc.localに実行権限を与えてあげるだけでOK。
実際やってみて、OKでした。
chmod u+x /etc/rc.d/rc.local
参考サイト:http://kantaro-cgi.com/blog/etc-server/cant_run_rclocal_centos7.html
②に関しては、
・専用シェルスクリプトを用意し、
・「/etc/systemd/systemの下に、拡張子が .serviceのテキストファイルを作る。」
→参考サイト:tire.retire ガジェット好きおじさんの日記 より引用
・systemedに登録してあげる。
参考サイト:http://tire-retire.blogspot.jp/2014/12/centos7rclocal.html
参考サイト:http://motw.mods.jp/shellscript/tutorial.html
僕は①を試したのち、今後のことも考えて、systemedの対応を進めてみました。
シェルスクリプトは書いたことがありませんでしたが、初心者の自分にも難しくはなかったです。
ただ、現状まだうまく自動起動設定ができていない状態です。
systemedはサービスの起動順序をいろいろ指定できるのですが、依存関係にあるサービスが立ち上がる前にsvnserveの自動起動スクリプトが実行されているのではないか、と考えています。
今のところ、現状サーバー再起動時に再度立ち上げないといけないものは少ないので、
しばらく手動で対応しますが、頃合いをみて再挑戦したいところです。
登録:
投稿 (Atom)