« ☆JWWのクリップボードを読み込んでみる。 | トップページ | ■最近・・・。 »

☆JWWのソリッドデータを描画してみる。

私自身、JWWを使いこなしていないため、よく分からないデータも多いのですが、 下記の処理で描画できているようです。 (申し訳ないのですが、現在、描画処理を別ユニットに分ける作業をしてて、そのユニット内のコードなので 前回のコードに組み込むには少し修正が必要です)

Solid_2


  uses jwwunit;

  // 実数を扱うTPoint
  PPointEx = ^TPointEx;
  TPointEx = packed record
    X: Double;
    Y: Double;
  end;

  // 座標を変換
  procedure Change_mm_dot_Point(PEx: TPointEx; var P: TPoint);
  begin
    P.x := Round( PEx.x * mm_dot + OriginPoint.X );
    P.y := Round(-PEx.y * mm_dot + OriginPoint.Y );
  end;

  // 円弧の描画
  procedure DrawEnko(Enko: CDataEnko; IsSolid: Boolean=False);
  var
    x1, y1, Hankei: Double;
    Hajime, Owari: Double;
    PEx1, PEx2: TPointEx;
    P1, P2, P3,P4: TPoint;
  begin
    if (not IsSupportLine(Enko.Root)) and LayerCheck(Enko.Root) then
    begin
      x1 := Enko.m_start_x;
      y1 := Enko.m_start_y;
      Hankei := Enko.m_dHankei;
      Hajime := Enko.m_radKaishiKaku + Enko.m_radKatamukiKaku;
      Owari :=  Enko.m_radKaishiKaku + Enko.m_radEnkoKaku +
        Enko.m_radKatamukiKaku;
      if Enko.m_radKatamukiKaku < 0 then
      begin
        PEx1.X := X1-Hankei*Enko.m_dHenpeiRitsu;
        PEx1.Y := Y1-Hankei;
        PEx2.X := X1+Hankei*Enko.m_dHenpeiRitsu;
        PEx2.Y := Y1+Hankei;
      end
      else
      begin
        PEx1.X := X1-Hankei;
        PEx1.Y := Y1-Hankei*Enko.m_dHenpeiRitsu;
        PEx2.X := X1+Hankei;
        PEx2.Y := Y1+Hankei*Enko.m_dHenpeiRitsu;
      end;

      // 円弧の設定
      LineSetting(Enko.Root);

      // mm→dot変換
      Change_mm_dot_Point(PEx1, P1);
      Change_mm_dot_Point(PEx2, P2);

      // ソリッドかどうか
      if IsSolid then
        ACanvas.Brush.Style := bsSolid
      else
        ACanvas.Brush.Style := bsClear;

      // 円弧の描画
      if Enko.m_bZenEnFlg = 1 then
      begin
        // 円・全円ソリッド
        ACanvas.Ellipse(P1.X,P1.Y,P2.X,P2.Y);
      end
      else
      begin
        // 円弧
        P3.X := Round( ((x1+Hankei*Cos(Hajime)))*MM_dot+OriginPoint.X);
        P3.Y := Round(-((y1+Hankei*Sin(Hajime)))*MM_dot+OriginPoint.Y);
        P4.X := Round( ((x1+Hankei*Cos(Owari )))*MM_dot+OriginPoint.X);
        P4.Y := Round(-((y1+Hankei*Sin(Owari )))*MM_dot+OriginPoint.Y);

        if (P3.X <> P4.X) or (P3.Y <> P4.Y) then
        begin
          if Enko.m_bZenEnFlg = 0 then
          begin
            // 円弧
            if (Enko.m_radEnkoKaku < 0) then
              ACanvas.Arc(P1.X,P1.Y,P2.X,P2.Y,P4.X,P4.Y,P3.X,P3.Y)
            else
              ACanvas.Arc(P1.X,P1.Y,P2.X,P2.Y,P3.X,P3.Y,P4.X,P4.Y);
          end
          else if Enko.m_bZenEnFlg = 2 then
          begin
            // 弓形ソリッド
            if (Enko.m_radEnkoKaku < 0) then
              ACanvas.Chord(P1.X,P1.Y,P2.X,P2.Y,P4.X,P4.Y,P3.X,P3.Y)
            else
              ACanvas.Chord(P1.X,P1.Y,P2.X,P2.Y,P3.X,P3.Y,P4.X,P4.Y);
          end
          else if Enko.m_bZenEnFlg = 3 then
          begin
            // 扇形ソリッド
            if (Enko.m_radEnkoKaku < 0) then
              ACanvas.Pie(P1.X,P1.Y,P2.X,P2.Y,P4.X,P4.Y,P3.X,P3.Y)
            else
              ACanvas.Pie(P1.X,P1.Y,P2.X,P2.Y,P3.X,P3.Y,P4.X,P4.Y);
          end;
        end;
      end;
    end;
  end;


  // ソリッド図形の描画
  procedure DrawSolid(Solid: CDataSolid);
  var
    poly: array[0..3] of TPoint;
    Enko: CDataEnko;
  begin
    if LayerCheck(Solid.Root) then
    begin
      if Solid.Root.m_nPenStyle > 100 then
      begin
        if Solid.Root.m_nPenStyle = 101 then
        begin
          //円のソリッド
          Enko.Root := Solid.Root;
          Enko.m_start_x := Solid.m_start_x;
          Enko.m_start_y := Solid.m_start_y;
          Enko.m_dHankei := Solid.m_end_x;
          Enko.m_radKaishiKaku := Solid.m_DPoint2_y;
          Enko.m_radEnkoKaku := Solid.m_DPoint3_x;
          Enko.m_radKatamukiKaku := Solid.m_DPoint2_x;
          Enko.m_dHenpeiRitsu := Solid.m_end_y;
          ACanvas.Pen.Color := Solid.m_Color;
          ACanvas.Brush.Color := ACanvas.Pen.Color;
          if Solid.m_DPoint3_y = 100 then
            Enko.m_bZenEnFlg := 1   // 全円ソリッド
          else if Solid.m_DPoint3_y = 5 then
            Enko.m_bZenEnFlg := 2   // 弓形ソリッド ※2は適当
          else if Solid.m_DPoint3_y = 0 then
            Enko.m_bZenEnFlg := 3   // 扇形ソリッド ※3は適当
          else if Solid.m_DPoint3_y = -1 then
            Enko.m_bZenEnFlg := 4   // 外側円弧ソリッド・・・どんな処理?
          else
            Enko.m_bZenEnFlg := 10; // 処理しない  ※10は適当
          if Enko.m_bZenEnFlg < 10 then
            DrawEnko(Enko, True);
        end
        else if Solid.Root.m_nPenStyle = 101 then
        begin
          // 円環ソリッド・・・どんな処理?
        end
        else if Solid.Root.m_nPenStyle = 111 then
        begin
          // 円周ソリッド・・・どんな処理?
        end;
      end
      else
      begin
        // ソリッド
        // mm→dot変換
        Change_mm_dot_Point(PointEx(Solid.m_start_x  , Solid.m_start_y  ), Poly[0]);
        Change_mm_dot_Point(PointEx(Solid.m_end_x    , Solid.m_end_y    ), Poly[1]);
        Change_mm_dot_Point(PointEx(Solid.m_DPoint2_x, Solid.m_DPoint2_y), Poly[2]);
        Change_mm_dot_Point(PointEx(Solid.m_DPoint3_x, Solid.m_DPoint3_y), Poly[3]);
        ACanvas.Pen.Color := Solid.m_Color;
        ACanvas.Brush.Color := ACanvas.Pen.Color;
        ACanvas.Polygon(poly);
      end;
    end;
  end;


  // ソリッド図形
  for I := Low(JWWSolid) to High(JWWSolid) do
    DrawSolid(JWWSolid[I]);

|

« ☆JWWのクリップボードを読み込んでみる。 | トップページ | ■最近・・・。 »