Skip to content
This repository has been archived by the owner on Apr 16, 2024. It is now read-only.

Commit

Permalink
Merge pull request #4 from mpewsey/remove-propy
Browse files Browse the repository at this point in the history
Remove propy dependency
  • Loading branch information
mpewsey committed May 5, 2019
2 parents 7b5317b + ad43f49 commit bbf74b1
Show file tree
Hide file tree
Showing 20 changed files with 603 additions and 237 deletions.
4 changes: 4 additions & 0 deletions civpy/math/linalg.py
@@ -1,3 +1,7 @@
"""
Copyright (c) 2019, Matt Pewsey
"""

import numpy as np
from math import cos, sin

Expand Down
4 changes: 4 additions & 0 deletions civpy/math/optimize.py
@@ -1,3 +1,7 @@
"""
Copyright (c) 2019, Matt Pewsey
"""

import scipy.optimize

__all__ = ['fsolve']
Expand Down
107 changes: 59 additions & 48 deletions civpy/structures/element.py
@@ -1,5 +1,10 @@
"""
Copyright (c) 2019, Matt Pewsey
"""

import copy
import propy
import attr
import weakref
import numpy as np
from math import cos, sin
from functools import lru_cache
Expand Down Expand Up @@ -153,6 +158,7 @@ def clear_element_cache():
transformation_matrix.cache_clear()


@attr.s(hash=False)
class Element(object):
"""
A class representing a structural element.
Expand All @@ -174,57 +180,62 @@ class Element(object):
jmx_free, jmy_free, jmz_free : bool
The rotational fixities at the j-node about the local x, y, and z axes.
"""
SYMMETRIES = (None, 'x', 'y', 'xy')
P = 'p'
X = 'x'
Y = 'y'
XY = 'xy'
SYMMETRIES = (None, X, Y, XY)

TRANSFORMS = {
'x': {'p': 'x', 'x': 'p', 'y': 'xy', 'xy': 'y'},
'y': {'p': 'y', 'x': 'xy', 'y': 'p', 'xy': 'x'},
X: {P: X, X: P, Y: XY, XY: Y},
Y: {P: Y, X: XY, Y: P, XY: X},
}

# Custom properties
name = propy.str_property('name')
inode = propy.str_property('inode_name')
jnode = propy.str_property('jnode_name')
symmetry = propy.enum_property('symmetry', set(SYMMETRIES))

imx_free = propy.bool_property('imx_free')
imy_free = propy.bool_property('imy_free')
imz_free = propy.bool_property('imz_free')

jmx_free = propy.bool_property('jmx_free')
jmy_free = propy.bool_property('jmy_free')
jmz_free = propy.bool_property('jmz_free')

inode_ref = propy.weakref_property('inode_ref')
jnode_ref = propy.weakref_property('jnode_ref')

def __init__(self, name, inode, jnode, group,
symmetry=None, roll=0, unstr_length=None,
imx_free=False, imy_free=False, imz_free=False,
jmx_free=False, jmy_free=False, jmz_free=False):
self.name = name
self.inode = inode
self.jnode = jnode
self.group = group
self.symmetry = symmetry
self.roll = roll
self.unstr_length = unstr_length

self.imx_free = imx_free
self.imy_free = imy_free
self.imz_free = imz_free

self.jmx_free = jmx_free
self.jmy_free = jmy_free
self.jmz_free = jmz_free

self.inode_ref = None
self.jnode_ref = None

__repr__ = propy.repr_method(
'name', 'inode', 'jnode', 'group', 'symmetry', 'roll',
'imx_free', 'imy_free', 'imz_free', 'jmx_free', 'jmy_free', 'jmz_free'
)
name = attr.ib(converter=str)
inode = attr.ib()
jnode = attr.ib()
group = attr.ib()
symmetry = attr.ib(default=None, validator=attr.validators.in_(SYMMETRIES))
roll = attr.ib(default=0)
unstr_length = attr.ib(default=None)
imx_free = attr.ib(default=False)
imy_free = attr.ib(default=False)
imz_free = attr.ib(default=False)
jmx_free = attr.ib(default=False)
jmy_free = attr.ib(default=False)
jmz_free = attr.ib(default=False)
_inode_ref = attr.ib(default=None, init=False, repr=False)
_jnode_ref = attr.ib(default=None, init=False, repr=False)

def inode_ref():
def fget(self):
value = self._inode_ref
if value is None:
return value
return value()
def fset(self, value):
if value is not None:
value = weakref.ref(value)
self._inode_ref = value
def fdel(self):
del self._inode_ref
return locals()
inode_ref = property(**inode_ref())

def jnode_ref():
def fget(self):
value = self._jnode_ref
if value is None:
return value
return value()
def fset(self, value):
if value is not None:
value = weakref.ref(value)
self._jnode_ref = value
def fdel(self):
del self._jnode_ref
return locals()
jnode_ref = property(**jnode_ref())

def __str__(self):
return self.name
Expand Down
19 changes: 9 additions & 10 deletions civpy/structures/element_group.py
@@ -1,8 +1,13 @@
import propy
"""
Copyright (c) 2019, Matt Pewsey
"""

import attr

__all__ = ['ElementGroup']


@attr.s(hash=False)
class ElementGroup(object):
"""
A class representing a group of element properties.
Expand All @@ -16,12 +21,6 @@ class ElementGroup(object):
material : :class:`.Material`
The group material.
"""
# Custom properties
name = propy.str_property('name')

def __init__(self, name, section, material):
self.name = name
self.section = section
self.material = material

__repr__ = propy.repr_method('name', 'section', 'material')
name = attr.ib()
section = attr.ib()
material = attr.ib()
95 changes: 82 additions & 13 deletions civpy/structures/element_load.py
@@ -1,4 +1,8 @@
import propy
"""
Copyright (c) 2019, Matt Pewsey
"""

import weakref
import numpy as np
from functools import lru_cache
from .element import transformation_matrix
Expand Down Expand Up @@ -248,16 +252,6 @@ class ElementLoad(np.ndarray):
The distance from the ix position toward the j node over which
the loads are applied.
"""
# Custom properties
element = propy.str_property('element')
fx = propy.index_property(0)
fy = propy.index_property(1)
fz = propy.index_property(2)
mx = propy.index_property(3)
my = propy.index_property(4)
mz = propy.index_property(5)
_element_ref = propy.weakref_property('_element_ref')

def __new__(cls, element, fx=0, fy=0, fz=0, mx=0, my=0, mz=0, ix=0, dx=-1):
obj = np.array([fx, fy, fz, mx, my, mz], dtype='float').view(cls)
obj.element = element
Expand All @@ -270,15 +264,90 @@ def __array_finalize__(self, obj):
self.element = getattr(obj, 'element', '')
self.ix = getattr(obj, 'ix', 0)
self.dx = getattr(obj, 'dx', 0)
self._element_ref = None
self.element_ref = None

def element():
def fget(self):
return self._element
def fset(self, value):
if not isinstance(value, str):
value = str(value)
self._element = value
def fdel(self):
del self._element
return locals()
element = property(**element())

def element_ref():
def fget(self):
value = self._element_ref
if value is None:
return value
return value()
def fset(self, value):
if value is not None:
value = weakref.ref(value)
self._element_ref = value
def fdel(self):
del self._element_ref
return locals()
element_ref = property(**element_ref())

def fx():
def fget(self):
return self[0]
def fset(self, value):
self[0] = value
return locals()
fx = property(**fx())

def fy():
def fget(self):
return self[1]
def fset(self, value):
self[1] = value
return locals()
fy = property(**fy())

def fz():
def fget(self):
return self[2]
def fset(self, value):
self[2] = value
return locals()
fz = property(**fz())

def mx():
def fget(self):
return self[3]
def fset(self, value):
self[3] = value
return locals()
mx = property(**mx())

def my():
def fget(self):
return self[4]
def fset(self, value):
self[4] = value
return locals()
my = property(**my())

def mz():
def fget(self):
return self[5]
def fset(self, value):
self[5] = value
return locals()
mz = property(**mz())

def __repr__(self):
s = [
'element={!r}'.format(self.element),
'forces={!r}'.format((self.fx, self.fy, self.fz)),
'moments={!r}'.format((self.mx, self.my, self.mz)),
'ix={!r}'.format(self.ix),
'dx={!r}'.format(self.dx)
'dx={!r}'.format(self.dx),
]

return '{}({})'.format(type(self).__name__, ', '.join(s))
Expand Down
18 changes: 9 additions & 9 deletions civpy/structures/load_case.py
@@ -1,8 +1,13 @@
import propy
"""
Copyright (c) 2019, Matt Pewsey
"""

import attr

__all__ = ['LoadCase']


@attr.s(hash=False)
class LoadCase(object):
"""
A class representing a structural load case.
Expand All @@ -17,14 +22,9 @@ class LoadCase(object):
A list of :class:`.ElementLoad` to apply with the load case.
"""
# Custom properties
name = propy.str_property('name')

def __init__(self, name, node_loads=[], elem_loads=[]):
self.name = name
self.node_loads = node_loads
self.elem_loads = elem_loads

__repr__ = propy.repr_method('name', 'node_loads', 'elem_loads')
name = attr.ib()
node_loads = attr.ib(default=[])
elem_loads = attr.ib(default=[])

def set_nodes(self, ndict):
"""
Expand Down
19 changes: 9 additions & 10 deletions civpy/structures/material.py
@@ -1,8 +1,13 @@
import propy
"""
Copyright (c) 2019, Matt Pewsey
"""

import attr

__all__ = ['Material']


@attr.s(hash=False)
class Material(object):
"""
A class representing an engineered material.
Expand All @@ -16,12 +21,6 @@ class Material(object):
rigidity : float
The modulus of rigidity.
"""
# Custom properties
name = propy.str_property('name')

def __init__(self, name, elasticity, rigidity=0):
self.name = name
self.elasticity = elasticity
self.rigidity = rigidity

__repr__ = propy.repr_method('name', 'elasticity', 'rigidity')
name = attr.ib()
elasticity = attr.ib()
rigidity = attr.ib(default=0)

0 comments on commit bbf74b1

Please sign in to comment.