说明

plot3d格式是NASA制定并大量使用的CFD网格文件格式,在CFD编程过程中经常涉及到。本文利用Python语言编写一个读取plot3d文件,写入plot3d文件的通用类,并利用vtk完成网格的显示。

对于程序的说明

  1. 使用说明

在主函数中,写入如下代码:

# 新建对象
mesh = Mesh() # 读文件
fname = 'demo.fmt'
mesh.read(fname) fname1 = "1111.dat"
mesh.write(fname1)
  1. 程序思路

定义Mesh类,包含有:

属性:

1. 网格维度: DIM = 3

2. 网格块数目: int BlockNum

3. 网格块坐标数目:np.array([]) Block_list

4. 网格块列表 list(Block)

方法:

1. setBlockNum: 设置网格块数目

2. setBlockList: 设置网格块数目

3. MeshInit: 创建mesh对象,给BlockNum和Block_list赋值

4. setBlock: 设置每一个块的坐标和IBLANK

每个Block具有:

1. id,jd,kd: 三个方向上坐标数目

2. X,Y,Z: 三个方向的坐标分量(一维列阵)

3. IBlank:当前块的IBlank值

源码

# !/usr/bin/env python
# -*- coding:utf-8 -*- import math
import numpy as np class Block():
"""
描述Plot3d文件中的一个Block
""" def __init__(self, ID, JD, KD):
self.id = ID
self.jd = JD
self.kd = KD
self.X = np.zeros(self.id)
self.Y = np.zeros(self.jd)
self.Z = np.zeros(self.kd)
self.IBlank = np.zeros(self.id * self.jd * self.kd) def setX(self, x_list):
self.X = x_list def setY(self, y_list):
self.Y = y_list def setZ(self, z_list):
self.Z = z_list def setBlank(self, blank_list):
self.IBlank = blank_list def setXYZ(self, x_list, y_list, z_list):
self.X = x_list
self.Y = y_list
self.Z = z_list class Mesh():
"""
描述一个plot3d网格文件
""" def __init__(self):
self.DIM = 3
self.blockNum = 1
self.block_list = []
self.BLOCK = [] def setBlockNum(self, block_num):
self.blockNum = block_num def setBlockList(self, block_list):
self.block_list = block_list def MeshInit(self, block_num, block_list):
self.setBlockNum(block_num)
self.setBlockList(block_list)
for i in range(self.blockNum):
bl = Block(*self.block_list[3 * i:3 * (i + 1)])
self.BLOCK.append(bl) def setBlock(self, i, coordinates_list, iblank_list):
self.BLOCK[i - 1].setXYZ(*coordinates_list)
self.BLOCK[i - 1].setBlank(iblank_list) def check(self):
if len(self.block_list) != self.blockNum * self.DIM:
print("The Block Num and the Block list is not consistent.")
for i in range(self.blockNum):
block = self.BLOCK[i]
ID = block.id
JD = block.jd
KD = block.kd
pointNum = ID * JD * KD
flag = len(block.X) == pointNum and len(block.Y) == pointNum
flag = flag and len(block.Z) == pointNum
if not flag:
print("The point number is not consistent.") def write(self, fname):
self.check()
data = ''
try:
with open(fname, 'w') as f:
# 写入Block数目
line = '\t{:>8d}\n'
data += line.format(self.blockNum)
# f.write(line.format(self.blockNum))
line = '\t'
for i in range(len(self.block_list)):
line = line + '{' + str(i) + ':>8d}\t'
if (i + 1) % 6 == 0:
line += '\n\t'
line += '\n'
data += line.format(*self.block_list)
# f.write(line.format(*self.block_list))
for block in self.BLOCK:
# 循环写入X,Y,Z坐标
for xi in [block.X, block.Y, block.Z]:
line = ' '
for i in range(len(xi)):
line = line + '{' + str(i) + ': 7E} '
if (i + 1) % 5 == 0:
line += '\n '
line += '\n'
data += line.format(*xi)
# f.write(line.format(*xi))
# 写入iBlank
line = '\t'
for i in range(len(block.IBlank)):
line = line + '{' + str(i) + ': 9d}' + '\t'
if (i + 1) % 6 == 0:
line += '\n\t'
line += '\n'
data += line.format(*block.IBlank)
# f.write(line.format(*block.IBlank))
f.write(data)
except (BaseException):
print("写出文件时发生错误!请检查您的输出数据结构。")
exit(1) def read(self, fname):
try:
with open(fname, 'r') as f:
# 读取块号
line = f.readline().strip()
self.blockNum = int(line)
# 读取block_list
num = math.ceil((self.DIM * self.blockNum) / 6)
line = ''
for i in range(num):
line += f.readline()
line = line.split()
block_list = np.array([int(i) for i in line])
self.block_list = block_list
# 初始化Mesh
self.MeshInit(self.blockNum, self.block_list) # 读取每个块信息
for ibl in range(self.blockNum):
bl = self.BLOCK[ibl]
# 获取block_list信息
bl.id, bl.jd, bl.kd = self.block_list[self.DIM *
ibl:self.DIM *
(ibl + 1)]
point_num = bl.id * bl.jd * bl.kd
num = math.ceil(point_num / 5)
# 获得x
line = ''
for i in range(num):
line += f.readline()
line = line.split()
x_list = np.array([float(im) for im in line])
# 获得y
line = ''
for i in range(num):
line += f.readline()
line = line.split()
y_list = np.array([float(im) for im in line])
# 获得z
line = ''
for i in range(num):
line += f.readline()
line = line.split()
z_list = np.array([float(im) for im in line])
# 获得iblank
line = ''
num = math.ceil(bl.id * bl.jd * bl.kd / 6)
for i in range(num):
line += f.readline()
line = line.split()
iblank_list = np.array([int(im) for im in line])
self.setBlock(ibl, [x_list, y_list, z_list], iblank_list)
except (BaseException):
pass
self.check() def visual(self):
"""
显示网格信息
"""
pass if __name__ == '__main__':
mesh = Mesh() # 读文件
fname = 'demo.fmt'
mesh.read(fname) fname1 = "1111.dat"
mesh.write(fname1)

plot3d网格读取写入与可视化的更多相关文章

  1. OpenMesh 读写网格控制(读取写入纹理坐标,法向等)

    OpenMesh读取网格默认是不自动读取obj网格中的法向,纹理坐标等信息的,写入网格同样也是.所以要读取(或写入)这些信息需要修改默认的选项. 先看一下其读写网格的函数 template<cl ...

  2. 用多态来实现U盘,Mp3,移动硬盘和电脑的对接,读取写入数据。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Java里的IO流里的 ObjectInputStream 的读取\写入!

    各位好!!我又来了!!今天遇见了一个小问题!! IO流里的对象读取总是出错!各种报错!!神烦啊!!百思不得其解啊!然后就上网百度!找了好久终于让我找到了!下面就让我来说一说! 当你用IO流里的对象流写 ...

  4. 关于Python中读取写入文件并进行文件与用户交互的操作

    一.提前知识点 在python中是同样和其他语言一样可以进行文件的读取写入操作,值得注意的是,Python中打开文件读取的方式有几种,分别是以下几种: f = open('username.txt') ...

  5. JXL读取,写入Excel

    JXL读取,写入Excel2003 相关阅读:poi 读写excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 读写excel200 ...

  6. J2SE 8的输入输出--读取/写入文本文件和读取/写入二进制数据

    读取/写入文本文件 // 1. 文本输入 // (1) 短小文本直接转入字符串 String string = new String(Files.readAllBytes(Paths.get(&quo ...

  7. Golang 读取写入Etcd

    http://www.yunweipai.com/archives/8131.html 新一代etcd:etcd3 etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现.简 ...

  8. Java poi读取,写入Excel2003

    Java poi读取,写入Excel2003 相关阅读:poi读写Excel2007:http://www.cnblogs.com/gavinYang/p/3576741.htmljxl读写excel ...

  9. Java poi读取,写入Excel2007

    Java poi读取,写入Excel2007 相关阅读:poi读写Excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmljxl读写excel ...

随机推荐

  1. Windows7,程序兼容助手:这个程序可能安装不正确(做注册表里设置白名单,软件自身的名字不能带setup)

    Windows上有一个很奇怪的一个现象,一个exe只要名字里面带了setup\install之类的,打开exe后立即退出就会弹出下面的窗口. 解决方法: 方法一.更改exe的名字,去掉setup\in ...

  2. sql执行分页查询

    declare  @PageSize int,@PageIndex int;set @PageSize=5;set @PageIndex=2;WITH Pagination AS(  SELECT * ...

  3. mysql 在不删除数据的时,同时重新更新主键id

    1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段:ALTER TABLE `table_name` ADD `id` MEDIUMINT( ...

  4. 图像滤镜艺术---球面(Spherize)滤镜

    原文:图像滤镜艺术---球面(Spherize)滤镜 球面(Spherize)滤镜 球面滤镜是通过极坐标变换实现图像的球面特效. 代码如下:         //         ///        ...

  5. java设计模式(2)

    工厂模式定义 在面向对象程序设计中,工厂通常是用来创建其他对象的对象,工产模式根据不同的参数来实现不同的分配方案和创建对象. 在工产模式中,我们创建对象时不会对客户端暴露创建逻辑,而且是通过使用一个共 ...

  6. Win8Metro(C#)数字图像处理--2.12Sobel边缘检测

    原文:Win8Metro(C#)数字图像处理--2.12Sobel边缘检测  [函数名称] 图像Sobel边缘检测函数SobelEdgeProcess(WriteableBitmap src) [ ...

  7. FC红白机游戏列表(维基百科)

    1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...

  8. Qt自定义委托在QTableView中绘制控件、图片、文字(内容比较全)

    自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...

  9. CrashRpt_v.1.4.2_vs2008_also_ok

    1.windows多线程程序release版崩溃记录工具,便于该如何查找错误. 2.此工具主要用来配置windbug工具,一种排查程序发布版本崩溃这种非常难处理的缺陷的方法,非常棒,amazing! ...

  10. .net core 2.0 dbfirst 报 dotnet ef 未找到与命令“dotnet-ef”匹配的可执行文件的解决办法

    问题描述: 最近研究了一段时间.netcore dbfirst,新建类库用来生成实体模型,执行命令总是提示 未找到与命令“dotnet-ef”匹配的可执行文件,根据网上的解决办法引用 Microsof ...