原创 迈达斯GTS-NX网格模型(FPN)导入Flac3D 6.0 源码

这是一个基于Python编写的程序,用于将MidasGTSNX的FPN文件转换为Flac3D6.0的.f3grid和.f3dat模型文件。用户需要确保FPN文件中的节点重新编号,且不同类型的单元分组名称不重复。程序首先读取节点和单元信息,然后分别转换实体和结构单元,生成的文件会保存在相同目录下,分组名保持原样。转换完成后,用户需在Flac3D中通过特定命令导入生成的文件。
摘要由CSDN通过智能技术生成
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")



  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值