【解決方法】DXF ポリライン円弧をバルジから Gcode に変換します

プログラミングQA


VB.net で DXF ファイルを GRBL レーザー用の GCode に変換するアプリケーションを作成しています。 無料または低価格のプログラムがたくさんあることは承知していますが、私はこのプログラムが非常に特殊な方法で機能することを望んでいます (理由はここでは説明しきれないほどあります)。 私はこのプログラムに約 6 か月間取り組んできましたが、最後の「ステップ」に到達しました。

ポリラインの円弧セグメントを GCode (G02 または G03 を使用) に変換するのに助けが必要です。

標準では、DXF は円弧セグメントを開始点、終了点、およびバルジとして保存します。 したがって、これらの 3 つの変数があります。 円弧の半径は 4*Atan(膨らみ) であることがわかっているので、円弧の角度を計算することができます。 私が必要とするのは、G02 または G03 を使用してこれを GCode (または .nc ファイル) に変換する方法です。 +bulge は反時計回り、-bulge は時計回りであることはわかっているので、大した問題ではありません。

しかし、今はどうなっているでしょうか? G02 と G3 には円弧の中心が必要ですが、どうすれば取得できますか? これについて別の方法はありますか?

ここで何か助けていただければ非常に感謝しています。 ありがとう!

私が試したこと:

Google 検索、DXF から GCode コンバータ、Autodesk Fusion 360

解決策 1

ここではC#で…

C#
public static List<LinhaGCode> Bulge2IJ(double X1, double Y1, double X2, double Y2, double Bulge, Config config)
        {
            double C = 0; //lunghezza della corda - length of the cord
            double H = 0; //altezza del triangolo - height of the triangle
            double alpha2 = 0; //mezzo angolo di arco  - half arc angle
            double beta = 0; //angolo della corda rispetto agli assi - orientation of the segment
            List<LinhaGCode> lista = new List<LinhaGCode>();
            double I, J, R;

            if (Bulge != 0)
            {
                C = Math.Sqrt(Math.Pow((X2 - X1), 2) + Math.Pow((Y2 - Y1), 2));
                alpha2 = Math.Atan(Bulge) * 2;
                R = Math.Abs(C / (2 * Math.Sin(alpha2)));
                H = Math.Sqrt(Math.Pow(R, 2) - Math.Pow((C / 2), 2));

                if ((Bulge > 1) || ((Bulge < 0) && (Bulge > -1)))
                {
                    alpha2 = alpha2 + Math.PI;
                }

                if (X1 != X2)
                {
                    beta = Math.Atan(System.Convert.ToDouble(Y2 - Y1) / System.Convert.ToDouble(X2 - X1));
                    if (X2 < X1)
                    {
                        beta = beta + Math.PI;
                    }
                }
                else
                {
                    if (Y2 < Y1)
                    {
                        beta = (-1) * (Math.PI / 2);
                    }
                    else
                    {
                        beta = Math.PI / 2; ;
                    }
                }

                if ((Bulge > 1) || ((Bulge < 0) && (Bulge > -1)))
                {
                    I = (X2 - X1) / 2 + (Math.Cos(beta - Math.PI / 2) * H);
                    J = (Y2 - Y1) / 2 + (Math.Sin(beta - Math.PI / 2) * H);
                }
                else
                {
                    I = (X2 - X1) / 2 - (Math.Cos(beta - Math.PI / 2) * H);
                    J = (Y2 - Y1) / 2 - (Math.Sin(beta - Math.PI / 2) * H);
                }
                if (Bulge > 0)
                {
                    lista.Add(new LinhaGCode("G03", X2, Y2, config.Z_G03, I, J));
                }
                else
                {
                    lista.Add(new LinhaGCode("G02", X2, Y2, config.Z_G03, I, J));
                }
            }
            else
            {
                lista.Add(new LinhaGCode("G01", X2, Y2, config.Z_G01));
            }
            return lista;
        }

解決策 2

こんにちは、アドアです
手伝って頂けますか
ありがとう

コメント

タイトルとURLをコピーしました