DXFファイルの読み込み入門(第2回)

前回は、DXF ファイルのグループコードと値のペア、セクションの構造について触れました。これを踏まえて、実際に siren スクリプトを組み立てていこうと思います。

スクリプトは前回の最後に述べたとおり、

  1. DXF を読み込む
  2. グループコードと値のペアのリストを作る
  3. リストからエンティティセクションを抽出する
  4. 各エンティティを抽出する
  5. エンティティから siren の Shape オブジェクトを生成する

の順序で組み立てていきます。

1. DXF を読み込む

DXF ファイルは前述のとおりテキストファイルですので、取り扱いがしやすいよう各行を文字列配列にします。 パッケージ配布版の siren では File クラスをそのまま使うことができます。

上のコードを1行ずつ順を追って説明します。まず、1行目の dxf = [] で変数 dxf が空の配列であることを明示的に記述しています。File.open メソッドのブロックの外に書くことによりスコープを広げ、同メソッドを抜けた後でも変数 dxf を使うことができます。

2行目は、一般的な Ruby スクリプトと同じように Drawing1.dxf という名前の DXF ファイルを r オプション(読み込みモード)で開き、ファイルオブジェクト変数 file にしています。 3行目は、ファイルの全ての行を配列にして返す readlines メソッドを呼び出し、map メソッドで各要素を加工しています。加工内容は、strip で各行の余分な空白文字を除去し、gsub メソッドでアスキーコードの0x20 から 0x7E 以外、つまり印字可能文字以外の文字を除去しています。今回は線分やポリラインを抽出するのが目的ですので、最初に余計な文字を排除する狙いがあります。

このコードを抜けると、各要素に DXF ファイルの内容が1行ずつ詰まった配列変数 dxf を得ることができます。 試しに、最終行に p dxf を追加して実行してみてください。DXF ファイルの内容が綺麗に配列の中に入っていれば成功です。

2. グループコードと値のペアのリストを作る

次に、DXF ファイルを取り扱う上で基本中の基本となるグループコードと値のペアのリスト(配列)の形になるようにスクリプトを改修してみましょう。このペアは、今は配列 dxf 中に

という形で並んでいると言えます。 これを

の形にすることにより、アクセスしやすくします。

Ruby で「配列から要素を n 個ずつ取り出して処理する」のは、each_slice メソッドです。

each_slice メソッドそのものは、各要素を実行した結果を配列として返しません。そこで .to_a メソッドを追加することにより配列化しています。

さて、今は DXF の各行を文字列として扱っていますが、少なくともグループコードはすべてが整数値で表わすことができます。後の比較判定などでわずらわしくないようグループコードを整数値化しておきましょう。

each メソッドを追加し、各要素の最初の項目を整数値化(to_i)したものを再定義しています。

ここまでできたら、行末に

を付けて実行してみてください。読み込んだグループコードと値のペアの数と、最初の5要素が正しく印字されれば成功です。

実行例:

上記のように、配列 dxf の各要素にはグループコードと値のペアが入っている状態になりました。ここで、これらのペアにアクセスする際の可読性を高めるため、Array クラスを再オープンしてメソッドを追加してみましょう。

先ほどのスクリプトの前に上記のコードを追加します。これにより Array クラスは、codevalue という2つのプロパティを持つようになりました。それぞれの挙動は書いてあるとおり、code に Read アクセスされた場合、自身の0番目の要素を返し、value の場合は1番目の要素を返します。Write アクセスはその逆です。

これにより、DXF の最初のペアにアクセスする場合

という記述から

といった具合に、可読性を高めることができます。

今回はグループコードと値のペアを論理的に扱えるようになりました。

第3回に続きます!

DXFファイルの読み込み入門(第2回)” への1件のフィードバック

コメントを残す