【问题标题】:Paraview - Using python script to export data in x3d formatParaview - 使用 python 脚本以 x3d 格式导出数据
【发布时间】:2019-08-26 22:20:09
【问题描述】:

我正在尝试使用 paraview-python 脚本以 x3d 格式导出 OpenFOAM 结果。当我通过 paraview 图形界面执行此操作时,它可以工作并且可以在 Blender 中可视化结果,请参见下图

但是,当我尝试使用以下脚本执行相同操作时

from paraview.simple import *
import fnmatch
import os
import shutil

#create alist of all vtk files
vtkFiles = []
for root, dirnames, filenames in os.walk('.'):
    for filename in fnmatch.filter(filenames, '*.vtk'):
        vtkFiles.append(os.path.join(root, filename))


vtkFilesGroups=[
    'U',
]


def ResetSession():
    pxm = servermanager.ProxyManager()
    pxm.UnRegisterProxies()
    del pxm
    Disconnect()
    Connect()


def x3dExport(output,r):
    #export in x3d format

    exporters = servermanager.createModule("exporters")
    Show(r)
    view = GetActiveView()
    render = Render()
    x3dExporter = exporters.X3DExporter(FileName=output)
    x3dExporter.SetView(view)
    x3dExporter.Write()
    ResetSession()

# group VTK files by gruop (fields in openfoam "vtkFilesGroups")
# then loop over all and save it into different formats
groupedVtkFiles=[]
for group in vtkFilesGroups:

    vtkDir = os.path.join('.', group, 'vtk')
    if not os.path.exists(vtkDir):
        os.makedirs(vtkDir)

    vtuDir = os.path.join('.', group, 'vtu')
    if not os.path.exists(vtuDir):
        os.makedirs(vtuDir)

    x3dDir = os.path.join('.', group, 'x3d')
    if not os.path.exists(x3dDir):
        os.makedirs(x3dDir)



    for stepFile in vtkFiles:
        tmp = stepFile.split(os.sep)
        oldFileName = tmp[-1].split('.')[0]
        time = tmp[-2]
        fileNameVtk = '{}_{}.vtk'.format(oldFileName, time)
        fileNameVtp = '{}_{}.vtp'.format(oldFileName, time)
        fileNameX3d = '{}_{}.x3d'.format(oldFileName, time)

        r = LegacyVTKReader(FileNames=[stepFile])
        w = XMLUnstructuredGridWriter()
        w.FileName = os.path.join(vtuDir, fileNameVtp)
        w.UpdatePipeline()

        x3dExport(os.path.join(x3dDir, fileNameX3d), r)

从这张图片中可以看出,字段值(速度 U)未导出!

谁能告诉我我做错了什么? 谢谢!

【问题讨论】:

    标签: python blender paraview x3d openfoam


    【解决方案1】:

    您的问题是 .foam 文件不是科学可视化文件,因为 VTK,.foam 文件仅用于 ParaView(通过其扩展名,而不是通过其内容)来识别读者OpenFOAMReader,然后我们将其用于后期处理。

    我有两个解决方案:

    1. 阅读阅读器文档以找到执行此操作的方法。
    2. 使用FoamToVTK 将结果转换为VTK 文件,然后循环遍历结果。

    编辑

    我很久以前就用这段代码来转换做那件事:

    from paraview.simple import *
    import fnmatch
    import os
    import shutil
    
    #create alist of all vtk files
    vtkFiles = []
    for root, dirnames, filenames in os.walk('.'):
        for filename in fnmatch.filter(filenames, '*.vtk'):
            vtkFiles.append(os.path.join(root, filename))
    
    
    vtkFilesGroups=('p', 'U')
    
    
    def ResetSession():
        pxm = servermanager.ProxyManager()
        pxm.UnRegisterProxies()
        del pxm
        Disconnect()
        Connect()
    
    
    def x3dExport(output,r):
        #export in x3d format
    
        exporters = servermanager.createModule("exporters")
        Show(r)
        view = GetActiveView()
        render = Render()
        x3dExporter = exporters.X3DExporter(FileName=output)
        x3dExporter.SetView(view)
        x3dExporter.Write()
        ResetSession()
    
    # group VTK files by gruop (fields in openfoam "vtkFilesGroups")
    # then loop over all and save it into different formats
    for group in vtkFilesGroups:
        x3dDir = os.path.join('.', group, 'x3d')
        if not os.path.exists(x3dDir):
            os.makedirs(x3dDir)
    
        for stepFile in (f for f in vtkFiles if group in f):
            tmp = stepFile.split(os.sep)
            oldFileName = tmp[-1].split('.')[0]
            time = tmp[-2]
            fileNameX3d = '{}_{}.x3d'.format(oldFileName, time)
    
            x3dExport(os.path.join(x3dDir, fileNameX3d), r)
    

    【讨论】:

    • 嗨!非常感谢您的回答。我想我越来越接近解决方案了。如何从脚本加载 VTK?
    • @Sim81,我编辑我的答案,如果你只需要 x3d 格式,你只需要循环内的 x3dExport 函数。并删除所有 pvdFile 的行
    • 好的 - 我现在试试,让你知道进展如何,谢谢!
    • 也许你需要编辑一些东西,因为我用它来处理使用运行时后处理表面函数创建的 vtk 字段,看看螺旋桨示例,但想法是一样的
    • @Sim81,对我来说看起来不错,如果它有效,那就太好了。哈哈。但如果您只需要 x3d 文件,您可以删除“fileNameVtk”、“fileNameVtp”、“r”、“w”
    【解决方案2】:

    您需要在脚本中为数据着色,例如:

    ColorBy(yourRep, ('POINTS', ('YourScalar', 'YourComp'))
    

    Documentation

    【讨论】:

    • 感谢您的回答。您能否提供此功能的一些文档/示例的链接?谢谢!
    猜你喜欢
    • 2021-05-23
    • 2016-04-10
    • 2021-10-20
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多