Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

だれでもできる、Pythonscript on Rhinoceros5 (Part2)

4,844 views

Published on

立体寺子屋でおこなったプレゼン資料です。
ライノセラス5では、Python言語によるスクリプトを書くことができます。

Published in: Technology
  • Be the first to comment

だれでもできる、Pythonscript on Rhinoceros5 (Part2)

  1. 1. ライノセラス5で Python スクリプト 2013 年 立体寺子屋 2013.6.19 Katsuyuki Saegusa 質問等は(参加案内メールへ返信)か、Facebook でおねがいします。(katsuyuki.saegusa)
  2. 2. 1)Rhino にはマクロがある。スクリプトはいつ使うの? コマンドマクロに出来ないことがある時に使います。  基本的に、コマンドマクロも、テキストファイルにすると、プログラムみたい に見えます。(右) ReadCommandFile、というコマンドがあります。 たとえば、次のテキストファイルは、コマンドマクロのプログラムで、テキスト ファイルに保存して、ReadCommandFile で実行できます。 Rhinoceros のコマンドを順次実行するときに使います。 コマンドプロンプトに1行1行のコマンドを送り出していますが、 次のことが出来ません。 演算、比較 +、-、×、÷、など。 大きい小さい同じの判断。 条件分岐、ループ プログラムの実行経路の変更 Rhino の外の世界 外部アプリケーション実行や、ファイルの読み書き、などなど、コンピュータで出来ること これらの機能が必要なときは、Python スクリプトが役に立ちます。 !_interpcrv 23,5,0 23.2,5,0 23.7,5.2,1 _Enter _interpcrv 26.1,4.9,1.1 26.8,4.9,1.0 27.1,4.8,0.9 _Enter マクロの例:
  3. 3. 2)Rhinoceros で Python の書き方の基本 1: # -*- coding: utf-8 -*- 2: import rhinoscriptsyntax as rs 3: 4: 5: def ABC(): 6: rs.Command(“_SelNone”) 7: print('ABC') 8: 9: ABC() 10: 11: ●インデント(タブ、字下げ)でブロックを表現 ●#はコメント ●ライノセラスの提供する機能は、2: で指定した rs を使う コマンドの実行は rs.Command ●ログラムの実行は、def(関数定義)ではない実行命令から始まる。 ●ABC() 関数呼び出しがあれば、実行時にはそこから def ABC の中にはいって、戻ってくる ●Python は、関数や変数に使う英字の大文字、小文字は「違うもの」として区別します。 1:utf-8 という世界標準の文字コードでプログラムを書く 2: ライノセラスの操作オブジェクトとして、 rs をインポートする 5:def   ABC(): ABC という名前とその処理 (= 関数 ) を決定 def=define 9:ABC() は関数を呼び出している(=実行する)。
  4. 4. 3) 簡単 Python のポイント(数、文字) 変数の定義は、変数名=値 と書くだけ。 事前に変数名や型の宣言は不要。(変数の型は存在する) x=1 変数に代入時に指定する値の基本の型と書き方のコツ 文字列   'abc' ”abc”  (注意 unicode prefix=u)u”漢字” 文字の連結は + 全角文字がある場合はユニコードで記述する 整数  1 2 50000 小数  1.0 0.001 ●整数と小数は、演算すると小数になる。 1+0.5, 3*1.0/2 文字列と型キャスト 自動的に変換されないものには、型キャストする。 よくあるのが入力文字列を数値化すること。 V1=5 V2='5' print (V1+V2) #これはエラー 文字列と整数を足している(文字列で連結?数値で演算?) print(V1+int(v2)) #Ok, 5+5=10 print(str(v1)+v2) #Ok, '5'+'5'='55' プログラム中で人に入力したものを受け取るときは、文字となっていることが多いので数値として使うには変換が いることが多いのです・・。 変数の型は type(変数)で実行時に調べることができます。
  5. 5. 4) 簡単 Python のポイント(演算と論理型・・マルかバツか) Python では、数値型(整数、小数の型)は演算ができます。演算の記号を、演算子といいます。 + 足し算 - 引き算 * 掛け算 ** ベキ乗 / 割り算(商) % 整数で割った余り(剰余) 3D の計算に算数チックな演算が必要な場合は、別モジュールの関数を使います。 三角関数 sin,cos は・・math モジュール。複素数の phase,poler は cmath モジュール 大小を比べたり、同じかどうか判断することを比較、比較演算といいます。 比較は算数での記法と似ています。イコールが入る場合は、不等号のあとに書きます。 a<b # (a が b より小さい かどうか) a>=b # (a が b 以上 かどうか) a==b # (a と b が等しいかどうか) イコールが1つだと代入になります。 比較の演算結果は、論理型になり、True=マル(正しい、Ok)か False=バツ(正しくない、NG)の値で表現されま す。True や False は、if などのプログラムのフローコントロール(あとで説明)でよく使います。 論理同士を演算するには、論理演算、をつかいます。 これも結果はマルかバツかです。 (a<b) and (b<=c) (b が a より大きく)、 かつ、 (b が c 以下)  かどうか (a<b) or (b<=c) (b が a より大きく)、 または、 (b が c 以下)  かどうか Python の論理演算は、先頭からショートサーキット評価をおこないます。(他言語の上級者向け)
  6. 6. 5) 簡単 Python のポイント(フローコントロール) 実行中のプログラムの実行経路を、変数によって変えることを、フローコントロールといいます。 これはマクロでは出来ません。 プログラムのアルゴリズムなどを図にしたものをフローチャート、といいます。 フローコントロールには、ループ、条件分岐、例外処理などが含まれます。 また、論理の値で処理が分かれて、インデントで処理をする対象のブロックを表現していることに注意してみて みてください。 条件分岐 もし、だったら。 if a==b: print(u”a と b は同じですよ” ) else: print(u”a と b は違いますよ” ) print(u” おしまい” ) 条件ループ   Ok の間は繰り返し i=1 while(i<=100): print( i ) i=i+1 print(u” おしまい” )
  7. 7. Python の範囲ループは、range 関数と一緒に使うことが多いのですが、最初と最終に注意が必要です。 範囲ループ(終了のみ) for i in range(10) print(i) 実行結果 0 1 2 3 4 5 6 7 8 9 範囲ループ(開始+終了) for i in range(1,3) print(i) 実行結果 1 2 範囲ループ ( 開始+終了+ step ) for i in range(5, 20, 4) print(i) 実行結果 5 9 13 17
  8. 8. 6) Python のプログラムから、ライノセラスの操作・・コマンド編 コマンドによる方法は、ライノのコマンドプロンプトにダイレクトに文字で指令を送る方法です。 これって、ほぼマクロじゃないのか、ということですが、そのとおり! 「マクロ」とおんなじことができますが、決定的に違うことは、Python の中でコマンドを文字列として生成し、 フローコントロールで実行時に何を何回実行するかなど、決めることができます。 実行に必要なのは rs.Command(マクロ文字列) だけです。 マクロ文字列をどう作るかは、自分のオペレーションからコマンドラインの履歴を見れば簡単に作れることなどを、 操作実例で示します。 最終的なプログラムのイメージとしては、こんな感じになります。 # -*- coding: utf-8 -*- import rhinoscriptsyntax as rs #(中略) if execute_cond: #マクロの文字列を Python の format などの文字列操作などで作成 s= "Convert SelID {0} Enter A 5 T 0.003 M {1} X {2} Enter".format(str(ofscurve),min,max) #マクロを実行 rs.Command(s ) 作ったマクロのプログラムは、スクリプトへもってきて、高度化することができます。
  9. 9. 7) Python のプログラムから、ライノセラスの操作・・ライノスクリプト編 ライノスクリプトによる方法は、文字列主体ではなく、ライノセラスが提供している関数を直接使います。 コマンドと比べると、指令や、戻り値の取得が細かく、ダイレクトにできる、という利点があります。 これまでは、VBScript でのスクリプトがありましたが、それと同等なものを Rhinoceros5 から Python でコントロー ルできるようになっています。VBScript でもまだ書けますが、これから書くなら、Python をお勧めします。 どんなことができるのでしょうか。 IDE の左横がヘルプになっていますので、その rhinoscriptsyntax という部分を開いてみてください。 rhinoscriptsyntax には 沢山関数があると思いますが、 ライノのコマンドを想像できる名前で 作られています。 中から、AddBox をクリックしてみます。
  10. 10. ヘルプが別画面で出てきました。 ヘルプは英語ですけど、小説ではないので、 単語とコツが分かれば読めてきます。 AddBox は立方体を生成するコマンドです。 AddBox で、コーナーを指定すると、オブジェ クトが生成されて、戻り値として得られるように なっています。(Guid = ポインタぽい物) Example は、 GetBox で得られた結果で AddBox しています。 慣れてくるとコマンドを発行するよりも、読みやすく、記述が簡単になる傾向があります。 コマンド発行と両方同時に使えますので、使いやすいほうを使っていきましょう。 (スクリプト以外にも、SDK でライノを操作する方法があります。スクリプトで出来ないことがあれば、SDK を検討してみましょう。)
  11. 11. 8)エディタの準備 メニューから、ツール>PythonScript>編集 で、エディタが表示されます。 参考:効率化の際に説明したキーマップ Ctrl+Shift + F3 = EditPythonScript  ( Ctrl+Shift+F4=RunPythonScript ) 短いプログラムで、Python のバージョンを確認してみましょう。 import sys print sys.version 右向きの三角の矢印が実行ボタンです。 print は下の output に表示されます。 ( Rhino5SP1 では 2.7.0 ( )  と表示されました。 ) 文字の大きさを変えたいとき、日本語の文字がお かしい場合 エディタのメニューで、Tool>Options・・を 選んで、Text Editor タブを選びます。 Font で日本語が表示できるフォント名、 MS ゴシックや、メイリオを選びます。 Size で、文字の大きさを指定できます。
  12. 12. 9)エディタからサンプルをデバッグモードで動かす あらかじめ用意されているサンプルを開いて、基本的なデバッガ機能を体験してみましょう。動作を1行ごとに止 めて追っていく方法(ブレーク&トレース)や、変数の中身を覗いてみる(ウオッチ)の方法を説明します。 エディタのメニューで Help > Samples > 2:ArrayPointsOnSurface を選ぶ。 (右の図) プログラムは解析されて、コメントや構文が色分けさ れます。 実行するには、三角のボタンを使います。赤い丸の ボタンは、ブレークポイントといい、実行中にここま で来たら、停止する行に設定します。 if __name__ == "__main__" のところに、ブレークポイントを設定して、実行して みます。 今回のプログラムは、(トリムされていない)サーフェスの上の uv に、ポイントをうっていくものですから、サーフェ スを1つ作っておいて、Select surface と表示されたときに、サーフェスを指示してください。
  13. 13. 10)ブレークした行からステップ実行する ブレークポイントをつけて実行すると、 ブレークした場所で停止し、黄色い矢印がつきます。 ブレークしている状態は、プログラムの実行がその場所 で、一時中断しています。 この状態では、Python エディタは、スコープの変数の状 態を下の Variables タブに表示しています。 また、ブレーク中は、次のボタンが有効になっています。 左から、Step Into[F11]、Step Over[F10]、StepOut、Stop です。 Step は、1行づつ実行をしますが、3つの種類は、呼び出した関数内(スタックに積まれて呼び出されますが)ま でトレースするかどうかの違いです。とりあえず、関数の中まで見てみたい場合は、StepInto[F11]で実行します。 関数は実行した結果のみあればいい場合は、SetpOver[F10]を選んでください。これらはよく使うため、キー ボードで実行ができます。Stop はプログラムの実行をキャンセルするボタンです。 ArrayPointsOnSurface までステップしながら、Variables タブなどを確認してみてください。 これらの機能は、非常に便利で、かつ有用なのですが、面白い、と思いませんか?
  14. 14. 11)プログラムを自分用に改造する 自分用に作りかえたい、としましょう。このファイルに名前をつけて保存してみます。 Python の標準的なファイル名は、.py をつけます。 サンプルでは、サーフェスから、格子状に点を生成しましたが、逆に、格子状の点から、面を生成する命令 (AddSrfPtGrid) がありますので、それを使ってみましょう。 AddPoints のコメント下に、次の2行を入れます。 # Add the points SCounts=[columns,rows] SPoints=[] rs.AddPoint の後ろに、下記のように追加します。 AddSrfPtGrid はループの外になるように、インデント に気をつけてください。 rs.AddPoint(point) #PointsStore SPoints.append(point) rs.AddSrfPtGrid(SCounts,SPoints) もし、うまくいかないところがあったら、ブレークやウ オッチをして修正をします。 実行する前には、念のために毎回保存すると良いでしょう。 右の図は、パラメータをかえて実行してみたところです。
  15. 15. 12)そのほか 保存したファイルを実行するときは、エディタからも実行できますが、プログラムをツール>PythonScript>実行 と すれば、 ブレークやウオッチはできませんが、より簡単に実行ができます。デバッグが終わったプログラムは、 そのように実行しましょう。 ●スクリプトの開発の委託や協力について プログラム開発では、内容にもよりますが、最後の詰め、安定性など、難しい部分があるかもしれません。 そんなときに、あきらめてしまわずに、ここまで作ったので出来ない部分、難しい部分を仕上げたい、アドバイス がほしい、などがあれば、ご相談下さい。 製作する場合でも、ある程度作ってあれば、価格を抑えることはできると思います。 ●プラグインについて ライノセラスのプラグイン開発では、Rhinoceros 用の SDK を使います。Microsoft Visual-C#等で開発ができま す。プラグインとしてのインストール機能や、カスタマイズされた入力フォームや、ライノセラスのメニューや UI へ のアクセスが可能になります。スクリプトを配布する場合に、プラグインにするほうが良いというメリットもあります。 ただ、専用の開発ソフトウエア(VisualStudio)が別途必要なのと、それらのツールや言語の使い方については、 ある程度の経験が必要です。 とにかく、いろいろ試してみて、楽しんでいただけると幸いです。

×