MAXSCRIPT_Vol1
MAXSCRIPTに関するQ&Aのためのスレッドです。 あらかじめ用意された複数のテクスチャ(解像度違い)があり、 選択しているオブジェクトのテクスチャをボタン一発(インターフェース上は、解像度の種類分)で 切り替えていくというスクリプトを作りたいと思っています。 またできれば、ディフューズレベル、スペキュラレベル...などで、選択できる分岐処理を実装できればと思っています。 既存のものであれば、ご紹介ください。また、参考になるテンプレートスクリプトがあれば、お願いします。 複数の子を選択なんてあったのか…今回はそれで十分でした。ありがとう。 レコーダーの件はわからないけど… maxのマクロレコーダーは使い物にならないことがまれによくある for i in objects do みたいな書き方だと、メッシュ化してないプリミティブオブジェクト(普通のSphereとかBoxとか)が拾えないみたいです。 objects の代わりに $* だと拾えるのは分かったんだけど、 昔に別な書き方でもできた気が。 $* 以外の書き方って無かったでしたっけ? >みたいな書き方だと、メッシュ化してないプリミティブオブジェクト(普通のSphereとかBoxとか)が拾えないみたいです。 あれ、拾える? 勘違いしたかも。ごめん。 >>251 一度くらいはリファレンスに目を通しましょう objectsはObjectSet値 $*はPathName値 条件次第で同じ動作をするけど明確に異なる値です 異なる値かどうかとか、全く質問と関係ないですよね。 複数のスクリプトのバージョンまとめて更新したいんだけど、なんかいい方法ある? 今のとこ一つずつビューポートに投げるしか方法思い浮かばなくて。 事故解決しますた。 AppDataのほうにスクリプトあるとmacroscriptsに入れても更新されないのね。 基本設定の自動バックアップのチェックのオンオフをスクリプトで制御したいのですが、 どこにアクセスしたら良いでしょうか? ( ( if (autosave.Enable = true) then autosave.Enable = false else autosave.Enable = true ) ) のようにして、有効の時に押せば無効になるようにしたのですが、 無効の時に押しても有効になりません… 書き方がおかしいのでしょうか? ×if (autosave.Enable = true) ○if (autosave.Enable == true) Boolのトグルにif文はいらんよ autosave.Enable = not autosave.Enable レイヤーマネージャーのボタンのように、一回押すとオレンジになり もう一回押すと戻るようなマクロスクリプトはどのように書いたらよいでしょうか? オブジェクトプロパティの「フリーズをグレーで表示」をボタンにしたいのですが、 マクロレコーダーに出た$.showFrozenInGray = onだけでは反映されません。 何か足りないのがあるのでしょうか? いけるはずだけど。 $は選択オブジェクトを表してるから、オブジェクトが選択されてないか、 もしくは複数選択されてるとか。 >>267 単体で試したら確かにいけました。 複数選択時はまた違うのでしょうか? これなら選択なし/単体/複数でも対応可能 selection.showFrozenInGray = true $は現在の選択を表す「PathName値」 selectionは現在の選択を表す「ObjectSet値」 どちらも配列の一種で似てるけど微妙に違う 試しに何も選択せずにリスナーに $ と selection を打って戻り値を確認するといいよ どういう違いなのかなんとなく分かるはず へ〜、selectionってプロパティの代入はループさせなくても複数一気にいけるんだ。 一個賢くなった。>>268 じゃないけどdクス >>269 ありがとうございます! いろいろ応用したいと思います 何度もすいません…。 下記のようにしてif文にしたところ、2010では動作しましたが2012では動作しないようです。 仕様が若干変わっていたりするのでしょうか? ( for i in selection do ( if (i.showFrozenInGray == on) then (i.showFrozenInGray = off) else (i.showFrozenInGray = on) ) ) スクリプトを勉強し始めた初心者です。 ヘルプにあるビューポートの再描画コールバックについて2012と2014で 結果が異なる為、ご存知の方がいましたらご教授願います。 fn redrawviews_p = print "Viewports Redrawn" registerRedrawViewsCallback redrawviews_p 上記を評価してコールバックを停止するため unregisterRedrawViewsCallback redrawviews_p と入力しました。 2012は正常にコールバックが停止するのですが、2014は「OK」と返しては来るのですが "Viewports Redrawn"がリスナーに表示され続けます(停止できない) モヤモヤしてます・・・ 今試してみたけど、うちは2014でも止まるよ。SP5。 >>275 なんだかよくわかりませんでしたが、max再起動したら正常に動作しました。 ありがとうございました。 >>276 登録したスクリプトがエラーを吐くと正常に登録解除できない その状況を作らないために登録する関数は 実処理を行う関数を呼び出すだけの内容にしておくといいってリファレンスにも載ってるよ さらにtry文で囲んでおくと安全 --登録 fn redrawviews_p = print "Viewports Redrawn" fn redrawviews_handler = try( redrawviews_p() )catch() registerRedrawViewsCallback redrawviews_handler --解除 unregisterRedrawViewsCallback redrawviews_handler バージョン毎の動作の違いはよく分からん >>277 教えて頂きありがとうございます。 仕事の暇を見つけてスクリプトの学習を行っているので進みがとても遅く try文が何なのか未だ理解してません。 もっと勉強します。 プログラミングの予備知識ゼロの人がmaxscriptを一人前に出来るようになるまで どれくらい時間が必要なんでしょうかね。本人次第の所はありますが。。。 Introduction to MaxScript - Creating a Voxel Tree - Part 1 https://www.youtube.com/watch?v=ZoIY5lT6IV4 Introduction to MaxScript - Creating a Voxel Tree - Part 2 https://www.youtube.com/watch?v=NxI-ru5yAa0 >>279 ただのBoxで構成された木を作る動画 ボクセルツリーという言葉に期待した人は残念でした また活発になってほしい... それかpython版作ろうよ いい加減Qtに移行したいけどpythonで完結できないことが多くて 結局maxscriptが必要になるならmaxscript一本でいいやとなって移行できない BonesProをmaxscriptから操作したいと思って試したのですが、上手くいかず困ってます。 http://doc.bonespro.com/MAXScript.html 【概要】 ボーン選択をmaxscriptで選択したい <void> BonesPro.bone_select_name <name> <select> <void>と <name> <select>のところが同様になっていると良いのかが良くわかっていません。 クラスとかパラメータとか調べてみたのですが、上記のメソッド関係が動いてくれません。 どうしたらいいのかアドバイス頂ける幸いです。 よろしくお願いいたします。 テストで探ってた際のログ 【実行】 showproperties $.modifiers[BonesProDemo] 【結果】 .use_inertia : boolean .use_oscillation : boolean .use_stack : boolean .use_parabones : boolean .use_dual_quaternion : boolean .use_linked : boolean on off .bone_sync : boolean .mirror_plane : integer .mirror_flip : boolean .mirror_offset : float .mirror_threshold : float .soft_selection : boolean .soft_radius : float .use_edge_distance : boolean .edge_distance : integer false 【それを元にパラメータは操作できました】 $.modifiers[#BonesProDemo].use_stack = off 【実行】 $.modifiers[#BonesProDemo].category $.modifiers[#BonesProDemo].classID 【結果】 #3d_io_Plugins #(1623534534, 1946828630) >>286 この手のドキュメントは <戻り値>関数名 <引数名または型> みたいに書かれてることが多い 型は説明文に書かれてる場合がある 戻り値のvoidってのは意味のある値は返さないって意味 ちょっと不親切なドキュメントだけど読めなくもない >>288 解説ありがとうございます。何となくな理解だったので助かりました。 あれから色々試していくつか分かってきたのですが、根本的に合っているのか謎で手探り状態なのですが、ご報告します。 ・Nameはstringにしろとエラー文で言われました。maxscriptのヘルプ通り、文字列 string値でした。 ・Bone選択は描画を更新しないと反映されないようで、以下のような処理が必ず実行されます。http://doc.bonespro.com/MAXScript.html の関数説明文にそのようなことが書いてありました。 【必ずBone選択時に実行される処理】 $.modifiers[#BonesPro].use_oscillation = on max views redraw ・また、Boneの操作のためにはLayerにアクセスする必要がありそうでした。実行:$.modifiers[#BonesPro].BonesPro.num_bones()結果:場所は <MixinInterface:BonesPro>と表示されます。 http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_78B79975_7BA5_4A03_8FEF_27E78D14B575_htm $.modifiers[#BonesPro].BonesPro.num_bones()のように単純にやるだけではダメで、Layerの方も考慮しないといけないぽく、立ち止まってます。 >>288 以下はテスト時のログ [実行] $.modifiers[#BonesPro].BonesPro.num_bones() ---------------------------------------------------------- $.modifiers[#BonesPro].BonesPro.bone_select_all() ---------------------------------------------------------- BonesPro.bone_select_all() ---------------------------------------------------------- BonesPro.bone_select_all(1) [結果] -- 未知のプロパティ : "num_bones()" 場所は <MixinInterface:BonesPro> ---------------------------------------------------------- OK ---------------------------------------------------------- -- 引数のカウント エラー : bone_select_all には 1 が必要です、0 を受け取りました ---------------------------------------------------------- -- ランタイム エラー: オブジェクトにこのインタフェースが実装されていません : BonesPro >>289 MixinInterfaceってのは簡単に言えばA(BonesProインタフェース)に実装された関数num_bonesを別のB(モディファイア)でも共有して利用するための仕組みのこと A └num_bones B(Aを継承) プラグイン内部をこんな感じで実装すると B.num_bones こんな感じでmaxscriptではAとBの違いを意識せずに使える 手元にプラグインがないから推測になるけど $.modifiers[#BonesPro].bone_select_all() みたいに書けばいいはず $.modifiers[#BonesPro].bone_select_all()でBone全選択行けました。 http://www.bonespro.com/download-order/ からデモ版でやっていたので、それで出来なかったっぽいです。ライセンス版の方で動きました。ありがとうございます。 名前選択の方も、-- 変換できません : "Bone001" 入力: Boolean といったエラーメッセージをもとにtrue or false を入れてみたら動きました。 名前の指定で選択 $.modifiers[#BonesPro].BonesPro.bone_select_name "Bone001" true 名前の指定で選択解除 $.modifiers[#BonesPro].BonesPro.bone_select_name "Bone001" false ありがとうございます。 この"Bone001"を配列に置き換えてfor文でループ処理して複数でも行けるようにしてみました。 A = #("Bone001","Bone002") print A[1] for i = 1 to 2 do ( $.modifiers[#BonesPro].BonesPro.bone_select_name A[i] true ) ありがとうございます。大変勉強になりました。 >>291 MixinInterfaceの解説はヘルプ見てもチンプンカンプンだったので、ありがとうございます。 まだ何となくですが、分かった気がしますw 色々ありがとうございました。 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 T7Y1UVEC4V read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる