Paraview — использование скрипта python для экспорта данных в формате x3d

Я пытаюсь экспортировать результаты OpenFOAM в формате x3d, используя скрипт paraview-python. Когда я делаю это через графический интерфейс 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) не экспортируются, как вы можете видеть на этом рисунке!

введите здесь описание изображения

Может кто-нибудь сказать мне, что я делаю неправильно? Благодарю вас!


person Sim81    schedule 05.04.2019    source источник


Ответы (2)


Ваша проблема в том, что файл .foam не является файлом научной визуализации, так как VTK, файл .foam используется только для ParaView (по расширению, а не по содержанию) для идентификации читателя OpenFOAMReader, а затем нас это для постобработки.

У меня есть два решения для вас:

  1. Прочтите документацию для читателей, чтобы найти способ сделать это.
  2. Преобразуйте результаты в файлы VTK с помощью FoamToVTK, а затем переберите результаты.

ИЗМЕНИТЬ

Я использую этот код для преобразования сделать это давно:

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)
person efirvida    schedule 02.05.2019
comment
Привет! Большое спасибо за ответ. Я думаю, что приближаюсь к решению. Как загрузить VTK из скрипта? - person Sim81; 07.05.2019
comment
@ Sim81, я редактирую свой ответ, если вам нужен только формат x3d, вам нужна только функция x3dExport внутри цикла. и удалите все строки pvdFile - person efirvida; 07.05.2019
comment
Хорошо, сейчас попробую и сообщу, как идут дела, спасибо! - person Sim81; 07.05.2019
comment
возможно, вам нужно отредактировать еще кое-что, потому что я использую его для обработки полей vtk, созданных с помощью функции поверхности постобработки во время выполнения, взгляните на пример пропеллера, но идея та же. - person efirvida; 07.05.2019
comment
К сожалению, у меня такая же проблема. Он экспортирует сетку, но не поле контура. Так что у меня такая же ситуация, как на втором фото-шоу! Как вы запускаете этот скрипт? Вы используете командную строку pvpython script.py? - person Sim81; 07.05.2019
comment
Я отредактировал свой вопрос с помощью предложенного вами сценария. Я установил vtkFilesGroups=[ 'U', ] так как хотел бы извлечь 'U'. Я также изменил цикл для stepFile в vtkFiles. Пожалуйста, дайте мне знать, что вы думаете. Благодарю вас! - person Sim81; 07.05.2019
comment
@ Sim81, мне кажется, хорошо, и если это работает, то это хорошо. ха-ха. но если вам нужен только файл x3d, вы можете удалить fileNameVtk, fileNameVtp, r,w - person efirvida; 07.05.2019

Вам нужно раскрасить данные в скрипте примерно так:

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

Документация

person Mathieu Westphal    schedule 14.04.2020
comment
Спасибо за ваш ответ. Не могли бы вы предоставить ссылку на документацию/пример для этой функции? Благодарю вас ! - person Sim81; 15.04.2020