ParaView - 使用Python脚本将数据导出为X3D格式

5
我正在尝试使用Paraview-Python脚本以x3d格式导出OpenFOAM结果。通过Paraview图形界面操作可以实现,并且结果可以在Blender中可视化,如下图所示。

enter image description here

然而,当我尝试使用以下脚本进行相同操作时:
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)未被导出!

enter image description here

有人能告诉我哪里做错了吗? 谢谢!

2个回答

3
您的问题在于.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
1
@Sim81,我编辑了我的答案,如果你只需要x3d格式,那么你只需要在循环内使用x3dExport函数。并删除所有pvdFile的行。 - efirvida
好的,我现在会尝试并告诉您进展情况,谢谢! - Sim81
1
也许你需要编辑更多的东西,因为我用它来处理运行时后处理表面函数创建的vtk字段,请看看螺旋桨示例,但是思路是相同的。 - efirvida
1
@Sim81,我觉得很不错,如果它能够正常工作,那就太好了。哈哈。但是,如果你只需要x3d文件,你可以删除"fileNameVtk"、"fileNameVtp"、"r"和"w"。 - efirvida
显示剩余2条评论

1

您需要在脚本中为数据添加颜色,例如:

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

文档


谢谢您的回答。您能否提供一些关于这个函数的文档或示例链接?谢谢! - Sim81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接