|
「SXF仕様書」の「図面情報」の次は「図面構造」ですが、図面構造フィーチャには以下のようなものがあります。
・用紙フィーチャ
・レイヤフィーチャ
・既定義線種フィーチャ、ユーザ定義線種フィーチャ
・既定義色フィーチャ、ユーザ定義色フィーチャ
・線幅フィーチャ
・文字フォントフィーチャ |
ここでは「用紙」について見てみます。
図面は基本的に、「用紙」の中に作図する事になります。「用紙」はプリンタやプロッタにセットする紙そのもの、といっていいでしょう。ですので、ここで設定する「用紙」の各項目と印刷用紙の大きさが同じでない場合、印刷用紙のほうが大きければ余白がたっぷり出来てしまうことになり、印刷用紙の方が小さいと図面全体が印刷されない(オーバーした箇所は用紙からはみ出た状態になる)という事になります。が、データの受け渡しをする際に、取引先から用紙サイズを指定される場合もありますので、自分が持っているプリンタでは使えないサイズでも指定するのは別に構いません。
また、CAD利用者では用紙サイズの外側を敢えて、作業用エリアとして利用している場合がありますが、この場合は、データを受け渡す場合には しっかり削除して渡す、という事に気を付けた方がいいかもしれません。
用紙 |
パラメータ | 型 | 説明 | 範囲 |
name[257] | Char | 図面名 | 0<文字列長≦256バイト |
Type | Int | 用紙サイズ種別(0:A0, 1:A1, 2:A2, 3:A3, 4:A4, 9:FREE) |
AX版の寸法はJIS規格
に従う |
Orient | Int | 縦/横区分(0:縦,1:横) |
|
X | Int | 自由用紙横長(単位mm) |
0<長さ<int(32bits)
の最大値 |
Y | Int | 自由用紙縦長(単位mm) |
0<長さ<int(32bits)
の最大値 |
備考
・用紙座標の原点(0, 0)は用紙の左下とする。
・用紙サイズ種別が自由用紙(9:FREE)の場合、自由用紙縦長・自由用紙横長が有効となり、縦/横区分は無効となる。 |
ここでいうInt型というのは、32bitの倍長整数のことのようですね。倍長整数の取り得る値の範囲は、通常は、-2147483648 〜2147483647 ですが、符号無しだと 0 〜 4294967295 となりますが、まぁここは 2147483647 までと解釈するのが普通のように思います。
Delphi2010では 整数型と一口に言っても
汎用整数型 |
Integer | -2147483648..2147483647 | 符号付き32ビット |
Cardinal | 0..4294967295 | 符号なし32 ビット |
基本整数型 |
Shortint | -128..127 | 符号付き8ビット |
Smallint | -32768..32767 | 符号付き16ビット |
Longint | -2147483648..2147483647 | 符号付き32ビット |
Int64 | -2^63..2^63-1 | 符号付き64ビット |
Byte | 0..255 | 符号なし8ビット |
Word | 0..65535 | 符号なし16ビット |
Longword
(DWord) | 0..4294967295 | 符号なし32 ビット |
UInt64 | 0..2^64-1 | 符号なし64ビット |
があります。
普通は汎用型を使えばいいと思いますが、使用可能な値範囲内に応じて型を変えてもいいと思いますし、その方が使用メモリも減ると思いますが、速度的に速いか遅いかは分かりません。また、イレギュラーな値が入ってきた場合にエラーする可能性もありますので、注意は必要となるかもしれません。そういった注意をしないといけなくて、それ専用の値チェック用関数・手続きを作る必要があるのなら、Integerで統一した方が効率的かもしれません。
例えば、用紙向き Orient の値は、0 か 1 か、ですので、Shortint や Byte で十分ですが、もしそこに、12345 とかいうイレギュラーな値が入ってきた場合に、その時点でプログラムがエラーを発生してしまうのでそれを避けるために、値チェックを行ってから、その変数に値を入れる作業をする事になりますが、Integer型であれば、その程度のイレギュラーな値が入ってもエラーはしません。けれども値チェックそのものは必要でしょう。やることはほとんど同じでも、エラーする可能性があるのなら、事前にその芽は摘んでおく、という必要はあると思います。
用紙は、A0〜A4の縦横、が基本で、それ以外は自由サイズ(FREE)という事になっているようです。自由だからといって、無茶苦茶な値を入れるのもどうかと思いますが、「SXF 表示機能及び確認機能要件書(案)」では「CAD製図基準(案)」によるところの
特別延長サイズまたは例外延長サイズの場合は、用紙フィーチャの用紙サイズ種別がFREE で、自由用紙縦長と自由用紙横長値は表 10 で示す様にJIS Z 8311 で定められている値と同じでなければならない |
という制限もありますが、例えば、B系の用紙サイズとか、プリンタで使用出来るインチ系のレターサイズであるとか、そういうものも使いたい場合も有り得るので、最初から電子納品についてのみ考慮をするのか、それとも自由さを取るのか、自由さを取っておいて電子納品をする場合には後からチェックして変更すればいいとするのか、という事は CADを作るに当たって最初から考えておいた方がいいとは思います。
SXF仕様書では
・用紙サイズ種別が自由用紙(9:FREE)の場合、自由用紙縦長・自由用紙横長が有効となり、縦/横区分は無効となる。 |
とありますが
「SXF 表示機能及び確認機能要件書(案)」では
・用紙サイズ種別が“FREE”の場合は、自由用紙横長が自由用紙縦長以上であれば横向
き、それ以外を縦向きとする |
とあるので、「SXF 表示機能及び確認機能要件書(案)」の方に合わせておいた方が無難でしょうね。
JIS Z 8311 (単位mm)
A列サイズ(第1類) | 特別延長サイズ(第2類) | 例外延長サイズ(第3類) |
呼び方 | 寸法a×b | 呼び方 | 寸法a×b | 呼び方 | 寸法a×b |
|
|
|
|
A0×2
A0×3 |
1189×1682
1189×2523 |
A0 | 841×1189 |
|
|
A1×3
A1×4 |
841×1783
841×2378 |
A1 | 594×841 |
|
|
A2×3
A2×4
A2×5 |
594×1261
594×1682
594×2102 |
A2 | 420×594 |
A3×3
A3×4 |
420×891
420×1189 |
A3×5
A3×6
A3×7 |
420×1486
420×1783
420×2080 |
A3 | 297×420 |
A4×3
A4×4
A4×5 |
297×630
297×841
297×1051 |
A4×6
A4×7
A4×8
A4×9 |
297×1261
297×1471
297×1682
297×1892 |
A4 | 210×297 |
|
|
|
|
B系の用紙サイズの例
| B0 | B1 | B2 | B3 | B4 | B5 | B6 |
X | 1456 | 1028 | 728 | 514 | 364 | 257 | 182 |
Y | 1028 | 728 | 514 | 364 | 257 | 182 | 128 |
Delphiでのプリンタ設定の縦横サイズを取得するには、Printersユニットをuses節に追加しておき、
X := Printer.PageWidth ;
Y := Printer.PageHeight ; |
にて、プリンタでのドット数での印刷可能範囲というのはすぐに分かりますが(※この値は用紙の向き(縦横)を考慮した値です)、プリンタの解像度(DPI)が分かりませんので印刷可能範囲が何mmか?というのは PrintersユニットのTPrinter型では分かりません。そんな場合は、WindowsAPIの関数を利用します。
// プリンタの横DPI
xdpi := GetDeviceCaps(Printer.Handle, LOGPIXELSX) ;
// プリンタの縦DPI
ydpi := GetDeviceCaps(Printer.Handle, LOGPIXELSY) ;
// プリンタの物理横サイズdot
px := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH) ;
// プリンタの物理縦サイズdot
py := GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT) ;
// プリンタの物理横サイズmm(四捨五入して小数点以下1桁に)
pxmm := Int(25.4*px/xdpi *10.0+0.5)/10.0 ;
// プリンタの物理縦サイズmm(四捨五入して小数点以下1桁に)
pymm := Int(25.4*py/ydpi *10.0+0.5)/10.0 ;
// プリンタ印刷可能横サイズmm(四捨五入して小数点以下1桁に)
xmm := Int(25.4*X/xdpi *10.0+0.5)/10.0 ;
// プリンタ印刷可能縦サイズmm(四捨五入して小数点以下1桁に)
ymm := Int(25.4*Y/ydpi *10.0+0.5)/10.0 ; |
のようになります。これは今回使用しませんけれども。
それでは、この用紙フィーチャをデータ化します。
単純に、前回のレコードに追加する、というのもありますが、やはり分けて置きたい、そして初期値を入れたり、値をチェックする機能も付けたい、という訳で、クラス化することにします。
type
TZumenTitle = record // 図面情報|図面表題欄
P_Name : string; // 事業名
C_Name : string; // 工事名
C_type : string; // 契約区分
D_title : string; // 図面名
D_number : string; // 図面番号
D_type : string; // 図面種別
D_Scale : string; // 尺度
D_Year : integer; // 図面作成年(西暦)
D_Month : integer; // 〃月 1≦月≦12
D_Day : integer; // 〃日 1≦日≦31
C_Contractor : string; // 受注会社名
C_Owner : string; // 発注事業者名
end;
TZumenPaper = record // 図面構造|用紙
name : string; // 図面名
typ : integer; // 用紙サイズ種別(0:A0, 1:A1, 2:A2, 3:A3, 4:A4, 9:FREE)
orient : integer; // 縦/横区分(0:縦,1:横)
x : integer; // 自由用紙横長(単位mm)
y : integer; // 自由用紙縦長(単位mm)
end;
TDataClass = class
public
{ Public 宣言 }
zt : TZumenTitle; // 図面情報|図面表題欄
zp : TZumenPaper; // 図面構造|用紙
constructor Create;
destructor Free;
procedure DataInit;
function StrCheck(s:string) : Boolean ;
procedure PaperSet(t,o,x,y:integer) ;
private
{ Private 宣言 }
end; |
実装部については下記のソースプログラムを見て下さい。
クラスにしましたので、メインプログラム Unit1.pas のほうで起動時にオブジェクト生成をするようにしています。
CData := TDataClass.Create; |
終了時に解放します。
用紙設定を行う手続き PaperSet() は、A0〜A4,Free だけでなく、色々な用紙サイズを指定出来るようにしています。それらは Freeサイズとして登録するようにしていますけれども。
それでは簡単なテストプログラムです。実行型ファイルは、サイズが大きくなるので含めていません。ソースだけです。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
▲PREV
▼NEXT
M7
Jw_cad
|