WingFlutter

Always stand on the egde…

翼型datファイルを読み込み、点結びしたdxfファイルに出力するpythonコード

学生の頃、点むすびというexcelアドインを使ってdatファイルをdxfファイルに出力する作業を行っていた。
最近調べてみるとそのアドインが置いてあったサイトがなくなっていることに気づいた。

そんなわけでタイトルにあるpythonコードを作成してみた。

実行環境
python 3.11.3

必要なモジュール
・dxfgrabber 1.0.1
・ezdxf 1.0.3

import tkinter as tk
from tkinter import filedialog
import dxfgrabber
import ezdxf

# ファイル選択ダイアログを表示し、datファイルを選択する
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(filetypes=[('DAT Files', '*.dat')])

# datファイルから座標データのみを読み取る
points = []
with open(file_path, 'r') as f:
    for line in f:
        try:
            x, y = map(float, line.strip().split())
            points.append([x, y])
        except ValueError:
            pass

# dxfファイルを作成する
doc = ezdxf.new('R2010')
msp = doc.modelspace()

# 点を描画する
for i in range(len(points) - 1):
    msp.add_line(points[i], points[i + 1])

# dxfファイルを保存する
save_path = filedialog.asksaveasfilename(defaultextension='.dxf', filetypes=[('DXF Files', '*.dxf')])
if save_path:
    doc.saveas(save_path)

dae21翼型をdxfファイル出力した結果を示す。

dae21.dxf

airfoiltools.comの翼型datデータは最初2行が座標ではなく、
かつ翼上面と下面が真ん中改行で分かれている。一応airfoiltools.comのdatデータをそのままコピーしたと仮定してコードを修正した。

airfoiltools.com

import tkinter as tk
from tkinter import filedialog
import dxfgrabber
import ezdxf

# ファイル選択ダイアログを表示し、datファイルを選択する
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(filetypes=[('DAT Files', '*.dat')])

# datファイルから座標データのみを読み取る
points = []
with open(file_path, 'r') as f:
    data_lines = f.read().splitlines()
    data_lines = data_lines[2:]  # 最初の2行を無視
    for line in data_lines:
        try:
            x, y = map(float, line.strip().split())
            points.append([x, y])
        except ValueError:
            pass

# 上側の座標と下側の座標を閉じる
if len(points) >= 2:
    points.append(points[0])

# dxfファイルを作成する
doc = ezdxf.new('R2010')
msp = doc.modelspace()

# 点を描画する
for i in range(len(points) - 1):
    msp.add_line(points[i], points[i + 1])

# dxfファイルを保存する
save_path = filedialog.asksaveasfilename(defaultextension='.dxf', filetypes=[('DXF Files', '*.dxf')])
if save_path:
    doc.saveas(save_path)

dxfファイル出力した結果を示す。

dae21翼型dxfファイル

上面のプロットと下面のプロットをつなぐ際に、
(0,0)と(1,0)の座標が線で結ばれてしまっているがあえて直していない。
(自分が使うときに結局前縁と後縁をつないでしまうため。)

datファイルをエクセルに張り付けて点結びのアドインを使うよりかは作業が楽になるかな~