基于pyvista的三维矩阵数据显示

pyvista是对vtk的封装,使用更简单。下面是一个简单的测试,显示三维随机场数据,从文件读取三维矩阵数据,三维网格显示,以及三个方向的切片显示。

import numpy as np
import pyvista as pv
from argon2 import __main__



def createRegularMesh(values, origin, cellSize):
    # 首先类似于新建一个空的矩阵
    grid = pv.UniformGrid()
    
    # 然后设置维度,如果想给cell填充数据则维度设置为 矩阵shape + 1,
    # 如果是给point填充数据指定为矩阵shape
    # 填充cell,颜色就不是渐变的,是每个块一个颜色,正好和ct的数据一样。
    grid.dimensions = np.array(values.shape) + 1
    
    # 设置origin和spacing,这两个参数正好和ct的参数一个意思。
    grid.origin = origin  # The bottom left corner of the data set
    grid.spacing = cellSize  # These are the cell sizes along each axis
    
    # 设置(网格)矩阵的值
    grid.cell_arrays["values"] = values.flatten(order="F")  # Flatten the array!
    
    return grid
    
def showRegularGrid3D(values, origin, cellSize):
    gridMesh = createRegularMesh(values, origin, cellSize)    
    # plot
    gridMesh.plot(show_edges=False)
    
def showRegularSlice3D(values, origin, cellSize, slicex, slicey, slicez):
    #指定三维数据场,顶点坐标,网格尺寸,以及三个方向切片的坐标
    gridMesh = createRegularMesh(values, origin, cellSize)    
    #指定x y z三个方向的坐标
    slices = gridMesh.slice_orthogonal(x=slicex, y=slicey, z=slicez)
    slices.plot()
    
def readArray3D(ni, nj, nk, fileName, headInfoNum):
    #读取三维矩阵数据
    #矩阵数据按行排列,从外向内,分别为k循环,j循环,和i循环。
    dat=np.loadtxt(fileName, skiprows = headInfoNum)
    print(dat.shape)
    #设置矩阵维数
    values = np.reshape(dat, (nk,nj,ni)).transpose(2,1,0)
    return values
    
def test1():
    _values = np.random.rand(10,10,5)
    print(_values.shape)
    _origin=(0,0,0)
    _cellSize=(1,1,1)
    showRegularGrid3D(_values,_origin, _cellSize)

def test2():
    _fileName = R"./../../../CASE2/readTIArray_temp.ecl"
    _ni = 100
    _nj = 100
    _nk = 20
    _headInfoNum=1
    _origin=(0,0,0)
    _cellSize=(10,10,5)
    _values = readArray3D(_ni, _nj, _nk, _fileName, _headInfoNum)
    print(_values.shape)
    showRegularGrid3D(_values,_origin, _cellSize)

def test3():
    _fileName = R"./../../../CASE2/readTIArray_temp.ecl"
    _ni = 100
    _nj = 100
    _nk = 20
    _headInfoNum=1
    _origin=(0,0,0)
    _cellSize=(10,10,5)
    _values = readArray3D(_ni, _nj, _nk, _fileName, _headInfoNum)
    print(_values.shape)
    _slicex=_ni*_cellSize[0]
    _slicey=1*_cellSize[1]
    _slicez=_nk*_cellSize[2]
    showRegularSlice3D(_values,_origin, _cellSize, _slicex, _slicey, _slicez)   

if __name__== "__main__":
    #test1()
    #test2()
    test3()

产生随机数三维矩阵,test1()

 

读取三维矩阵数据并显示,test2(),其中矩阵数据按行排列,从外向内,分别为k循环,j循环,和i循环。

切片显示方式

参考资料

https://blog.csdn.net/u012925804/article/details/105292081

 

 

 

posted @ 2022-08-21 10:12  Oliver2022  阅读(332)  评论(0编辑  收藏  举报