"""G3DCode class definition"""
from typing import Any
import os
import sys
import getopt
from g3d.defs import G3DWorld
from g3d.defs import G3DDisplay
from g3d.defs import DIMMode
from g3d.defs import G3DEntity
[docs]
class G3DCode(G3DEntity):
"""
base class for G3D code packages
extends G3DEntity
"""
def __init__(self, *args: Any, **kwargs: Any) -> None:
"""initialize G3DCode environment"""
update_code_type = True
print_splash = True
for key, value in kwargs.items():
if key == 'update_code_type':
update_code_type = value
elif key == 'silent' or key == 'quiet':
print_splash = not value
G3DWorld().display.silent = value
if update_code_type:
self._set_code_type()
if print_splash:
G3DWorld().display.splash()
super().__init__(*args, **kwargs)
self.__check_options()
self._init_post_actions()
def _set_default(self) -> None:
super()._set_default()
self._tag = 'g3d_code'
def _set_code_type(self) -> None:
pass
def __check_options(self) -> None:
g3d_world = G3DWorld()
if len(sys.argv) > 1:
try:
opts, args = getopt.getopt(sys.argv[1:], g3d_world.options.short_opt, g3d_world.options.long_opt)
except getopt.GetoptError as err:
# print help information and exit:
print(err) # will print something like "option -a not recognized"
self._print_help_message()
sys.exit(2)
for opt, arg in opts:
self._evaluate_run_option(opt, arg)
def _print_help_message(self) -> None:
print('-v verbose mode')
def _evaluate_run_option(self, opt: str, arg: Any) -> None:
g3d_world = G3DWorld()
if opt in ['-h', '--help']:
self._print_help_message()
sys.exit(2)
elif opt in ['-v', '--verbose']:
g3d_world.display.verbose = True
elif opt == '--no-cuda':
os.environ['__USE_CUDA'] = '0'
elif opt == '--prof':
g3d_world.options.attach_profiler = True
elif opt == '--g2d':
g3d_world.options.dim_mode = DIMMode.G2D
elif opt == '--g3d':
g3d_world.options.dim_mode = DIMMode.G3D
[docs]
def set(self, *args: Any, **kwargs: Any) -> None:
"""
sets code parameters according to specifications
input: args, kwargs
example: set(args, kwargs)
"""
super().set(*args, **kwargs)
self.__check_options() # options overrides settings
[docs]
def set_from_key_value(self, key: str, value: Any) -> bool:
"""
sets code parameters from specified key => value data
input: key, value
valid keys for G3DCode base class:
'verbose', 'silent/quiet', 'jobname', 'working_directory', 'dimension', 'cuda', 'prof'
example: set_from_key_value(key, value)
"""
if super().set_from_key_value(key, value):
return True
elif key == 'verbose':
G3DWorld().display.verbose = value
return True
elif key == 'silent' or key == 'quiet':
G3DWorld().display.silent = value
return True
elif key == 'print_splash':
G3DWorld().display.print_splash = value
return True
elif key == 'jobname':
G3DWorld().io.jobname = value
return True
elif key == 'wd' or key == 'working_directory':
G3DWorld().io.wd = value
return True
elif key == 'dimension' or key == 'dim':
G3DWorld().options.dim_mode = value
return True
elif key == 'cuda':
if value:
os.environ['__USE_CUDA'] = '1'
else:
os.environ['__USE_CUDA'] = '0'
return True
elif key == 'attach_profiler' or key == 'prof':
G3DWorld().options.attach_profiler = value
return True
elif key == 'update_code_type':
return True
return False
[docs]
def jobname_append(self, name: str) -> None:
"""
extends jobname with the specified string
input: name
example: jobname_append(name)
"""
g3d_world = G3DWorld()
jobname = g3d_world.io.jobname + name
g3d_world.io.jobname = jobname
def _init_post_actions(self) -> None:
pass
[docs]
@staticmethod
def hline(*args: Any, **kwargs: Any) -> None:
"""
prints horizontal line
optional input (kwargs): dashes (default='-'), scrw (default=80)
example: hline(dashes='*', scrw=90)
"""
g3d_display = G3DDisplay()
g3d_display.hline(*args, **kwargs)