pygmsh
pygmsh copied to clipboard
Geometry() unusable outside `with` block
As far as I can tell, all tests and examples use the following structure:
with pygmsh.geo.Geometry() as geom:
# Do stuff
In my case I want to store the geometry inside a class, like so:
class MyClass:
def __init__(self):
self.geom = pygmsh.geo.Geometry()
Common sense says this should work just as fine, but it doesn't. I just get an error on each operation:
Error : Gmsh has not been initialized
Looking at the source code, in src/pygmsh/common/geometry.py it is clear that some crucial gmsh operations are done in __enter__() and __exit__().
I could manually call gmsh.initialize() and such, but it seems awful for an abstraction API. I could also call __enter__() and __exit__() manually, but that's even uglier.
A good compromise might be to just move the enter/exit code to proper initialize() and finalize() methods, calling them from __enter()__ and __exit()__.
As an alternative, the enter/exit code could perhaps be moved to the constructor/destructor.
I could also use this; it looks like the main concern is what assumptions gmsh makes internally. The API really seems like it wants you to work on only one model at a time and using a context manager helps to guarantee that. If multiple initialization / destruction is a concern, gmsh has a function is_initialized that could help avoid anything too awful from happening, but there might be other concerns as well.
I'd be happy to take a crack at this but it would be good to get some feedback from @nschloe first.