Mod: mesh and shape io
Mod: mesh patches
This commit is contained in:
parent
e501b8b52b
commit
8fa62bba38
@ -7,9 +7,19 @@ from netgen import meshing
|
|||||||
from numpy import array
|
from numpy import array
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class NoGeometrySpecified(Exception):
|
||||||
|
def __init__(self, msg):
|
||||||
|
super().__init__(self, msg)
|
||||||
|
|
||||||
|
|
||||||
|
class NotSupportedMeshFormat(Exception):
|
||||||
|
def __init__(self, msg):
|
||||||
|
super().__init__(self, msg)
|
||||||
|
|
||||||
class Mesh(object):
|
class Mesh(object):
|
||||||
def __init__(self, shape):
|
def __init__(self, shape: OCCGeometry = None):
|
||||||
self.geometry = OCCGeometry(shape)
|
self.geometry = OCCGeometry(shape) if shape else None
|
||||||
self.mesh = None
|
self.mesh = None
|
||||||
|
|
||||||
# Parameters
|
# Parameters
|
||||||
@ -43,15 +53,44 @@ class Mesh(object):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def build(self):
|
def build(self):
|
||||||
|
if self.geometry:
|
||||||
self.mesh = self.geometry.GenerateMesh(self.parameters)
|
self.mesh = self.geometry.GenerateMesh(self.parameters)
|
||||||
|
|
||||||
def export(self, filename: str):
|
else:
|
||||||
"""Export a shape.
|
raise NoGeometrySpecified("Specify a geometry to build a mesh")
|
||||||
|
|
||||||
Supported formats: vol, mesh.
|
formats = {
|
||||||
|
"vol": "Netgen Format",
|
||||||
|
"mesh": "Neutral Format",
|
||||||
|
"msh": "Gmsh2 Format"
|
||||||
|
}
|
||||||
|
|
||||||
|
def load(self, filename: str):
|
||||||
|
"""Import a mesh.
|
||||||
|
|
||||||
|
Use `Mesh.formats` to see supported formats.
|
||||||
|
|
||||||
:param filename:
|
:param filename:
|
||||||
Name of the file to store the given shape in.
|
Name of the file to store the given mesh in.
|
||||||
|
"""
|
||||||
|
ext = os.path.splitext(filename)[1][1: ]
|
||||||
|
|
||||||
|
if ext in self.formats.keys():
|
||||||
|
self.mesh = meshing.Mesh()
|
||||||
|
self.mesh.Load(filename)
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise NotSupportedMeshFormat(f"Mesh format '{ ext }' is not supported")
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
|
def export(self, filename: str):
|
||||||
|
"""Export a mesh.
|
||||||
|
|
||||||
|
Use `Mesh.formats` to see supported formats.
|
||||||
|
|
||||||
|
:param filename:
|
||||||
|
Name of the file to store the given mesh in.
|
||||||
|
|
||||||
:return:
|
:return:
|
||||||
Output, error messages and returncode
|
Output, error messages and returncode
|
||||||
@ -63,20 +102,13 @@ class Mesh(object):
|
|||||||
if ext == "vol":
|
if ext == "vol":
|
||||||
self.mesh.Save(filename)
|
self.mesh.Save(filename)
|
||||||
|
|
||||||
elif ext == "mesh":
|
elif ext in self.formats.keys():
|
||||||
self.mesh.Export(filename, "Neutral Format")
|
self.mesh.Export(filename, self.formats[ext])
|
||||||
|
|
||||||
elif ext == "msh":
|
|
||||||
self.mesh.Export(filename, "Gmsh2 Format")
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError(f"Mesh format '{ ext }' is not supported")
|
raise NotSupportedMeshFormat(f"Mesh format '{ ext }' is not supported")
|
||||||
|
|
||||||
except NotImplementedError as e:
|
except (NotSupportedMeshFormat, Exception) as e:
|
||||||
err = e
|
|
||||||
returncode = 1
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = e
|
err = e
|
||||||
returncode = 1
|
returncode = 1
|
||||||
|
|
||||||
|
@ -57,6 +57,51 @@ class Shape(object):
|
|||||||
else:
|
else:
|
||||||
raise NotImplementedError(f"Shape format '{ext}' is not supported")
|
raise NotImplementedError(f"Shape format '{ext}' is not supported")
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
|
def patches(self, group: bool = False, shiftIndex: bool = False, prefix: str = None):
|
||||||
|
"""Get patches indices with their names.
|
||||||
|
|
||||||
|
:param group:
|
||||||
|
Group indices together with the same patches names.
|
||||||
|
|
||||||
|
:param shiftIndex:
|
||||||
|
Start numerating with one instead of zero.
|
||||||
|
|
||||||
|
:param prefix:
|
||||||
|
Add string prefix to the index.
|
||||||
|
|
||||||
|
:return:
|
||||||
|
List if group = False else dictionary.
|
||||||
|
"""
|
||||||
|
if group:
|
||||||
|
patches_ = {}
|
||||||
|
|
||||||
|
for idn, face in enumerate(self.shape.faces):
|
||||||
|
if shiftIndex:
|
||||||
|
idn += 1
|
||||||
|
|
||||||
|
item = idn if not prefix else prefix + str(idn)
|
||||||
|
|
||||||
|
if patches_.get(face.name):
|
||||||
|
patches_[face.name].append(item)
|
||||||
|
|
||||||
|
else:
|
||||||
|
patches_[face.name] = [ item ]
|
||||||
|
|
||||||
|
else:
|
||||||
|
patches_ = []
|
||||||
|
|
||||||
|
for idn, face in enumerate(self.shape.faces):
|
||||||
|
if shiftIndex:
|
||||||
|
idn += 1
|
||||||
|
|
||||||
|
item = idn if not prefix else prefix + str(idn)
|
||||||
|
|
||||||
|
patches_.append((item, face.name))
|
||||||
|
|
||||||
|
return patches_
|
||||||
|
|
||||||
def normal(self, face: FACE) -> numpy.array:
|
def normal(self, face: FACE) -> numpy.array:
|
||||||
"""
|
"""
|
||||||
:return:
|
:return:
|
||||||
|
Loading…
Reference in New Issue
Block a user