問題
Autodesk Fusionで、スプライン曲線を含むスケッチをDXF形式で保存して、Inkscapeで開くとスプライン曲線が表示されない。
原因
Autodesk Fusionでは、5次のスプラインを用いて滑らかな曲線を実現している。一方、他の多くのソフトでは3次のスプラインしかサポートしていないため、Fusionから書き出したDXFを他のソフトで表示すると、スプラインが消える可能性がある。
解決方法
- 下絵を取り込んで手作業でトレースする
- スプラインをポリラインに変換する
ここでは、2 の方法をとる。具体的な手段としては、
- AutoCAD の SPLINEDIT コマンドを使う → AutoCAD持ってない
- Fusionのアドインである DXF Spline To Polyline を使う → 試したがうまくいかない
- オンラインの変換ツールを使う → 試したがうまくいかない
- PythonでDXFファイルを変換するスクリプトを書く → 成功
ひとまず 4 の方法を採用することにする。
実装
まず、ezdxfライブラリをインストールする。
pip install ezdxf
import ezdxf # スプラインをポリラインに変換 # input_file : 入力ファイル名 (DXF) # output_file : 出力ファイル名 (DXF) # segments : 線分の数 def spline_to_polyline(input_file: str, output_file: str, segments: int = 100): # DXFファイルを読み込み、モデル空間を取得 doc = ezdxf.readfile(input_file) msp = doc.modelspace() # モデル空間に含まれる各々のスプライン要素をポリライン要素に変換 for spline in msp.query("SPLINE"): # スプラインを、指定した数の線分で近似し、その頂点を取得 points = spline.construction_tool().approximate(segments) # 取得した頂点から新しいポリラインを作成してモデル空間に追加 msp.add_lwpolyline(points, format="xy", close=False) # 元のスプラインを削除 msp.delete_entity(spline) # DXFファイルに保存 doc.saveas(output_file) print(f"スプラインがポリラインに変換され、{output_file}に保存されました。") # 使い方 input_dxf = "input.dxf" output_dxf = "output.dxf" spline_to_polyline(input_dxf, output_dxf)
※ Inkscapeで読み込むとなぜか隅に点のようなものが表示されるが、「グループ解除」を2回実行してから点だけ削除する。(暫定措置)
