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