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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CAD作ろ! レイヤ・色・線種の設定(4)
前節の続きです。
さて、次はレイヤ毎に指定する尺度について考えます。レイヤ設定画面で指定する尺度は「1/1」「1/10」等のように入力し、その内容は、レイヤ設定テーブル「TLayerTable」の「scs」に文字データとして入りますが、同時に、「sc」に数値データとして「1.0」「0.1」等のような値を入れるようにしています。
 
要素登録をする際に、レイヤの尺度を考慮して座標データを入力させるようにします。その前に、尺度とはどういうものでしょうか?
 
尺度(scale)とは「図形の大きさ(長さ)と対象物の大きさ(長さ)との割合」(JIS Z 8114「製図用語」より)であり、
「現尺:対象物の大きさ(長さ)と同じ大きさ(長さ)に図形を描く場合の尺度」(1:1 = 1/1)
「倍尺:対象物の大きさ(長さ)よりも大きい大きさ(長さ)に図形を描く場合の尺度」(例 200:1 = 200/1)
「縮尺:対象物の大きさ(長さ)よりも小さい大きさ(長さ)に図形を描く場合の尺度」(例 1:100 = 1/100)
(JIS Z 8114「製図用語」より)
です。小さいもの、例えば、腕時計の図面をA1用紙に描きたい場合、そのままの大きさで描くと用紙に大きな余白部が出来ますし、細かい部分が見えません。そのため、何倍か大きくして図面を描きます。これが「倍尺」です。
また、大きいもの、例えば、家の図面をA1用紙に描きたい場合、当然そのままでは描き切れませんので、何分の1かに小さくして図面を描きます。これが「縮尺」です。
 
例えば、A1用紙の場合、用紙の大きさは「594×841」(JIS Z 8311「図面の大きさ及び様式」より)ですが、A1横の場合、本プログラムでは変数 PA_x,PA_y に、841,594の値が入り、要素データの座標値は通常、(-841÷2,-594÷2)〜(841÷2,594÷2) つまり、(-420.5,-297)〜(420.5,297)(中央が(0,0))の四角い領域内に入れる事になります。
これが、倍尺200/1の場合には、
  (-420.5÷200,-297÷200)〜(420.5÷200,297÷200)領域内
  つまり
  (-2.1025,-1.485)〜(2.1025,1.485)領域内
また、縮尺1/200の場合には、
  (-420.5×200,-297×200)〜(420.5×200,297×200)領域内
  つまり
  (-84100,-59400)〜(84100,59400)領域内
として要素データを登録・作図する必要があります。
 
つまり、プログラムでは、
(-PA_x/2/scale,-PA_y/2/scale)〜(PA_x/2/scale,PA_y/2/scale)
の領域内に要素データを登録・作図する事になります。
勿論、このscale値は、レイヤによって変わってきますので、それを考慮したプログラミングを行う必要があります。
基本的には、データを入力する時と、データを出力(表示)する時に、注目をします。
 
まずは、マウスを移動する際に LabelA3 に座標を表示させていますので、そこから追加修正しましょう。LabelA3のCaptionを変更させているのは、「procedure TFmMain.PaintBox1MouseMove()」内ですので、
var
 tx,ty : double ;
begin
 tx := WD_x1 + X / MM_dot ;
 ty := WD_y2 - Y / MM_dot ;
 LabelA3.Caption := '( ' + FloatToStr(tx) + ' , '
             + FloatToStr(ty) + ' )';
         ↓
var
 sc,tx,ty : double ;
begin
 sc := LayTbl[ComboBox1.ItemIndex].sc ;
 tx := WD_x1 + X / MM_dot ;
 ty := WD_y2 - Y / MM_dot ;
 LabelA3.Caption := '( ' + FloatToStr(tx/sc) + ' , '
             + FloatToStr(ty/sc) + ' )';
のように追記します。すると、尺度の値、つまり現在のレイヤによって表示される内容も変わってくるのが確認出来ます。
 
次に、座標入力する際に尺度演算を作業を行う訳ですが、画面の拡大表示等で指定する座標値には、この作業を行いたくありませんので、それを考慮し「procedure TFmMain.MouseClick()」内の変数 tx,ty そのものに尺度演算するのではなく、線分のデータ登録の箇所で尺度演算を行います。
GRBERASE ;
sc := LayTbl[ComboBox1.ItemIndex].sc ;
// データ登録
Inc(Dat_N);
try
  SetLength(Dat,Dat_N); // 線分データ領域を増やす
  DatAttribSet(Dat_N-1);
  Dat[Dat_N-1].x1 := FBx/sc ; // 添え字は 0 からなので注意
  Dat[Dat_N-1].y1 := FBy/sc ;
  Dat[Dat_N-1].x2 := tx /sc ;
  Dat[Dat_N-1].y2 := ty /sc ;
  //
  if (Dat_N = 1) then begin
    ZA_MinX := Dat[0].x1*sc;
    ZA_MinY := Dat[0].y1*sc;
    ZA_MaxX := Dat[0].x1*sc;
    ZA_MaxY := Dat[0].y1*sc;
  end;
  if (ZA_MinX > Dat[Dat_N-1].x1*sc) then ZA_MinX:=Dat[Dat_N-1].x1*sc;
  if (ZA_MinX > Dat[Dat_N-1].x2*sc) then ZA_MinX:=Dat[Dat_N-1].x2*sc;
  if (ZA_MinY > Dat[Dat_N-1].y1*sc) then ZA_MinY:=Dat[Dat_N-1].y1*sc;
  if (ZA_MinY > Dat[Dat_N-1].y2*sc) then ZA_MinY:=Dat[Dat_N-1].y2*sc;
  if (ZA_MaxX < Dat[Dat_N-1].x1*sc) then ZA_MaxX:=Dat[Dat_N-1].x1*sc;
  if (ZA_MaxX < Dat[Dat_N-1].x2*sc) then ZA_MaxX:=Dat[Dat_N-1].x2*sc;
  if (ZA_MaxY < Dat[Dat_N-1].y1*sc) then ZA_MaxY:=Dat[Dat_N-1].y1*sc;
  if (ZA_MaxY < Dat[Dat_N-1].y2*sc) then ZA_MaxY:=Dat[Dat_N-1].y2*sc;
逆に、線分データから呼び出しを行っている「function TFmMain.MouseSnap()」内では、整合性を取るため、尺度逆演算を行っておきます。
for i:=0 to Dat_N-1 do begin
  if (LayTbl[k].no = Dat[i].lay) then begin
    xx := Dat[i].x1*LayTbl[k].sc ;
    yy := Dat[i].y1*LayTbl[k].sc ;
    if (Abs(x-xx) <= a)and(Abs(y-yy) <= a) then begin
      x := xx;
      y := yy;
      Result := True ;
      break; // ループを抜け出して直ぐに終了
    end;
    xx := Dat[i].x2*LayTbl[k].sc ;
    yy := Dat[i].y2*LayTbl[k].sc ;
    if (Abs(x-xx) <= a)and(Abs(y-yy) <= a) then begin
      x := xx;
      y := yy;
      Result := True ;
      break; // ループを抜け出して直ぐに終了
    end;
  end;
end;
 
そして、登録データを画面表示しているUnitGraph内の「procedure GL_ALLDAT()」内も追加修正しておきます。
wx1 := Dat[i].x1*LayTbl[k].sc;
wy1 := Dat[i].y1*LayTbl[k].sc;
wx2 := Dat[i].x2*LayTbl[k].sc;
wy2 := Dat[i].y2*LayTbl[k].sc;
GL_LINE(C,wx1,wy1,wx2,wy2);
 
その他、影響しそうな箇所を考えてみます。
Dat[○].x1、Dat[○].y1、Dat[○].x2、Dat[○].y2 の値を参照している場所は? Delphiの検索機能を使う等をして確認します。
一通り実行してみて確認します。
すると、マウス両ボタン左下方向ドラッグの図形範囲表示がおかしい事に気付きます。作図した後、レイヤ設定で尺度を変更すると、図形範囲も変わってきますので納得出来ます。これに対応するため、レイヤ設定を行った後、図形範囲の再設定を行うようにします。(※本質的には、尺度を変更したかどうかをチェックし、変更した部分だけを再設定すれば多少は速度アップに繋がると思われますが、プログラムが煩雑になりますので見送ります)
 
 
取りあえず、ここまでのサンプルプログラムです。
サンプルプログラムのソース
ついでながら、レイヤ設定画面で選択しているレイヤを現在のレイヤにするようにし、レイヤ設定画面のレイヤ一覧(StringGrid)上でダブルクリックするとレイヤ設定画面を閉じるように変更しています。
 
 
余談ですが、縦横異縮尺に対応したい場合には、上記の「sc」を、「scx」「scy」のようにX・Y別々に扱うようにすると対処出来ると思われます。(※勿論、将来、円→楕円のような処理は必要になってくるでしょう)本プログラムでは対応しませんが、チャレンジしようという方は是非ともやってみて下さい。
 
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
 ▲PREV
 ▼NEXT
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.