QCAD日本語

Ubuntuではいろんなアプリケーションが利用できますが、2次元CADのQCadもバンドルされています。
インストールは簡単で、「Synapticパッケージマネージャ」か、アプリケーションの「追加と削除」でシステムにアプリケーションを追加するだけです。これはそのスナップショットです。
qcad.png

しかし、このQCad、AutoCAD R12形式とAutoCAD 2000形式がサポートされているというものの、そのままでは日本語の含まれる図面が表示できませんでした。
Windowsで動作する無償の2次元CADの JW-CAD for Windows (以下JWW)と、QCadの間でR12 DXF ファイルを送受信できることを確認しました。

JWWとQCadのR12 DXFファイルの違い


アプリケーション 文字コード バージョン 文字データの特記事項
JWW    日本語ShiftJIS R12 DXF 文字スタイルが省略されSTANDARDになる,CIFは使用できない
QCad Windows欧米 R12 DXF 日本語が表示できるのはUnicode文字スタイルのみ,日本語はCIFで表現可能

AutoCADのInternationalization


DOS Extenderを使ってたころから、シフトJISコードで日本語が利用できました。
Unifont が導入されたのは R13 からです。英語版AutoCADではWindows Latinの範囲の文字は普通に入力し、それ以外の文字は、\U+XXXX の形式で入力できるようになりました。これをCIFといいます。XXXXはUnicode (UCS-2)の16進数表記です。たとえば、 ('Д') は ('\U+0414') と表現します。
また、英語版AutoCADで、日本語などMBCSの文字を表現する、MIFという表現方法も定義されています。\M+NXXXX の形式で、NはMBCS識別コード(0-5のいずれか)で、XXXXは16進4桁で言語別の文字コードです。日本語は識別コードは1で文字コードはシフトJIS、繁体中国語は2でbig5などと決まっています。あ は \M+182A0 と表現します。
R9からR12のDWG,DXFは言語またがりのデータ交換に注意を払っていませんが、R13からは注意が払われるようになりました。文字コードの違いは、AutoCAD2007でUnicodeアプリケーション、データベース化されたことにより完全解決されました。2007DXFでは、文字はUTF-8で表現されます。

AutoCADではオブジェクトの名前は、大文字小文字を区別しません。カタカナや記号の半角と全角は区別します。
とはいえ、大文字、小文字の判定は、R12forWinから2006までは、WindowsのNLS (National Language Support) APIを使用していたため、OSと文字セットのことなる図面で、大文字小文字の判定ができなくなったというような現象が、Windows95/98とR14から2000 DXF の組み合わせでは起きていました。

操作手順


JWWでサンプル図面を開きました。
jww1.jpg

これを「ファイル」メニューの「DXF形式で保存する」を選んで、図面をDXF形式で保存します。
次に、このファイルを ubuntuに送ります。SMB/CIFS プロトコルによるWindows共有ディスクにデータをおくのもよいですし、デュアルブートPCなら、 Ubuntu に、WindowsのVFATやNTFSでフォーマットしたディスクをマウントすることも簡単です。

iconv コマンドで、シフトJISのDXFファイルを、UTF-8に変換して、日本語部分を CIF に変換する。qcdxf フィルタを通します。
$ iconv -f CP932 -t UTF-8 jww.dxf | qcdxf > qcad.dxf

このファイルは、QCadで開くことができます。
qccadjww.png

逆にQCadで保存したファイルを、JWWに戻します。
jwdxf フィルタで、CIFを普通のUTF-8に戻して、iconv でシフトJISに戻します。

$ jwdxf qcad.dxf | iconv -f UTF-8 -t CP932 > jww.dxf

QCADで日本語を入力するのは大変

QCADには、kochiフォントが用意されていますが、JWWとのやりとりには、unicodeフォントを使います。
QCADで、日本語入力メソッドAnthyが使えないので、テキストエディタを起動して日本語を入力してから、
QCADの入力ボックスに貼り付けました。
qcadJa.png

画層名などには、日本語は使えません。

ソースコード

qcdxf.c

/* Wide Char -> Hex(\\U+xxxx)変換プログラム */
#include <wchar.h> // ワイド文字を扱うためのヘッダー
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define DXFBUF 2049 // 256*8+1

int main(void) {
wchar_t wbuf[DXFBUF]; // リードバッファ
 wchar_t *ws;            // ワイド文字列ポインタ
 unsigned int code;    // HEX変換用
 setlocale(LC_ALL, "");
 while (fgetws(wbuf,DXFBUF,stdin)){  // 標準入力から読む
   for ( ws = wbuf; *ws ; ws++) {
     code = (unsigned int)*ws;
     if (code > 255)                         // マルチバイト文字列なら変換
       printf("\\U+%04X",code); // \U+0324なんてのもあり。
     else
       fputc(code,stdout);
   }
 }
 return 0;
}

jwdxf.c

/* Hex(\\U+xxxx)->Wide Char変換プログラム */
#define _GNU_SOURCE
#include <wchar.h> // ワイド文字を扱うためのヘッダー
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define DXFBUF 2049 // 256*8+1

int main(void) {
  char buf[DXFBUF]; // リードバッファ
   char hex[5];
 wchar_t wbuf[DXFBUF]; // ライトバッファ
 int n;
 int x;
 int i;
 setlocale(LC_ALL, "");
 while (fgets(buf,DXFBUF,stdin)){  // 標準入力から読む
   n = strnlen(buf,DXFBUF);
   for( x = i = 0; i < n ; )
   {
       if( i + 7 < n && strncasecmp( &buf[i], "\\U+", 3 ) == 0 )
       {
           strncpy(hex,&buf[i+3],4);
           hex[4] = 0;
           wbuf[x++] = strtol(hex,NULL,16);
           i += 7;
       }
       else
       {
           wbuf[x++] = (wchar_t)(0x00ff & buf[i++]);
       }
   }
   wbuf[x] = (wchar_t)0;
   fputws(wbuf,stdout);
 }
 return 0;
}

  • 最終更新:2008-03-13 22:32:15

このWIKIを編集するにはパスワード入力が必要です

認証パスワード