【Python】批量提取Fibersim xml文件中的节点网格数据

发布时间 2023-03-22 21:42:45作者: hayden_william

程序功能:

  • 输入需求:
    • fibersim导出的ply 的xml文件,可以很多个也没问题。但名字要有规律,不然没法循环读写。比如我自己用的就是x1.xml、x2.xml、Y1.xml......的文件名
    • 定义一些需要的变量,看名字都可以知道什么意思
  • 输出:
    • 程序会输出每个xml文件中每个ply对应的node.csv和mesh.csv

code

import re
# 打开一个txt文本文件,写入所有ply信息
Finfo=open('Plyinfo.txt','w')

# define vars
prefix_1=['x','Y']
prefix_2=range(1,14)
xmlsDir='I:\\3 Group Project\\05 Focus on propeller surface\\20230314\\20230316-xml\\'

# start loop
for q in prefix_1:
    for p in prefix_2:
        print('now='+q+str(p))
        numOfElem=0
        numOfNode=0
        fibersimXmlPath=xmlsDir+q+str(p)+'.xml'
        with open(fibersimXmlPath, 'r',encoding="utf-8") as f1:
            flag=0
            for i in f1:
                if '<Ply' in i:
                    # split string i
                    i=i.split('"')
                    # get the name of Ply
                    ply_name=i[-2]
                    node_file_name=ply_name+'_node.csv'
                    mesh_file_name=ply_name+'_mesh.csv'
                    # Finfo.write('')
                if '<Material' in i:
                    i=i.split('"')
                    ply_thickness=i[-2]
                    # 把ply 铺层的信息都写入为一行,逗号分隔,方便在matlab中使用split和str2num函数转化为可用的检索信息 
                    Finfo.write(ply_name+','+ply_thickness+','+node_file_name+','+mesh_file_name+'\n')
                    
                if '<Mesh_Point_Table' in i :
                    # 检测到节点的起始,打开文件
                    fn = open(node_file_name, 'w')
                    fn.write('node_index,X Coordinate,Y Coordinate,Z Coordinate\n')
                    flag=1
                if '</Mesh_Point_Table' in i:
                    print('!'+q+str(p)+' number of nodes ='+str(numOfNode))
                    flag=0
                    numOfNode=0
                    fn.close()
                    
                if '<Mesh_Polygon_Table' in i :
                    fm = open(mesh_file_name, 'w')
                    fm.write('element_index,Node 1,Node 2,Node 3,Warp ,Weft\n')
                    flag=2
                if '</Mesh_Polygon_Table' in i:
                    print('!'+q+str(p)+'  number of elements ='+str(numOfElem))
                    print(numOfElem)
                    fm.close()
                    numOfElem=0
                    flag=0
                #进入下一行
                # true则表示,现在遍历为节点信息
                if '<R/>' in i:
                    # 说明现在是单元信息
                    if flag==2:
                        # elem index
                        numOfElem=numOfElem+1
                        temp=i.replace('<R/>','')
                        mcsvline=temp.replace(' ', ',')
                        mcsvline=str(numOfElem)+','+mcsvline
                        fm.write(mcsvline)
                    elif flag==1 :
                       # , not in i 说明现在是节点信息
                        numOfNode=numOfNode+1
                        temp=i.replace('<R/>','')
                        csvline=temp.replace(' ', ',')
                        csvline=str(numOfNode)+','+csvline
                        fn.write(csvline)
Finfo.close()