 | レベル: 中級 Matthew Scarpino, Java Developer, Eclipse Engineering, LLC
2009年 5月 12日 スクリプトによって、SketchUp モデルにオートメーション、アニメーション、そして幾何学的計算を追加することができます。適切なコードを使えば、SketchUp を Maya、あるいは AutoCAD のような機械設計ツールに変身させることさえできます。2 回連載の「SketchUp と Eclipse による 3D モデリング」の第 2 回目となるこの記事では、SketchUp スクリプトで用いるさまざまな基本クラスについて説明し、これらの基本クラスの使用例を紹介します。基本クラスを使って線分や面からなる 3D 形状を作成した後は、色とイメージを使って面ごとに外観を構成することができます。
第 1 回の記事では、SketchUp スクリプトを作成、編集、実行するための Eclipse 環境をセットアップする方法を説明しました。サンプル・スクリプトも記載しましたが、前回ではまだ重要な疑問に答えていません。それは、スクリプトの内部ではどのようにコードが機能するかという疑問です。今回の記事で SketchUp API について説明することで、この疑問に答えたいと思います。SketchUp モデルを描画し、その線、サーフェス、色、イメージなどの特徴を変更するのは、SketchUp API に含まれるクラスのメソッドです。この記事で API を完全に網羅することはできないので、SketchUp の形状を構成するために必要な基本クラスに重点を絞ります。しかし本題に入る前に、SketchUp API がベースとしている Ruby 言語の概要と、この言語がどのように機能するかについて概説しておきます。
 |
よく使われる頭字語
- API: Application Programming Interface
- DHTML: Dynamic Hypertext Markup Language
- UI: User Interface
|
|
Java プログラマーにとっての Ruby: その概要
Java™ プログラミング言語の人気と、記事のタイトルに Eclipse という言葉が含まれていることから、この記事では読者が Java プログラミング言語について十分に理解していると想定します。その一方、Ruby は Java ほどよく使用されているわけではありません。そこで、Java と比較した場合の Ruby の類似点と相違点をいくつか簡単に説明しておきます。この説明から、違和感なく Ruby を使って初歩的なコマンドを作成できるようになってほしいと思います。
以下に、箇条書きで類似点と相違点を説明します。
- Java と同じように、Ruby もオブジェクト指向です。実際、Ruby ではすべてが
Object のサブクラスとなります。Java 言語で使用する int、float、Boolean のようなプリミティブ型はありません。
- Ruby では変数の型を宣言する必要はないため、あるコマンドで x = 5 と設定し、次のコマンドでは x = "Hello world!" と設定することができます。
- Ruby のメソッドは Java プログラミングと同じくドット表記で呼び出しますが、括弧 (
()) とセミコロン (;) はオプションです。Ruby クラスにはすべて、new というコンストラクター・メソッドがあります。
- Ruby の
String オブジェクトは二重引用符 (") または単一引用符 (') のいずれかで囲むことができます。その違いは、インタープリターは二重引用符で囲まれた String オブジェクト内のエスケープ・シーケンス (\n、\t など) を認識するという点です。Ruby では単一文字の String オブジェクトが許容されますが、char オブジェクト固有のデータ構造はありません。
- 1 行のコメントはシャープ (
#) 記号で始まります。複数行にまたがるコメントは、=begin と =end で区切られます。
- Ruby のクラスは Java のクラスと同じ役割を果たしますが、Ruby ではクラスだけでなくモジュールもサポートします。Ruby モジュールとは、静的メソッドのみが含まれる Java クラスのようなものです。Ruby モジュールをインスタンス化することはできません。モジュールは、他と区別可能な名前空間の下にあるルーチンの集まりに過ぎません。
- 最もよく使われるテキスト出力メソッドは
put と print です。put は、print メソッドとは異なり、出力の最後に改行を追加します。
以上のルールを念頭に置いていれば、今すぐにでも Ruby コードを使い始められます。SketchUp で「ウィンドウ」 > 「Ruby コンソール」の順にクリックし、以下のコマンドのどれか、またはすべてを実行してみてください。
2 * (5 + 5) / 4 * 1.0
6.class
print 'Hello world'; puts '!'
m = Time.new; m.month
x = [4, true, 'hi there!']
puts x[2].to_s + " is a " + x[2].class.to_s
最後のコマンドで、Ruby の Object クラスの to_s メソッドが実行する操作は、Java の Object クラスの toString() メソッドと同じく Object を表す String を返します。図 1 に、SketchUp の Ruby コンソールに表示された上記のコマンドの実行結果を示します。
図 1. Ruby コンソールでの出力
これらのコマンドは単純には見えるかもしれませんが、Ruby は Java や C、C++ 言語ではお目にかかれない機能を提供します。これらの独特な機能には、例えばイテレーター・ブロック、並列割り当て、そして Range クラスといった特異なものまであります。しかし SketchUp API に関して言えば、Ruby 言語の基本的な知識さえあれば、かなりの操作を実行することができます。次のセクションでは、この API について詳しく説明します。
SketchUp API
第 1 回では SketchUp のサンプル・スクリプトを紹介し、SketchUp の load コマンドとSketchUp Bridge を使用してこのスクリプトを実行する方法を説明しました。しかし前回の記事では、このスクリプトがどのように機能するかについては説明していません。このスクプトのコマンドは、このセクションの主題である SketchUp API の一部です。ここではまず基本的な SketchUp データ構造 (Sketchup および Model) を紹介し、続いて Edge および Face オブジェクトの作成方法を追っていきます。その後、2 つの押し出しメソッド、pushpull と followme を取り上げ、SketchUp のマテリアルがどのようにオブジェクトに適用されるのかについて説明して締めくくります。
基本的なデータ構造
Ruby モジュールとはメソッドのコレクションのことで、SketchUp API で最も重要なモジュールは SketchUp です。SketchUp モジュールのメソッドが SketchUp システム全体に関する情報を提供するからです。このモジュールに含まれる 5 つのメソッドを以下に記載します。
os_language — SketchUp が動作しているオペレーティング・システムを返します。
locale — 現行のロケールに対応する言語コードを返します。
find_support_files — 最上位レベルの SketchUp ディレクトリー内にあるファイルのパスを返します。
version_number — SketchUp のバージョン情報を返します。
active_model — 現行のモデルを表す Model オブジェクトを返します。
Java 言語での静的メソッドと同じく、Ruby モジュールのメソッドを呼び出すには、モジュール名の後にドット、次にメソッドの名前を続けます。例えば SketchUp アプリケーションのバージョンを調べるには、Ruby コンソールにコマンド Sketchup.version_number を入力します。
SketchUp モジュールのすべてのメソッドのなかで最も重要なのは、active_model です。このメソッドが返す Model オブジェクトには、現行の SketchUp モデル内にあるすべての情報が含まれます。それぞれのモデルごとに 1 つの Model オブジェクトがあり、それぞれの Model オブジェクトが 1 つのモデルを表現します。「すべての情報」が含まれると言いましたが、これはつまり、すべての頂点の位置、すべての形状の色、モデルに使用可能なスタイルなどはすべて Model オブジェクトに保存されるということです。Model オブジェクトはその情報を一連の「コンテナー・オブジェクト」に保存します。コンテナー・オブジェクトには以下のコンポーネントが含まれます。
- エンティティ (
Entities) — 現行モデルで使用されているすべての形状
- マテリアル (
Materials) — 色とテクスチャ
- レイヤ (
Layers) — モデルのグラフィック・レイヤー
- スタイル (
Styles) — モデルの外観設定
概して言うと、SketchUp スクリプトの最終目的は上記のコンテナー・オブジェクトに含まれるデータを変更することにあります。そのために呼び出すのが、Model クラスの対応するメソッドです。これらのメソッドを覚えるのは簡単で、例えば layers メソッドは Layers オブジェクトを返し、styles メソッドは Styles オブジェクトを返し、entities メソッドは Entities オブジェクトを返すといった具合です。例えば、以下のコードは現行 Model オブジェクトの Entities コンテナーを取得します。
model = Sketchup.active_model
ents = model.entities
|
上記の 2 つのコマンドは、以下のように 1 つのコマンドに結合することができます。
ents = Sketchup.active_model.entities
|
このコマンドは重要なので覚えておいてください。この記事に記載するすべてのサンプル・スクリプトは、上記の行で始まるからです。サンプル・スクリプトは記事からダウンロードすることができます。次に、Model オブジェクトの Entities コンテナーにアクセスできることがなぜそれほど重要なのかを説明します。
SketchUp エンティティ: エッジと面
ご想像のとおり、Entities コンテナーに含まれるのは Entity オブジェクトです。簡単に言うと、Entity オブジェクトは SketchUp の描画領域内で表示、移動、あるいは変更が可能なすべての形状を表します。Entity クラスは、図 2 を見るとわかるように多くの SketchUp クラスのスーパークラスとなっています。この図には、Entity のほとんどのサブクラスが示されています。
図 2. Entity クラス階層
Entity オブジェクトのなかでもとりわけ重要なのは、SketchUp モデルに含まれるすべての形状のビルディング・ブロックとして機能する Edge と Face の 2 つのオブジェクトです。Edge とは線分のことで、Edge オブジェクトをモデルに追加するには Entities クラスの add_line メソッドを使用します。このメソッドが受け入れる 3 つの要素からなる配列は、Edge オブジェクトの始点と終点を表します。例えば、[0, 0, 0] から [5, 5, 5] までの線分を作成するには、以下のようなコードを使用することになります。
ents = Sketchup.active_model.entities
edge = ents.add_line [0,0,0], [5, 5, 5]
|
2 番目のコマンドが実行されると、SketchUp は Edge オブジェクトに対応する線を自動的に描画領域に描画します。線のプロパティーは、Edge クラスのメソッドを呼び出すことによって読み取り、変更することができます。例えば length メソッドは線の長さを返し、start メソッドは始点、end メソッドは終点を返します。また、線の外観を変更する smooth やhidden などのメソッドもあります。
その名前が示すように、Face オブジェクトは 2 D サーフェス (平面) を表します。Entities クラスの add_face メソッドは、描画領域にサーフェスを描画するとともに、Face オブジェクトを返します。このメソッドが受け入れるのは、一連の点または Edge オブジェクトです。例えば以下のコードは、x-y 面と y-z 面にそれぞれ Face オブジェクトを作成します。この例では Face オブジェクトの頂点はどちらも 4 つとなっていますが、Face オブジェトは任意の数の点を使って作成することができます。
ents = Sketchup.active_model.entities
# Create a face from points
face1 = ents.add_face [0,0,0], [3,0,0], [3,3,0], [0,3,0]
# Create a face from edges
edge1 = ents.add_line [0,0,0], [0,3,0]
edge2 = ents.add_line [0,3,0], [0,3,3]
edge3 = ents.add_line [0,3,3], [0,0,3]
edge4 = ents.add_line [0,0,3], [0,0,0]
face2 = ents.add_face [edge1, edge2, edge3, edge4]
|
Face クラスのメソッドは、それぞれ対応する形状のプロパティーにアクセスします。area メソッドは表面積を返し、edges メソッドは面を形成する Edge オブジェクトの配列を返します。また、normal メソッドは、サーフェスに垂直な方向を識別する法線ベクトルを返します。例えば face1.normal を呼び出した場合、x-y 面に垂直なのは +z 方向であるため [0, 0, 1] が返されます。もちろん [0, 0, -1] ベクトルも同じく垂直なので、reverse! メソッドを呼び出せば Face オブジェクトの法線ベクトルを反転することができます。
3D 形状の押し出し
2D サーフェスから 3D の形状を作成するプロセスは、「押し出し」と呼ばれます。Face クラスには、この押し出しを実行する 2 つのメソッド、pushpull と followme があります。重要な点として、SketchUp では 3D 形状を対象とした別のクラスを設けていないことに注意してください。SketchUp では 3D 形状用のクラスを用意する代わりに、押し出しプロセスの一環として 3D 形状を形成する Edge オブジェクトと Face オブジェクトを作成します。
2 つのメソッドのうち、簡単に使用できるのは pushpull メソッドのほうです。このメソッドは SketchUp の「プッシュ/プル」ツールと同じ操作を行います。つまり、Face オブジェクトを法線ベクトルの方向に押し出すことによって、3D 形状を作成します。このメソッドに必要な唯一の引数は、どれだけ押し出すかを特定する距離の値だけです。この値を負にすると、法線ベクトルとは逆の方向に Face オブジェクトが押し出されます。例えば、前の記事では、正方形の Face オブジェクトを作成した後、引数を -9 に設定した pushpull メソッドを呼び出してボックスを作成しました。
2 つ目の押し出しメソッド、followme は、SketchUp の「フォローミー」ツールと同じ目的を果たします。pushpull は 1 つの方向に押し出すだけですが、followme はどの方向にでも押し出すことができます。例えば、円形の Face オブジェクトを作成した後、円の軸に沿って押し出せば円柱になります。その一方、円の軌道に沿って押し出せば、円環面や球面を作成することもできます。押し出しのパスを設定するには、Edge オブジェクトまたは Edge オブジェクトの配列を定義しなければなりません。このメソッドの使い方をリスト 1 に示します。ここでは、三角形の面を作成し、四角いパスに沿って平面を押し出しています (「ダウンロード」を参照)。
リスト 1. followme メソッドによる押し出し
# Access the Entities object
model = Sketchup.active_model
ents = model.entities
# Create a triangular face
triangle = ents.add_face [1, 0, 0], [0, 1, 0], [0, -1, 0]
# Create the extrusion path
path = ents.add_edges [0, 0, 0], [0, 0, 10], [0, -10, 10],
[0, -10, 0], [0, 0, 0]
# Extrude the triangle along the rectangular path
triangle.followme path
|
add_edges メソッドは、一連の点から Edge オブジェクトの配列を作成します。図 3 (a) に、三角形の Face オブジェクトと四角いパスを示します。上記のスクリプトの最後のコマンド (triangle.followme path) を実行すると、三角形がパスに沿って押し出され、図 3 (b) の結果となります。
図 3. SketchUp の押し出し
パスは閉ループでなければならないことに注意してください。つまり、パスの最初の Edge オブジェクトの最初の点は、最後の Edge オブジェクトの最後の点と同じ位置でなければならないということです。
SketchUp のマテリアル
コードで形状を作成する方法がわかったところで、次に覚えなければならないのは、これらの形状の外観を定義する方法です。外観を定義するには、まず Material オブジェクトを作成して外観を構成し、このオブジェクトを Edge や Face オブジェクトなどの形状と関連付けます。Material オブジェクトの外観は、色、テクスチャ、またはその両方で定義することができます。Material オブジェクトを詳細にすればするほど、描画もリアルでプロフェッショナルが描画したような外観になります。SketchUp には、あらかじめいくつものマテリアルが用意されているので、「ウィンドウ」 > 「マテリアル」の順にクリックして、SketchUp でそれぞれのマテリアルがどのように表示されるかを確認してください。
モデルの Entities コンテナーが Entity オブジェクトを保持するのと同じように、Materials コンテナーは Material オブジェクトを保持します。新しい Material オブジェクトをモデルに追加するには、Materials クラスの add メソッドを呼び出す必要があります。このメソッドはマテリアルの名前を受け入れて新規 Material オブジェクトを返します。例えば、以下のコードは Materials コンテナーにアクセスし、RedBrick という Materials オブジェクトを作成します。
mats = Sketchup.active_model.materials
rb_mat = mats.add "RedBrick"
|
Material オブジェクトを作成した後は、Material クラスに含まれるメソッドを使ってオブジェクトのプロパティーにアクセスし、構成できるようになります。これらのメソッドとしては以下のものがあります。
color — Material オブジェクトの色を設定します。
texture — Material オブジェクトのテクスチャを識別します。
materialType — Material オブジェクトに色 (0)、テクスチャ (1)、またはその両方 (2) があるかどうかを識別する数値を返します。
display_name — Material オブジェクトの名前を返します。
SketchUp には、SketchUp に特有の Color オブジェクトがありますが、単純な RGB 配列 (例えば [64, 128, 255] など) に置き換えるとより簡単になります。この配列では、最初の要素が色に含まれる赤の強度を指定し、2 番目の要素が緑の強度、3 番目の要素が青の強度を指定します。さらに、色の名前を例えば Red、Plum、MintGreen などに置き換えこともできます。X11 色のすべての名前を網羅したリストを見るには、Ruby コンソールで Sketchup::Color.names と入力してください。例えば rb_mat の色を赤にする場合には、以下のコマンドのいずれかを入力します。
rb_mat.color = [255, 0, 0]
rb_mat.color = "Red"
|
3D グラフィックの用語では、テクスチャとはデザインの対象となる領域に適用する壁紙パターンなどのイメージを指します。必要に応じてイメージを繰り返すか、切り取るかしてサーフェスを覆います。SketchUp には、SketchUp に特有の Texture オブジェクトがありますが、イメージ・ファイル名に置き換えたほうが簡単です。SketchUp では JPG、PNG、PSD、TIF、TGA、および BMP ファイルからテクスチャを作成することができます。以下のコマンドを実行してみてください。C:/scripts/tex.targa に置かれたイメージがどのように rb_mat という Material オブジェクトのテクスチャになるかがわかります。
rb_mat.texture = "C:/scripts/tex.targa"
|
Material オブジェクトの色またはテクスチャを構成したら、そのオブジェクトをモデルに含まれる形状 (複数可) に割り当ててください。その方法は簡単で、Drawingelement クラス (Entity のサブクラスで、Edge および Face のスーパークラス) が提供する material という名前のメソッドを使えばよいだけのことです。このクラスが Material オブジェクトを受け入れ、Material オブジェクトの色またはテクスチャを要素に適用します。このメソッドの使用方法を示したリスト 2 では、テクスチャ (C:/scripts/brick.jpg) と色 (DodgerBlue) を持つ Material オブジェクトを作成しています。イメージ・ファイルのパスは最初の行で定義します。このスクリプトは、パスが正しく指定されていなければ正しく機能しません。
リスト 2. マテリアルの作成および適用
image_file_path = "C:/scripts/brick.jpg"
# Create the new material
mats = Sketchup.active_model.materials
brick_mat = mats.add "red_brick"
# Assign the color and texture
brick_mat.texture = image_file_path
brick_mat.color = "DodgerBlue"
# Draw a Face and set its material
ents = Sketchup.active_model.entities
face = ents.add_face [10, -10, 0], [10, 10, 0],
[-10, 10, 0], [-10, -10, 0]
face.reverse!
face.material = brick_mat
|
マテリアル brick_mat の色はそのテクスチャの後に定義し、テクスチャの色を変更してからマテリアルをサーフェスに適用していることに注意してください。brick.jpg イメージはそもそも赤ですが、最終的なテクスチャは青になります。これは、Material オブジェクトの色が後から定義されているためです。この青の色は、図 4 のように表示されます。
図 4. 面に適用されたマテリアル
さらに詳しく学ぶために
これまでの説明で勘違いさせてしまったとしたら申し訳ありませんが、SketchUp スクリプトが提供するのは Edge オブジェクト、Face オブジェクト、そして Material オブジェクトだけではありません。SketchUp には、非常に見事な形状を作成するための魅力的な機能が豊富に用意されています。以下に記載するのはその一部です。
- Animation — SketchUp モデルが時間の経過につれてどのように動くかを定義します。
- Component — ファイルに保存したり、モデル内でインスタンス化したりすることが可能なモジュール式モデルを作成します。
- PolygonMesh — 高度な形状を作成またはインポートして、複合テクスチャを適用します。
- WebDialog — 特殊化された DHTML のウィンドウを使用してインターネットと対話します。
- Tool/Menu/Page — UI を増補することによって SketchUp に機能を追加します。
そしてもちろん、SketchUp の長所の 1 つとして欠かせないのは、Google Earth とインターフェースを取って地形に固有の構造を作成できることです。
まとめ
SketchUp スクリプトを作成して実行することによって、設計プロセスを自動化できるだけでなく、多大な時間を節約できる可能性がでてきます。さらに、スプラインや非一様有理 B スプライン (NURBS)、パラメトリック曲線などの形状を描画する幾何学的アルゴリズムをコード化することも可能です。ありがたいことに、SketchUp API は Google をこれほどまでに成功させた単純ながらも強力な理念をそのまま引き継いでいるため、ほんのわずかな時間で基本クラス (Edge、Face) をマスターし、これらのクラスを組み合わせて SketchUp の形状を作成することができます。そしてさらに時間をかけて調べていくうちに、アニメーションや動的コンポーネントなどの高度な機能も追加できるようになります。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Eclipse plug-in that interfaces with SketchUp | os-eclipse-sketchup2-example_scripts.zip | 16KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | |  | Matthew Scarpino は、Eclipse Engineering LLC のプロジェクト・マネージャーであり、Java 開発者です。彼は SWT/JFace in Action の主執筆者であり、また SWT (Standard Widget Toolkit) に対して、小さいながらも重要な貢献をしました。彼が好きなものはアイルランドの民族音楽やマラソン、William Blake の詩、そして GEF (Graphical Editing Framework) です。 |
記事の評価
|  |