mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-11 10:06:47 +00:00
add zero-length springs for point connections and connection-to-member
This commit is contained in:
+102
-16
@@ -1,5 +1,8 @@
|
||||
import json
|
||||
import numpy as np
|
||||
import itertools
|
||||
|
||||
flatten = itertools.chain.from_iterable
|
||||
|
||||
class COMMANDFILE:
|
||||
def __init__(self, dataFilename, asterFilename):
|
||||
@@ -32,6 +35,7 @@ class COMMANDFILE:
|
||||
conn = [c for c in connections if c['ifcName'] == rel['relatedConnection']][0]
|
||||
if conn['geometryType'] == 'point':
|
||||
rel['groupName'] = self.getGroupName(rel['relatingElement']) + '_0DC_' + self.getGroupName(rel['relatedConnection'])
|
||||
rel['springGroupName'] = self.getGroupName(rel['relatingElement']) + '_1DS_' + self.getGroupName(rel['relatedConnection'])
|
||||
self.calculateConstraints(rel)
|
||||
conn['relatedElements'].append(rel)
|
||||
# End <--
|
||||
@@ -42,6 +46,7 @@ class COMMANDFILE:
|
||||
edgeGroupNames = tuple([self.getGroupName(el['ifcName']) for el in elements if el['geometryType'] == 'line'])
|
||||
faceGroupNames = tuple([self.getGroupName(el['ifcName']) for el in elements if el['geometryType'] == 'surface'])
|
||||
point0DGroupNames = tuple([self.getGroupName(el['ifcName']) for el in connections if el['geometryType'] == 'point'])
|
||||
spring1DGroupNames = tuple(flatten([[rel['springGroupName'] for rel in el['connections']] for el in elements]))
|
||||
|
||||
unifiedConnection = False
|
||||
rigidLinkGroupNames = []
|
||||
@@ -138,7 +143,7 @@ model = AFFE_MODELE(
|
||||
),'''
|
||||
|
||||
context = {
|
||||
'groupNames': point0DGroupNames
|
||||
'groupNames': tuple(flatten([point0DGroupNames, spring1DGroupNames]))
|
||||
}
|
||||
|
||||
f.write(template.format(**context))
|
||||
@@ -347,16 +352,36 @@ element = AFFE_CARA_ELEM(
|
||||
_F(
|
||||
GROUP_MA = '{groupName}',
|
||||
CARA = 'K_TR_D_N',
|
||||
VALE = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
|
||||
VALE = {stiffnesses},
|
||||
REPERE = 'LOCAL'
|
||||
),'''
|
||||
|
||||
context = {
|
||||
'groupName': self.getGroupName(conn['ifcName'])
|
||||
'groupName': self.getGroupName(conn['ifcName']),
|
||||
'stiffnesses': conn['stiffnesses']
|
||||
}
|
||||
|
||||
f.write(template.format(**context))
|
||||
|
||||
for rel in conn['relatedElements']:
|
||||
|
||||
template = \
|
||||
'''
|
||||
_F(
|
||||
GROUP_MA = '{groupName}',
|
||||
CARA = 'K_TR_D_L',
|
||||
VALE = {stiffnesses},
|
||||
REPERE = 'LOCAL'
|
||||
),'''
|
||||
|
||||
context = {
|
||||
'groupName': rel['springGroupName'],
|
||||
'stiffnesses': rel['stiffnesses']
|
||||
}
|
||||
|
||||
f.write(template.format(**context))
|
||||
|
||||
|
||||
f.write(
|
||||
'''
|
||||
),'''
|
||||
@@ -401,6 +426,23 @@ element = AFFE_CARA_ELEM(
|
||||
|
||||
f.write(template.format(**context))
|
||||
|
||||
for rel in conn['relatedElements']:
|
||||
|
||||
template = \
|
||||
'''
|
||||
_F(
|
||||
GROUP_MA = '{groupName}',
|
||||
CARA = 'VECT_X_Y',
|
||||
VALE = {localAxesXY}
|
||||
),'''
|
||||
|
||||
context = {
|
||||
'groupName': rel['springGroupName'],
|
||||
'localAxesXY': tuple(rel['orientation'][0] + rel['orientation'][1])
|
||||
}
|
||||
|
||||
f.write(template.format(**context))
|
||||
|
||||
f.write(
|
||||
'''
|
||||
),'''
|
||||
@@ -517,7 +559,8 @@ liaisons = AFFE_CHAR_MECA(
|
||||
|
||||
f.write(
|
||||
'''
|
||||
)'''
|
||||
)
|
||||
'''
|
||||
)
|
||||
|
||||
template = \
|
||||
@@ -664,6 +707,7 @@ FIN()
|
||||
'coeffs': [],
|
||||
'dofs': []
|
||||
}
|
||||
stiffnesses = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
|
||||
if not rel['appliedCondition']:
|
||||
rel['appliedCondition'] = {
|
||||
'dx': True,
|
||||
@@ -673,26 +717,45 @@ FIN()
|
||||
'dry': True,
|
||||
'drz': True
|
||||
}
|
||||
if rel['appliedCondition']['dx']:
|
||||
if isinstance(rel['appliedCondition']['dx'], bool) and rel['appliedCondition']['dx']:
|
||||
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0], -o[0][0], -o[1][0], -o[2][0]))
|
||||
liaisons['dofs'].append(('DX', 'DY', 'DZ', 'DX', 'DY', 'DZ'))
|
||||
if rel['appliedCondition']['dy']:
|
||||
elif isinstance(rel['appliedCondition']['dx'], float) and rel['appliedCondition']['dx'] > 0:
|
||||
stiffnesses[0] = rel['appliedCondition']['dx']
|
||||
|
||||
if isinstance(rel['appliedCondition']['dy'], bool) and rel['appliedCondition']['dy']:
|
||||
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1], -o[0][1], -o[1][1], -o[2][1]))
|
||||
liaisons['dofs'].append(('DX', 'DY', 'DZ', 'DX', 'DY', 'DZ'))
|
||||
if rel['appliedCondition']['dz']:
|
||||
elif isinstance(rel['appliedCondition']['dy'], float) and rel['appliedCondition']['dy'] > 0:
|
||||
stiffnesses[1] = rel['appliedCondition']['dy']
|
||||
|
||||
if isinstance(rel['appliedCondition']['dz'], bool) and rel['appliedCondition']['dz']:
|
||||
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2], -o[0][2], -o[1][2], -o[2][2]))
|
||||
liaisons['dofs'].append(('DX', 'DY', 'DZ', 'DX', 'DY', 'DZ'))
|
||||
if rel['appliedCondition']['drx']:
|
||||
elif isinstance(rel['appliedCondition']['dz'], float) and rel['appliedCondition']['dz'] > 0:
|
||||
stiffnesses[2] = rel['appliedCondition']['dz']
|
||||
|
||||
if isinstance(rel['appliedCondition']['drx'], bool) and rel['appliedCondition']['drx']:
|
||||
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0], -o[0][0], -o[1][0], -o[2][0]))
|
||||
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ', 'DRX', 'DRY', 'DRZ'))
|
||||
if rel['appliedCondition']['dry']:
|
||||
elif isinstance(rel['appliedCondition']['drx'], float) and rel['appliedCondition']['drx'] > 0:
|
||||
stiffnesses[3] = rel['appliedCondition']['drx']
|
||||
|
||||
if isinstance(rel['appliedCondition']['dry'], bool) and rel['appliedCondition']['dry']:
|
||||
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1], -o[0][1], -o[1][1], -o[2][1]))
|
||||
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ', 'DRX', 'DRY', 'DRZ'))
|
||||
if rel['appliedCondition']['drz']:
|
||||
elif isinstance(rel['appliedCondition']['dry'], float) and rel['appliedCondition']['dry'] > 0:
|
||||
stiffnesses[4] = rel['appliedCondition']['dry']
|
||||
|
||||
if isinstance(rel['appliedCondition']['drz'], bool) and rel['appliedCondition']['drz']:
|
||||
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2], -o[0][2], -o[1][2], -o[2][2]))
|
||||
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ', 'DRX', 'DRY', 'DRZ'))
|
||||
elif isinstance(rel['appliedCondition']['drz'], float) and rel['appliedCondition']['drz'] > 0:
|
||||
stiffnesses[5] = rel['appliedCondition']['drz']
|
||||
|
||||
|
||||
rel['liaisons'] = liaisons
|
||||
rel['stiffnesses'] = tuple(stiffnesses)
|
||||
|
||||
def calculateRestraints(self, conn):
|
||||
group = self.getGroupName(conn['ifcName'])
|
||||
@@ -702,28 +765,51 @@ FIN()
|
||||
'coeffs': [],
|
||||
'dofs': []
|
||||
}
|
||||
stiffnesses = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
|
||||
|
||||
if not conn['appliedCondition']:
|
||||
conn['liaisons'] = liaisons
|
||||
conn['stiffnesses'] = tuple(stiffnesses)
|
||||
return
|
||||
if conn['appliedCondition']['dx']:
|
||||
|
||||
if isinstance(conn['appliedCondition']['dx'], bool) and conn['appliedCondition']['dx']:
|
||||
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0]))
|
||||
liaisons['dofs'].append(('DX', 'DY', 'DZ'))
|
||||
if conn['appliedCondition']['dy']:
|
||||
elif isinstance(conn['appliedCondition']['dx'], float) and conn['appliedCondition']['dx'] > 0:
|
||||
stiffnesses[0] = conn['appliedCondition']['dx']
|
||||
|
||||
if isinstance(conn['appliedCondition']['dy'], bool) and conn['appliedCondition']['dy']:
|
||||
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1]))
|
||||
liaisons['dofs'].append(('DX', 'DY', 'DZ'))
|
||||
if conn['appliedCondition']['dz']:
|
||||
elif isinstance(conn['appliedCondition']['dy'], float) and conn['appliedCondition']['dy'] > 0:
|
||||
stiffnesses[1] = conn['appliedCondition']['dy']
|
||||
|
||||
if isinstance(conn['appliedCondition']['dz'], bool) and conn['appliedCondition']['dz']:
|
||||
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2]))
|
||||
liaisons['dofs'].append(('DX', 'DY', 'DZ'))
|
||||
if conn['appliedCondition']['drx']:
|
||||
elif isinstance(conn['appliedCondition']['dz'], float) and conn['appliedCondition']['dz'] > 0:
|
||||
stiffnesses[2] = conn['appliedCondition']['dz']
|
||||
|
||||
if isinstance(conn['appliedCondition']['drx'], bool) and conn['appliedCondition']['drx']:
|
||||
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0]))
|
||||
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ'))
|
||||
if conn['appliedCondition']['dry']:
|
||||
elif isinstance(conn['appliedCondition']['drx'], float) and conn['appliedCondition']['drx'] > 0:
|
||||
stiffnesses[3] = conn['appliedCondition']['drx']
|
||||
|
||||
if isinstance(conn['appliedCondition']['dry'], bool) and conn['appliedCondition']['dry']:
|
||||
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1]))
|
||||
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ'))
|
||||
if conn['appliedCondition']['drz']:
|
||||
elif isinstance(conn['appliedCondition']['dry'], float) and conn['appliedCondition']['dry'] > 0:
|
||||
stiffnesses[4] = conn['appliedCondition']['dry']
|
||||
|
||||
if isinstance(conn['appliedCondition']['drz'], bool) and conn['appliedCondition']['drz']:
|
||||
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2]))
|
||||
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ'))
|
||||
elif isinstance(conn['appliedCondition']['drz'], float) and conn['appliedCondition']['drz'] > 0:
|
||||
stiffnesses[5] = conn['appliedCondition']['drz']
|
||||
|
||||
conn['liaisons'] = liaisons
|
||||
conn['stiffnesses'] = tuple(stiffnesses)
|
||||
|
||||
if __name__ == '__main__':
|
||||
fileNames = ['cantilever_01', 'portal_01']
|
||||
|
||||
+20
-10
@@ -1,3 +1,5 @@
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
import os
|
||||
import time
|
||||
import json
|
||||
@@ -5,7 +7,6 @@ import salome
|
||||
import salome_notebook
|
||||
import salome_version
|
||||
import numpy as np
|
||||
from pprint import pprint
|
||||
|
||||
class MODEL:
|
||||
def __init__(self, dataFilename, medFilename, meshSize):
|
||||
@@ -141,7 +142,7 @@ class MODEL:
|
||||
|
||||
### Define entities ###
|
||||
start_time = time.time()
|
||||
pprint('Defining Object Geometry')
|
||||
print('Defining Object Geometry')
|
||||
init_time = start_time
|
||||
|
||||
# Loop 1
|
||||
@@ -202,7 +203,7 @@ class MODEL:
|
||||
|
||||
elapsed_time = time.time() - init_time
|
||||
init_time += elapsed_time
|
||||
pprint('Building Geometry Defined in %g sec' % (elapsed_time))
|
||||
print('Building Geometry Defined in %g sec' % (elapsed_time))
|
||||
|
||||
if len([e for e in elements if e['geometryType'] == 'line']) > 0:
|
||||
buildingShapeType = 'EDGE'
|
||||
@@ -242,7 +243,7 @@ class MODEL:
|
||||
|
||||
elapsed_time = time.time() - init_time
|
||||
init_time += elapsed_time
|
||||
pprint('Building Geometry Groups Defined in %g sec' % (elapsed_time))
|
||||
print('Building Geometry Groups Defined in %g sec' % (elapsed_time))
|
||||
|
||||
###
|
||||
### SMESH component
|
||||
@@ -251,7 +252,7 @@ class MODEL:
|
||||
import SMESH
|
||||
from salome.smesh import smeshBuilder
|
||||
|
||||
pprint('Defining Mesh Components')
|
||||
print('Defining Mesh Components')
|
||||
|
||||
if NEW_SALOME:
|
||||
smesh = smeshBuilder.New()
|
||||
@@ -287,7 +288,7 @@ class MODEL:
|
||||
|
||||
elapsed_time = time.time() - init_time
|
||||
init_time += elapsed_time
|
||||
pprint('Meshing Operations Completed in %g sec' % (elapsed_time))
|
||||
print('Meshing Operations Completed in %g sec' % (elapsed_time))
|
||||
|
||||
# Define and add groups for all curve and surface members
|
||||
if len([e for e in elements if e['geometryType'] == 'line']) > 0:
|
||||
@@ -310,6 +311,7 @@ class MODEL:
|
||||
for j,rel in enumerate(el['connections']):
|
||||
tempgroup = bldMesh.GroupOnGeom(el['connObjs'][j], self.getGroupName(el['ifcName']) + '_0DC_' + self.getGroupName(rel['relatedConnection']), SMESH.NODE)
|
||||
smesh.SetName(tempgroup, self.getGroupName(el['ifcName']) + '_0DC_' + self.getGroupName(rel['relatedConnection']))
|
||||
rel['node'] = (bldMesh.GetIDSource(tempgroup.GetNodeIDs(), SMESH.NODE)).GetIDs()[0]
|
||||
# if rel['eccentricity']:
|
||||
# tempgroup = bldMesh.GroupOnGeom(el['linkObjs'][j], self.getGroupName(el['ifcName']) + '_1DC_' + self.getGroupName(rel['relatedConnection']), SMESH.EDGE)
|
||||
# smesh.SetName(tempgroup, self.getGroupName(el['ifcName']) + '_1DC_' + self.getGroupName(rel['relatedConnection']))
|
||||
@@ -321,13 +323,22 @@ class MODEL:
|
||||
nodesId = bldMesh.GetIDSource(tempgroup.GetNodeIDs(), SMESH.NODE)
|
||||
tempgroup = bldMesh.Add0DElementsToAllNodes(nodesId, self.getGroupName(conn['ifcName']))
|
||||
smesh.SetName(tempgroup, self.getGroupName(conn['ifcName']))
|
||||
conn['node'] = nodesId.GetIDs()[0]
|
||||
|
||||
# create 1D SEG2 spring elements
|
||||
for el in elements:
|
||||
for j,rel in enumerate(el['connections']):
|
||||
grpName = bldMesh.CreateEmptyGroup(SMESH.EDGE, self.getGroupName(el['ifcName']) + '_1DS_' + self.getGroupName(rel['relatedConnection']))
|
||||
smesh.SetName(grpName, self.getGroupName(el['ifcName']) + '_1DS_' + self.getGroupName(rel['relatedConnection']))
|
||||
conn = [conn for conn in connections if conn['ifcName'] == rel['relatedConnection']][0]
|
||||
grpName.Add([bldMesh.AddEdge([conn['node'], rel['node']])])
|
||||
|
||||
self.mesh = bldMesh
|
||||
self.meshNodes = bldMesh.GetNodesId()
|
||||
|
||||
elapsed_time = time.time() - init_time
|
||||
init_time += elapsed_time
|
||||
pprint('Mesh Groups Defined in %g sec' % (elapsed_time))
|
||||
print('Mesh Groups Defined in %g sec' % (elapsed_time))
|
||||
|
||||
try:
|
||||
if NEW_SALOME:
|
||||
@@ -342,7 +353,7 @@ class MODEL:
|
||||
else:
|
||||
bldMesh.ExportMED(self.medFilename, 0, SMESH.MED_V2_2, 1, None, 0)
|
||||
except:
|
||||
pprint('ExportMED() failed. Invalid file name?')
|
||||
print('ExportMED() failed. Invalid file name?')
|
||||
|
||||
if salome.sg.hasDesktop():
|
||||
if NEW_SALOME:
|
||||
@@ -350,9 +361,8 @@ class MODEL:
|
||||
else:
|
||||
salome.sg.updateObjBrowser(1)
|
||||
|
||||
|
||||
elapsed_time = init_time - start_time
|
||||
pprint('ALL Operations Completed in %g sec' % (elapsed_time))
|
||||
print('ALL Operations Completed in %g sec' % (elapsed_time))
|
||||
|
||||
if __name__ == '__main__':
|
||||
fileNames = ['cantilever_01', 'portal_01']
|
||||
|
||||
Reference in New Issue
Block a user