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文件打开成功!")breakelse: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"):breaklist = 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 = 0Line_Text = file.readline()  # 此时Line_Text值为:$$      Elementwhile (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 + 1if ("PRISM" in Line_Text):list = Line_Text.split(",")element_list.append(list)PRISM = PRISM + 1if ("PYRAM" in Line_Text):list = Line_Text.split(",")element_list.append(list)PYRAM = PYRAM + 1if ("TETRA" in Line_Text):list = Line_Text.split(",")element_list.append(list)TETRA = TETRA + 1if ("LINE" in Line_Text):list = Line_Text.split(",")list[5] = list[5].strip('.')list[6] = list[6].strip('.')element_list.append(list)LINE = LINE + 1if ("RECT" in Line_Text):list = Line_Text.split(",")element_list.append(list)RECT = RECT + 1if ("TRIA" in Line_Text):list = Line_Text.split(",")element_list.append(list)TRIA = TRIA + 1print("\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):breakLine_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) + 1else:num = (i // 8)Text = ""  # 读取单元号j = 0while (j <= (num - 1)):T = file.readline().strip().replace(" ", "")Text = Text + Tj = j + 1str_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) + 1else:num = (i // 8)Text = ""  # 读取单元号j = 0while (j <= (num - 1)):T = file.readline()j = j + 1Line_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)-1j=1while (j<n):if(i[j] in Z ):judge = Trueelse:judge = Falsej = j + 1if(judge):out_file.write("ZGROUP\t"+"'"+i[0]+"'\n")j=1while(j<=n):out_file.write(i[j]+"\t")j=j+1out_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_listStruct_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=Truebreakelse:judge=Falseif(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)-1k=1while(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 源码相关推荐

  1. Midas GTS NX 的中性FPN文件转为 FLAC3D5.0的模型 c++源码 (FPN to FLAC3D)

    FPN文件转为 FLAC3D5.0的模型 1.使用方法    新增:依据Midas中的网格组,将FLAC3D的模型进行分组的程序,无需再填写属性,数据导出之前一定要执行步骤(1), (链接:https ...

  2. matlab 双层规划求解,双层规划模型的遗传算法求解的Matlab源码

    双层规划模型的遗传算法求解的Matlab源码 双层规划模型的遗传算法求解的Matlab源码 function [BESTX,BESTY,ALLX,ALLY]=GAU (KU,KD,NU,ND,PmU, ...

  3. 第一次作业:对于Linux2.6.0源码中进程模型的分析

    摘要: 作为第一次写博客,可能在排版,页面布局等方面会有大大小小的失误和不足,希望阅读者可以指出,笔者会继续学习,锻炼自己的博客水平:作为第一次分析Linux操作系统,基于进程模型的理解,在不是很熟悉 ...

  4. 用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)

    用Linux/ C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架 前言 服务器端源码 客户端源码 自定义库 helper.c 和 helper.h helper.c helper.h M ...

  5. 【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】

    多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10) 数学推导 在之前实现的模型普遍都是单输入单输出模型,显然,在现实 ...

  6. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  7. 深度学习大模型训练--分布式 deepspeed PipeLine Parallelism 源码解析

    deepspeed PipeLine Parallelism 源码解析 basic concept PipeDream abstract 1F1B 4 steps Code comprehension ...

  8. matlab人口迁移模型,人口迁移优化算法MATLAB源码

    人口迁移算法是进化计算领域新出现的一种优化算法,它通过模拟人类社会人口迁移的社会现象,来构造启发式规则,提出的一种新型智能优化算法,GreenSim团队实现了该算法,并加入了一点小改进.本源码由Gre ...

  9. mysql服务器多线程模型_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码 - 陈彦斌 - 博客园...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  10. Transformer课程第39章:面向Knowledge-intensive任务的Transformer模型RAG的架构及完整源码实现

    1,为何Transformer网络能够存储factual knowledge信息? 2,pretrained dense retrieval数学原理分析 3,sequence-to-sequence ...

最新文章

  1. 4.12—002—周五
  2. python新人一月工资_python【项目】:工资管理(简易版)
  3. 在lean trace mode下运行function
  4. 7.33oracle安装不了,在RedHat7.0下安装Oracle的经历
  5. 【竞赛题解】第22次CCF计算机软件能力认证 B
  6. 很有用很有效的操作之批量操作一组图片
  7. MUI 如何更改单选框样式
  8. SaltStack配置管理之Gains与State测试
  9. P3986 斐波那契数列
  10. 实现简单的python爬虫功能
  11. 利用 LSTM 神经网络预测股价走势
  12. 手机安装W ndows7镜像,Windows7ISO镜像安装系统教程
  13. CSS实现平行四边形
  14. AliOS Things的SDK ESP8266 连接阿里生活物联网平台 配网失败解决方案
  15. 【亲测有效】解决 Ubuntu 虚拟机无法共享文件夹的问题
  16. 免费英文在线翻译-英文自动翻译
  17. 2019年(本命年)个人总结
  18. 《全国青少年软件编程等级考试》2021年3月C语言一级真题(含答案)
  19. 前端自学路线 更新11.11
  20. 英语影视台词---绿皮书(2)(利普 我以为你要把那家伙打死了)

热门文章

  1. 人工智能研究所使用方法,持续更新~
  2. Day 177/200 React 颜色选择器
  3. 整理了100个必备的 Python 函数,值得收藏
  4. 老男孩python全栈3期_Python/Python3视频教程2017老男孩Python全栈工程师3期基础Python3.5...
  5. 质量数据分析工具软件的应用
  6. mysql5.7绿色版安装与卸载教程
  7. 曲线运动与万有引力公式_物质自旋与力的形成 ——关于万有引力与磁荷力本质与统一问题的探讨...
  8. 1925异常 xshell_Xmanager Power Suite 6
  9. 隧道人员定位管理系统
  10. IT基础架构变革,Hitachi Vantara如何解决超融合(HCI)的真正痛点?