« ■Microsoft Visual Studio 2008 Express Editions | トップページ | ☆TreeViewのチェックボックスを設定する。 »

☆JWWファイルの超簡易表示 その2

以前、☆JWWファイルの超簡易表示 という記事で書いたコードのDrawdata手続きを更新しましたので載せておきますね。

Sample


前回は線と文字を適当に表示するだけでしたが、線、円・楕円・円弧、文字をもう少し それっぽく表示するようにしました。(レイヤー、ソリッドやSXFなどは全く考慮していませんけどね。)
procedure TForm1.Drawdata;

  // 座標を変換
  procedure Change_mm_dot(x1, x2, y1, y2: Double;
    var ix1, ix2, iy1, iy2: Integer);
  begin
    ix1 := Round( x1 * mm_dot + ox );
    iy1 := Round(-y1 * mm_dot + oy );
    ix2 := Round( x2 * mm_dot + ox );
    iy2 := Round(-y2 * mm_dot + oy );
  end;

  // 線及び円弧の線種・線色の設定
  procedure LineSetting(Root: CData);
  begin
    // ペンの太さ
    PaintBox1.Canvas.Pen.width := 0;
    // ペンのスタイル
    case Root.m_nPenStyle of
      1: PaintBox1.Canvas.Pen.Style := psSolid;
      2: PaintBox1.Canvas.Pen.Style := psDot;
      3: PaintBox1.Canvas.Pen.Style := psDot;
      4: PaintBox1.Canvas.Pen.Style := psDot;
      5: PaintBox1.Canvas.Pen.Style := psDashDot;
      6: PaintBox1.Canvas.Pen.Style := psDashDot;
      7: PaintBox1.Canvas.Pen.Style := psDashDotDot;
      8: PaintBox1.Canvas.Pen.Style := psDashDotDot;
      9: PaintBox1.Canvas.Pen.Style := psDot;
    end;
    // ペンの色
    case Root.m_nPenColor of
      1: PaintBox1.Canvas.Pen.Color := RGB(0,192,192);
      2: PaintBox1.Canvas.Pen.Color := clBlack;
      3: PaintBox1.Canvas.Pen.Color := RGB(0,192,0);
      4: PaintBox1.Canvas.Pen.Color := RGB(192,192,0);
      5: PaintBox1.Canvas.Pen.Color := RGB(192,0,192);
      6: PaintBox1.Canvas.Pen.Color := RGB(0,0,255);
      7: PaintBox1.Canvas.Pen.Color := RGB(0,128,128);
      8: PaintBox1.Canvas.Pen.Color := RGB(255,0,128);
      9: PaintBox1.Canvas.Pen.Color := RGB(255,128,255);
    end;
  end;

  // フォントの設定
  procedure FontSetting(ACDataMoji: CDataMoji);
  begin
    // フォント名
    PaintBox1.Canvas.Font.Name := ACDataMoji.m_strFontName;
    // フォントの高さ
    PaintBox1.Canvas.Font.Height := Round(ACDataMoji.m_dSizeY* mm_dot);
    // フォントの色
    case JWWHd.m_Moji[ACDataMoji.m_nMojiShu].m_anMojiCol of
      1: PaintBox1.Canvas.Font.Color := RGB(0,192,192);
      2: PaintBox1.Canvas.Font.Color := clBlack;
      3: PaintBox1.Canvas.Font.Color := RGB(0,192,0);
      4: PaintBox1.Canvas.Font.Color := RGB(192,192,0);
      5: PaintBox1.Canvas.Font.Color := RGB(192,0,192);
      6: PaintBox1.Canvas.Font.Color := RGB(0,0,255);
      7: PaintBox1.Canvas.Font.Color := RGB(0,128,128);
      8: PaintBox1.Canvas.Font.Color := RGB(255,0,128);
      9: PaintBox1.Canvas.Font.Color := RGB(255,128,255);
    end;
  end;

var
  I, ax3, ay3, ax4, ay4: Integer;
  x1, x2, y1, y2, Hankei: Double;
  ix1, ix2, iy1, iy2: Integer;
  Moji: String;
  Hajime, Owari: Double;
  wx1,wy1,wx2,wy2: Double;
  LF: TLogFont;
begin
  // 用紙枠の描画
  Draw_Paper_Frame;

  // 線の描画
  PaintBox1.Canvas.Pen.Color := clBlack;
  for I := Low(JWWSen) to High(JWWSen) do
  begin
    x1 := JWWSen[I].m_start_x;
    y1 := JWWSen[I].m_start_y;
    x2 := JWWSen[I].m_end_x;
    y2 := JWWSen[I].m_end_y;

    // mm→dot変換
    Change_mm_dot(x1, x2, y1, y2, ix1, ix2, iy1, iy2);

    // 線の設定
    LineSetting(JWWSen[I].Root);

    //線の描画
    PaintBox1.Canvas.MoveTo(ix1, iy1);
    PaintBox1.Canvas.LineTo(ix2, iy2);
  end;

  // 円弧の描画
  for I := Low(JWWEnko) to High(JWWEnko) do
  begin
    x1 := JWWEnko[I].m_start_x;
    y1 := JWWEnko[I].m_start_y;
    Hankei := JWWEnko[I].m_dHankei;
    Hajime := JWWEnko[I].m_radKaishiKaku + JWWEnko[I].m_radKatamukiKaku;
    Owari := JWWEnko[I].m_radKaishiKaku + JWWEnko[I].m_radEnkoKaku +
      JWWEnko[I].m_radKatamukiKaku;
    if JWWEnko[I].m_radKatamukiKaku < 0 then
    begin
      wx1 := X1-Hankei*JWWEnko[I].m_dHenpeiRitsu;
      wy1 := Y1-Hankei;
      wx2 := X1+Hankei*JWWEnko[I].m_dHenpeiRitsu;
      wy2 := Y1+Hankei;
    end
    else
    begin
      wx1 := X1-Hankei;
      wy1 := Y1-Hankei*JWWEnko[I].m_dHenpeiRitsu;
      wx2 := X1+Hankei;
      wy2 := Y1+Hankei*JWWEnko[I].m_dHenpeiRitsu;
    end;

    // 円弧の設定
    LineSetting(JWWEnko[I].Root);

    // mm→dot変換
    Change_mm_dot(wx1, wx2, wy1, wy2, ix1, ix2, iy1, iy2);

    // 円弧の描画
    if JWWEnko[I].m_bZenEnFlg = 1 then
      PaintBox1.Canvas.Ellipse(ix1, iy1,ix2,iy2)  //円
    else
    begin
      ax3 := Round( ((x1+Hankei*Cos(Hajime)))*MM_dot+ox);
      ay3 := Round(-((y1+Hankei*Sin(Hajime)))*MM_dot+oy);
      ax4 := Round( ((x1+Hankei*Cos(Owari)))*MM_dot+ox);
      ay4 := Round(-((y1+Hankei*Sin(Owari)))*MM_dot+oy);

      if (ax3 <> ax4) or (ay3 <> ay4) then
      begin
        if (JWWEnko[I].m_radEnkoKaku < 0) then
          PaintBox1.Canvas.Arc(ix1,iy1,ix2,iy2,ax4,ay4,ax3,ay3)
        else
          PaintBox1.Canvas.Arc(ix1,iy1,ix2,iy2,ax3,ay3,ax4,ay4);
      end;
    end;
  end;

  // 文字の描画
  for I := Low(JWWMoji) to High(JWWMoji) do
  begin
    x1 := JWWMoji[I].m_start_x;
    y1 := JWWMoji[I].m_start_y;
    x2 := JWWMoji[I].m_end_x;
    y2 := JWWMoji[I].m_end_y;
    Moji := JWWMoji[I].m_string;

    // mm→dot変換
    Change_mm_dot(x1, x2, y1, y2, ix1, ix2, iy1, iy2);

    // フォントの設定
    FontSetting(JWWMoji[I]);

    // 文字の描画
    GetObject(PaintBox1.Canvas.Font.Handle, SizeOf(LF), @LF);
    SetTextAlign(PaintBox1.Canvas.Handle,TA_LEFT or TA_BOTTOM);
    LF.lfEscapement := Round(JWWMoji[I].m_degKakudo*10);
    PaintBox1.Canvas.Font.Handle := CreateFontIndirect(LF);
    PaintBox1.Canvas.TextOut(ix1,iy1,moji);
  end;
end;

指定フォルダから検索文字を含むJWWファイル一覧を作成し、 そのファイル名をクリックすると、検索文字を目立つように描画させて、 VE等の内容がきちんと訂正されているかをチェックするのに使っています。

|

« ■Microsoft Visual Studio 2008 Express Editions | トップページ | ☆TreeViewのチェックボックスを設定する。 »