Source code for xsect.calc.cross_section
from __future__ import division
import numpy as np
from ..data import query_aisc
from .multi import multi_section_summary
__all__ = ['CrossSection']
[docs]class CrossSection():
"""
A class representing a member cross section.
Parameters
----------
name : str
The name of the cross section.
width, height : float
The width and height of the cross section in the x and y directions.
area : float
The cross sectional area.
unit_weight : float
The unit weight of the cross section.
inertia_x, inertia_y : float
The moment of inertias about the x and y axes.
inertia_z : float
The moment of inertia about the weak principal axis.
inertia_j : float
The polar moment of inertia.
inertia_t : float
The torsional moment of inertia.
gyradius_x, gyradius_y : float
The radius of gyration about the x and y axes.
gyradius_z : float
The radius of gyration about the weak principal axis.
elast_sect_mod_x, elast_sect_mod_y : float
The elastic section modulus about the x and y axes.
elast_sect_mod_z : float
The elastic section modulus about the weak principal axis.
plast_sect_mod_x, plast_sect_mod_y : float
The plastic section modulus about the x and y axes.
is_round : bool
If True, the member represents a round cross section, such as a round
or pipe.
kwargs
Additional keyword arguments for secondary section properties that
will be stored in the object's meta dictionary property.
Examples
--------
The dictionaries returned by the various section summary functions
included in this package may be passed to the initializer using the
dictionary unwrapper as shown below. This can assist in the more rapid
creation of cross section objects.
>>> from xsect import angle_summary
>>> odict = angle_summary(8, 8, 1.125)
>>> CrossSection('L8x8x1.125', **odict)
CrossSection(name='L8x8x1.125', ...)
"""
def __init__(self, name, area, width=0, height=0, unit_weight=None,
inertia_x=None, inertia_y=None, inertia_z=None,
inertia_j=None, inertia_t=None,
gyradius_x=None, gyradius_y=None, gyradius_z=None,
elast_sect_mod_x=None, elast_sect_mod_y=None, elast_sect_mod_z=None,
plast_sect_mod_x=None, plast_sect_mod_y=None,
is_round=False, **kwargs):
self.name = name
self.width = width
self.height = height
self.area = area
self.unit_weight = unit_weight
self.inertia_x = inertia_x
self.inertia_y = inertia_y
self.inertia_z = inertia_z
self.inertia_j = inertia_j
self.inertia_t = inertia_t
self.gyradius_x = gyradius_x
self.gyradius_y = gyradius_y
self.gyradius_z = gyradius_z
self.elast_sect_mod_x = elast_sect_mod_x
self.elast_sect_mod_y = elast_sect_mod_y
self.elast_sect_mod_z = elast_sect_mod_z
self.plast_sect_mod_x = plast_sect_mod_x
self.plast_sect_mod_y = plast_sect_mod_y
self.is_round = is_round
self.meta = dict(**kwargs)
def __repr__(self):
attrs = [
'name', 'area', 'width', 'height', 'unit_weight',
'inertia_x', 'inertia_y', 'inertia_z', 'inertia_j', 'inertia_t',
'gyradius_x', 'gyradius_y', 'gyradius_z',
'elast_sect_mod_x', 'elast_sect_mod_y', 'elast_sect_mod_z',
'plast_sect_mod_x', 'plast_sect_mod_y', 'is_round', 'meta'
]
s = ['{}={!r}'.format(k, getattr(self, k)) for k in attrs]
return '{}({})'.format(type(self).__name__, ', '.join(s))
[docs] @classmethod
def from_points(cls, name, add, subtract=[], is_round=False,
include_meta=True, **kwargs):
"""
Initializes a cross section from boundary points.
Parameters
----------
add : list
A list of arrays of (x, y) coordinates for shapes composing the
cross section.
subtract : list
A list of arrays of (x, y) coordinates for shapes subtracting
from the cross section.
is_round : bool
If True, the member represents a round cross section, such as a
round or pipe.
include_meta : bool
If True, secondary properties will be written to the object meta
dictionary. Otherwise, no values will be written to the meta
dictionary. This saves memory if data from the meta dictionary
is not needed.
Examples
--------
>>> from xsect import cruciform_points
>>> add = cruciform_points(8, 8, 1.125)
>>> CrossSection.from_points('4L8x8x1.125', add)
CrossSection(name='4L8x8x1.125', ...)
"""
odict = multi_section_summary(add, subtract)
# Set additional properties
odict['name'] = name
odict['is_round'] = is_round
odict.update(kwargs)
# Create the object
xsect = cls(**odict)
# Clear meta dictionary
if not include_meta:
xsect.meta.clear()
return xsect
[docs] @classmethod
def from_aisc(cls, name, metric=False, version=None, include_meta=True):
"""
Initializes a cross section from the properties in the AISC database.
Parameters
----------
name : str
The name of the member.
metric : bool
If True, searches for the name in the metric shape database.
Otherwise, searches for the name in the imperial shape database.
version : str
The version of the shape database to query. If None, the latest
version will be used.
include_meta : bool
If True, secondary properties in the database will be written
to the object meta dictionary. Otherwise, no values will be written
to the meta dictionary. This saves memory if data from the
meta dictionary is not needed.
Examples
--------
>>> CrossSection.from_aisc('L8x8x1-1/8')
CrossSection(name='L8X8X1-1/8', area=16.8, unit_weight=56.9, ...)
"""
odict = query_aisc(name, metric, version)
# Set additional properties
odict['inertia_j'] = odict['inertia_x'] + odict['inertia_y']
# If pipe, set to round
if odict['Type'].upper() == 'PIPE':
odict['is_round'] = True
# Create the object
xsect = cls(**odict)
# Clear meta dictionary
if not include_meta:
xsect.meta.clear()
return xsect