ともさんのHP >プロブラミング >自作JavaLibrary >JavaでDXFファイルを出力

JavaでDXFファイルを出力する方法

線データをDXF形式のファイルに落とすメソッドを作ったので、記録に書いておきます。
洋裁CADで作成した型紙のデータをDXF化する目的で作りました。
参考にした本は、DXFハンドブック。

参考になる本はこれしか見つかりませんでした。高価な本ですが、私の場合、さいわい図書館で借りることができました。
読み込めるかの確認はフリーソフトのJW-CADを使っています。

DXFファイルとは

CADを使っている人であれば必要ないと思いますが、一応説明。
異なるCADの間でデータをやり取りするためのフォーマットです。本来はAutoCadというCADのファイルだったものです。
現在ではほとんどのCADが自身のデータファイル以外にDXFファイルの読み込み、保存に対応しています。

広告

バージョン

DXFフォーマットといっても、1種類ではありません。非常にたくさんのバージョンが存在しています。
詳しく知りたい方は「DXFハンドブック」を読んでみてください。
私の場合、DXFファイルを出力するのは、「他のCADにデータを渡す」のが目的です。
ですので、なるべくエラーの起きない、単純な(古い)バージョンを選ぶことにしました。R12というバージョンです。
他のCADも、DXFフォーマットをフルに利用しているのではなく、最低限にとどめてデータのやり取り時にエラーを起こさないようにしているようです。
また、少しくらいバージョンに沿っていないデータがあってもエラーは出さないように配慮しているようですね。

ファイル構成

バージョン「R12」までのファイル構成は4つに分かれています(以降のバージョンはもっと複雑)。
順に、ヘッダ、テーブル、ブロック、エンティティ。
各セクションの内容は以下の通り
 ヘッダ:システム変数
 テーブル:レイヤー、線種情報
 ブロック:寸法、ブロック化した図形
 エンティティ:線、文字
ヘッダのシステム変数とは、数値の精度、角度の0度は度の方向か、DXFのバージョンなどです。

Javaで出力するためのメソッド

DXFファイルを出力するために作ったclassがDxf.javaです。参考にされてください。
最低限のデータしか出さないようにしています(極力エラーを起こさないため)。
ヘッダ、テーブル、ブロックはとりあえずエラーを出さないための最低限の情報を入れています(JW-CADで読み込ませてエラーにあらないことを確認しました)。
エンティティには線情報を入れます。円も曲線も、直線も、全て点配列にして、点の配列p[][]にしてメソッドに渡します。なので、出力される線は全て直線の組み合わせになっています。

JavaClasse Dxf.java

package tomojavalib.exec;
import tomojavalib.p2cad.Point;
import tomojavalib.util.*;

/**
 * DXFファイルをファイルに出力するclassです.
 * ホームページ公開用に作成
 */
public class Dxf {

/** Dxfファイルを出力 */
public boolean makeDxf( Point[][] p , String filename ){
tomojavalib.util.TextFile tf = new tomojavalib.util.TextFile();
 try{
  tf.outOpen( filename );
  this.writeHeader(tf);
  this.writeTables(tf);
  this.writeBlock(tf);
  this.writeEntities( tf , p );
  tf.write("  0");//ファイルの終了
  tf.write("EOF");
  tf.outClose();
 }catch(Exception e){  System.out.println( "ファイル出力でエラー" ); return false; }; 
return true;
}

/** Dxfファイルのエンティティを書きだす */
public boolean writeEntities( TextFile t , Point[][] p){
try{
 t.write("  0");
 t.write("SECTION");
 t.write("  2");
 t.write("ENTITIES");
 //印刷データをもとに描画
for( int ii=0 ; ii < p.length ; ii++ ){
   this.writeLine(t, p[ii]);
}
 t.write("  0");
 t.write("ENDSEC");
}catch(Exception e){ return false; }
return true;
}

/** Dxfファイルのブロックを書きだす */
public boolean writeBlock( TextFile t ){
try{
}catch(Exception e){ return false; }
return true;
}

/** Dxfファイルのテーブルを書きだす */
public boolean writeTables( TextFile t ){
try{
 t.write("  0");//セクション開始
 t.write("SECTION");
 t.write("  2");//ヘッダー開始
 t.write("TABLES");
 t.write("  0");
 t.write("TABLE");//線種の設定
 t.write("  2");
 t.write("LTYPE");
 t.write(" 70");
 t.write("     9");
 t.write("  0");
 t.write("LTYPE");
 t.write("  2");
 t.write("CONTINUOUS");
 t.write(" 70");
 t.write("    64");
 t.write("  3");
 t.write("実線");
 t.write(" 72");
 t.write("    65");
 t.write(" 73");
 t.write("     0");
 t.write(" 40");
 t.write("0.0");
 t.write("  0");
 t.write("TABLE");
 t.write("  2");
 t.write("LAYER");
 t.write(" 70");
 t.write("    2");
 t.write("  0");
 t.write("LAYER");
 t.write("  2");
 t.write("_0-0_");
 t.write(" 70");
 t.write("   64");
 t.write(" 62");
 t.write("    7");
 t.write("  6");
 t.write("CONTINUOUS");
 t.write("  0");
 t.write("LAYER");
 t.write("  2");
 t.write("ADD_LINE");
 t.write(" 70");
 t.write("   64");
 t.write(" 62");
 t.write("    7");
 t.write("  6");
 t.write("CONTINUOUS");
 t.write("  0");
 t.write("ENDTAB");
 t.write("  0");
 t.write("ENDSEC");
 t.write("  0");//セクション終了
 t.write("ENDSEC");
}catch(Exception e){ return false; }
return true;
}

/** Dxfファイルのヘッダーを書きだす */
public boolean writeHeader( TextFile t ){
try{
 t.write("  0");//セクション開始
 t.write("SECTION");
 t.write("  2");//ヘッダー開始
 t.write("HEADER");
 t.write("   9");//DXFのバージョン
 t.write("$ACADVER");
 t.write("  1");//R12J
 t.write("AC1009");
 t.write("  9"); //画面範囲の左下頂点
 t.write("$LIMMIN");
 t.write(" 10");
 t.write("-500");
 t.write(" 20");
 t.write("-500");
 t.write("  9");//画面範囲の右上頂点
 t.write("$LIMMAX");
 t.write(" 10");
 t.write("500");
 t.write(" 20");
 t.write("500");
 t.write("  0");//セクション終了
 t.write("ENDSEC");
}catch(Exception e){ return false; }
return true;
}

/** 線の出力 */
private boolean writeLine( TextFile t , Point[] p ){
if(p==null){ System.out.println("点がないlineエラー");return false; }
if(p.length<2){ System.out.println("点が足りないlineエラー");return false; }
for(int i=0;i<p.length-1;i++){
//System.out.println("線出力");
try{
 t.write("  0");//直線
 t.write("LINE");
 t.write("  8");
 t.write("  _1");//グループ(レイヤー)
 t.write("  6");
 t.write("CONTINUOUS");//線種(実線)
 t.write(" 62");
 t.write("    7");//色番号(3緑) 
 t.write(" 10");
 t.write(""+p[i].x);//始点x座標
 t.write(" 20");
 t.write(""+p[i].y); //始点y座標
 t.write(" 11");
 t.write(""+p[i+1].x); //終点x座標
 t.write(" 21");
 t.write(""+p[i+1].y);  //終点y座標
}catch(Exception e){
 System.out.println(e.getLocalizedMessage() +"lineエラー");
 return false; 
}}
return true;
}

}

最終更新日: 2016-04-24 10:20:27

ともさんのHP >プロブラミング >自作JavaLibrary >JavaでDXFファイルを出力

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

スリットカメラアプリケーション  
ゴアテックス生地の入手方法  
洗濯物干しハンガーの自作  
3次元CADで帽子の型紙  
【Java】画像の座標変換のためのクラス  
USBカメラをJAVAで制御して定点観測  
ミソハギの育てかた  
3次元CADでぬいぐるみ  
JavaFXのMeshViewに衝突判定を付加  
ニセアカシアの伐採  
小動物の飼いかた  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 
PageSpeedInsights
html5チェック

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます