Source code for o3seespy.base_model
from collections import OrderedDict
try:
from custom_openseespy import opensees as opy
from custom_openseespy import opensees as ops
except ModuleNotFoundError:
import openseespy.opensees as opy
import openseespy.opensees as ops
from . import exceptions
from . import extensions
[docs]class OpenSeesObject(object):
op_base_type = "<not-set>" # used to call opensees module
op_type = "<not-set>" # string name given to object in opensees module
_tag = None
_name = None
_parameters = None
@property # deliberately no setter method
def tag(self):
return self._tag
@property
def name(self):
return self._name
[docs] def to_process(self, osi):
if osi.state == 0:
return self.to_opensees()
# elif osi.state == 1:
# osi.to_commands(self.to_commands())
# elif osi.state == 2:
# osi.to_dict(self)
elif osi.state == 3:
osi.to_commands(self.to_commands())
return self.to_opensees()
elif osi.state == 4:
osi.to_commands(self.to_commands())
[docs] def to_opensees(self):
try:
try:
return getattr(opy, self.op_base_type)(*self.parameters)
except opy.OpenSeesError as e:
com = extensions.to_commands(self.op_base_type, self.parameters)
raise ValueError('{0} caused error "{1}"'.format(com, e))
except SystemError as e:
if None in self.parameters:
print(self.parameters)
raise exceptions.ModelError("%s of type: %s contains 'None'" % (self.op_base_type, self.op_type))
else:
raise SystemError(e)
except AttributeError as e:
print(e)
print('opensees.{0}({1}) caused error "{2}"'.format(self.op_base_type,
','.join(str(x) for x in self.parameters),
e))
raise exceptions.ModelError("op_base_type: '%s' does not exist in opensees module" % self.op_base_type)
[docs] def to_commands(self):
return extensions.to_commands(self.op_base_type, self.parameters)
@property
def parameters(self):
return self._parameters
@property
def type(self):
return self.op_type
@property
def base_type(self):
return self.op_base_type
[docs] def to_dict(self, export_none=False):
outputs = OrderedDict()
for item in self.__dict__:
if '_' == item[0]: # do not export private variables
continue
value = self.__getattribute__(item)
if not export_none and value is None:
continue
outputs[item] = collect_serial_value(value)
return outputs
[docs]class OpenSeesMultiCallObject(OpenSeesObject):
_multi_parameters = None
@property
def parameters(self):
return self._multi_parameters[-1]
@property
def multi_parameters(self):
return self._multi_parameters
[docs]def collect_serial_value(value):
if isinstance(value, str):
return value
elif isinstance(value, int):
return value
elif hasattr(value, "to_dict"):
return value.to_dict()
elif hasattr(value, "__len__"):
tolist = getattr(value, "tolist", None)
if callable(tolist):
value = value.tolist()
return value
else:
if hasattr(value, "tag"):
return value.tag
elif hasattr(value, "to_dict"):
value = value.to_dict()
return value
else:
values = []
for item in value:
values.append(collect_serial_value(item))
return values
else:
return value