AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:用紙
「SXF仕様書」の「図面情報」の次は「図面構造」ですが、図面構造フィーチャには以下のようなものがあります。
・用紙フィーチャ
・レイヤフィーチャ
・既定義線種フィーチャ、ユーザ定義線種フィーチャ
・既定義色フィーチャ、ユーザ定義色フィーチャ
・線幅フィーチャ
・文字フォントフィーチャ
ここでは「用紙」について見てみます。
 
図面は基本的に、「用紙」の中に作図する事になります。「用紙」はプリンタやプロッタにセットする紙そのもの、といっていいでしょう。ですので、ここで設定する「用紙」の各項目と印刷用紙の大きさが同じでない場合、印刷用紙のほうが大きければ余白がたっぷり出来てしまうことになり、印刷用紙の方が小さいと図面全体が印刷されない(オーバーした箇所は用紙からはみ出た状態になる)という事になります。が、データの受け渡しをする際に、取引先から用紙サイズを指定される場合もありますので、自分が持っているプリンタでは使えないサイズでも指定するのは別に構いません。
 
また、CAD利用者では用紙サイズの外側を敢えて、作業用エリアとして利用している場合がありますが、この場合は、データを受け渡す場合には しっかり削除して渡す、という事に気を付けた方がいいかもしれません。

 
用紙
パラメータ説明範囲
name[257]Char図面名0<文字列長≦256バイト
TypeInt用紙サイズ種別(0:A0, 1:A1, 2:A2, 3:A3, 4:A4, 9:FREE) AX版の寸法はJIS規格
に従う
OrientInt縦/横区分(0:縦,1:横)
XInt自由用紙横長(単位mm) 0<長さ<int(32bits)
の最大値
YInt自由用紙縦長(単位mm) 0<長さ<int(32bits)
の最大値
備考
・用紙座標の原点(0, 0)は用紙の左下とする。
・用紙サイズ種別が自由用紙(9:FREE)の場合、自由用紙縦長・自由用紙横長が有効となり、縦/横区分は無効となる。
 
ここでいうInt型というのは、32bitの倍長整数のことのようですね。倍長整数の取り得る値の範囲は、通常は、-2147483648 〜2147483647 ですが、符号無しだと 0 〜 4294967295 となりますが、まぁここは 2147483647 までと解釈するのが普通のように思います。
 
Delphi2010では 整数型と一口に言っても
汎用整数型
Integer-2147483648..2147483647符号付き32ビット
Cardinal0..4294967295符号なし32 ビット
基本整数型
Shortint-128..127符号付き8ビット
Smallint-32768..32767符号付き16ビット
Longint-2147483648..2147483647符号付き32ビット
Int64-2^63..2^63-1符号付き64ビット
Byte0..255符号なし8ビット
Word0..65535符号なし16ビット
Longword
(DWord)
0..4294967295符号なし32 ビット
UInt640..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
A0841×1189

A1×3
A1×4
841×1783
841×2378
A1594×841

A2×3
A2×4
A2×5
594×1261
594×1682
594×2102
A2420×594 A3×3
A3×4
420×891
420×1189
A3×5
A3×6
A3×7
420×1486
420×1783
420×2080
A3297×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
A4210×297



 
B系の用紙サイズの例

B0B1B2B3B4B5B6
X14561028728514364257182
Y1028728514364257182128
 
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;
終了時に解放します。
CData.Free;
 
用紙設定を行う手続き PaperSet() は、A0〜A4,Free だけでなく、色々な用紙サイズを指定出来るようにしています。それらは Freeサイズとして登録するようにしていますけれども。
 
 
それでは簡単なテストプログラムです。実行型ファイルは、サイズが大きくなるので含めていません。ソースだけです。
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
 ▲PREV
 ▼NEXT
M7
Jw_cad
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.