end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Creo Element Direct DraftingによるME10 ver.9図面→DXF形式へのCAD変換

ME10という機械CADデータのマイグレーションのお話。

ME10の現在の名称は、PTC Creo Element Direct Drafting 18.0

そもそもME10というCADを知りませんでしたが、次のurlにたどり着きました。

http://www.ptc.com/

ME10はHPが開発したが、その後、CoCreate社に渡り「OneSpace Designer Drafting」という名称になり、更にPTC社に渡り、現在は「Creo Element Direct Drafting」として販売されている。
まぁ、今後も名称は変わるでしょうが、ME10というキーワードで日本の代理店を探すところから苦労しました。

ME10 ver.9図面は、Drafting 18.0でも閲覧可能

マイグレーション対象のCAD図面はME10 ver.9で古く、文字コードsjisです。最新のDrafting 18.0は、encoding=unicode(utf8)前提で、閲覧できないことを心配していましたが、それなりに表示されました。

※「○○○建設工業㈱ テスト」を日本語を書きましたが

  • 「㈱」のような機種依存文字は表示させませんでした
  • 半角の「テスト」の表示幅は怪しい気がしますが、それでも表示されました

その他、リビジョンを表す△がずれているのも気になります。

DraftingのメニューからDXF形式保存が可能(ただしsjis->utf8文字参照)

先程の図面をDraftingのメニューバーから「ファイル→名前を付けて保存」を選択し、「AutoCAD2010 DXF形式」で保存することも可能です。

ただし、文字コードがut8に変換され、先ほどの「○○○建設工業㈱ テスト」は内部的に次のようにunicode文字参照コードで保存されます。

\U+25cb\U+25cb\U+25cb\U+5efa\U+8a2d\U+5de5\U+696d\U+3231\U+3000\U+ff83\U+ff7d\U+ff84

http://d.hatena.ne.jp/end0tknr/20110519/1305797466
perlによる文字参照のencode/decodeは、以前、↑このurlに記載していますが、chr()やhex()を利用し、次のようなscriptで元の文字に戻すことができます。

#!/usr/local/bin/perl
use strict;
use utf8;
use Encode;

main();

sub main {
    my $org_str = join('',
		       '\U+25cb\U+25cb\U+25cb\U+5efa\U+8a2d\U+5de5',
		       '\U+696d\U+3231\U+3000\U+ff83\U+ff7d\U+ff84');
    $org_str =~ s/\\U\+([0-9a-f]{4})/chr(hex($1))/egoi;
    print Encode::encode('utf8',"$org_str\n");
}

DraftingによるDXF化データをJw_cadで開く前に、utf8文字参照実体化&sjis

先程、Draftingで「AutoCAD2010 DXF形式」保存したファイルをJw_cadで開くと、次のように文字参照コードがそのまま表示されます。

どうやらJw_cadでDXFファイルを開く場合、DXFに含まれる文字は、実体化されたshift_jisである必要があるようなので、次のようなperl scriptで、utf8文字参照の実体化と、utf8->sjis変換を行うことで正しく表示できます。

#!/usr/local/bin/perl
use strict;
use utf8;
use Encode;

main(@ARGV);

sub main {
    my ($mi_dxf_file) = @_;

    open(my $fh,$mi_dxf_file) or die "can't open $mi_dxf_file $!";
    {
	local $/ = undef;
	my $dxf_lines = <$fh>;
	#文字参照コード→文字(utf8)
	$dxf_lines =~ s/\\U\+([0-9a-f]{4})/chr(hex($1))/egoi;
	#utf8→sjis(cp932)
	print Encode::encode('cp932',$dxf_lines);
    }
    close($fh) or die "can't close $mi_dxf_file $!";
}


Jw_cadでは「㈱」のような機種依存文字も正しく表示されました


様々なCADデータの書式なんて、どれもDXFを基本とした派生データなんて、思っていましたが、実際にマイグレーションやる場合、いろいろと手間なんだろうなぁ