Source code for civpy.structures.node
"""
Copyright (c) 2019, Matt Pewsey
"""
import copy
import numpy as np
__all__ = ['Node']
[docs]class Node(np.ndarray):
"""
A class representing a structural node.
Parameters
----------
name : str
A unique name for the node.
x, y, z : float
The x, y, and z coordinates of the node.
symmetry : {None, 'x', 'y', 'xy'}
The symmetry of the node.
fx_free, fy_free, fz_free : bool
The force fixities of the node in the x, y, and z directions.
mx_free, my_free, mz_free : bool
The moment fixities of the node about the x, y, and z axes.
"""
X = 'x'
Y = 'y'
XY = 'xy'
SYMMETRIES = (None, X, Y, XY)
def __new__(cls, name, x=0, y=0, z=0, symmetry=None,
fx_free=True, fy_free=True, fz_free=True,
mx_free=True, my_free=True, mz_free=True):
obj = np.array([x, y, z], dtype='float').view(cls)
obj.name = name
obj.symmetry = symmetry
obj.fx_free = fx_free
obj.fy_free = fy_free
obj.fz_free = fz_free
obj.mx_free = mx_free
obj.my_free = my_free
obj.mz_free = mz_free
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.name = getattr(obj, 'name', '')
self.symmetry = getattr(obj, 'symmetry', None)
self.fx_free = getattr(obj, 'fx_free', True)
self.fy_free = getattr(obj, 'fy_free', True)
self.fz_free = getattr(obj, 'fz_free', True)
self.mx_free = getattr(obj, 'mx_free', True)
self.my_free = getattr(obj, 'my_free', True)
self.mz_free = getattr(obj, 'mz_free', True)
def x():
def fget(self):
return self[0]
def fset(self, value):
self[0] = value
return locals()
x = property(**x())
def y():
def fget(self):
return self[1]
def fset(self, value):
self[1] = value
return locals()
y = property(**y())
def z():
def fget(self):
return self[2]
def fset(self, value):
self[2] = value
return locals()
z = property(**z())
def symmetry():
def fget(self):
return self._symmetry
def fset(self, value):
if value not in self.SYMMETRIES:
raise ValueError('Type {!r} must be in {!r}.'.format(value, self.SYMMETRIES))
self._symmetry = value
def fdel(self):
del self._symmetry
return locals()
symmetry = property(**symmetry())
def __repr__(self):
s = [
('name', self.name),
('x', self.x),
('y', self.y),
('z', self.z),
('symmetry', self.symmetry),
('fx_free', self.fx_free),
('fy_free', self.fy_free),
('fz_free', self.fz_free),
('mx_free', self.mx_free),
('my_free', self.my_free),
('mz_free', self.mz_free),
]
s = ', '.join('{}={!r}'.format(x, y) for x, y in s)
return '{}({})'.format(type(self).__name__, s)
def __str__(self):
return self.name
[docs] def copy(self):
"""Returns a copy of the node."""
return copy.copy(self)
[docs] def f_fixed(self):
"""Sets the node force reactions to fixed."""
self.fx_free = self.fy_free = self.fz_free = False
return self
[docs] def m_fixed(self):
"""Sets the node moment reactions to fixed."""
self.mx_free = self.my_free = self.mz_free = False
return self
[docs] def fixed(self):
"""Sets the node force and moment reactions to fixed."""
return self.f_fixed().m_fixed()
[docs] def fixities(self):
"""Returns the force and moment fixities for the node."""
return [self.fx_free, self.fy_free, self.fz_free,
self.mx_free, self.my_free, self.mz_free]
[docs] def sym_nodes(self):
"""Returns the symmetric nodes for the node."""
def primary():
n = self.copy()
n.name = '{}_p'.format(self.name)
return n
def x_sym():
n = self.copy()
n.name = '{}_x'.format(self.name)
n[1] *= -1
return n
def y_sym():
n = self.copy()
n.name = '{}_y'.format(self.name)
n[0] *= -1
return n
def xy_sym():
n = self.copy()
n.name = '{}_xy'.format(self.name)
n[:2] *= -1
return n
if self.symmetry is None:
return primary(),
elif self.symmetry == 'x':
return primary(), x_sym()
elif self.symmetry == 'y':
return primary(), y_sym()
elif self.symmetry == 'xy':
return primary(), x_sym(), y_sym(), xy_sym()