print("*".center(105,"*"))
print("将Midas GTS NX的FPN中性文件转为Flac3D 6.0模型文件(基于python语言编写 )".center(80," "))
print("西南交通大学:李泽星".center(90," "))
print("使用说明:1.需要转换的fpn文件需要放在和该程序相同的文件夹下")
print("\t 2.生成的结果文件位于同一个文件夹下")
print("\t 3.转换出来的单元group名:GTS NX中网格组名(这也是这个版本的最大优点!!!)")
print("\t 4.Midas GTS 生成和实体单元耦合的平面单元时,建议使用析取功能")
print("\t 5.三维实体单元文件为.f3grid,线或者平面等结构单元文件为.f3dat")
print("\t 在Flac3D中,通过zone import '文件名.f3grid'和program call '文件名.f3dat'命令调用")
print("\t 在同时具有实体单元和结构单元的模型中,请先导入实体单元文件,再导入结构单元文件,否则结构-实体间不会自动生成link")
print("\t 一般而言,结构单元导入后,会自动生成link,如果没有,需要用户在Flac3D里面手动设置")
print("注意事项:在导出FPN文件前,需要注意以下几点,否则Flac3D不能正确生成网格")
print("\t 1.Midas GTS NX输出FPN文件前,必须对节点重新编号(且起始号须为1)!!!")
print("\t 2.Midas GTS NX对单元分组命名时,不同类型的单元(实体、平面、线)分组名称不能相同")
print("\t 例如:线单元和平面单元不能使用同一个分组名")
print("\t 3.Midas GTS 划分网格单元时,不能有网格在“默认网格组”里面,且分组名不能有逗号,建议不要有空格")
print("*".center(105,"*"))
# 判断FPN文件是否存在
import os
import sys
while True:
FPN_name = input("请打开FPN文件(无需输入文件后缀名).fpn:")
FPN_name = FPN_name + ".fpn"
judge = os.path.isfile(FPN_name)
if judge:
print("\t文件打开成功!")
break
else:
print("\t文件打开失败,请重新输入:")
# 读取FPN文件
with open(FPN_name, mode='rt', encoding='GBK') as file:
Line_Text = "NULL"
while (Line_Text != "$$ Node\n"):
Line_Text = file.readline()
# 此时指针指向第一个NODE
# 读取节点信息---------------------------------------------------------------------
print("开始读入节点信息:")
Line_Text = "NODE"
node_list = []
while (Line_Text[0:4] == "NODE"):
Line_Text = file.readline().strip().replace(" ", "").rstrip(",")
if (Line_Text[0:4] != "NODE"):
break
list = Line_Text.split(",")
list[2] = list[2].strip('.')
list[3] = list[3].strip('.')
list[4] = list[4].strip('.')
node_list.append(list)
print("\t共导入" + str(len(node_list)) + "个节点")
# 此时Line_Text值为空
# 开始读取单元信息---------------------------------------------------------------
print("开始读入单元信息:")
element_list = []
HEAX = PRISM = PYRAM = TETRA = LINE = RECT = TRIA = 0
Line_Text = file.readline() # 此时Line_Text值为:$$ Element
while (Line_Text != ""):
Line_Text = file.readline().strip().replace(" ", "").rstrip(",")
if ("HEXA" in Line_Text):
list=( Line_Text+file.readline().strip().replace(" ", "").rstrip(",")).split(",")
element_list.append(list)
HEAX = HEAX + 1
if ("PRISM" in Line_Text):
list = Line_Text.split(",")
element_list.append(list)
PRISM = PRISM + 1
if ("PYRAM" in Line_Text):
list = Line_Text.split(",")
element_list.append(list)
PYRAM = PYRAM + 1
if ("TETRA" in Line_Text):
list = Line_Text.split(",")
element_list.append(list)
TETRA = TETRA + 1
if ("LINE" in Line_Text):
list = Line_Text.split(",")
list[5] = list[5].strip('.')
list[6] = list[6].strip('.')
element_list.append(list)
LINE = LINE + 1
if ("RECT" in Line_Text):
list = Line_Text.split(",")
element_list.append(list)
RECT = RECT + 1
if ("TRIA" in Line_Text):
list = Line_Text.split(",")
element_list.append(list)
TRIA = TRIA + 1
print("\t共有" + str(len(element_list)) + "个单元")
if(HEAX!=0):
print("\t其中有块体网格(6个面 8个顶点):" + str(HEAX) + "个")
if (PRISM != 0):
print("\t其中有三棱柱体网格(5个面 6个顶点):" + str(PRISM) + "个")
if (TETRA != 0):
print("\t其中有四面体网格(3个面 4个顶点):" + str(TETRA) + "个")
if (PYRAM != 0):
print("\t其中有棱锥体网格(5个面 5个顶点):" + str(PYRAM) + "个")
if (LINE != 0):
print("\t其中有线单元:" + str(LINE) + "个")
if (TRIA != 0):
print("\t其中三角形平面单元:" + str(TRIA) + "个")
if (RECT != 0):
print("\t其中四边形平面单元:" + str(RECT) + "个")
# 读取网格分组信息--------------------------------------------------------------------------
print("开始读取网格分组信息:")
# 此时Line_Text值为:空值
while (True):
Line_Text = file.readline()
if ("默认网格组" in Line_Text):
break
Line_Text = file.readline()
Line_Text = file.readline() # 读到用户开始自定义分组的上一行
Group_list = []
Text = ""
Line_Text = file.readline().strip().replace(" ", "")
while (Line_Text[0:4] == "MSET"): #读取分组信息的循环
list = Line_Text.split(",") # 将有分组名那一行换成列表
group_name = list[2]
Text = file.readline().strip().replace(" ", "") # 读取MSETE那一行
list = Text.split(",")
i = int(list[2]) # 获取单元数
if (i % 8 != 0):
num = (i // 8) + 1
else:
num = (i // 8)
Text = "" # 读取单元号
j = 0
while (j <= (num - 1)):
T = file.readline().strip().replace(" ", "")
Text = Text + T
j = j + 1
str_Group_list = str((group_name) + Text).rstrip(",") # 此处生成单元分组信息列表
alone_Group_list = str_Group_list.split(",")
Group_list.append(alone_Group_list)
L = file.readline().strip().replace(" ", "") # 读取MSETN 那一行
list = L.split(",")
i = int(list[2]) # 获取结点数
if (i % 8 != 0):
num = (i // 8) + 1
else:
num = (i // 8)
Text = "" # 读取单元号
j = 0
while (j <= (num - 1)):
T = file.readline()
j = j + 1
Line_Text = file.readline().strip().replace(" ", "") # 读取下一个MSET 分组信息
print("\t共有" + str(len(Group_list)) + "个分组")
#实体单元转换----------------------------------------------------------------------
print("开始转换实体单元,请稍等(网格数量较多时,运行时间较长,请耐心等待):")
f3grid_name=FPN_name.strip(".fpn")+".f3grid"
with open(f3grid_name, mode='wt',encoding='utf-8') as out_file:
for i in node_list:
out_file.write("G\t"+i[1]+"\t"+i[2]+"\t"+i[3]+"\t"+i[4]+"\t\n")
Z=[]
for j in element_list:
if(j[0]=="TETRA"):
out_file.write("Z\t" + "T4"+ "\t" + j[1] + "\t" + j[3] + "\t" + j[4]+ "\t" + j[5]+ "\t" + j[6] + "\t\n")
Z.append(j[1])
if (j[0] == "PRISM"):
out_file.write("Z\t" + "W6" + "\t" + j[1] + "\t" + j[4] + "\t" + j[3] + "\t" + j[7] + "\t" + j[5] + "\t" + j[6]+ "\t" + j[8]+ "\t\n")
Z.append(j[1])
if (j[0] == "PYRAM"):
out_file.write("Z\t" + "P5" + "\t" + j[1] + "\t" + j[3] + "\t" + j[4] + "\t" + j[6] + "\t" + j[7] + "\t" + j[5]+ "\t\n")
Z.append(j[1])
if (j[0] == "HEXA"):
out_file.write("Z\t" + "B8" + "\t" + j[1] + "\t" + j[3] + "\t" + j[4] + "\t" + j[6] + "\t" + j[7] + "\t" + j[5]+ "\t" + j[10]+ "\t" + j[8]+ "\t" + j[9]+"\t\n")
Z.append(j[1])
for i in Group_list:
n=len(i)-1
j=1
while (j<n):
if(i[j] in Z ):
judge = True
else:
judge = False
j = j + 1
if(judge):
out_file.write("ZGROUP\t"+"'"+i[0]+"'\n")
j=1
while(j<=n):
out_file.write(i[j]+"\t")
j=j+1
out_file.write("\n")
print("\t转换成功!结果已保存至:"+f3grid_name)
# 结构单元转换----------------------------------------------------------------------
f3dat_name=FPN_name.strip(".fpn")+".f3dat"
with open(f3dat_name, mode='wt',encoding='utf-8') as out_struct:
#node_list, Group_list,element_list
Struct_element_list=[]
Struct_group_list=[]
for i in element_list:
if (i[0] == "RECT" or i[0] == "LINE" or i[0] =="TRIA" ):
Struct_element_list.append(i)
if(Struct_element_list==[]):
os.system("pause")
sys.exit(0)
for i in Group_list:
for j in Struct_element_list:
if(j[1] in i):
judge=True
break
else:judge=False
if(judge):Struct_group_list.append(i)
print("开始转换结构单元,请稍等:")
print("\t请为结构单元分组设置单元类型:(按照类型输入beam、cable、pile、shell、geogrid、liner。切勿输错)")
for i in Struct_group_list:
print("\t请为结构单元分组 "+i[0]+" 设置单元类型:",end="")
rename=input()
print("\t请为结构单元分组 " + i[0] + " 设置id号:", end="")
id_rename = input()
n=len(i)-1
k=1
while(k<=n):
for j in Struct_element_list:
if(j[1]==i[k] and j[0]=="RECT"):
out_struct.write("structure "+rename+" create by-quadrilateral ")
out_struct.write(str(node_list[int(j[3])-1][2])+" "+str(node_list[int(j[3])-1][3])+" "+str(node_list[int(j[3])-1][4])+" ")
out_struct.write(str(node_list[int(j[4])-1][2])+" "+str(node_list[int(j[4])-1][3])+" "+str(node_list[int(j[4])-1][4])+" ")
out_struct.write(str(node_list[int(j[5])-1][2])+" "+str(node_list[int(j[5])-1][3])+" "+str(node_list[int(j[5])-1][4])+" ")
out_struct.write(str(node_list[int(j[6])-1][2])+" "+str(node_list[int(j[6])-1][3])+" "+str(node_list[int(j[6])-1][4])+" id="+str(id_rename)+" group "+"'"+i[0]+"'\n")
if (j[1] == i[k] and j[0] == "TRIA"):
out_struct.write("structure " + rename + " create by-triangle position ")
out_struct.write(str(node_list[int(j[3])-1][2]) + " " +str(node_list[int(j[3])-1][3] )+ " " + str(node_list[int(j[3])-1][4]) + " ")
out_struct.write(str(node_list[int(j[4])-1][2]) + " " +str(node_list[int(j[4])-1][3]) + " " +str( node_list[int(j[4])-1][4]) + " ")
out_struct.write(str(node_list[int(j[5])-1][2]) + " " +str(node_list[int(j[5])-1][3] )+ " " + str(node_list[int(j[5])-1][4]) + " id="+str(id_rename)+" group "+"'"+i[0]+"'\n")
if (j[1] == i[k] and j[0] == "LINE"):
out_struct.write("structure " + rename + " create by-line ")
out_struct.write(str(node_list[int(j[3])-1][2]) + " " + str(node_list[int(j[3])-1][3]) + " " + str(node_list[int(j[3])-1][4]) + " ")
out_struct.write(str(node_list[int(j[4])-1][2]) + " " + str(node_list[int(j[4])-1][3]) + " " + str(node_list[int(j[4])-1][4]) + " id="+str(id_rename)+" group "+"'"+i[0]+"'\n")
k=k+1
print("\t转换成功!文件已保存至:"+f3dat_name)
element_list.clear()
node_list.clear()
Struct_group_list.clear()
Struct_element_list.clear()
Z.clear()
Group_list.clear()
os.system("pause")
原创 迈达斯GTS-NX网格模型(FPN)导入Flac3D 6.0 源码
于 2021-10-29 20:36:12 首次发布
这是一个基于Python编写的程序,用于将MidasGTSNX的FPN文件转换为Flac3D6.0的.f3grid和.f3dat模型文件。用户需要确保FPN文件中的节点重新编号,且不同类型的单元分组名称不重复。程序首先读取节点和单元信息,然后分别转换实体和结构单元,生成的文件会保存在相同目录下,分组名保持原样。转换完成后,用户需在Flac3D中通过特定命令导入生成的文件。
摘要由CSDN通过智能技术生成