-
Notifications
You must be signed in to change notification settings - Fork 0
/
Convert_Text_to_VTK.py
175 lines (134 loc) · 5.27 KB
/
Convert_Text_to_VTK.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# Script to Convert 1D Solver .dat result files to vtk
# Based off 1D Solver subroutine (c++):
# cvOneDBFSolver::postprocess_VTK_XML3D_MULTIPLEFILES
# Melody Dong 9/29/17
# #################
# Import Statements
# #################
import sys
import os
import numpy as np
import math
import csv
import argparse
# ########################################
# READ SINGLE MODEL FILE
# Converted from c++ in main.cpp to python
# Melody Dong 10/18/17
# ########################################
def readModelFile(inputFile):
# Message
print("\n");
print("Reading file: %s ... \n" % str(inputFile));
# Declare input File
with open(inputFile,'r') as inFile:
# inFileTxt = csv.reader(inFile);
lineCount = 1;
reminder = 0;
totSegments = 0;
# Read Data from File
inFileTxt = inFile.readlines();
# print(inFileTxt[14]);
inFile.close();
# Initialize dictionaries to store Nodal Coordinates, joints, and segment info
segInfo = {};
nodeInfo = {};
jointInfo = {};
for line in inFileTxt:
subLine = line.split(' ');
if subLine[0] == 'NODE':
# Node info dictionary => <nodeID> : [X, Y, Z]
nodeInfo[int(subLine[1])] = [float(subLine[2]), float(subLine[3]), float(subLine[4])];
elif subLine[0] == 'SEGMENT':
# Seg info dictionary => <segName> : [<segID>, <segLen>, <FE>, <NodeIn>, <NodeOut>, <Ain>, <Aout>]
segInfo[str(subLine[1])] = [int(subLine[2]), float(subLine[3]), int(subLine[4]),
int(subLine[5]), int(subLine[6]), float(subLine[7]), float(subLine[8])];
elif subLine[0] == 'JOINTINLET':
jointNum = int(subLine[3])
elif subLine[0] == 'JOINTOUTLET':
jointOut = []
# numOutSeg = int(subLine[2])
for outSeg in subLine[3:]:
jointOut.append(int(outSeg))
jointInfo[jointNum] = jointOut;
elif subLine[0] == 'MODEL':
model = str(subLine[1])
# Print Statements for TROUBLESHOOTING
# print(segInfo[0])
return(segInfo, nodeInfo, jointInfo, model)
# ============================
# POST-PROCESS VTK SINGLE FILE
# ============================
def postprocess_VTK_XML3D_ONEFILE(filePaths, inputFile):
segInfo, nodeInfo, jointInfo, model = readModelFile(inputFile);
modelFile = model + ".vtp";
with open(modelFile,"a") as vtpSingle:
# Write VTK XML Header
vtpSingle.write("<?xml version=\"1.0\"?>\n");
vtpSingle.write("<VTKFile type=\"PolyData\" version=\"0.1\" byte_order=\"LittleEndian\">\n");
vtpSingle.write("<PolyData>\n");
segInlet =
# Define Incidence
for segName in segInfo:
# ========================
# MAIN FUNCTION
# ========================
if __name__ == "__main__":
# get command line arguments
parser = argparse.ArgumentParser(description = 'Convert Script from 1D .dat to vtk results files')
group1 = parser.add_mutually_exclusive_group(required=True)
group1.add_argument('-a', '--all', action='store_true', help='converts .dat to a single vtk result file')
group1.add_argument('-i', '--indiv', action='store_true', help='converts .dat to multiple vtk result files')
group2 = parser.add_mutually_exclusive_group(required=True)
group2.add_argument('-d', '--directory', action='store_true', help='provide directory of .dat files' )
group2.add_argument('-f', '--files', action='store_true', help='provide individual .dat files')
parser.add_argument('data', nargs='+', help='directory of .dat files (with -d) or individual files (with -f)')
parser.add_argument('inputFile', help='Input file for results')
args = parser.parse_args()
# Collect all .dat results files
if args.directory:
filePaths = ['inletPath']
# check for correct number of arguments
if len(args.data) != 1:
sys.exit('\nExiting due to error: Only one directory can be provided')
dirPath = args.data[0]
# check if argument is a directory
if not(os.path.isdir(dirPath)):
sys.exit('\nExiting due to error:Must provide a directory when using -d flag')
# record all files in directory
for filename in os.listdir(dirPath):
# skip non .dat files
if not('.dat' in filename):
continue
# check if arguments are files
filePath = dirPath + '/' + filename
if not(os.path.isfile(filePath)):
sys.exit('\nExiting due to error: Must provide a directory of files when using -d flag')
# Don't include path to file when checking for match with inlet branch filename
shortFilenames = filename.split('/')
shortFilename = shortFilenames[-1]
filePaths.append(filePath)
# individual files provided
else:
filePaths = ['inletPath']
# record all files
for filename in args.data:
# check if arguments are files
if not(os.path.isfile(filename)):
sys.exit('\nExiting due to error: Must provide a list of files when using -f flag.\nNote: this error could be caused by not specifying full path to files')
# Don't include path to file when checking for match with inlet branch filename
shortFilenames = filename.split('/')
shortFilename = shortFilenames[-1]
filePaths.append(filePath)
# Input File
# inFile = args.inputFile
# with open(args.inputFile) as inFile:
# reader = csv.reader(inFile)
inputFile = args.inputFile
# readModelFile(inputFile);
postprocess_VTK_XML3D_ONEFILE(filePaths, inputFile)
# Iterate through all files
# geometries = []
# for segmentFileName in filePaths:
# # Export to VTK File (if required)
# postproc_VTK_XML3D_MULTIPLEFILES(segmentFilename,inputFile)