Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion RFEM/TypesForSurfaces/surfaceEccentricity.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,36 @@
from RFEM.initModel import Model, clearAtributes
from RFEM.initModel import Model, clearAtributes, ConvertToDlString
from RFEM.enums import SurfaceEccentricityAlignment
from enum import Enum

class TransverseOffsetObject(Enum):
MEMBER, SURFACE = range(2)

class SurfaceEccentricity():
def __init__(self,
no: int = 1,
offset: float = 0.1,
assigned_to_surfaces: str = '1',
thickness_alignment = SurfaceEccentricityAlignment.ALIGN_MIDDLE,
transverse_offset_object = TransverseOffsetObject.SURFACE,
transverse_offset_object_no: int = 1,
transverse_offset_alignment = SurfaceEccentricityAlignment.ALIGN_MIDDLE,
comment: str = '',
params: dict = None,
model = Model):
"""
Surfase Eccentricity

Args:
no (int, optional): Number
offset (float, optional): Offset value
assigned_to_surfaces (str, optional): Eccentricity assignmet
thickness_alignment (enum, optional): Thickness alignment
transverse_offset_object (enum, optional): Transverse offset reference type (member, surface or None)
transverse_offset_object_no (int, optional): Transverse offset reference number
transverse_offset_alignment (enum, optional): Transverse offset aligment
comment (str, optional): Comments
params (dict, optional): Any WS Parameter relevant to the object and its value in form of a dictionary
"""

# Client model | Surface Eccentricity
clientObject = model.clientModel.factory.create('ns0:surface_eccentricity')
Expand All @@ -16,6 +41,25 @@ def __init__(self,
# Surface Eccentricity No.
clientObject.no = no

# Offset
clientObject.offset = offset

# Assigned to Surfaces
clientObject.assigned_to_surfaces = ConvertToDlString(assigned_to_surfaces)

# Thickness Assigmnet
clientObject.thickness_alignment = thickness_alignment.name

# Transverse Offset Object, Number, and Transverse Offset Alignment
if transverse_offset_object == TransverseOffsetObject.MEMBER:
clientObject.transverse_offset_reference_type = "TRANSVERSE_OFFSET_TYPE_FROM_MEMBER_SECTION"
clientObject.transverse_offset_reference_member = transverse_offset_object_no
clientObject.transverse_offset_alignment = transverse_offset_alignment.name
elif transverse_offset_object == TransverseOffsetObject.SURFACE:
clientObject.transverse_offset_reference_type = "TRANSVERSE_OFFSET_TYPE_FROM_SURFACE_THICKNESS"
clientObject.transverse_offset_reference_surface = transverse_offset_object_no
clientObject.transverse_offset_alignment = transverse_offset_alignment.name

# Comment
clientObject.comment = comment

Expand Down
20 changes: 19 additions & 1 deletion RFEM/TypesForSurfaces/surfaceMeshRefinements.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
from RFEM.initModel import Model, clearAtributes
from RFEM.initModel import Model, clearAtributes, ConvertToDlString

class SurfaceMeshRefinement():
def __init__(self,
no: int = 1,
surfaces: str = "1",
target_length: float = 0.2,
comment: str = '',
params: dict = None,
model = Model):
"""
Surface Mesh Refinement

Args:
no (int, optional): _description_. Defaults to 1.
surfaces (str, optional): _description_. Defaults to "1".
target_length (float, optional): _description_. Defaults to 0.1.
comment (str, optional): _description_. Defaults to ''.
params (dict, optional): _description_. Defaults to None.
"""

# Client model | Surface Mesh Refinement
clientObject = model.clientModel.factory.create('ns0:surface_mesh_refinement')
Expand All @@ -16,6 +28,12 @@ def __init__(self,
# Surface Mesh Refinement No.
clientObject.no = no

# Assigned to Surfaces
clientObject.surfaces = ConvertToDlString(surfaces)

# Target FE Length
clientObject.target_length = target_length

# Comment
clientObject.comment = comment

Expand Down
79 changes: 79 additions & 0 deletions RFEM/TypesForSurfaces/surfaceStiffnessModification.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,30 @@
from RFEM.initModel import Model, clearAtributes
from RFEM.enums import SurfaceStiffnessModificationType

class SurfaceStiffnessModification():
def __init__(self,
no: int = 1,
type = SurfaceStiffnessModificationType.TYPE_TOTAL_STIFFNESS_FACTOR,
factors: list = None,
comment: str = '',
params: dict = None,
model = Model):
"""
Surface Stiffeness Modification

Args:
no (int, optional): Number
type (_type_, optional): Modification Type
factors (list, optional): Stiffeness Modification Factors
if SurfaceStiffnessModificationType.TYPE_TOTAL_STIFFNESS_FACTOR:
factor_of_total_stiffness
elif SurfaceStiffnessModificationType.TYPE_PARTIAL_STIFFNESSES_FACTORS:
factor_of_bending_stiffness, factor_of_shear_stiffness, factor_of_membrane_stiffness, factor_of_eccentric_effects, and factor_of_weight
elif SurfaceStiffnessModificationType.TYPE_STIFFNESS_MATRIX_ELEMENTS_FACTORS:
all 21 factors from kd11 to kd38
comment (str, optional): Comments
params (dict, optional): Any WS Parameter relevant to the object and its value in form of a dictionary
"""

# Client model | Surface Stifness Modification
clientObject = model.clientModel.factory.create('ns0:surface_stiffness_modification')
Expand All @@ -16,6 +35,66 @@ def __init__(self,
# Surface Stifness Modification No.
clientObject.no = no

# Modification Type
clientObject.type = type.name

# Stiffeness factors
if type == SurfaceStiffnessModificationType.TYPE_TOTAL_STIFFNESS_FACTOR:
clientObject.factor_of_total_stiffness = factors[0]
elif type == SurfaceStiffnessModificationType.TYPE_PARTIAL_STIFFNESSES_FACTORS:
clientObject.factor_of_bending_stiffness = factors[0]
clientObject.factor_of_shear_stiffness = factors[1]
clientObject.factor_of_membrane_stiffness = factors[2]
clientObject.factor_of_eccentric_effects = factors[3]
clientObject.factor_of_weight = factors[4]
elif type == SurfaceStiffnessModificationType.TYPE_STIFFNESS_MATRIX_ELEMENTS_FACTORS:
if len(factors) == 1:
clientObject.kd11 = factors[0]
clientObject.kd12 = factors[0]
clientObject.kd13 = factors[0]
clientObject.kd22 = factors[0]
clientObject.kd23 = factors[0]
clientObject.kd33 = factors[0]
clientObject.kd44 = factors[0]
clientObject.kd45 = factors[0]
clientObject.kd55 = factors[0]
clientObject.kd66 = factors[0]
clientObject.kd67 = factors[0]
clientObject.kd68 = factors[0]
clientObject.kd77 = factors[0]
clientObject.kd78 = factors[0]
clientObject.kd88 = factors[0]
clientObject.kd16 = factors[0]
clientObject.kd17 = factors[0]
clientObject.kd18 = factors[0]
clientObject.kd27 = factors[0]
clientObject.kd28 = factors[0]
clientObject.kd38 = factors[0]
elif len(factors) == 21:
clientObject.kd11 = factors[0]
clientObject.kd12 = factors[1]
clientObject.kd13 = factors[2]
clientObject.kd22 = factors[3]
clientObject.kd23 = factors[4]
clientObject.kd33 = factors[5]
clientObject.kd44 = factors[6]
clientObject.kd45 = factors[7]
clientObject.kd55 = factors[8]
clientObject.kd66 = factors[9]
clientObject.kd67 = factors[10]
clientObject.kd68 = factors[11]
clientObject.kd77 = factors[12]
clientObject.kd78 = factors[13]
clientObject.kd88 = factors[14]
clientObject.kd16 = factors[15]
clientObject.kd17 = factors[16]
clientObject.kd18 = factors[17]
clientObject.kd27 = factors[18]
clientObject.kd28 = factors[19]
clientObject.kd38 = factors[20]
else:
raise IndexError('Size of "factors" can by either 1 or 21.')

# Comment
clientObject.comment = comment

Expand Down
103 changes: 59 additions & 44 deletions RFEM/TypesForSurfaces/surfaceSupport.py
Original file line number Diff line number Diff line change
@@ -1,44 +1,59 @@
from RFEM.initModel import Model, ConvertToDlString, clearAtributes

class SurfaceSupport():
def __init__(self,
no: int = 1,
surfaces_no: str = '1',
c_1_x: float = 0.0,
c_1_y: float = 0.0,
c_1_z: float = 0.0,
c_2_x: float = 0.0,
c_2_y: float = 0.0,
comment: str = '',
params: dict = None,
model = Model):

# Client model | Surface Support
clientObject = model.clientModel.factory.create('ns0:surface_support')

# Clears object atributes | Sets all atributes to None
clearAtributes(clientObject)

# Surface Support No.
clientObject.no = no

# Surface No. (e.g. "5 6 7 12")
clientObject.surfaces = ConvertToDlString(surfaces_no)

# Surface Support Conditions
clientObject.translation_x = c_1_x
clientObject.translation_y = c_1_y
clientObject.translation_z = c_1_z
clientObject.shear_xz = c_2_x
clientObject.shear_yz = c_2_y

# Comment
clientObject.comment = comment

# Adding optional parameters via dictionary
if params:
for key in params:
clientObject[key] = params[key]

# Add Surface Support to client model
model.clientModel.service.set_surface_support(clientObject)
from RFEM.initModel import Model, ConvertToDlString, clearAtributes
from RFEM.dataTypes import inf

class SurfaceSupport():
def __init__(self,
no: int = 1,
surfaces_no: str = '1',
c_ux: float = 10000.0,
c_uy: float = 0.0,
c_uz: float = inf,
c_vxz: float = inf,
c_vyz: float = inf,
comment: str = '',
params: dict = None,
model = Model):
"""
Surface Support

Args:
no (int, optional): Number
surfaces_no (str, optional): Assignet du surfaces no
c_ux (float, optional): Translational Support in X direction
c_uy (float, optional): Translational Support in Y direction
c_uz (float, optional): Translational Support in Z direction
c_vxz (float, optional): Shear Support in XZ direction
c_vyz (float, optional): Shear Support in YZ direction
comment (str, optional): Comments
params (dict, optional): Any WS Parameter relevant to the object and its value in form of a dictionary
"""

# Client model | Surface Support
clientObject = model.clientModel.factory.create('ns0:surface_support')

# Clears object atributes | Sets all atributes to None
clearAtributes(clientObject)

# Surface Support No.
clientObject.no = no

# Surface No. (e.g. "5 6 7 12")
clientObject.surfaces = ConvertToDlString(surfaces_no)

# Surface Support Conditions
clientObject.translation_x = c_ux
clientObject.translation_y = c_uy
clientObject.translation_z = c_uz
clientObject.shear_xz = c_vxz
clientObject.shear_yz = c_vyz

# Comment
clientObject.comment = comment

# Adding optional parameters via dictionary
if params:
for key in params:
clientObject[key] = params[key]

# Add Surface Support to client model
model.clientModel.service.set_surface_support(clientObject)
13 changes: 12 additions & 1 deletion RFEM/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -1742,6 +1742,7 @@ class SteelMemberRotationalRestraintRotationalStiffness(Enum):
Steel Member Rotational Restraint Rotational Stiffness
'''
ROTATIONAL_STIFFNESS_INFINITELY, ROTATIONAL_STIFFNESS_MANUALLY = range(2)

class SteelBoundaryConditionsSupportType(Enum):
'''
Steel Boundary Conditions Support Type
Expand All @@ -1750,14 +1751,24 @@ class SteelBoundaryConditionsSupportType(Enum):
SUPPORT_TYPE_FIXED_IN_Y_AND_WARPING, SUPPORT_TYPE_INDIVIDUALLY, SUPPORT_TYPE_NONE, SUPPORT_TYPE_TORSION, SUPPORT_TYPE_TORSION_AND_WARPING = range(
9)


class SteelBoundaryConditionsEccentricityTypeZ(Enum):
'''
Steel Boundary Conditions Eccentricity Type Z Type
'''
ECCENTRICITY_TYPE_AT_LOWER_FLANGE, ECCENTRICITY_TYPE_AT_UPPER_FLANGE, ECCENTRICITY_TYPE_NONE, ECCENTRICITY_TYPE_USER_VALUE = range(
4)

class SurfaceStiffnessModificationType(Enum):
'''
Surface Stiffness Modification Type
'''
TYPE_PARTIAL_STIFFNESSES_FACTORS, TYPE_STIFFNESS_MATRIX_ELEMENTS_FACTORS, TYPE_TOTAL_STIFFNESS_FACTOR = range(3)

class SurfaceEccentricityAlignment(Enum):
'''
Surface Eccentricity Alignment
'''
ALIGN_TOP, ALIGN_MIDDLE, ALIGN_BOTTOM = range(3)

class ActionCategoryType(Enum):
'''
Expand Down
4 changes: 4 additions & 0 deletions UnitTests/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ def template():
#assert member.length == 5
#assert member.result_beam_z_minus == 4

# Errors
# To test various errors like ValueError, just put 'with pytest.raises(ValueError):'
# before expression that should raise a ValueError.

# COMMENTS
# Broken object or type can by commented out assuming author will add
# associated bug number so everybody else can understand and track the issue.
Expand Down
2 changes: 1 addition & 1 deletion UnitTests/test_RigidLinks.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def test_rigid_links():

RigidLink(1, 3, 6)
RigidLink.LineToLine(2, 3, 8)
# RigidLink.LineToSurface(0, 3, 3, 2) # bug 24282
# RigidLink.LineToSurface(0, 3, 3, 2) # TODO: bug 24282
RigidLink.Diapragm(4,'3 4', '6 9')

Model.clientModel.service.finish_modification()
Expand Down
5 changes: 4 additions & 1 deletion UnitTests/test_SurfaceLoad_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
from RFEM.LoadCasesAndCombinations.loadCase import LoadCase
from RFEM.LoadCasesAndCombinations.staticAnalysisSettings import StaticAnalysisSettings
from RFEM.TypesForNodes.nodalSupport import NodalSupport
from RFEM.TypesForSurfaces.surfaceSupport import SurfaceSupport
from RFEM.BasicObjects.surface import Surface
from RFEM.BasicObjects.line import Line
from RFEM.BasicObjects.node import Node
from RFEM.BasicObjects.thickness import Thickness
from RFEM.BasicObjects.material import Material
from RFEM.initModel import Model, Calculate_all
from RFEM.initModel import Model
from RFEM.enums import *

if Model.clientModel is None:
Expand Down Expand Up @@ -101,6 +102,8 @@ def test_surface_loads():
## Mass Type Surface Load ##
SurfaceLoad.Mass(14, 1, '1', individual_mass_components=True, mass_parameter=[500, 600, 700])

SurfaceSupport(1,'1')

#Calculate_all() # Don't use in unit tests. See template for more info.

Model.clientModel.service.finish_modification()
Loading