弦月之舞

人生不设限

CATIA导入翼型曲线&DAT文件规范化处理+绘图

飞行器设计中,翼型DAT文件处理,对于初学者来说,是个老大难问题。

首先,要说明的是:DAT只是一后缀名。其实它就是纯文本,直接用文本编辑器编辑即可,也可用程序或导入Excel处理。conf, init, log等格式同理。第一列是关键点在翼型的相对弦长位置,第二列是相对厚度,其实就是无量纲坐标。从Airfoil Tools上下载时记得下Selig Format,是按从尾到头再到尾的顺序写的,多数程序是认这个的。

用PropScan生成DXF后导入

之前一直用Profili生成的DXF,但在老外的教程中找到了Propscan这个软件。学好英文确实有用啊。

下载链接:点这。关于软件的更多信息,这个页面的最后能找到链接。作者是法国人,自己搞CNC,这也是个副产品。

导入DAT,导出DXF,再导入CATIA/CAD/SolidWorks等,比较可行。

唉,要是能自己写这程序就好了。

CATIA内的样条线

教程参考:这篇帖子

  1. 导入点。先把DAT复制一份,把文件里的翼型名字删去,确保只有数字。然后:

法1:在Digital Shape Editor中的“Import”中导入纯文本。注意:1)文件类型选“所有文件”,免得找不到DAT;2)必须有三维坐标。这就需要加一列0上去。可以用Excel自动填充,也可以写程序,比如这样:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
import pandas as pd

in_name="MH 45_catia.dat"#这里改输入文件名
out_name="MH 45_cat_import.dat"#这里改输出文件名
data_in=pd.read_csv(in_name,'\s+');#这里分隔符是任意多空白字符,包括空格、制表符、换页符
# append zeros
nl=data_in.size;
data_out=data_in.join(pd.DataFrame(np.zeros(nl).reshape((nl,1))));
print(data_out);
data_out.to_csv(out_name,'\t',index=False);

这里我把分隔符设成了TAB。

法2:用Excel宏导入,这个网上有教程。

  1. 把点转成有序几何图形集。点就会变成白色十字形。

  2. 在创成式外形设计中生成样条线。

如果它不太贴合,手动指定一些切线,在相切那里右击-直线-选相邻两点,连条直线,多来几个点,就贴合很多。

DAT格式的绘图

用Python/MATLAB不难,无非就是2列数据分别当x、y而已。没试过Tecplot,Paraview中也容易实现,网上也有。Python代码其实就是在上面的基础上加上:

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
plt.plot(data_in.iloc[:,0],data_in.iloc[:,1]
# ,scaley=False
)

plt.axis('scaled') # Either of these two settings is ok.
# plt.axis('equal') #Set the correct aspect ratio of the plot.
plt.show()

DAT格式翼型的坐标处理

在修改翼型时,常会遇到翼型前后缘坐标不是(0,0)和(1,0)的问题,引起软件报错。写了一段小程序,把翼型转正,并把坐标归一化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import numpy as np
import pandas as pd
import math
import matplotlib.pyplot as plt
in_name="TL54m1.dat"#输入文件名
out_name="TL54m1_Normalized.dat"#输出文件名
data_in=pd.read_csv(in_name,delimiter='\s+',index_col=False,header=None,skiprows=1);
#这里分隔符是任意多空白字符,包括空格、制表符、换页符
data_in=data_in.iloc[:,0:2]
#Normalize the foil - rotate
angle_to_rot = math.atan(data_in.iloc[-1:,1]/data_in.iloc[-1:,0])
M_rot=np.array([[math.cos(angle_to_rot),-math.sin(angle_to_rot)],
[math.sin(angle_to_rot),math.cos(angle_to_rot)] ])
for i in range(len(data_in.iloc[:,0])):
data_in.iloc[i,0]=np.matmul(data_in.iloc[i,0:2],M_rot)[0]
data_in.iloc[i,1]=np.matmul(data_in.iloc[i,0:2],M_rot)[1]
#Normalize the foil - scale x-axis
X_scale_factor=1/data_in.iloc[0,0]
for i in range(len(data_in.iloc[:,0])):
data_in.iloc[i,0]=data_in.iloc[i,0]*X_scale_factor;
#Plot
plt.plot(data_in.iloc[:,0],data_in.iloc[:,1])
plt.axis('scaled') # Either of these settings is ok.
# plt.axis('equal')
plt.show()
#Output
data_out = data_in.iloc[:,0:2]
data_out.columns=[in_name,' ']
data_out.to_csv(out_name,'\t',index=False,float_format='%.6e');

发表日期: 2023-07-10
更新日期: 2024-09-17
转载请注明来源。采用CC-BY-NC 4.0进行许可。