tag:blogger.com,1999:blog-87909045806096373752024-02-19T16:17:13.447+09:00Hossan Maya Mel etc... practiceAnonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.comBlogger34125tag:blogger.com,1999:blog-8790904580609637375.post-53818719975998771882018-06-03T22:12:00.000+09:002018-06-03T22:12:08.386+09:00選択したエッジを延長した先の交点を求める選択したエッジを延長し、その交点で頂点をマージしたいという要望が会社でありました。<br />
ベクトルを使えば簡単に解決できそうな感じがしましたが、気になったので調査してみました。<br />
以下ソース<br />
<script src="https://gist.github.com/hossan-tk9004/312fa84625e04d892f86d64e628d8d78.js"></script>
コードと考え方は以下を参考にしました。
<a href="http://www.sousakuba.com/Programming/gs_two_lines_intersect.html">http://www.sousakuba.com/Programming/gs_two_lines_intersect.html </a><br />
大変わかりやすく解説されています。
<br />
<br />
このソースでは、選択したエッジの交点を求め、近いほうの頂点をその座標へ移動するまでとなっていますが、処理の根幹としては十分かと。<br />
<br />
うん、やっぱベクトルってべんりだなーと…。Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-70635196105906211552018-05-26T00:56:00.001+09:002018-05-26T00:57:03.138+09:00namespaceを指定してFBXインポート手動で行う分には問題なく行える操作ですが、スクリプトで実行しようとしたとき、若干はまりポイントだと思うので、メモを。<br />
以下ソース<br />
<script src="https://gist.github.com/hossan-tk9004/457f51ad81c3a4e8350c49efc8f5944b.js"></script>
<br />
fileコマンドからインポートした時、namespaceを指定しても無反応。<br />
カレントネームスペースを設定したうえでインポートするところがポイント。Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-88095912912349523212018-05-17T02:48:00.001+09:002018-05-17T02:48:08.862+09:00Maya2017 systemからフォルダを開くと無限ループで落ちるMayaバグ無印Maya2017では起こらなかったのですが、Maya2017 update4で以下ソースを実行すると、落ちます。<br />
<script src="https://gist.github.com/hossan-tk9004/cbd5def6aaea83070e5b45c4bdc240d6.js"></script><br />
systemからエクスプローラーでダイアログを開こうとすると、なぜか処理がconfirmDialogのところへ戻って、以下無限ループ。<br />
キャンセルなどして、systemの処理をスキップしようとすると、Mayaが固まって落ちました。<br />
<br />
処理をpythonに逃がして対応できないかと模索したところ、<br />
os.startfileの処理では、同様の結果となり、Mayaが落ちました。<br />
しかし、subprocess.popenから処理を行ったところ、無事にクラッシュを回避できました。(以下ソース)<br />
<script src="https://gist.github.com/hossan-tk9004/5f19602c3f9995cd2bc2bd345f83cb37.js"></script><br />
subprocessとos、melのsystemの大きな違いは、既定値でshellへ処理を飛ばすかどうか。<br />
subprocessは既定ではshellで処理をしなかったはずなので、そのあたりに原因があるかも。<br />
<br />
なお、最新のMaya2017 update5で発生するかどうかは未検証。
後日もう少し探ってみることにする。Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-40666175597144114342018-05-06T21:59:00.001+09:002018-05-17T02:11:14.153+09:00OpenMaya:頂点処理の速度比較以前海外の記述で見つけた記述を参考に、選択頂点で、設定値より近接している頂点の検索処理を、OpenMayaとmayaPythonで比較してみました。<br />
<br />
処理内容はどちらも<br />
①選択頂点の座標を取得<br />
②openMayaのMVectorクラスを使って閾値以上近接している頂点を検索<br />
③エラーがあればリストに格納して返す<br />
<br />
以下ソース<br />
mayaPython<br />
<script src="https://gist.github.com/hossan-tk9004/f85f2afaab7273c6d22175934c190b7c.js"></script>
openMaya<br />
<script src="https://gist.github.com/hossan-tk9004/b81f3b01b6324ebd56f8a1bae5995684.js"></script>
<br />
で、結果。<br />
mayaPythonの結果:
elapsed_time:1.26999998093[sec]<br />
openMayaの結果:
elapsed_time:0.103000164032[sec]<br />
<br />
うーん!
これだけで10倍以上の処理速度の差が。<br />
ソースはもっと洗練できると思う。
もっと早くなるんじゃないだろか。
<br />
参考;<br />
<a href="http://jensvhansen.com/fastest-way-to-query-vertex-position-in-maya/">http://jensvhansen.com/fastest-way-to-query-vertex-position-in-maya/</a><br />
<a href="https://boomrigs.com/blog/2016/1/12/how-to-get-mesh-vertex-position-through-maya-api">https://boomrigs.com/blog/2016/1/12/how-to-get-mesh-vertex-position-through-maya-api</a>Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-58523440619239331162018-04-30T19:27:00.002+09:002018-04-30T19:27:51.109+09:00OpenMaya:現在のビューポートからフェースを選択する大分前にopenMayaを使って、現在のビューポートからフェースを選択するコードを書いたのですが、
どこかに行ってしまい、参考にした海外の書き込みも見当たらず、どーしたもんかと思っていたところ、
ようやく見つけました。
<script src="https://gist.github.com/hossan-tk9004/60f5032cf77d5f3f310dc72e648e6153.js"></script>
こんどこそ忘れないように。
※後になって参考にした書き込みを発見…はやくいってよぉ…。<br />
参考:<a href="http://forums.cgsociety.org/archive/index.php?t-1045968.html">http://forums.cgsociety.org/archive/index.php?t-1045968.html</a><br />
<br />
なお、元ソースを探してさまよっていた際、porySelectConstraintを使った方法を紹介している記述を見つけたので、試してみました。<br />
<script src="https://gist.github.com/hossan-tk9004/61a67a63c8d8f414a62f9d7542052c7b.js"></script>
参考:<a href="https://forum.highend3d.com/t/select-polygons-facing-camera/2782/3">https://forum.highend3d.com/t/select-polygons-facing-camera/2782/3</a><br />
しかし、使ってみると、こちらはポリゴンメッシュ内部にカメラがめり込むと、そのポリゴンメッシュが選択不能になってしまったので、openMaya経由のほうが無難に使えました。
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-42910162466983020742018-03-27T00:22:00.003+09:002018-04-29T15:48:47.120+09:00現在のアクティブなシェルフを取得する作ったToolのボタンをシェルフに登録したい。<br />
ShelfLayoutをそもそも使っていれば何の問題もないけど、<br />
さまざまな理由から、遠回りをしたいとき。<br />
<br />
例えば右クリック⇒現在のMayaシェルフに登録などさせる場合、<br />
現在アクティブなシェルフレイアウトの名前を取得したい。<br />
<br />
そんな時はこちら。<br />
<br />
<script src="https://gist.github.com/hossan-tk9004/8c497f49b1fbf702f0edd1265d87b8ef.js"></script>Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-8979678433783356522017-11-21T21:41:00.000+09:002018-04-29T15:54:07.607+09:00レンダリング画像上の、あるノードのxy座標を取得する方法<pre>レンダリング画像上の、あるノードのxy座標を取得する方法。
OpenMayaを介して、ワールド空間空間内の座標位置をカメラから計算し、画像上のxy座標を算出します。
レンダリング情報はレンダリング設定のcommon設定のresolutionから取得して計算します。
</pre>
<pre class="brush:python; first-line: 1; highlight: [,];" title="">ソースまるコピ:</pre>
<pre class="brush:python; first-line: 1; highlight: [,];" title=""><a href="http://forums.cgsociety.org/archive/index.php?t-1109300.html">http://forums.cgsociety.org/archive/index.php?t-1109300.html</a></pre>
<pre class="brush:python; first-line: 1; highlight: [,];" title="">非常に分かりやすい記事でした。</pre>
<script src="https://gist.github.com/hossan-tk9004/aa8cd11c216a51d75a57ca835d81f9aa.js"></script>
<pre>なお、実際は知らせてみると、Photoshop画像上でx座標は正しい位置を取得しましたが、y座標の上下が逆転しました。</pre>
うーん、なんだろ。
<br />
<pre>以上、備忘録メモ</pre>
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-71082738443934941692016-11-16T01:00:00.001+09:002018-04-29T15:56:11.537+09:00melメモ:カレントファイルのフルパス・ファイル名・ディレクトリの取得備忘録的メモです。<br />
<div>
<script src="https://gist.github.com/hossan-tk9004/f7c9134ffe3a7c4217b2b3f5287e92af.js"></script>
<br />
割と忘れて、basenameコマンドやらなんやらを使いがち。。。</div>
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-25568413433677777262016-11-14T01:50:00.000+09:002018-04-29T15:58:11.001+09:00blenderスクリプトメモ:ビューポートのカメラ設定を変えるBlenderスクリプトは、カメラ設定をいじるのにも、どこに情報が格納されているのか、探すのに一苦労でした。。<br />
<br />
ひとまず、現在のウインドウの、View_3Dパネルを取得できれば、いろいろいじることができそう。<br />
<br />
以下ソース<br />
<script src="https://gist.github.com/hossan-tk9004/9565d1919602f577127ccbdffc6fb27c.js"></script>
<br />
しかし、ビューにすべてのオブジェクトが入るようにするやり方がわからなかった。<br />
(ショートカットだと、shift+C)<br />
引き続き調査してみます。Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-3725749739048131082016-11-14T01:36:00.000+09:002018-04-29T16:00:10.329+09:00blender スクリプトメモ:fileDialogでファイルパスを取得するMayaのmelやpythonだと、fileDialogを出すのには全く苦労しませんが、<div>
Blenderはかなり面倒くさかったです。</div>
<div>
あちこち調べて、ようやくソースを見つけたので、こちらにメモします。</div>
<div>
<br /></div>
<div>
以下ソース</div>
<script src="https://gist.github.com/hossan-tk9004/2103a9ba5e6cf4d22d3132e399819787.js"></script>
<div>
<br /></div>
<div>
参考:</div>
<div>
<a href="http://blender.stackexchange.com/questions/39854/how-can-i-open-a-file-select-dialog-via-python-to-add-an-image-sequence-into-vse">http://blender.stackexchange.com/questions/39854/how-can-i-open-a-file-select-dialog-via-python-to-add-an-image-sequence-into-vse</a></div>
<div>
<br /></div>
<div>
<a href="https://www.blender.org/forum/viewtopic.php?t=26470">https://www.blender.org/forum/viewtopic.php?t=26470</a></div>
<div>
<br /></div>
<div>
<a href="http://blender.stackexchange.com/questions/30678/bpy-file-browser-get-selected-file-names">http://blender.stackexchange.com/questions/30678/bpy-file-browser-get-selected-file-names</a></div>
<div>
<br /></div>
<div>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div>
<div>
<br /></div>
<div>
本当は、fileDialogから、単にパスを返すだけのソースにしたかったのですが、解決方法がわからず、fileDialogを呼び出した処理の中に、本処理を書き込む流れになっています。</div>
<div>
<br /></div>
<div>
うーむ。。気持ち悪い。。</div>
<div>
<br /></div>
<div>
というか、たかだかfileDialogだすだけで相当時間を食ってしまった…南無三。</div>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-36725985991141884882016-10-20T01:45:00.000+09:002016-12-01T15:35:22.643+09:00blender::スクリプトで後からActionにgroupを追加し、fcurveを登録する方法現在、お仕事でBlenderのスクリプトを触っているのですが、まったくMayaのそれとは異質で四苦八苦。。(汗<br />
<div>
同じpythonといっても、Blenderのpythonスクリプティングは、完全にオブジェクト指向なので、コマンドを動かして操作するmaya pythonとはまったくハンドリングが違う。</div>
<div>
たかだかジョイントツリーを選択するだけで時間がかかる…!</div>
<div>
<br /></div>
<div>
Blender pythonでの操作方法はいくつかわかってきましたが、そのうち一つをこちらでメモを兼ねて公開します。</div>
<div>
<br /></div>
<div>
通常、Blender上でアニメーションを作成すると、ArmatureにActionを登録し、キーフレームを作成すると、Actionデータの中に骨ごとのグループができて、中にfcurveが登録されます。</div>
<div>
が、例えば、FBXなどをインポートすると、(出力やインポート方法によって異なるかもですが)、この骨ごとのグループが作成されず、Armature直下にfcurveが登録されます。</div>
<div>
<br /></div>
<div>
これを骨ごとのグループに登録しなおすには、ActionEditor上から手作業でグループを作成…してもよいのですが、面倒。</div>
<div>
<br /></div>
<div>
スクリプトでやると、以下の通りです。</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">※あらかじめ編集したいArmatureを選択してアクティブにしておくことが前提</span></div>
<div>
<span style="color: #3d85c6;">※アクティブにするArmatureをスクリプトで指定する方法は、またべつのはなし(笑)</span></div>
<div>
<span style="color: #6aa84f;"><br /></span></div>
<div>
<span style="color: #3d85c6;">#まず、新規にActionにgroupを追加する。</span></div>
<div>
<span style="color: #6aa84f;">>>></span><span style="color: #6aa84f;"> </span><span style="color: #6aa84f;">bpy.context.object.animation_data.action.groups.new('test')</span></div>
<div>
<span style="color: #3d85c6;">#手動操作時の、infoウインドウにログ表示される「bpy.ops.anim.channels_group(name="testGrp")</span></div>
<div>
<span style="color: #3d85c6;">」という入力だとなんでか怒られます。おそらく、fcurveがきちんと指定できてないのかも。</span></div>
<div>
<span style="color: #6aa84f;"><br /></span></div>
<div>
<span style="color: #3d85c6;">#つぎに、アニメーションカーブを取得します。</span></div>
<div>
<span style="color: #6aa84f;">>>> fcList=bpy.context.object.animation_data.action.fcurves</span></div>
<div>
<span style="color: #3d85c6;">#カーブごとのグループアトリビュートを指定します。</span></div>
<div>
<span style="color: #6aa84f;"><strike>>>> for fc in fcList:</strike></span></div>
<div>
<span style="color: #6aa84f;"><strike>... fc.group.name='test'</strike></span><br />
<span style="color: #6aa84f;">>>>for fc in fcList:</span><br />
<span style="color: #6aa84f;">... fc.group=bpy.context.object.animation_data.action.groups['test']</span><br />
<span style="color: #6aa84f;"><br /></span>
<span style="color: #3d85c6;">※12/1修正:名前指定ではグループに入りませんでした!</span><br />
<span style="color: #3d85c6;">※グループオブジェクトを指定する必要があるようです。</span></div>
<div>
<br /></div>
<div>
…以上!(ジェイソン風味</div>
<div>
fcurveごとに登録したいグループを変えるのであれば、fcurveのdata_pathアトリビュートから、UI上に表示されている名前を取得できるので、if文で処理分岐するといいと考えています。</div>
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-69084255683818559302016-10-13T21:05:00.000+09:002018-04-29T16:03:04.795+09:00シーン内のすべてのリファレンスノードをインポートする。メモ代わりに。<br />
<br />
<script src="https://gist.github.com/hossan-tk9004/76546e4b70b99ecb9a40e2718048fb36.js"></script>
リファレンスノードを取得し、ファイルパスを取得、fileコマンドからインポート。<br />
<br />Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-86251833405670483542016-07-23T02:19:00.000+09:002016-07-23T02:19:29.279+09:00Photoshop JavaScript:レイヤーを別のファイルへ複製する。業務でPhotoshopのJavaScriptによる自動化を行いました。<br />
その際、「特定レイヤーセットを、別のファイルへ複製する」方法を調べたのですが、なかなかヒットしなかったので、こちらに投稿しておきます。<br />
<br />
<span style="color: lime;">psObj = open(new File('<コピー先のファイルパス>')); </span><br />
<span style="color: lime;">refObj = open(new File('<コピー元のファイルパス>')); </span><br />
<span style="color: lime;">var layObj = refObj.layerSets.getByName("<指定するレイヤーセットの名前>")</span><br />
<span style="color: lime;">layObj.duplicate(psObj)</span><br />
<br />
割と簡単でした。<br />
ちなみに、上記の例では、一番上の階層のレイヤーセットのみを検索します。<br />
その下階層の場合は、指定のlayerSetの中のlayerSetを取得してやる必要があります。<br />
<br />
また、この例では、layerSetsのduplicateを行っていますが、通常layerやartLayerからも実行することも可能かも。<br />
(未確認)<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-31197506630972003812016-07-10T00:49:00.000+09:002016-07-10T18:00:45.727+09:00pythonでredmineを使う。オープンソースのプロジェクト管理ソフトウェア、「redmine」ですが、<br />
僕の環境でもredmineを使ったプロジェクト管理を模索しています。<br />
<br />
他の会社などの話を様々なセミナーで聞くと、(redmineに限った話ではないですが)様々な環境に合わせたカスタマイズが行われているようです。<br />
Mayaとredmineなどの管理ソフトの連動なども行われていたり。<br />
<br />
僕の方でも、redmineをより使いやすくするため、pythonからアクセスする方法を模索してみました。<br />
redmineにはrestAPIでアクセスが可能ですが、pythonでアクセスできれば、<br />
デスクトップToolだけでなく、Mayaとの連動でタスク管理することが可能になってきます。<br />
<br />
<h3>
・python-redmineモジュールを使う。</h3>
→これで解決しました(簡単)。 まさにそれ、というモジュールがあったのですね。。<br />
Mayaから実行する場合、MayaのpythonPathが通っているところにモジュールをおいて、importすればOK。<br />
githubにモジュールあるので、ダウンロードして使用できます。<br />
<br />
<h3>
・ssl認証エラーする場合は?</h3>
割と壁だったのが、SSL認証。 オレオレ認証かなんかを使っていると、「このサイト信用できまへんで」などと言われてブラウザに怒られます。<br />
python-redmineからアクセスする際も、同じようにエラーが返ってきて、情報が取得できませんでした。<br />
このSSL認証をスキップするには、…<br />
<br />
<span style="color: lime;">redmine = Redmine('https://redmine.url', requests={'verify': False})</span><br />
<br />
この記述で解決しました。<br />
python-redmineに同梱されている、requestModuleのバージョンによって、<br />
エラー表示が出まくることがありますが、とりあえず実行・情報取得はできました。<br />
エラーを非表示にしたい場合、requestモジュールのバージョンを下げれば解決するそうです。<br />
<br />
でもまぁ、値さえ取得できればOKなので、僕は無視してます。<br />
<br />
参考URL<br />
<br />
<a href="http://qiita.com/mima_ita/items/1a939db423d8ee295c85">http://qiita.com/mima_ita/items/1a939db423d8ee295c85</a><br />
<a href="https://github.com/maxtepkeev/python-redmine/issues/1">https://github.com/maxtepkeev/python-redmine/issues/1</a><br />
<a href="https://pypi.python.org/pypi/python-redmine">https://pypi.python.org/pypi/python-redmine</a><br />
<a href="http://python-redmine.readthedocs.io/resources/issue_category.html#manager">http://python-redmine.readthedocs.io/resources/issue_category.html#manager</a><br />
<br />Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-10976974303624808832016-06-19T12:46:00.003+09:002016-06-19T12:47:59.145+09:00文字分割は、python使ったほうが楽?pythonでのコーディングは便利でいいですが、やはりmelにはmelの良さがあるし、melのほうが手っ取り早いこともあります。<br />
<br />
ただ、melはやっぱりpythonと比べると、文字分割関連がめんどくさい…。<br />
<br />
たとえば、文字列…<br />
<br />
<span style="color: lime;">"aaa/bbb/ccc.bmp"</span><br />
<br />
で、"bbb"を抜き出したい場合、おそらく普通にmelでコーディングすると…<br />
<br />
<br />
<span style="color: lime;">string $temp[] = stringToSTringArray("aaa/bbb/ccc.bmp","/");</span><br />
<span style="color: lime;">string $result = $temp[1] ;</span><br />
<br />
など、stringToStringArrayを使わない場合でも、一度配列に出してから抜き出さないと、だと思います。<br />
<br />
今日試してみたのが、pythonを挟む方法です。<br />
<span style="color: lime;"><br /></span>
<span style="color: lime;">string $result = python('aaa/bbb/ccc.bmp'.split('/')[-2]);</span><br />
<br />
…一行で済むというね!<br />
<br />
<br />
しばらくこちらを試してみようと思います。Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-77135146057681472252016-06-19T12:09:00.001+09:002016-06-19T12:11:52.683+09:00pythonソース もう一度importするには??melのsourdeと違って、pythonの場合、ソースを更新して再度importコマンドを行っても更新されることがありません。<br />
この場合、reload()関数を使うと解決できます。<br />
<br />
⇒<a href="http://docs.python.jp/2/library/functions.html#reload" target="_blank">reload関数()</a><br />
<br />
ほかにも、読み込んだモジュールを削除して再度importする方法を採用している方もいるようです。<br />
<br />
⇒<a href="http://qiita.com/nel215/items/cc3722a1f2d8ce217d42">.pyファイルの再import</a><br />
<br />
とくにもんだいなければ、reload関数を使うのがよさそうです。Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-44856254780147562342016-06-17T14:53:00.002+09:002018-04-29T16:06:51.428+09:00melで、指定パス以下のフォルダ・ファイル階層を取得する。子供が熱でた~ … ということで、家で作業しております。<br />
<br />
Toolを作っている際、データ集合をフォルダ階層に分けて管理・Tool上にそのツリーを表示したい…などというケースは少なくないと思います。<br />
<br />
簡単ですが、再帰処理による、「指定パス以下のフォルダ・ファイル階層を取得するmel」を作成しました。<br />
メモ代わりに貼り付けます。
<script src="https://gist.github.com/hossan-tk9004/e8a3a43a8133c23421cbb8d25f70f506.js"></script>
treeListerかなんかでフォルダを列挙したいときなんか便利かも。Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-16851844480279073312016-06-12T17:35:00.000+09:002018-04-29T16:14:32.342+09:00任意のフォルダのpythonファイルをimport コマンドから持ってくるToolのソースを、特定のフォルダの特定階層に整理したいのに、melファイルのsourceコマンドとは違って、pythonのimportコマンドは、あらかじめpythonパスが通っているところしか見てくれない。<br />
<br />
そういう場合は、環境変数に書き込むか、一時的リリースのToolなんかだったら、一時的にpythonパスをソースから追加することでインポートが可能です。<br />
<br />
サンプルソース;
<script src="https://gist.github.com/hossan-tk9004/44e9e618b74756ab6d6235ad00b23cf8.js"></script>
これでpythonパスを一時的に追加できるので、この後importコマンドを走らせればいい
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-32306421427964930542016-02-11T01:51:00.000+09:002018-04-29T16:11:11.499+09:00選択したキーフレームのリストを取得する基礎の話なのですが、恥ずかしながらつい先日知ったことを、こちらにも載せておきます。<br />
<br />
通常、グラフエディタで選択したキーフレームは、<br />
<br />
keyframe -q -sl;<br />
<br />
で取得できますが、これは単に、選択したフレーム=time(時間)のリストを返すだけで、<br />
たとえば、複数アトリビュートのキーを同時選択していたとしても、いっしょくたに値が返されます。<br />
<br />
アトリビュートとノードのリストは、<br />
<br />
keyframe -q -n;<br />
<br />
から取得可能ですが、それぞれ別々に実行すると、キーフレームとアトリビュートが関連していません。<br />
このままでは、たとえば「選択したキーすべてにある処理を加える」などの処理がしにくい。。<br />
方法を探していたのですが、何のことはない、「keyframe -q -sl;」の時、そのカーブの名前を指定してあげればよかったのでした。。<br />
<br />
つまりは…<br />
<script src="https://gist.github.com/hossan-tk9004/6ccbe2636484b26796b388ff429d9916.js"></script>
…で、各アニメーションカーブごとに、各々選択したキーフレームが取得できました。<br />
<br />
…基礎です。(恥<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-64567623152124137392016-01-05T01:16:00.000+09:002018-04-29T16:21:39.622+09:00【Maya】 【python】ポリゴンの凹面を判別する。少し前からですが、アーティストの方から割と要望をいただく件として、<br />
「ポリゴンメッシュの凹面を自動判別する機能」があります。<br />
<br />
早めに開発着手したかったのですが、なかなか手が空かず、<br />
時間ばかりいただいてしまいました。。<br />
で、ちょうど年末年始、数学に強い従兄の助言もいただき、<br />
時間のあるこの時期に大体形にしてみたので、こちらでも紹介します。<br />
<br />
■どうやって凹凸を判別するか?<br />
チェックするポリゴンは4頂点の4角形であることが前提です。<br />
<span style="color: #6fa8dc; font-size: x-small;">そもそも3角形だったら平面だし。5角形だったらそもそもポリゴン割れし。</span><br />
<br />
で、仕組みはこうです。<br />
<span style="color: #e06666; font-size: large;">ずばり内積と外積を使います。</span><br />
<br />
ベクトルの内積と外積を使って、4頂点のうち、<br />
3頂点の平面から見た残りの1点の位置を判別します。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsBqi2Xi_KmDy3hX0xcWFqy0miwPV-4f2rX_xS0pzOKdQ64HKXo4R3nDChyxIJIlPUfFdAAzVL2QZhC9F77uJj8JMGvIu0KKzxbcJ8g6BQaca3vvOjMslUu95GpfAjliAcgRa2_dbHnZ62/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsBqi2Xi_KmDy3hX0xcWFqy0miwPV-4f2rX_xS0pzOKdQ64HKXo4R3nDChyxIJIlPUfFdAAzVL2QZhC9F77uJj8JMGvIu0KKzxbcJ8g6BQaca3vvOjMslUu95GpfAjliAcgRa2_dbHnZ62/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="color: #6fa8dc;">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
かんたんに外積:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0o3XYreQ8cAYwFyScsMtPgsZx4Fv7mT2v0ODRwS4r-1jORlT8v0ujXWGRhhSYQJGwVMfELUwqtPG6JHx6WwNqk0kscT_5zccRHwnkD5CsBdiS9oz0keK4JjWDt0Eio-rCbZvK-NWuxi0t/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0o3XYreQ8cAYwFyScsMtPgsZx4Fv7mT2v0ODRwS4r-1jORlT8v0ujXWGRhhSYQJGwVMfELUwqtPG6JHx6WwNqk0kscT_5zccRHwnkD5CsBdiS9oz0keK4JjWDt0Eio-rCbZvK-NWuxi0t/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a>2つのベクトルに垂直なベクトルを算出します。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
かんたんに内積:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Xydez9e63ITBTUGr4CYFEkTEDUbyQUvAqCL2FbrzjNGDevsEEEMfJM6uIBLwOAJk3VP7TJITDJGaV-U-6tIr56emGteCNYyScS0YlGOxvC_fg6Wyf0HsjwW9tXFvwcCSWcDIVTERdUaY/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Xydez9e63ITBTUGr4CYFEkTEDUbyQUvAqCL2FbrzjNGDevsEEEMfJM6uIBLwOAJk3VP7TJITDJGaV-U-6tIr56emGteCNYyScS0YlGOxvC_fg6Wyf0HsjwW9tXFvwcCSWcDIVTERdUaY/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a>ベクトルAをベクトルBに成分分解したときの、そのベクトルの長さを求めます。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="color: #6fa8dc;">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
その手順は…、<br />
<br />
①3頂点で作る、1点から伸びる2本のベクトルの外積を出して、<br />
この3角形に垂直なベクトルを算出します。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj2NByox2PtRhoaN62_FhkFtXAvsdMUHGQlB_QxjW4G_Q86JcKtcULw78kcaTmaMrXmg_uAIUGF2aicongugU_KpdIXWz_NpOQrTNQPX1ur0iI6sK_gcvI4zW45zXCufQRVT4i1woTx0gf/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj2NByox2PtRhoaN62_FhkFtXAvsdMUHGQlB_QxjW4G_Q86JcKtcULw78kcaTmaMrXmg_uAIUGF2aicongugU_KpdIXWz_NpOQrTNQPX1ur0iI6sK_gcvI4zW45zXCufQRVT4i1woTx0gf/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
②残り1頂点で作るベクトルと、①の三角形に垂直なベクトルの内積を求めます。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBbx7mGJ1KbQmkzVyXIR4F60rJl5pmSmnx3D10YzH4PG6TAp9Ltq6UjoTw_fqR-yAxnuOE5oizXlmsGzoFXj3604nUiZvFN_1-4yT79f3kimY73bMVe4fX-raaABGpXREba7NGRKSvEQw1/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBbx7mGJ1KbQmkzVyXIR4F60rJl5pmSmnx3D10YzH4PG6TAp9Ltq6UjoTw_fqR-yAxnuOE5oizXlmsGzoFXj3604nUiZvFN_1-4yT79f3kimY73bMVe4fX-raaABGpXREba7NGRKSvEQw1/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
この内積の値が正か負かで、残りの1点の位置が算出できるはずです。<br />
<br />
■しかし、ポリゴンのみかたで凹か凸かが変わってしまう。<br />
この4頂点ですが…<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0mU8g-3FTcnm_2tR6T-VRJoFFqZM_I7u_-OMcciES0s5UuWfRLdm4yviOCjBWlvxU5yrPQB5wrobrJLV70g4559-97oRFY2mr3liJsbIMA63AqVHUfEouNaVXcxkS1Jy7Y2myYR5LxF4b/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0mU8g-3FTcnm_2tR6T-VRJoFFqZM_I7u_-OMcciES0s5UuWfRLdm4yviOCjBWlvxU5yrPQB5wrobrJLV70g4559-97oRFY2mr3liJsbIMA63AqVHUfEouNaVXcxkS1Jy7Y2myYR5LxF4b/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a>こうみるか<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb9_O_n71dCxKHcTegz93HmObGkWJk0Fh-Nj_P4pzTnLnwSz1QmJlRwhNIHtE235fpE-VROJr7TmZw5uZm5sxabBXcOQYQT17AQ4qwXkJGIT4T-kpak4rKE35toZhrLR9RKEjgm3fAYVEx/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb9_O_n71dCxKHcTegz93HmObGkWJk0Fh-Nj_P4pzTnLnwSz1QmJlRwhNIHtE235fpE-VROJr7TmZw5uZm5sxabBXcOQYQT17AQ4qwXkJGIT4T-kpak4rKE35toZhrLR9RKEjgm3fAYVEx/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
こうみるかで、凹か凸かが変わってしまいます。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
要は、どの頂点を判別するのか、準点を定める必要があるわけです。<br />
ここは、判別の基準をアーティストさんに確認する必要がありますが、、、<br />
とりあえず、一度Triangulateをかけた時の形状が、凹か凸かを判別するように<br />
考えることにしました。<br />
<br />
要は、このポリゴンを…<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsedD2wBNJO7OJmYm48uxa8IZwHNcVpv5JFZwYrJF35dVQ0DD25VUBjR26XetZyLo3RV7ufN6iYBBIAuBvp9tC_I_GViYR6xTE6uXN7TVb0OsQAER747cAS7r5Wa93bBsjk0j2ToCji-z0/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsedD2wBNJO7OJmYm48uxa8IZwHNcVpv5JFZwYrJF35dVQ0DD25VUBjR26XetZyLo3RV7ufN6iYBBIAuBvp9tC_I_GViYR6xTE6uXN7TVb0OsQAER747cAS7r5Wa93bBsjk0j2ToCji-z0/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Triangulateをかけて…<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH0E0tOd63d5KOgfurte3wqV3GM17PQvbY24r1D7XhyNQwD3KjRP7cMCjBaFwyrsdj3WgfUXSHC640wpBSGqXGVVeizCoyoKVlR7ittJ8WZw7VX6_QWMs0XHhPlxfa6F9WKN31CZyrcovi/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH0E0tOd63d5KOgfurte3wqV3GM17PQvbY24r1D7XhyNQwD3KjRP7cMCjBaFwyrsdj3WgfUXSHC640wpBSGqXGVVeizCoyoKVlR7ittJ8WZw7VX6_QWMs0XHhPlxfa6F9WKN31CZyrcovi/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
<br />
この3角形に含まれない頂点…<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhwua2DFQQM7FLRkw1Q1pJIv84PSlLgdh9uLqyD5m8hAwE5RzO1vh2Dw5eJHCP76Gx3oqr-SAfHU_0ybP5szOXe_iF9QJSLh6IQNQJqRx1SKMMg3aYtS528c1bx1C20HPsq4lyByvcqd1E/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhwua2DFQQM7FLRkw1Q1pJIv84PSlLgdh9uLqyD5m8hAwE5RzO1vh2Dw5eJHCP76Gx3oqr-SAfHU_0ybP5szOXe_iF9QJSLh6IQNQJqRx1SKMMg3aYtS528c1bx1C20HPsq4lyByvcqd1E/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
<br />
つまり、この頂点を判別することにします。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0ywJs4LqLqo4ccvuCAMIPPjrYNv9utIU18pfECGcaPuCyUhjOgaJUhQyBelQyglYUT5fIJX1n16A547v1Ka8eTxDfTgMOTaShDa8OPELEOLeYRri19zrfHIXEQitY8_QtkzWoCgLd-hS/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0ywJs4LqLqo4ccvuCAMIPPjrYNv9utIU18pfECGcaPuCyUhjOgaJUhQyBelQyglYUT5fIJX1n16A547v1Ka8eTxDfTgMOTaShDa8OPELEOLeYRri19zrfHIXEQitY8_QtkzWoCgLd-hS/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+2.jpg" width="320" /></a><br />
<br />
■melに便利なコマンドが<br />
melにズバリ、内積・外積を算出するコマンドがあるので、これを使うっきゃない。<br />
<br />
外積:cross <a href="http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/cross.html">http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/cross.html</a><br />
内積:dot <a href="http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/dot.html">http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/dot.html</a> <br />
<br />
しかし、頂点計算など、数が多い処理は全てmelで処理するには重たすぎるので、<br />
基本はすべてpythonで書くことにし、pythonからmelプロシージャを呼び出すようにします。<br />
<br />
そんな感じで、ぱっと作ってみました。<br />
<span style="color: #6fa8dc;">※使用方法は、mel文を先に実行しておくか、sourceコマンドで読んでおいた上で</span><br />
<span style="color: #6fa8dc;">ポリゴンを選択し、python文を実行します。</span><br />
<span style="color: #6fa8dc;">すると、凹んだ角形のみが選択された状態で終了します。</span><br />
<br />
実際にまだ使っていないので、信頼性は低いですが。<br />
いろいろテストなどして、ブラッシュアップしていこうと思います。<br />
<br />
以下ソース<br />
<script src="https://gist.github.com/hossan-tk9004/98f84cab6660bb05a3d7e0600532d4d2.js"></script>
<script src="https://gist.github.com/hossan-tk9004/af4bb8d48529e27afa70bb000e1cfe0b.js"></script>Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-87498623754703870792016-01-04T23:45:00.000+09:002016-01-04T23:45:15.576+09:00centos7 rc.localからだと起動スクリプトがうごかない。。。以前svnserveを導入した際、rc.localにsvnserveの起動スクリプトを記述して、<br />
サーバーの起動時にsvnserveが自動的に立ち上がるように設定したのですが、<br />
単にこれだけだと、自動起動してくれないことが分かりました。<br />
<br />
実は、centos7から従来のrc.localにとる起動スクリプト管理ではなく、systemedにて<br />
起動スクリプトの管理を行うようになったようです。<br />
<br />
…てか、本にもそう書いてあった。全然読んでないじゃん。orz<br />
<br />
<br />
起動スクリプトの管理方法は、他サイト様にていろいろ紹介されてありますが、<br />
方法は2つ。<br />
①rc.localを従来通り使うか<br />
②systemedに乗り換えるか<br />
<br />
です。<br />
<br />
①に関しては、単にrc.localに実行権限を与えてあげるだけでOK。<br />
実際やってみて、OKでした。<br />
<br />
chmod u+x /etc/rc.d/rc.local<br />
<br />
参考サイト:<a href="http://kantaro-cgi.com/blog/etc-server/cant_run_rclocal_centos7.html">http://kantaro-cgi.com/blog/etc-server/cant_run_rclocal_centos7.html</a><br />
<br />
②に関しては、<br />
・専用シェルスクリプトを用意し、<br />
・「/etc/systemd/systemの下に、拡張子が .serviceのテキストファイルを作る。」<br />
<span style="font-size: x-small;">→参考サイト:tire.retire ガジェット好きおじさんの日記 より引用</span><br />
・systemedに登録してあげる。<br />
<br />
参考サイト:<a href="http://tire-retire.blogspot.jp/2014/12/centos7rclocal.html">http://tire-retire.blogspot.jp/2014/12/centos7rclocal.html</a><br />
参考サイト:<a href="http://motw.mods.jp/shellscript/tutorial.html">http://motw.mods.jp/shellscript/tutorial.html</a><br />
<br />
僕は①を試したのち、今後のことも考えて、systemedの対応を進めてみました。<br />
シェルスクリプトは書いたことがありませんでしたが、初心者の自分にも難しくはなかったです。<br />
<br />
ただ、現状まだうまく自動起動設定ができていない状態です。<br />
systemedはサービスの起動順序をいろいろ指定できるのですが、依存関係にあるサービスが立ち上がる前にsvnserveの自動起動スクリプトが実行されているのではないか、と考えています。<br />
<br />
今のところ、現状サーバー再起動時に再度立ち上げないといけないものは少ないので、<br />
しばらく手動で対応しますが、頃合いをみて再挑戦したいところです。<br />
<br />Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-49032650038473321062015-11-08T23:28:00.000+09:002016-01-04T23:50:55.070+09:00centos7にSVN1.8とsvnserveを導入する仕事では、Maya等のテクニカル対応のほかに、実はファイルサーバーやSVNの管理などもやっております。<br />
…とはいえ、サーバー周りの技術なり知識は、今の職場に来てから習得した…というよりも習得中(…汗)なので、正直な話、ずぶの素人と大してかわんないんですけど。<br />
ともあれ、やらねばならぬ、ということで、やってます。<br />
<br />
で、今回はSVN対応の話。仕事でsvnserveの対応をしたのですが、細かなところでつまづくところがありましたので、メモの意味もふくめ、僕の対応手順を書き記すことにしました。<br />
<br />
<br />
サーバーはLinuxでCentOS7。クライアントはwindows7。<br />
クライアント側にすでにインストールされていたsvnが1.8だったので、svn1.8でsvnserve対応をする必要がありました。<br />
<br />
そんなわけで、僕が行った手順は以下の通りです。<br />
~~~~~~~~<br />
<span style="color: #3d85c6;">① SVN1.8の導入</span><br />
<span style="color: #3d85c6;">→通常インストールでは1.7が入るため、WandiscoRPMリポジトリから落とす。</span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">参考サイト:CentOS 6でsubversionのバージョンを上げる</span><br />
<a href="http://www.torutk.com/projects/swe/wiki/CentOS_6%E3%81%A7subversion%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B"><span style="color: #3d85c6;">http://www.torutk.com/projects/swe/wiki/CentOS_6でsubversionのバージョンを上げる</span></a><br />
<br />
<span style="color: #3d85c6;">② 競合するSVN1.7をアンインストール</span><br />
<span style="color: #3d85c6;"> # yum remove package name</span><br />
<span style="color: #3d85c6;"> →svn1.7とライブラリ周りが競合したので、アンインストール</span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">③ svnserveを起動</span><br />
<span style="color: #3d85c6;">参考サイト:subversionのインストール(CentOS,svnserve)</span><br />
<a href="http://blog.myspoon.info/2011/07/subversioncentossvnserve.html"><span style="color: #3d85c6;">http://blog.myspoon.info/2011/07/subversioncentossvnserve.html</span></a><br />
<span style="color: #3d85c6;">→すでにリポジトリは作成済みだったため、上記記事のうち、リポジトリ作成部分・アクセス権部分は割愛</span><br />
<span style="color: #3d85c6;">→service svnserve STATUSでsvnserveの起動状況を確認しつつ…</span><br />
<span style="color: #3d85c6;">→svnserve –d –r ルートパス で起動</span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">④ リポジトリのフォルダ内の、confフォルダの中身…</span><br />
<span style="color: #3d85c6;">svnserve.conf …を編集</span><br />
<span style="color: #3d85c6;"> </span><span style="color: #6aa84f;">[general]</span><br />
<span style="color: #6aa84f;"> anon-access = read →ユーザー認証なしの人:読み込みのみ</span><br />
<span style="color: #6aa84f;"> auth-access = write →ユーザー認証ありの人:読み書きOK</span><br />
<span style="color: #6aa84f;"> password-db = passwd →パスワード定義ファイルの名前</span><br />
<span style="color: #6aa84f;"> authz-db = authz →ユーザーごとのアクセス権設定ファイルの名前</span><br />
<span style="color: #6aa84f;"> realm = My First Repository →認証の名前</span><br />
<br />
<span style="color: #3d85c6;">「password」 …を編集</span><br />
<span style="color: #3d85c6;"> </span><span style="color: #6aa84f;"> [users]</span><br />
<span style="color: #6aa84f;"> testUser = testuser</span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">「authz」 …を編集</span><br />
<span style="color: #3d85c6;"> </span><span style="color: #6aa84f;"> [groups]</span><br />
<span style="color: #6aa84f;"> superUser = testUser ←ユーザーをグループに分ける</span><br />
<br />
<span style="color: #6aa84f;"> [/]</span><br />
<span style="color: #6aa84f;"> @superUser = rw ←グループごとにアクセス権を設定</span><br />
<span style="color: #6aa84f;"> * = r</span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">⑤ ポートの開放</span><br />
<span style="color: #3d85c6;"> 参考サイト:</span><a href="http://blog.layer8.sh/ja/2011/12/28/subversion%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92svnserve%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/"><span style="color: #3d85c6;">http://blog.layer8.sh/ja/2011/12/28/subversionのサーバーをsvnserveで構築する/</span></a><br />
<span style="color: #3d85c6;"> →このあと、#servuce iptables restartで再読み込み</span><br />
<br />
~~~~~~~~<br />
…ひとまず、この手順でsvnserveの起動が確認でき、RedmineやJenkins、TortoiseSVNから「svn://...」でアクセスすることができました。<br />
あとは起動スクリプトに svnserveを起動するスクリプトを追加して、OSが立ち上がる際に自動でsvnserveも起動するように設定して、完了です。<br />
<br />
あと、余談ですが、SVNやRedmineをLinuxサーバーで運用していて思ったのですが、<br />
Centos7でSVNサーバーを運用するのは、現状ではまだ避けたほうがいいんじゃないか、ということです。<br />
Centos7だとsvn1.8 webDAVがリリースされていないのか、wandiscoのリポジトリなどを探しても見当たらず、webdav認証が出来ずにすごく苦労しています。<br />
←結局、アクセス権は、svnserveか、sambaを介して行っているのが現状です。<br />
<br />
ただし、Centos6ではsvn1.8のwevdavがリリースされていたり、また、様々なノウハウも蓄積していて、web上のドキュメントも多いです。<br />
Centos7ではなく、centos6を選択したほうが現状ではまだ有利だったかもしれません…。<br />
<div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px; margin-left: 18pt;">
<u></u></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px; margin-left: 18pt;">
<u></u></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px; margin-left: 18pt;">
<u></u></div>
</div>
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-11485587291847525892015-09-05T13:31:00.000+09:002015-09-05T13:39:48.811+09:00Maya UVTextureEditorをカスタマイズする。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Lvfi7cWf4-QKiXYPzkMC2itcnqQg6PRqfqkc0Es7t_F6QNbiIZV0nUzJY0GafQyVHqh4L4WhN_UFZbPdNY7U-neE9JYiGbO0TTQe0uz6coKzEkAN8c5xYygnR78q_Rrs_xzwTX-w2-Tq/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Lvfi7cWf4-QKiXYPzkMC2itcnqQg6PRqfqkc0Es7t_F6QNbiIZV0nUzJY0GafQyVHqh4L4WhN_UFZbPdNY7U-neE9JYiGbO0TTQe0uz6coKzEkAN8c5xYygnR78q_Rrs_xzwTX-w2-Tq/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+1.jpg" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
会社で、以前勤めていた方が、UV TextureEditorをカスタマイズしたmelを作成されてました。<br />
<div>
先日、このmelの修整依頼をいただき、中身を解析したところ、割と面白かったので、</div>
<div>
Tipsをこちらでも紹介しようと思います。</div>
<div>
<br /></div>
<div>
要は、MayaのデフォルトのUVTextureEditorにカスタマイズしたレイアウトをねじ込む…というものです。</div>
<div>
では、僕がやってみた手順を順番に紹介したいと思います。</div>
<div>
<br /></div>
<div>
まず、UVTextureEditorはMayaのランタイムコマンドで、以下で生成できます。</div>
<div>
(scriptEditorの履歴からもわかります。)</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">TextureViewWindow;</span></div>
<div>
<br /></div>
<div>
で、この生成されたウインドウにレイアウトをねじ込みたいわけですが、</div>
<div>
ここでほしい情報は、</div>
<div>
<b><span style="color: orange;">1)このウインドウの名前</span></b></div>
<div>
<b><span style="color: orange;">2)中に入っている各々レイアウト構造の名前</span></b></div>
<div>
です。</div>
<div>
<br /></div>
<div>
生成したTextureWindowのパネル名は、以下コマンドで求めることができます。</div>
<div>
<br /></div>
<div>
<span style="color: #d0e0e3;">string $texWinName[] = `getPanel -sty polyTexturePlacementPanel`;</span></div>
<div>
(これはMayaユーザーガイドに載ってます)</div>
<div>
<br /></div>
<div>
ここで取得したTextureWindowの親レイアウトをフルパス取得すれば、1)と2)が解決したも同然なので、</div>
<div>
<br /></div>
<div>
<span style="color: #6fa8dc;">string $texWinParent = `textureWindow -q -p $texWinName[0]`;</span></div>
<div>
<br /></div>
<div>
…で、親レイアウトを求めてみました。</div>
<div>
すると、帰ってきた文字列が…</div>
<div>
<br /></div>
<div>
<span style="color: #f6b26b;">polyTexturePlacementPanel1Window|TearOffPane|polyTexturePlacementPanel1|formLayout109</span></div>
<div>
<b><span style="color: #e06666;">※1</span></b></div>
<div>
<br /></div>
<div>
なるほどー。</div>
<div>
TextureWindowはformLayoutに入っているのですな。</div>
<div>
前任の方は、ここにformLayoutを横付けして、レイアウトにカスタマイズ領域を確保してました。</div>
<div>
今回の要望は、Maya2011以降のバージョンだと、レイアウトの幅が太くなってしまって、使いにくい、細くしてほしいということだったので、ここのところを改造します。</div>
<div>
<br /></div>
<div>
細くしてほしい…とは言っても、人によって好みもありますから(笑)、paneLayoutで、幅を可変にします。</div>
<div>
<br /></div>
<div>
<b><span style="color: #e06666;">※1</span></b>で求めた、</div>
<div>
<span style="color: #e69138;">polyTexturePlacementPanel1Window|TearOffPane|polyTexturePlacementPanel1|formLayout109</span></div>
<div>
から、</div>
<div>
<span style="color: #e69138;">polyTexturePlacementPanel1Window|TearOffPane|polyTexturePlacementPanel1</span></div>
<div>
…の部分に、paneLayoutをねじ込みます。</div>
<div>
<br /></div>
<div>
<span style="color: #6fa8dc;">string $texPanel = `formLayout -q -p $texWinParent`;</span><br />
<span style="color: #6fa8dc;"> string $HOS_paneLayout = `paneLayout -p $texPanel -configuration "vertical2" -ps 1 20 100`;</span><br />
<span style="color: #6fa8dc;"> columnLayout -p $HOS_paneLayout -adj 1;</span><br />
<span style="color: #6fa8dc;"> button -w 80;</span><br />
<span style="color: #6fa8dc;"> intSliderGrp -w 80;</span><br />
<span style="color: #6fa8dc;"> button -w 80;</span><br />
<span style="color: #6fa8dc;"> button -w 80;</span><br />
<br />
<span style="color: #6fa8dc;"> setParent..;</span><br />
<b><span style="color: #e06666;">※2</span></b><br />
<br />
で、<b><span style="color: #e06666;">※1</span></b>で求めたtextureWindowの親を、<b><span style="color: #e06666;">※2</span></b>のpaneLayoutに入れてあげればできるはず。。<br />
<br />
<span style="color: #6fa8dc;">formLayout -e -p $HOS_paneLayout $texWinParent;</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB56m4Umgl0Ece45yyonOq_LmlbeQIXRaJa64vTzzMEcWCGMd3HDBcOkYjma0JEa3TVpvf0KH5ZU9aoyGuObEUf7PJKz2a8w_P59EK0CoEUyOTOT7P_8Fk9iS4agcb4uv3exVxyFCDIN8m/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB56m4Umgl0Ece45yyonOq_LmlbeQIXRaJa64vTzzMEcWCGMd3HDBcOkYjma0JEa3TVpvf0KH5ZU9aoyGuObEUf7PJKz2a8w_P59EK0CoEUyOTOT7P_8Fk9iS4agcb4uv3exVxyFCDIN8m/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A+1.jpg" width="320" /></a></div>
<br />
できた!<br />
あとは、<b><span style="color: #e06666;">※2</span></b>でとりあえず入れ込んだcolumnLayout部分を必要に応じてカスタマイズしてあげればOKですね!<br />
<br />
<br />
ソース全容です。<br />
<span style="color: lime;">----------------------</span><br />
<span style="color: lime;">proc test(){</span><br />
<span style="color: lime;"> string $texWinName[] = `getPanel -sty polyTexturePlacementPanel`;</span><br />
<span style="color: lime;"> if(size($texWinName)>0){</span><br />
<span style="color: lime;"> for ($panel in $texWinName){</span><br />
<span style="color: lime;"> string $parentList = `textureWindow -q -p $panel`;</span><br />
<span style="color: lime;"> string $win[] = stringToStringArray($parentList,"|");</span><br />
<span style="color: lime;"> if(`window -q -ex $win[0]`)deleteUI $win[0];</span><br />
<span style="color: lime;"> }</span><br />
<span style="color: lime;"> } </span><br />
<span style="color: lime;"> TextureViewWindow;</span><br />
<span style="color: lime;"> clear $texWinName;</span><br />
<span style="color: lime;"> $texWinName = `getPanel -sty polyTexturePlacementPanel`;</span><br />
<span style="color: lime;"> string $texWinParent = `textureWindow -q -p $texWinName[0]`;</span><br />
<span style="color: lime;"> string $texPanel = `formLayout -q -p $texWinParent`;</span><br />
<span style="color: lime;"> string $HOS_paneLayout = `paneLayout -p $texPanel -configuration "vertical2" -ps 1 20 100`;</span><br />
<span style="color: lime;"> columnLayout -p $HOS_paneLayout -adj 1;</span><br />
<span style="color: lime;"> button -w 80;</span><br />
<span style="color: lime;"> intSliderGrp -w 80;</span><br />
<span style="color: lime;"> button -w 80;</span><br />
<span style="color: lime;"> button -w 80;</span><br />
<span style="color: lime;"> setParent..;</span><br />
<span style="color: lime;"> formLayout -e -p $HOS_paneLayout $texWinParent;</span><br />
<span style="color: lime;">}</span><br />
<br />
<span style="color: lime;">test;</span><br />
<span style="color: lime;">----------------------</span><br />
<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-10765824793851316522015-05-03T02:10:00.000+09:002015-09-05T13:40:47.320+09:00スキンウエイト値を切り捨て・切り上げ・四捨五入するプロシージャ引き続き、モデラーさん用Toolを作成してます。<br />
表題のような機能を持ったToolの作成依頼があったので、対応してました。<br />
<br />
最初melで処理を作ったのですが、頂点数が多いと途端に重たくなり、<br />
えっなに、フリーズ!?...みたいな状態。。。せいぜい2000頂点とかその程度で<br />
重たくなりました。<br />
<br />
<span style="color: orange;"><b>パイソン…やるか。。</b></span><br />
<br />
というわけで、今回はpythonのお話です。<br />
どっちにせよ、ゆくゆく.pyは習得するつもりで、チマチマ勉強はしていたので、<br />
ついに日の目を見る時が来たか。。。という感じで、練習&実習がてら.pyでプロシージャを<br />
組んでみました。<br />
<br />
以下ソースです。<br />
<br />
<span style="color: #3d85c6;">mode=1で切り捨て・mode=2で切り上げ・mode=3で四捨五入。</span><br />
<span style="color: #3d85c6;">CUL_floatは、切り上げ・切り下げの目安の数値 ※四捨五入モードでは無視されます。</span><br />
<span style="color: #3d85c6;">CUL_ROUNDは、小数点第何位かの指定、です。</span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">例)</span><br />
<span style="color: #3d85c6;">mode=1,CUL_float=2.0,CUL_ROUND=2.0で、0.02で切り上げ</span><br />
<span style="color: #3d85c6;">mode=2,CUL_float=2.0,CUL_ROUND=1.0で、0.2で切り上げ</span><br />
<span style="color: #3d85c6;">mode=3,CUL_float=5.0,CUL_ROUND=2.0で、0.05で切り上げ</span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #e06666;"><br /></span>
<span style="color: #e06666;">import maya.cmds as mc</span><br />
<span style="color: #e06666;">import maya.mel as mel</span><br />
<span style="color: #e06666;">import math as math</span><br />
<span style="color: #e06666;">def ARKW_skinWeightAdjustProc(mode=0,CUL_float=2.0,CUL_ROUND=2.0):</span><br />
<span style="color: #e06666;"> skincluster=[]</span><br />
<span style="color: #e06666;"> vtx_list=mc.ls(sl=True,fl=True)</span><br />
<span style="color: #e06666;"> #頂点ごとの処理</span><br />
<span style="color: #e06666;"> for vtx in vtx_list:</span><br />
<span style="color: #e06666;"> inflnode_list=[]</span><br />
<span style="color: #e06666;"> inflpct_list=[]</span><br />
<span style="color: #e06666;"> new_inflpct_list=[]</span><br />
<span style="color: #e06666;"> node_name=vtx.split('.')[0]</span><br />
<span style="color: #e06666;"> #スキンクラスタを探す</span><br />
<span style="color: #e06666;"> skincluster=mel.eval('findRelatedSkinCluster %s'%node_name)</span><br />
<span style="color: #e06666;"> #スキンクラスタがなければスキップ</span><br />
<span style="color: #e06666;"> if skincluster is None:</span><br />
<span style="color: #e06666;"> mc.error('スキンクラスタが見当たりません。\n',sl=False)</span><br />
<span style="color: #e06666;"> else:</span><br />
<span style="color: #e06666;"> #インフルエンスオブジェクトのリストを取得する</span><br />
<span style="color: #e06666;"> inflnode_list=mc.skinPercent(skincluster,vtx,q=True,t=None)</span><br />
<span style="color: #e06666;"> #インフルエンスオブジェクトごとにスキン数値の取得</span><br />
<span style="color: #e06666;"> for inflnode in inflnode_list:</span><br />
<span style="color: #e06666;"> inflpct_list.append(mc.skinPercent(skincluster,vtx,t=inflnode,q=True))</span><br />
<span style="color: #e06666;"> i=0</span><br />
<span style="color: #e06666;"> while(i<len(inflpct_list)):</span><br />
<span style="color: #e06666;"> #切り捨て</span><br />
<span style="color: #e06666;"> if mode==0:</span><br />
<span style="color: #e06666;"> inflpct_list[i] = math.floor(inflpct_list[i]*10.0**CUL_ROUND)</span><br />
<span style="color: #e06666;"> REM = inflpct_list[i]%CUL_float</span><br />
<span style="color: #e06666;"> QUO = math.floor(inflpct_list[i]/CUL_float)</span><br />
<span style="color: #e06666;"> if REM>0:</span><br />
<span style="color: #e06666;"> inflpct_list[i] = CUL_float*QUO</span><br />
<span style="color: #e06666;"> inflpct_list[i] *= 1/10.0**CUL_ROUND</span><br />
<span style="color: #e06666;"> #切り上げ</span><br />
<span style="color: #e06666;"> elif mode==1:</span><br />
<span style="color: #e06666;"> inflpct_list[i] = math.ceil(inflpct_list[i]*10.0**CUL_ROUND)</span><br />
<span style="color: #e06666;"> REM = inflpct_list[i]%CUL_float</span><br />
<span style="color: #e06666;"> QUO = math.floor(inflpct_list[i]/CUL_float)</span><br />
<span style="color: #e06666;"> if REM>0:</span><br />
<span style="color: #e06666;"> inflpct_list[i] = CUL_float*QUO+CUL_float</span><br />
<span style="color: #e06666;"> inflpct_list[i] *= 1/10.0**CUL_ROUND</span><br />
<span style="color: #e06666;"> #四捨五入 </span><br />
<span style="color: #e06666;"> else:</span><br />
<span style="color: #e06666;"> inflpct_list[i] = round(inflpct_list[i],int(CUL_ROUND))</span><br />
<span style="color: #e06666;"> i+=1</span><br />
<span style="color: #e06666;"> #値の正規化</span><br />
<span style="color: #e06666;"> i=0</span><br />
<span style="color: #e06666;"> j=0</span><br />
<span style="color: #e06666;"> while(i<len(inflpct_list)-1):</span><br />
<span style="color: #e06666;"> if inflpct_list[i]<inflpct_list[i+1]:</span><br />
<span style="color: #e06666;"> j=i</span><br />
<span style="color: #e06666;"> elif inflpct_list[i]>inflpct_list[i+1]:</span><br />
<span style="color: #e06666;"> j=i+1</span><br />
<span style="color: #e06666;"> i+=1</span><br />
<span style="color: #e06666;"> total_skinpct=0.0</span><br />
<span style="color: #e06666;"> i=0</span><br />
<span style="color: #e06666;"> while(i<len(inflpct_list)):</span><br />
<span style="color: #e06666;"> total_skinpct=total_skinpct+inflpct_list[i]</span><br />
<span style="color: #e06666;"> i+=1</span><br />
<span style="color: #e06666;"> if total_skinpct!=1:</span><br />
<span style="color: #e06666;"> inflpct_list[j] += 1-total_skinpct</span><br />
<span style="color: #e06666;"> #スキンウエイトの適応</span><br />
<span style="color: #e06666;"> mc.setAttr((skincluster + '.normalizeWeights'),0)</span><br />
<span style="color: #e06666;"> i=0</span><br />
<span style="color: #e06666;"> while (i<len(inflnode_list)):</span><br />
<span style="color: #e06666;"> mc.skinPercent(skincluster,vtx,nrm=False,tv=(inflnode_list[i],inflpct_list[i]))</span><br />
<span style="color: #e06666;"> i+=1</span><br />
<span style="color: #e06666;"> mc.setAttr((skincluster + '.normalizeWeights'),1)</span><br />
<span style="color: #e06666;"> #print (inflpct_list)</span><br />
<span style="color: #e06666;"> del inflnode_list</span><br />
<span style="color: #e06666;"> del inflpct_list</span><br />
<br />
<br />
---------------<br />
今回、慣れない.pyだったので、いろいろ苦労しましたが、<br />
ポイントは3点ほどありました。<br />
<br />
<span style="color: #3d85c6;">①melにしかないコマンドは、pythonからmelを呼ぶ</span><br />
#スキンクラスタを探す<br />
skincluster=mel.eval('findRelatedSkinCluster %s'%node_name)<br />
↑ここですね。<br />
<br />
<span style="color: #3d85c6;">②skinPercentコマンドで、transformをqモードで呼び出したいときはNoneで指定する</span><br />
#インフルエンスオブジェクトのリストを取得する<br />
inflnode_list=mc.skinPercent(skincluster,vtx,q=True,t=None)<br />
↑これですね。。。<br />
ここは結構詰まりました。<br />
melでの書き方では…<br />
string $inflnode_list[]=`skincluster -q -t skincluster vtx`;<br />
…ですので、最初は、<br />
inflnode_list=mc.skinPercent(skincluster,vtx,q=True,t=True)<br />
とか<br />
inflnode_list=mc.skinPercent(skincluster,vtx,q=True,t='')<br />
とか<br />
inflnode_list=mc.skinPercent(skincluster,vtx,q=True,t=)<br />
とか、試しましたが、すべて怒られましたw<br />
t=None と指定しないといけなかったのですね!<br />
参考:<a href="http://forums.cgsociety.org/archive/index.php/t-928526.html">http://forums.cgsociety.org/archive/index.php/t-928526.html</a><br />
調べたら、割と結構同じ個所で悩まれた方がいるみたいで。。<br />
てっとり早くmelから呼び出して解決された方なんかもいらっしゃるみたいですね。。。<br />
<br />
<span style="color: #3d85c6;">③ceil/floorしたfloat数値をリストに入れ、そのまま照会すると、ceil/floorされてない!</span><br />
これも。。。悩みました。<br />
たとえば、<br />
<br />
d_list=[]<br />
<br />
a=0.4966666<br />
b=100.0<br />
c=math.floor(a*b)<br />
d_list.append(c/b)<br />
<br />
print (d_list)<br />
<br />
print (d_list[0])<br />
<br />
・・・を実行すると、<br />
<br />
[0.48999999999999999]<br />
0.49<br />
<br />
・・・という結果が返ってきます。<br />
リストに入れたままprintすると、近似値が返ってくるんですね。。。<br />
ちゃんと数値を扱いたい場合は、取り出してあげないといけないのかな??<br />
<br />
pythonのドキュメントを呼んでいたところ、<br />
<span style="background-color: black;"><span style="color: #6aa84f;">「<span style="font-family: 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">Python は格納されている値の10進小数での近似値を表示するので、格納されている値が元の10進小数の近似値でしか無いことを忘れがちです。」</span></span></span><span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;"><a href="http://docs.python.jp/2/tutorial/floatingpoint.html">http://docs.python.jp/2/tutorial/floatingpoint.html</a></span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">・・・との表記が。</span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">これは仕様なのかな。。</span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;"><br /></span></span>
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;"><br /></span></span>
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">ともあれ、なんとか形にできそう。</span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">Pythonは、文法自体はすごくわかりやすいし、いろいろてっとり早かったりするので、</span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">慣れると作業が速くなるかもしれません。処理も早くなるし、APIにもアクセスできるし、</span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">他にもいろいろなモジュールがあるから、便利だし。。。</span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">pythonはいいことづくしという感じでしょうか。</span></span><br />
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;"><br /></span></span>
<span style="font-family: Lucida Grande, Lucida Sans Unicode, Geneva, Verdana, sans-serif;"><span style="font-size: 14px; letter-spacing: -0.140000000596046px; line-height: 21px;">python開発の、よい一歩になりました。</span></span>Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0tag:blogger.com,1999:blog-8790904580609637375.post-65166511053153077572015-04-21T16:38:00.000+09:002015-09-05T13:41:17.883+09:00ポリゴン境界を選択するプロシージャモデラーさん向けmelToolの開発中、ポリゴンの境界を検出するmelを探していたところ、<br />
Mayaにあらかじめ実装されているプロシージャーで、以下のようなものを見つけました。<br />
<br />
<span style="color: lime;">polySelectBorderShell(int $borderOnly)</span><br />
<br />
さっと中身を呼んだところ、<br />
<span style="color: cyan;">これは、すでに選択されているエッジのうち、境界であるものを残して選択する...</span><br />
というようなプロシージャーのようです。<br />
<br />
ポリゴンの境界を検出する際、<br />
あらかじめすべてのエッジを選択しておいて、上記のプロシージャーを走らせれば、<br />
簡単にポリゴン境界を検出できそうです。<br />
<br />
<br />
<span style="color: #e06666;">これはモデリング作業のとき、ポリゴンマージの漏れなどチェックするときに便利かも??</span><br />
<br />
以下、サンプルソースでありんす。<br />
<br />
<span style="color: #ea9999;">proc SELECT_BORDER_EDGE(){</span><br />
<span style="color: #ea9999;"> string $NODE_NAME;</span><br />
<span style="color: #ea9999;"> string $NODE_LIST[] = `ls -sl`;</span><br />
<span style="color: #ea9999;"> if(size($NODE_LIST)<1){</span><br />
<span style="color: #ea9999;"> error "ポリゴンノードを二つ以上選んでね。";</span><br />
<span style="color: #ea9999;"> }</span><br />
<span style="color: #ea9999;"> else{</span><br />
<span style="color: #ea9999;"> select -cl;</span><br />
<span style="color: #ea9999;"> for($NODE_NAME in $NODE_LIST){</span><br />
<span style="color: #ea9999;"> //ポリゴンの末端のエッジを選択</span><br />
<span style="color: #ea9999;"> select -add ($NODE_NAME + ".e[*:*]") ; </span><br />
<span style="color: #ea9999;"> }</span><br />
<span style="color: #ea9999;"> polySelectBorderShell(1); </span><br />
<span style="color: #ea9999;"> }</span><br />
<span style="color: #ea9999;">}</span><br />
<span style="color: #ea9999;">SELECT_BORDER_EDGE;</span>Anonymoushttp://www.blogger.com/profile/12744199096830393307noreply@blogger.com0