ともさんの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ファイルを出力
ツイート