Source code for pymead.core.pymead_obj

from copy import deepcopy
from abc import ABC, abstractmethod


[docs] class DualRep: # These attributes are non-serializable because they contain references to PyQt5 graphics or signal/slot objects, # which are inherently non-serializable non_serializable_attributes = ["tree", "tree_item", "canvas", "canvas_item", "gui_obj"] def __deepcopy__(self, memo): """ Overwrite the ``deepcopy`` method to set any non-serializable attributes in the copied object to ``None``. """ cls = self.__class__ result = cls.__new__(cls) memo[id(self)] = result for k, v in self.__dict__.items(): # Eliminate any GUI references so the object is deep-copyable if k in self.non_serializable_attributes: v = None if k == "equation_dict" and isinstance(v, dict) and "__builtins__" in v: v["__builtins__"] = None setattr(result, k, deepcopy(v, memo)) return result
[docs] class PymeadObj(ABC, DualRep): """ Base class for all objects in pymead. """
[docs] def __init__(self, sub_container: str, geo_col=None): """ Parameters ---------- sub_container: str Sub-container where this object will be stored in the ``GeometryCollection`` """ self.sub_container = sub_container self._name = None self.geo_col = geo_col self.gcs = None self.tree_item = None self.canvas_item = None self.gui_obj = None self.tree = None self.canvas = None
[docs] def name(self): """ Retrieves the parameter name Returns ======= str The parameter name """ return self._name
[docs] def set_name(self, name: str): """ Sets the object name. Parameters ========== name: str The object name """ if self.geo_col is not None: # Rename the reference in the geometry collection if necessary sub_container = self.geo_col.container()[self.sub_container] if self.name() in sub_container and sub_container[self.name()] is self: sub_container[name] = sub_container[self.name()] sub_container.pop(self.name()) self._name = name
[docs] @abstractmethod def get_dict_rep(self) -> dict: """ Gets a dictionary representation of the pymead object. In general, this dictionary should consist of only the required arguments for object instantiation. For example, the dictionary representation of a point looks something like this: ``{"x": 0.3, "y": 0.5}``. If the argument requires a reference to a ``PymeadObj`` rather than a string or float value, the ``name()`` method should be the value that is stored. For an example, see the overridden value of this method in ``pymead.core.airfoil.Airfoil``. All subclasses of ``PymeadObj`` must implement this method, since it is the way pymead objects are stored in saved instances of a ``GeometryCollection`` (``.jmea`` files). """ pass