2018年2月10日土曜日

C#で、JW_CADの外部変形用のファイル(JWC_TEMP.TXT)からSVG生成用のGraphicsPathを生成する

JW_CADには「外部変形」という機能があります。
JW_CADが指定のデータを一時ファイルに出力し、ユーザが機能を拡張できる仕組みです。

外部変形の使い方
JWのCADの使い方ー 外部変形プログラム

一時ファイルの仕様はこちらの
DAISY DAISY.. [CAD]
このあたり
jwc_temp.txtの解説(Jw_win)#単線
を参考にさせてもらいました。


コードは概要は下記のようになります。

・ほとんど置き換えているだけで特殊な処理は必要ありませんでした

・Y座標の上下が異なる(JW_CADは左下が原点)のでそこは反転しています

・参考にさせていただいた上記URLには、正円弧に関して
語尾の「1」と「0」は、それぞれ偏平率と軸角。正円弧の場合は「1」と「0」固定でよい
と記載がありましたが、私の環境(8.01b)では
正円弧を作成した後に回転すると末尾の「0」が「90」など回転させた数値になる
となりました

・「曲線」で作成された図形はJW_CADの内部では直線群として扱われているようです

・結果、「単線」「正円」「正円弧、楕円、楕円弧」の3種類のみの処理となりました

ということで、すっきりとした実装になりました。


※「jwwTempItem」はJWC_TEMP.TXTの情報を保持する自作オブジェクトクラス
※GraphicsPath : System.Drawing.Drawing2D.GraphicsPath
※「単線」は単純に座標を移しているだけなので割愛
※90DPIのSVGにするために、別途「(float)((float)90 / (float)25.4)」を乗じています


// --正円の生成 ->
GraphicsPath path = new GraphicsPath();
float x = jwwTempItem.Center.X - jwwTempItem.Radius;
float y = (jwwTempItem.Center.Y * (float)-1.0) - jwwTempItem.Radius;
float w = jwwTempItem.Radius * (float)2.0;
float h = jwwTempItem.Radius * (float)2.0;
path.AddEllipse(x, y, w, h);
// <-正円の生成 --


// -- 円弧、楕円、楕円弧の生成 ->
GraphicsPath path = new GraphicsPath();
float x = jwwTempItem.Center.X - jwwTempItem.Radius;
float y = (jwwTempItem.Center.Y * (float)-1.0) - (jwwTempItem.Radius * jwwTempItem.AspectRatio);
float w = jwwTempItem.Radius * (float)2.0;
float h = jwwTempItem.Radius * (float)2.0 * jwwTempItem.AspectRatio;
float startAngle = jwwTempItem.StartAngle * (float)(-1.0);
float sweepAngle = (jwwTempItem.EndAngle - jwwTempItem.StartAngle) * (float)-1.0;
if (jwwTempItem.EndAngle <= jwwTempItem.StartAngle)
{
    sweepAngle = (jwwTempItem.EndAngle + 360 - jwwTempItem.StartAngle) * (float)-1.0;
}
path.AddArc(x, y, w, h, startAngle, sweepAngle);

// 回転
Matrix matrix = new Matrix();
matrix.RotateAt(jwwTempItem.ShaftAngle * (float)(-1.0), new PointF(jwwTempItem.Center.X, jwwTempItem.Center.Y * (float)-1.0));
path.Transform(matrix);
// <- 円弧、楕円、楕円弧の生成 --



JW_CADで外部変形の範囲選択を行ったところ

変換後のSVGファイルをInkscapeで開いたところ

うぇーい

0 件のコメント:

コメントを投稿