チュートリアル | (トピック一覧へ戻る) |
ファイルを開くには、IG.open()関数にファイルパスを渡します。 ファイルパスは絶対・相対パスのどちらも対応されています。
絶対パスはファイルの場所をファイルシステムの最上階から指定します。
Windowsでは
C:\Users\username\My Documents\
のように表記されます。
Macでは
/home/user/Documents/
のように表記されます。
相対パスはファイルの場所をProcessingのdataフォルダから指定します。
dataフォルダは保存された該当スケッチフォルダの下にあり、
もし現在のスケッチが "sketch_sep01a"という名前でデフォルトのProcessingフォルダ内に保存されているとき
Windowsでは
My Documents\Processing\sketch_sep01a\data\
Macでは
~/Documents/Processing/sketch_sp01a/data/
に位置します。
Windowsにおいてファイルパスを記述する際、バックスラッシュまたは円記号(\)は
"C:\\User\\username\\My Documents\\"
のように二度入力される必要があります。
Processingでは入力画像やファイルなどのリソースファイルはdataフォルダ内に保存されることが推奨されます。 スケッチのフォルダ内にdataフォルダを作成し、リソースファイルをそこに保存してください。 もしくはProcessingアプリケーションのメニュー"Sketch"から"Add File..."を選択し、 リソースファイルを選択すれば、Processingは自動的にスケッチのフォルダ内にdataフォルダを作成し、 指定されたファイルをそこにコピーします。
リソースファイルがdataフォルダに保存されれば、スケッチ上で以下のように開くことができます。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("test_input_file.obj"); // Wavefront OBJ format IG.open("test_input_file.3dm"); // Rhinoceros 3dm format
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.save("test_output_file.obj"); // Wavefront OBJ format IG.save("test_output_file.3dm"); // Rhinoceros 3dm format
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("test_input_file.obj"); // Wavefront OBJ format IG.open("test_input_file.3dm"); // Rhinoceros 3dm format IPoint[] pts = IG.points(); //getting points ICurve[] crvs = IG.curves(); //getting curves ISurface[] srfs = IG.surfaces(); //getting surfaces IMesh[] meshes = IG.meshes(); //getting polygon meshes IBrep[] breps = IG.breps(); //getting Breps
配列の各要素を参照する際、以下のスケッチのようにfor文が用いられます。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("test_input_file.obj"); // Wavefront OBJ format IG.open("test_input_file.3dm"); // Rhinoceros 3dm format IPoint[] pts = IG.points(); //getting points for(int i=0; i < pts.length; i++){ // do something with pts[i] } ICurve[] crvs = IG.curves(); //getting curves for(int i=0; i < crvs.length; i++){ // do something with crvs[i] } ISurface[] srfs = IG.surfaces(); //getting surfaces for(int i=0; i < srfs.length; i++){ // do something with srfs[i] } IMesh[] meshes = IG.meshes(); //getting polygon meshes for(int i=0; i < meshes.length; i++){ // do something with meshes[i] } IBrep[] breps = IG.breps(); //getting BReps for(int i=0; i < breps.length; i++){ // do something with breps[i] }
読み込まれた幾何学オブジェクトの種類別の数量を参照するには以下の関数を用います。
IG.pointNum()は点の総数を返します。
IG.curveNum()は曲線の総数を返します。
IG.surfaceNum()は平面・曲面の総数を返します。
IG.mesheNum()はポリゴン・メッシュの総数を返します。
IG.brepNum()はpolysufrace(BRep)の総数を返します。
読み込まれた幾何学オブジェクトの一つ一つを指定して参照するには以下の関数を用います。
IG.point(int)は指定の番号の点を返します。
IG.curve(int)は指定の番号の曲線を返します。
IG.surface(int)は指定の番号の平面・曲面を返します。
IG.meshe(int)は指定の番号のポリゴンメッシュを返します。
IG.brep(int)は指定の番号のpolysurface(BRep)を返します。
以上の関数を用いることで、上記のスケッチは以下のように簡潔に記述できます。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("test_input_file.obj"); // Wavefront OBJ format IG.open("test_input_file.3dm"); // Rhinoceros 3dm format for(int i=0; i < IG.pointNum(); i++){ // do something with IG.point(i) } for(int i=0; i < IG.curveNum(); i++){ // do something with IG.curve(i) } for(int i=0; i < IG.surfaceNum(); i++){ // do something with IG.surface(i) } for(int i=0; i < IG.meshNum(); i++){ // do something with IG.mesh(i) } for(int i=0; i < IG.brepNum(); i++){ // do something with IG.brep(i) }
上記の数量を返す関数は、その実行時に認識されている全てのオブジェクトに対する総数を返すことに注意してください。 たとえば以下のようなスケッチは無限ループに陥ります。反復のたびにIPointオブジェクトが増加するため、 IPointオブジェクトの総数を使った条件式が永久に真となります。
for(int i=0; i < IG.pointNum(); i++){ new IPoint(IG.point(i)); // duplicating each point }
このような場合、IG.points()などで生成した配列を操作すべきです。
各レイヤーのオブジェクトを参照するにはIG.layer()にレイヤーの名前をStringオブジェクトとして渡してください。 レイヤーオブジェクトは上記で列挙されている、各種の幾何学オブジェクトを取得する関数をすべて持ちます。
IG.layer("layer name").points()はレイヤー上の全ての点を配列として返します。
IG.layer("layer name").curves()はレイヤー上の全ての曲線を配列として返します。
IG.layer("layer name").surfaces()はレイヤー上の全ての曲面を配列として返します。
IG.layer("layer name").meshes()はレイヤー上の全てのポリゴン・メッシュを配列として返します。
IG.layer("layer name").breps()はレイヤー上の全てのpolysurface(Brep)を配列として返します。
レイヤーに含まれる各種幾何学オブジェクトの総数は以下のメソッドで取得されます。
IG.layer("layer name").pointNum()はレイヤー上の点の総数を返します。
IG.layer("layer name").curveNum()はレイヤー上の曲線の総数を返します。
IG.layer("layer name").surfaceNum()はレイヤー上の曲面の総数を返します。
IG.layer("layer name").mesheNum()はレイヤー上のポリゴン・メッシュの総数を返します。
IG.layer("layer name").brepNum()はレイヤー上のpolysurface(BRep)の総数を返します。
以下のメソッドはレイヤー内のひとつひとつの幾何学オブジェクトを参照します。
IG.layer("layer name").point(int)はレイヤー上で指定の番号の点を参照します。
IG.layer("layer name").curve(int)はレイヤー上で指定の番号の曲線を参照します。
IG.layer("layer name").surface(int)はレイヤー上で指定の番号の曲面を参照します。
IG.layer("layer name").meshe(int)はレイヤー上で指定の番号のポリゴン・メッシュを参照します。
IG.layer("layer name").brep(int)はレイヤー上で指定の番号のpolysurface(BRep)を参照します。
以下は3つの曲線が異なるレイヤーにある場合の例です。 もしもレイヤーまたは曲線が存在しない場合エラーが発生します。 例に用いたファイルは以下です。
test_input_file2.3dm
幾何学オブジェクトを生成する際、layer()メソッドによって
オブジェクトが所属するレイヤーを選択することができます。
指定のレイヤーが存在しない場合、新しいレイヤーが生成されます。
import processing.opengl.*;
import igeo.*;
size( 480, 360, IG.GL );
IG.open("test_input_file2.3dm");
// first curve in layer 01
ICurve curveInLayer1 = IG.layer("Layer 01").curve(0);
// first curve in layer 02
ICurve curveInLayer2 = IG.layer("Layer 02").curve(0);
// first curve in layer 03
ICurve curveInLayer3 = IG.layer("Layer 03").curve(0);
import processing.opengl.*;
import igeo.*;
size( 480, 360, IG.GL );
new IPoint(0,0,0).clr(1.0,0,0).layer("layerA");
new ICurve(10,0,0, 20,20,0).clr(0,0,1.0).layer("layerB");
new ISurface(0,0,5, 5,5,5, -10,0,10).layer("layerC");