def build(self): if self.bdfpath is not None: if os.path.isfile(str(self.bdfpath)): self.nastranmodel = NastranModel(self.bdfpath) self.nastranmodel.read_bulkdata() else: print('WARNING - Nastran model "{0}" not found!'. format(self.bdfpath)) # reading structural elements if self.sefilepath is None: print('sefilepath must be defined!') return with open(self.sefilepath) as f: lines = f.readlines() for line in lines: line = strip(line) if not line: continue if line.startswith('#'): continue fields = map(strip, line.split(';')) sename, name = fields[:2] sename = sename.lower() seClass = self.se_classes.get(sename) if seClass is None: print('ERROR - Ivalid Structural Element: {0}'.format(sename)) continue eids = map(int, fields[2:]) self.ses[sename][name] = seClass(name, eids, model=self) # reading structural assemblies if self.safilepath is None: return with open(self.safilepath) as f: lines = f.readlines() for line in lines: line = strip(line) if not line: continue if line.startswith('#'): continue fields = line.split(';') saname, name = map(strip, fields[:2]) saname = saname.lower() saClass = self.sa_classes.get(saname) if saClass is None: print('ERROR - Ivalid Structural Assembly: {0}'.format(saname)) continue senames = fields[2:] args = [self.ses.get(sename) for sename in senames] self.sas[saname][name] = saClass(name, args)
class StructModel(object): """Structural Analysis Model Base Class Attributes ---------- ses : dict All types of supported structural element classes are grouped in this dictionary. """ def __init__(self, sefilepath, safilepath=None, bdfpath=None): # link to Nastran model self.bdfpath = bdfpath self.nastranmodel = None # structural elements and assemblies self.sefilepath = sefilepath self.safilepath = safilepath self.se_classes = dictX((c.__name__.lower(), c) for c in se_classes) self.sa_classes = dictX((c.__name__.lower(), c) for c in sa_classes) self.ses = dictX((c.__name__.lower(), dictX()) for c in se_classes) self.sas = dictX((c.__name__.lower(), dictX()) for c in sa_classes) self.build() def read_forces(self): if self.nastranmodel.op2 is None: print('ERROR - No op2 file loaded') return op2 = self.nastranmodel.op2 # reading forces for each SE for sename, d in self.ses.items(): already_print = False for se in d.values(): if not already_print: print('Reading forces for %s...' % sename) if isinstance(se, SE1D): se.forces = read_forces_1d(op2, se) elif isinstance(se, SE2D): se.forces = read_forces_2d(op2, se) if not already_print: print('finished!') already_print = True def build(self): if self.bdfpath is not None: if os.path.isfile(str(self.bdfpath)): self.nastranmodel = NastranModel(self.bdfpath) self.nastranmodel.read_bulkdata() else: print('WARNING - Nastran model "{0}" not found!'. format(self.bdfpath)) # reading structural elements if self.sefilepath is None: print('sefilepath must be defined!') return with open(self.sefilepath) as f: lines = f.readlines() for line in lines: line = strip(line) if not line: continue if line.startswith('#'): continue fields = map(strip, line.split(';')) sename, name = fields[:2] sename = sename.lower() seClass = self.se_classes.get(sename) if seClass is None: print('ERROR - Ivalid Structural Element: {0}'.format(sename)) continue eids = map(int, fields[2:]) self.ses[sename][name] = seClass(name, eids, model=self) # reading structural assemblies if self.safilepath is None: return with open(self.safilepath) as f: lines = f.readlines() for line in lines: line = strip(line) if not line: continue if line.startswith('#'): continue fields = line.split(';') saname, name = map(strip, fields[:2]) saname = saname.lower() saClass = self.sa_classes.get(saname) if saClass is None: print('ERROR - Ivalid Structural Assembly: {0}'.format(saname)) continue senames = fields[2:] args = [self.ses.get(sename) for sename in senames] self.sas[saname][name] = saClass(name, args)