"""Creating and managing visual stimuli
"""
import os
from os import environ as _env
from reiz._visual.complex import Mural, Image, Cross, Circle, Background, Line, Bar
from reiz._visual.complex import Polygon, Trapezoid, Cylinder
from reiz._visual.colors import COLORS, get_color
from types import SimpleNamespace
from typing import Dict, NewType, Any
from pathlib import Path
from pkg_resources import resource_filename
libConf = NewType(
"libConf", Dict[str, Dict[str, Any]]
) #: Dict[str, Dict[str, Any], a dictionary of types and respective keywords arguments
_defaults = libConf(
{
"Mural": {
"post": {"text": "Run endet"},
"pre": {"text": "Run beginnt"},
"eo": {"text": "Augen offen"},
"ec": {"text": "Augen zu"},
"ready": {"text": "Bereit machen"},
"los": {"text": "Los"},
"go": {"text": "Go!"},
"imagine": {"text": "Bewegung vorstellen"},
"move": {"text": "Bewegung starten"},
"count": {"text": "Zahlen berechnen"},
"relax": {"text": "Entspannen"},
"rating": {
"text": "0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10",
"fontsize": 0.75,
},
},
"Cross": {"fixation": {"color": "white"},},
"Image": {"logo": {"imgpath": resource_filename(__name__, "data/logo.png")},},
}
) #: libConf
[docs]def read_folder(folder: str = None) -> SimpleNamespace:
""""read image files in a the specified folder into a library
args
----
folder:str
the path to the folder with the images
The function selects all files ending in .png and .jpg. It collects them into a SimpleNamespace, so you can use dot notation to select the images. These fields are named based on the filename. Some basic sanitization is performed, but is nonetheless best if the files already have names which could be called safely from python. For example, files should be named 'image_file.png' instead of 'image-file.png'.
"""
folder = folder or resource_filename(__name__, "data/")
def sanitize(fname: str) -> str:
return fname.replace("-", "_").replace(" ", "_").replace(":", "_")
conf = dict()
conf["Image"] = dict()
pth = Path(folder).expanduser().absolute()
print(pth)
for file in pth.glob("*.png"):
print(file)
conf["Image"][sanitize(file.stem)] = {"imgpath": str(file)}
for file in pth.glob("*.jpg"):
print(file)
conf["Image"][sanitize(file.stem)] = {"imgpath": str(file)}
return make_library(conf)
[docs]def make_library(settings: libConf = None, failraise=False) -> SimpleNamespace:
"""create a library of visual stimuli from a dictionary of arguments
args
----
settings:
a dictionary of types with kwargs appropriate to the respective type
as dictionary
failraise:bool
raise an exception if a key is not recognized. defaults to False
returns
-------
library:
a library of instances of stimuli which can be adressed in dot.notation
"""
if settings is None:
settings = _defaults
library = dict()
for key in settings.keys():
for name, args in settings[key].items():
if key.lower() == "mural":
library[name] = Mural(**args)
elif key.lower() == "cross":
library[name] = Cross(**args)
elif key.lower() == "image":
library[name] = Image(**args)
else:
if failraise:
raise (f"{key} with {args} can't be processed")
library = SimpleNamespace(**library)
return library
if not "DOC" in _env.keys():
library = make_library()
else: # pragma: no cover
mock = dict()
for t, item in _defaults.items():
for k, v in item.items():
mock[k] = t
library = SimpleNamespace(**mock) #: a library of visual stimuli
print("Generating sphinx documentation. Skipping visual library")
__doc__ += f"""
During import, a basic library will be created. By default, it contains
the following set of visual stimuli: {', '.join([str(k) for k in library.__dict__])}. These stimuli can be addressed by dot.notation from :data:`reiz.visual.library`, for example like :data:`reiz.visual.library.go`
.. automodule:: reiz._visual.complex
:members: Mural, Image, Cross, Circle, Background, Line, Bar, Polygon, Trapezoid, Cylinder
.. automodule:: reiz._visual.colors
:members: COLORS, get_color
Create libraries of visual stimuli
..................................
"""