2019年3月13日水曜日

AutoCAD シェイプフォント

シェイプソースファイル(拡張子 SHP)
シェイプフォントファイル(拡張子 SHX)

COMPILE コマンド、SHPファイルをSHXに変換
STYLE コマンド、文字スタイルにフォント(SHXファイルかTrueTypeフォント)を割り当て
LOAD コマンド、シンボルライブラリとしてのシェイプフォントの読み込み
SHAPE コマンド、シンボルを図面に配置

DUMPSHX ツール、SHX ファイルを SHPファイルに変換
(AutoCAD のインストール時にオプションの Express Tools をチェックすると、このコマンドラインツールがインストールされる)

(重要) AutoCAD LT や AutoCAD互換CADには、COMPILEコマンドもDUMPSHXツールも存在しない。

フォーマット
SHPファイルについては AutoCAD カスタマイズリファレンスの「シェイプファイルとフォントファイルのコンパイル」以降に記述されている。

SHXフォントは以下のシグネチャから始まる。

AutoCAD-86 shapes 1.0  (128文字+ %%c %%d %%p )
AutoCAD-86 shapes 1.1  (256文字+ %%c %%d %%p )
AutoCAD-86 unifont 1.0  (UnicodeのBMPに限る)
AutoCAD-86 bigfont 1.0  (MBCSフォント用)

文字数  LSB2バイトでファイルに含まれる文字数
文字コード0 の情報
文字コード0x0A (LF) の情報
文字コード 0x20 (SP) の情報
 ...

データは文字コードの昇順に並んでいる。
文字の形状によってサイズがまちまちだがシーケンシャルにデータが入っている
文字コード 0 はフォントの見出し情報として、次のものが含まれる。
・フォントの簡単な説明、著作権表示など
・1つの文字データが 何×何 のマス目で表現されているか
・基準線より上が何マスで、下が何マスか
・縦書き可能かどうかの制御ビット
・(MBCSフォントのみ)2バイトコードになる範囲
(日本語の場合、0x8140 から2バイトコードが始まり、途中 0xA0から0xDF は半角カタカナがあり、0xE040から2バイトコードが再開される。そのため 02 81 9F E0 FC と記述される、範囲の個数、下限、上限)

文字1つ分の書式は次のようになっている
・文字コード 古いシェイプは1バイト、UNIFONTは2バイト、BIGFONTは1バイトと2バイトのコードが混在。
・サイズ この後の部分のバイト数が LSBの2バイトで格納されている
・シェイプ名 文字用フォントは NUL の1バイト。シンボル用フォントは最大31バイト+NULバイト。CHARで格納。
・形状記述コード 1バイトのニーモニックとパラメータの組み合わせで文字やシェイプの形状が記述される

上位4ビットが0の場合、次の意味になります。
0        シェイプの終了
1       ペンダウン 以下のコードは画面,用紙に出力される
2       ペンアップ 以下のコードは画面,用紙に出力されない
3,R    以降のペンの長さをRで割る
4,R    以降のペンの長さをRで掛ける
5       ペンの今の位置をスタックに保存(4回まで)
6       スタックに保存されたペンの位置を復元
7,C    サブシェイプとして文字コードCを再生
 コードのサイズはシェイプの種類によって1バイトまたは2バイト)
 拡張ビッグフォントは部首をサブシェイプとして定義しているため、コード、位置X,Y、尺度X,Y といったデータを持つ。
8,X,Y ペンの移動・描画
9,X,Y,...,0,0 ペンの連続移動・描画
A,R,SC  八分円弧の定義 (詳細はカスタマイズ リファレンスを参照)
B,        別の円弧の定義 (詳細はカスタマイズ リファレンスを参照)
C,        別の円弧の定義 (詳細はカスタマイズ リファレンスを参照)
D,        連続円弧の定義 (詳細はカスタマイズ リファレンスを参照)
E         次のコードは縦書きのみ実行
 普通はペンの移動(8)で、文字の再生位置を調整することで文字を縦書きにします。

上位4ビットが1からFの場合、1バイトで移動距離と進行方向を示します
上位4ビット 1~F   ペンの移動距離
下位4ビット 0~F   ペンの進行方向(0が右、4が上、8が左、Cが下など)

SHPファイルでは、ニーモニックとパラメータは10進または16進で記述されます。
16進で記述する場合、先行0が付加されます。
0,  10進数の0です
1,    10進数の1です
99,  10進数の99です
001, 16進数の1です
099, 16進数の99(10進数では153)です

8 ペンの移動や 9 ペンの連続移動では、XとYが組みの値であることを強調するためにカッコをつけることがありますが、データとしての意味はありません。
また、-128 から 127 の変位を指定できます。マイナスは付けますが、プラスは付けません。

ツール
FontCompiler プロジェクト

コマンドラインツールで
FontCompiler  入力ファイル 出力ファイル
入力ファイルはSHPまたはSHXファイルを指定する
出力ファイルはSHXまたはSHPファイルを指定する(入力の反対)
パスを指定すれば、別のフォルダに出力することも可能。

(今は暫定的に Unifont の SHP を SHX にするケースを実装している。)

0 件のコメント:

コメントを投稿

異尺度注釈図形にアタッチされている尺度を知る

 異尺度注釈図形が持っている尺度(文字列)を表示する ;;; ;;; LISTANNOSCALE.LSP ;;; (defun C:LISTANNOSCALE ( / el id f)   (setq f T)   ;異尺度注釈図形を選択   (if (setq el (entg...