from os import path, makedirs
import re
import bpy
import bmesh
def _FOAMheader(location, object):
answ = '\
FoamFile\n\
{\n\
version 2.0;\n\
format ascii;\n\
class dictionary;\n\
location "' + location + '";\n\
object ' + object + ';\n\
}\n\n'
return answ
[docs]
def writeFOAMfile(caseDir, location, object, body):
data = _FOAMheader(location, object) + body
fileDir = path.join(caseDir, location)
try:
makedirs(fileDir)
except Exception:
pass
filePath = path.join(fileDir, object)
f = open(filePath, "w")
f.write(data)
f.close()
[docs]
class BlenderObj2PolyMesh:
def __init__(self, *, obj=None, meshCase=None):
self._blenderObj = obj
self._blenderMesh = obj.data
self._meshCase = meshCase
self._noOrigVertices = len(self._blenderMesh.vertices)
self._noOrigPolygons = len(self._blenderMesh.polygons)
print('Blender Surface Mesh:')
print('number of vertices', self._noOrigVertices)
print('number of polygons', self._noOrigPolygons)
self._points = []
self._faces = []
self._owner = []
for vertice in self._blenderMesh.vertices:
self._points.append(self._blenderObj.matrix_world @ vertice.co)
# boundary faces
for polygon in self._blenderMesh.polygons:
face = []
for vertice in polygon.vertices:
face.append(vertice)
self._faces.append(face)
self._owner.append(polygon.index)
# extrusion
endPoint = len(self._points)
for polygon in self._blenderMesh.polygons:
face = []
for _ in polygon.vertices:
self._points.append(self._points[vertice])
face.append(endPoint)
endPoint += 1
self._faces.append(face)
self._owner.append(polygon.index)
noNewFaces = len(face)
vB = []
for vertice in polygon.vertices:
vB.append(vertice)
vB.append(vB[0])
vT = []
for vertice in face:
vT.append(vertice)
vT.append(vT[0])
for i in range(0, noNewFaces):
self._faces.append([vB[i], vB[i + 1], vT[i + 1], vT[i]])
self._owner.append(polygon.index)
print('\nOpenFOAM Mesh:')
print('number of points', len(self._points))
print('number of faces', len(self._faces))
print('number of cells', self._noOrigPolygons)
body = str(len(self._points)) + '\n(\n'
for p in self._points:
body += '(' + str(p[0]) + ' ' + str(p[1]) + ' ' + str(p[2]) + ')\n'
body += ')\n'
writeFOAMfile(self._meshCase,
path.join('constant', 'polyMesh'), 'points', body)
body = str(len(self._faces)) + '\n(\n'
for f in self._faces:
body += str(len(f)) + '('
for p in f:
body += str(p) + ' '
body += ')\n'
body += ')\n'
writeFOAMfile(self._meshCase,
path.join('constant', 'polyMesh'), 'faces', body)
body = str(len(self._owner)) + '\n(\n'
for o in self._owner:
body += str(o) + '\n'
body += ')\n'
writeFOAMfile(self._meshCase,
path.join('constant', 'polyMesh'), 'owner', body)
body = '0 \n(\n' + ')\n'
writeFOAMfile(self._meshCase,
path.join('constant', 'polyMesh'), 'neighbour', body)
body = '1 \n(\n'
body += ' laser\n'
body += ' {\n'
body += ' type patch;\n'
body += ' startFace 0;\n'
body += ' nFaces ' + str(len(self._blenderMesh.polygons)) + ';\n'
body += ' }\n'
body += ')\n'
writeFOAMfile(self._meshCase,
path.join('constant', 'polyMesh'), 'boundary', body)