| 古いものから 投稿するには登録が必要です | 前のスレッド | 次のスレッド | 下へ |
投稿者 | スレッド |
---|---|
投稿数: 422
|
投稿日時: 2006-09-20 18:16 Re: Appleスクリプト・・・ |
ShadeからAppleScriptへ渡すデータを最適化することができるのなら・・・。
| |
投稿数: 189
|
投稿日時: 2006-09-20 17:38 Re: Appleスクリプト・・・ |
どうもスクリプトエディターがらみで、あながち Shade 側だけの問題ではないみたいですね。
色も少し変わってしまいますか、って、なんともコメントのしようが‥‥ | |
投稿数: 422
|
投稿日時: 2006-09-20 17:15 Re: Appleスクリプト・・・ |
最近のAppleScriptはを実行はできるがコンパイルはできないようです
以前のAppleScriptでコンパイルしてShade8.5のその他から実行はできるが IntelMacに付属のAppleScriptエディターはコンパイルができない それとレインンボウスクリブトで指定した色は再度レインンボウスクリブトが動作したときには指定した色よりも少し色指定のポイントが中に移動しているようです 3行を省いた方でも同じように安全色に調節されているようです。 | |
投稿数: 422
|
投稿日時: 2006-09-20 16:28 Re: Appleスクリプト・・・ |
数回色を変えて試しましたがどちらででも作動しました。
これも保存版に・・・。 | |
投稿数: 189
|
投稿日時: 2006-09-20 16:11 Re: Appleスクリプト・・・ |
修正版です
引用:
Apple Script で使われる一文字で表される >= が送信すると文字化けしちゃってました。 ということで、一文字で表される >= を使わない書き方で書き改めました。 --- ここからチョッキン --- tell application "Shade 8 professional" -- 入力ダイアログ activate begin dialog 200 -- dialog ID には適当な数字を入れてください set n_color to 4 -- 色を指定するダイアログの数を与えます。(2以上の数であれば自由に指定できます) repeat n_color times -- RGB ダイアログを n_color 個作成 append RGB dialog item "色" end repeat set colorL to {} -- 入力ダイアログで指定される色を格納するリストを空リストとして作成 if ask dialog then repeat with i from 1 to n_color set colorL to colorL & {(get RGB property value (i - 1))} -- colorL にユーザーが指定する色を順次格納 end repeat end dialog else return end if -- 処理 inhibit update if object type = part object then -- 選択オブジェクトがパート(自由曲面やジョイント類を含む)なら set n_Child to (number of sons of shape 1 of active objects of scene 1) -- 選択されているオブジェクトの子の数を調べる if n_Child > 1 then -- 子オブジェクトが2個以上存在する (n_child = 1 だと SetColor() の中でエラーとなってしまう) select child set counter to 1 -- 何番目の子であるかを示すカウンター set base color to my SetColor(n_color, colorL, n_Child, counter) -- SetColor() で決定される拡散反射色をセットする repeat (n_Child - 1) times select brother set counter to (counter + 1) -- カウンターを一つ進ませる set base color to my SetColor(n_color, colorL, n_Child, counter) end repeat select parent end if end if allow update end tell on SetColor(n_color, colorL, n_Child, counter) -- 色を設定する sub-routine -- n_color : 指定された色の数 -- colorL : 指定された色を格納したリスト -- n_child : 子オブジェクトの総数 -- counter : 現在の子の番号(1から始まる) set d to (n_color - 1) / (n_Child - 1) set pos to d * (counter - 1) -- 4つの色が指定された場合、子オブジェクトの番号に応じて 0〜3( = 4 - 1) の数字を pos として割り当てる set item_1 to (pos div 1) + 1 -- (pos div 1) で切り捨てとなる、例えば、pos = 0.5 ならば切り捨てられて 0、それに1を加えて結果 item_1 = 1 となる if item_1 ≠ n_color then -- 選択されている子オブジェクトへの色を指定された色の間で定義するが、その際に使用される左側の色番号 set item_2 to (item_1 + 1) -- 選択されている子オブジェクトへの色を指定された色の間で定義するが、その際に使用される右側の色番号 else set item_2 to item_1 end if set pos to (pos - (pos div 1)) -- pos から自身を切り捨てた数値を引く、すなわち pos の小数点以下をあらためて pos として再定義 set color_1 to (item item_1 of colorL) -- 左側の色番号に従って colorL の中から左側の色を取り出す set color_2 to (item item_2 of colorL) -- 右側の色番号に従って colorL の中から右側の色を取り出す set red to ((item 1 of color_1) + pos * ((item 1 of color_2) - (item 1 of color_1))) -- color_1, color_2 の間で pos を使って中間の色の赤成分を決定 set green to ((item 2 of color_1) + pos * ((item 2 of color_2) - (item 2 of color_1))) -- 同上の緑成分 set blue to ((item 3 of color_1) + pos * ((item 3 of color_2) - (item 3 of color_1))) -- 同乗の青成分 set red to (red * 1000000 div 1) / 1000000 -- 本来は不必要だが試しに入れてみた set green to (green * 1000000 div 1) / 1000000 -- 本来は不必要だが試しに入れてみた set blue to (blue * 1000000 div 1) / 1000000 -- 本来は不必要だが試しに入れてみた return {red, green, blue} -- RGB color としてリスト形式で返す end SetColor | |
投稿数: 189
|
投稿日時: 2006-09-20 15:58 Re: Appleスクリプト・・・ |
引用:
むむむ、送信した段階で何かおかしくなってますね。 しばし、お待ちを | |
投稿数: 422
|
投稿日時: 2006-09-20 15:53 Re: Appleスクリプト・・・ |
移動スクリプトを等比にすると途中からオブジェクトが消えてしましました
これはやっぱり有効桁数の問題かもしれませんね。 | |
投稿数: 422
|
投稿日時: 2006-09-20 15:51 Re: Appleスクリプト・・・ |
加藤さんありがとうございます。
以前に使っていたレインボウスクリプトが動作しなくなってましたのでこれが動けばスクリプトの環境が改善されます。 が コンパイルエラーになってしまいました "then"などがあるべきところですがunknown tokenが見つかりました。 というアラートが出ました。 set base color to my SetColor(n_color, colorL, n_Child, counter) -- SetColor() で決定される拡散反射色をセットする の行の Child, の部分に選択の印がついていました。 | |
投稿数: 189
|
投稿日時: 2006-09-20 15:27 Re: Appleスクリプト・・・ |
おまけ( 後編 )
一つ前の script の続きです。 指定するカラーの数は 4 にしていますが、6行目の n_color の数を変更すれば、いくつでも増やせます。 set n_color to 4 ← この 4 を好きな数に変更する RGB カラー情報の有効桁数をわざと制限してあります。 IntelMac で動けばめっけものですが、この処理を加えていてもダメなら原因は有効桁数以外にある可能性が強くなります。 もし IntelMac で動いたなら、試しに RGB の有効桁数を制限した部分を取り除いて動かしてみてください。 その状態でエラーとなれば、IntelMac での不具合の原因は有効桁数にある可能性が強くなります。 on SetColor(n_color, colorL, n_Child, counter) ‥‥ ‥‥ set red to (red * 1000000 div 1) / 1000000 ← この行を取り除く set green to (green * 1000000 div 1) / 1000000 ← この行を取り除く set blue to (blue * 1000000 div 1) / 1000000 ← この行を取り除く return {red, green, blue} end SetColor | |
投稿数: 189
|
投稿日時: 2006-09-20 15:25 Re: Appleスクリプト・・・ |
おまけ(前編)
引用:
warp さんのやってみたいことを想像して作ってみました。 選択したパートの中のオブジェクト(2個以上必要)の拡散反射色にレインボーカラーを割り当てます。 ---- ここから下をはさみでチョッキン ---- tell application "Shade 8 professional" -- 入力ダイアログ activate begin dialog 200 -- dialog ID には適当な数字を入れてください set n_color to 4 -- 色を指定するダイアログの数を n_color で与えます( 2以上の数であれば自由に指定できます。) repeat n_color times -- RGB ダイアログを n_color 個作成 append RGB dialog item "色" end repeat set colorL to {} -- 入力ダイアログで指定される色を格納するリストを空リストとして作成 if ask dialog then repeat with i from 1 to n_color set colorL to colorL & {(get RGB property value (i - 1))} -- colorL にユーザーが指定する色を順次格納 end repeat end dialog else return end if -- 処理 inhibit update if object type = part object then -- 選択オブジェクトがパート(自由曲面やジョイント類を含む)なら set n_Child to (number of sons of shape 1 of active objects of scene 1) -- 選択されているオブジェクトの子の数を調べる if n_Child ? 2 then -- 子オブジェクトが2個以上存在する (n_child = 1 だと SetColor() の中でエラーとなってしまう) select child set counter to 1 -- 何番目の子であるかを示すカウンター set base color to my SetColor(n_color, colorL, n_Child, counter) -- SetColor() で決定される拡散反射色をセットする repeat (n_Child - 1) times select brother set counter to (counter + 1) -- カウンターを一つ進ませる set base color to my SetColor(n_color, colorL, n_Child, counter) end repeat select parent end if end if allow update end tell on SetColor(n_color, colorL, n_Child, counter) -- 色を設定する sub-routine -- n_color : 指定された色の数 -- colorL : 指定された色を格納したリスト -- n_child : 子オブジェクトの総数 -- counter : 現在の子の番号(1から始まる) set d to (n_color - 1) / (n_Child - 1) set pos to d * (counter - 1) -- 4つの色が指定された場合、子オブジェクトの番号に応じて 0〜3( = 4 - 1) の数字を pos として割り当てる set item_1 to (pos div 1) + 1 -- (pos div 1) で切り捨てとなる、例えば、pos = 0.5 ならば切り捨てられて 0、それに1を加えて結果 item_1 = 1 となる if item_1 ≠ n_color then -- 選択されている子オブジェクトへの色を指定された色の間で定義するが、その際に使用される左側の色番号 set item_2 to (item_1 + 1) -- 選択されている子オブジェクトへの色を指定された色の間で定義するが、その際に使用される右側の色番号 else set item_2 to item_1 end if set pos to (pos - (pos div 1)) -- pos から自身を切り捨てた数値を引く、すなわち pos の小数点以下をあらためて pos として再定義 set color_1 to (item item_1 of colorL) -- 左側の色番号に従って colorL の中から左側の色を取り出す set color_2 to (item item_2 of colorL) -- 右側の色番号に従って colorL の中から右側の色を取り出す set red to ((item 1 of color_1) + pos * ((item 1 of color_2) - (item 1 of color_1))) -- color_1, color_2 の間で pos を使って中間の色の赤成分を決定 set green to ((item 2 of color_1) + pos * ((item 2 of color_2) - (item 2 of color_1))) -- 同上の緑成分 set blue to ((item 3 of color_1) + pos * ((item 3 of color_2) - (item 3 of color_1))) -- 同乗の青成分 set red to (red * 1000000 div 1) / 1000000 -- 本来は不必要だが試しに入れてみた set green to (green * 1000000 div 1) / 1000000 -- 本来は不必要だが試しに入れてみた set blue to (blue * 1000000 div 1) / 1000000 -- 本来は不必要だが試しに入れてみた return {red, green, blue} -- RGB color としてリスト形式で返す end SetColor | |
投稿数: 422
|
投稿日時: 2006-09-20 15:06 Re: Appleスクリプト・・・ |
最後の部分を
on action(trans, theta, k) -- 移動回転処理 tell application "Shade 8 professional" if k = 0 then -- 移動→回転 move object around center translate trans move object around center rotate theta else -- 回転→移動 move object around center rotate theta move object around center translate trans end if end tell end action にしたら私の考えている通りになりました。 これは保存版にさせていただきます。 | |
投稿数: 189
|
投稿日時: 2006-09-20 14:24 Re: Appleスクリプト・・・ |
引用:
非常に情報不足ですから script を最初から勉強される方は大変だと思います。 今行おうとしていることが Shade 特有の機能が必要なのか、Apple Script に備わっている機能が必要なのか、その区分けが初心者の方にはさっぱりだということも、学習を阻害する大きな要因です。 やはりダイアログを開いて云々というレベルのものまで作ろうと思うと、Apple script に限らずプログラムの書き方に対する馴れのようなものがないと苦しいですね。 私が紹介したサンプルもちょっと長いですが、少しスクリプトをかじった方なら、プログラムの流れは直ぐに理解できると思います。 が、その域に達するまでに時間がかかってしまいます。 こういうのは向き不向きがあり、感覚として受け入れられそうだと思えば、ハチマキ締めてやれば覚えられますから、紹介したサンプル見て、覚悟を決めて取り組むか、やっぱり諦めて recording で満足するか、そのどちらかを決めていただければいいと思います。 script に割かれる時間と作品づくりの生産性と、その天秤具合を判断するのはとても難しいですし、そもそも初心者の方にとってはこの天秤具合を判断することができないというのが苦しいです。 ちなみにかく言う私も tcl は見る気もおきない、python はだいたい読めるけど、書く気までにはとうていなれないという程度です。 | |
投稿数: 189
|
投稿日時: 2006-09-20 13:21 Re: Appleスクリプト・・・ |
引用:
center で選択オブジェクトの中心座標が取得できます。 中心を指定しての拡大縮小と回転は次のようになります。 move object around {10,10,10} scale {2,2,2} -- 座標 {10,10,10} を中心としてX, Y, Z 方向に2倍に拡大 move object around {10,10,10} rotate {0, 20, 0} -- 座標 {10,10,10} を中心として Y 回りに20度回転 ですからオブジェクトの中心回りの拡大縮小と回転は move object around center scale {2,2,2} move object around center rotate {0, 20, 0} | |
投稿数: 422
|
投稿日時: 2006-09-20 12:49 Re: Appleスクリプト・・・ |
年齢 " "視力 " "名前 " "座標 " のスクリプトIntelMacではエラーになってしまいます。
これもやっぱりIntelMacの仕業でしょうか。 帰ってPowerbookでやってみます。 | |
投稿数: 422
|
投稿日時: 2006-09-20 12:43 Re: Appleスクリプト・・・ |
加藤さん微に入り細に入りありがとうございます。
最後のスクリプトまでになったらもうありがたく使わせていただく意外手が見つかりませんが、少しずつ解読-応用ができるようになっていきたいと思います。 ダイアログボックスに入れた数値と予想がちょっと違う感じになってしまいます。 弟位置のオブジェクトそれぞれの中心を順に取得して、そこを起点にそれぞれのオブジェクトひとつひとつに拡大縮小・移動・回転ができたら予想通りになるような感じがしています 昔のスクリプトから (get center)なるコマンドを見つけました どういう形で入れてよいのやら分かりませんがどこかに挟み込んだらその場で回転とかができるようになるかと思いました。 それぞれのオブジェクトのセンターを中心に(から)回転や移動・拡縮ができる感じです。 | |
投稿数: 189
|
投稿日時: 2006-09-20 10:40 Re: Appleスクリプト・・・ |
引用:
これも sub-routine を使用しないで記述するとすれば、次のようになります。 tell application "Shade 8 professional" -- 入力ダイアログ activate --Shade を前面にもってくる begin dialog 200 -- ダイアログの開始(dialog ID = 200 この番号は script 毎にユニークな値を割り当てる) append vec3 dialog item "初期移動量" --0 append selection dialog item "移動量の変化/等差/等比" --1 append vec3 dialog item "移動量の変化(等比の場合は等比係数)" --2 append vec3 dialog item "初期回転量" --3 append selection dialog item "回転量の変化/等差/等比" --4 append vec3 dialog item "回転量の変化(等比の場合は等比係数)" --5 append selection dialog item "移動回転の順序/移動→回転/回転→移動" --6 if ask dialog then -- 入力ダイアログを開き、ユーザーがキャンセルしなかった set trans to (get vec3 property value 0) set transSel to (get selection property value 1) set d_trans to (get vec3 property value 2) set theta to (get vec3 property value 3) set rotSel to (get selection property value 4) set d_theta to (get vec3 property value 5) set t_r to (get selection property value 6) end dialog --ダイアログ終了 else return -- ユーザーキャンセル end if inhibit update if select child then if t_r = 0 then -- 移動→回転 move object translate trans move object rotate theta else -- 回転→移動 move object rotate theta move object translate trans end if repeat if select brother then if transSel = 0 then -- 等差 set trans to {(item 1 of trans) + (item 1 of d_trans), (item 2 of trans) + (item 2 of d_trans), (item 3 of trans) + (item 3 of d_trans)} else -- 等比 set trans to {(item 1 of trans) * (item 1 of d_trans), (item 2 of trans) * (item 2 of d_trans), (item 3 of trans) * (item 3 of d_trans)} end if if rotSel = 0 then -- 等差 set theta to {(item 1 of theta) + (item 1 of d_theta), (item 2 of theta) + (item 2 of d_theta), (item 3 of theta) + (item 3 of d_theta)} else -- 等比 set theta to {(item 1 of theta) * (item 1 of d_theta), (item 2 of theta) * (item 2 of d_theta), (item 3 of theta) * (item 3 of d_theta)} end if if t_r = 0 then -- 移動→回転 move object translate trans move object rotate theta else -- 回転→移動 move object rotate theta move object translate trans end if else exit repeat end if end repeat select parent end if allow update end tell | |
投稿数: 189
|
投稿日時: 2006-09-20 10:03 Re: Appleスクリプト・・・ |
引用:
ダイアログを開いて入力項目を受け取る部分を sub-routine 化しない場合は、つぎのようになります。 tell application "Shade 8 professional" -- 入力ダイアログを開く activate --Shade を前面にもってくる begin dialog 200 -- ダイアログの開始(dialog ID = 200 この番号は script 毎にユニークな値を割り当てる) append vec3 dialog item "移動量" --0 if ask dialog then -- 入力ダイアログを開き、ユーザーがキャンセルしなかった set trans to (get vec3 property value 0) --座標の回答を変数 trans に格納 end dialog --ダイアログ終了 else return -- ユーザーキャンセルされた end if -- 処理部分 inhibit update if select child then set theta to 10 move object translate trans move object rotate {0, theta, 0} repeat if select brother then set theta to (theta + 10) move object translate trans move object rotate {0, theta, 0} else exit repeat end if end repeat select parent end if allow update end tell | |
投稿数: 189
|
投稿日時: 2006-09-20 02:33 Re: Appleスクリプト・・・ |
追加説明
引用:
set object name to [ 文字列 ] オブジェクト名称をセットする set n to (n + 1) n の値を1増やす n as string 整数である n を string( 文字列 )に変換します。 引用:
& は数値計算における + のような働きを文字列などに対して行います。 set t1 to "東京都" t1 に "東京都" をセットする set t2 to "中央区" t2 に "中央区" をセットする set t3 to t1 & t2 t1 と t2 を足したものを t3 にセットする t3 = "東京都中央区" となる ですから (n as string) & " - " & (object name) では、整数 n を文字列に変換したものに " - " を加え、さらにオリジナルのオブジェクト名称を加える という意味になります。 & はリストにデータを加えるときにも使用します。 set L to {} L を空リストとする set L to L & "東京都" リスト L に "東京都" という文字列を加える set L to L & 3.14159 リスト L に 3.14159 という実数を加える set L to L & true リスト L に true(真偽値)を加える 結果 L の中身は {"東京都", 3.14159, true} となります。 リストの中の値を取り出すには item n of L を使います。 n は1から始まる整数です。 set t to (item 1 of L) リスト L の第一項目を t にセットする t = "東京都" となります set pi to (item 2 of L) リスト L の第二項目を pi にセットします pi = 3.14159 となります | |
投稿数: 189
|
投稿日時: 2006-09-20 01:22 Re: Appleスクリプト・・・ |
連続move作業 - 4( 最後だよ )
もうチト凝ったことをしてみます。 入力では以下の項目を入力します。 ・初期移動量 ・移動量の変化を 等差, 等比 から選択 ・移動量の変化量 ・初期回転量 ・回転量の変化を 等差, 等比から選択 ・回転量の変化量 ・移動と回転の順番を指定 ここでは 移動, 回転の処理部分も sub-routine 化して記述し、移動, 回転量の計算部分も sub-routine 化します。 sub-routine 化すると冗長な記述を圧縮できるので、全体の行数を減らすことができますし、プログラムの見通しもよくなりますから間違い探しも楽になります。 tell application "Shade 8 professional" set input to my InputDialog() if (length of input = 0) then -- ユーザーキャンセルの場合は input は空リスト return end if inhibit update if select child then set trans to (item 1 of input) set theta to (item 4 of input) my action(trans, theta, (item 7 of input)) -- 移動回転処理 repeat if select brother then set trans to my SetValue(trans, (item 2 of input), (item 3 of input)) -- 移動回転量セット set theta to my SetValue(theta, (item 5 of input), (item 6 of input)) -- 移動回転量セット my action(trans, theta, (item 7 of input)) -- 移動回転処理 else exit repeat end if end repeat select parent end if allow update end tell on InputDialog() -- 入力ダイアログ tell application "Shade 8 professional" activate --Shade を前面にもってくる begin dialog 200 -- ダイアログの開始(dialog ID = 200 この番号は script 毎にユニークな値を割り当てる) append vec3 dialog item "初期移動量" --0 append selection dialog item "移動量の変化/等差/等比" --1 append vec3 dialog item "移動量の変化(等比の場合は等比係数)" --2 append vec3 dialog item "初期回転量" --3 append selection dialog item "回転量の変化/等差/等比" --4 append vec3 dialog item "回転量の変化(等比の場合は等比係数)" --5 append selection dialog item "移動回転の順序/移動→回転/回転→移動" --6 set input to {} --入力結果を格納する空リスト if ask dialog then -- 入力ダイアログを開き、ユーザーがキャンセルしなかった set input to input & {(get vec3 property value 0)} set input to input & (get selection property value 1) set input to input & {(get vec3 property value 2)} set input to input & {(get vec3 property value 3)} set input to input & (get selection property value 4) set input to input & {(get vec3 property value 5)} set input to input & (get selection property value 6) end dialog --ダイアログ終了 end if return input --ユーザーキャンセルの場合は空のリストが返される end tell end InputDialog on SetValue(v, k, d) -- 移動回転量セット if k = 0 then -- 等差 set vv to {(item 1 of v) + (item 1 of d), (item 2 of v) + (item 2 of d), (item 3 of v) + (item 3 of d)} else -- 等比 set vv to {(item 1 of v) * (item 1 of d), (item 2 of v) * (item 2 of d), (item 3 of v) * (item 3 of d)} end if return vv end SetValue on action(trans, theta, k) -- 移動回転処理 tell application "Shade 8 professional" if k = 0 then -- 移動→回転 move object translate trans move object rotate theta else -- 回転→移動 move object rotate theta move object translate trans end if end tell end action | |
投稿数: 189
|
投稿日時: 2006-09-20 00:12 Re: Appleスクリプト・・・ |
連続move作業 - 4( 最後から2番目 )
引用:
ということで、今まで長々と述べてきたことを応用すれば次のようになりますです。 入力ダイアログを開く部分は sub-routine にしていますが、オブジェクトの移動と回転部分は内容が簡単なので sub-routine にはしていません。 それと1度づつではなく、10度づつの等差にしています。 tell application "Shade 8 professional" set input to my InputDialog() if (length of input = 0) then -- ユーザーキャンセルの場合は input は空リスト return end if inhibit update if select child then set theta to 10 move object translate (item 1 of input) move object rotate {0, theta, 0} repeat if select brother then set theta to (theta + 10) move object translate (item 1 of input) move object rotate {0, theta, 0} else exit repeat end if end repeat select parent end if allow update end tell on InputDialog() tell application "Shade 8 professional" activate --Shade を前面にもってくる begin dialog 200 -- ダイアログの開始(dialog ID = 200 この番号は script 毎にユニークな値を割り当てる) append vec3 dialog item "移動量" --0 set input to {} --入力結果を格納する空リスト if ask dialog then -- 入力ダイアログを開き、ユーザーがキャンセルしなかった set input to input & {(get vec3 property value 0)} --座標の回答 ( リスト形式で返している ) end dialog --ダイアログ終了 end if return input --ユーザーキャンセルの場合は空のリストが返される end tell end InputDialog | |
| 古いものから 投稿するには登録が必要です | 前のスレッド | 次のスレッド | トップ |