def mergedModel(meshes,**kargs): """Returns the fe Model obtained from merging individual meshes. The input arguments are (coords,elems) tuples. The return value is a merged fe Model. """ return Model(*mergeMeshes(meshes,**kargs))
def convertMesh(): """Transform the element type of the selected meshes. """ if not selection.check(): selection.ask() narrow_selection(Mesh) if not selection.names: return meshes = [ named(n) for n in selection.names ] eltypes = set([ m.eltype.name() for m in meshes if m.eltype is not None]) print "eltypes in selected meshes: %s" % eltypes if len(eltypes) > 1: warning("I can only convert meshes with the same element type\nPlease narrow your selection before trying conversion.") return if len(eltypes) == 1: fromtype = elementType(eltypes.pop()) choices = ["%s -> %s" % (fromtype,to) for to in fromtype.conversions.keys()] if len(choices) == 0: warning("Sorry, can not convert a %s mesh"%fromtype) return res = askItems([ _I('_conversion',itemtype='vradio',text='Conversion Type',choices=choices), _I('_compact',True), _I('_merge',itemtype='hradio',text="Merge Meshes",choices=['None','Each','All']), ]) if res: globals().update(res) print "Selected conversion %s" % _conversion totype = _conversion.split()[-1] names = [ "%s_converted" % n for n in selection.names ] meshes = [ m.convert(totype) for m in meshes ] if _merge == 'Each': meshes = [ m.fuse() for m in meshes ] elif _merge == 'All': print _merge coords,elems = mergeMeshes(meshes) print elems ## names = [ "_merged_mesh_%s" % e.nplex() for e in elems ] ## meshes = [ Mesh(coords,e,eltype=meshes[0].eltype) for e in elems ] ## print meshes[0].elems meshes = [ Mesh(coords,e,m.prop,m.eltype) for e,m in zip(elems,meshes) ] if _compact: print "compacting meshes" meshes = [ m.compact() for m in meshes ] export2(names,meshes) selection.set(names) clear() selection.draw()
def __init__(self,coords=None,elems=None,meshes=None,fuse=True): """Create new model data. coords is an array with nodal coordinates elems is either a single element connectivity array, or a list of such. In a simple case, coords and elems can be the arrays obtained by ``coords, elems = F.feModel()``. This is however limited to a model where all elements have the same number of nodes. Then you can use the list of elems arrays. The 'fe' plugin has a helper function to create this list. E.g., if ``FL`` is a list of Formices (possibly with different plexitude), then ``fe.mergeModels([Fi.feModel() for Fi in FL])`` will return the (coords,elems) tuple to create the Model. The model can have node and element property numbers. """ if meshes is not None: if coords is not None or elems is not None: raise ValueError,"You can not use nodes/elems together with meshes" for M in meshes: if M.prop is None: M.setProp(0) self.coords,self.elems = mergeMeshes(meshes,fuse=fuse) self.prop = concatenate([M.prop for M in meshes]) else: if not type(elems) == list: elems = [ elems ] self.coords = Coords(coords) self.elems = [ Connectivity(e) for e in elems ] self.prop = None meshes = self.meshes() nnodes = [ m.nnodes() for m in meshes ] nelems = [ m.nelems() for m in meshes ] nplex = [ m.nplex() for m in meshes ] self.cnodes = cumsum([0]+nnodes) self.celems = cumsum([0]+nelems) pf.message("Finite Element Model") pf.message("Number of nodes: %s" % self.coords.shape[0]) pf.message("Number of elements: %s" % self.celems[-1]) pf.message("Number of element groups: %s" % len(nelems)) #pf.message("Number of nodes per group: %s" % nnodes) pf.message("Number of elements per group: %s" % nelems) pf.message("Plexitude of each group: %s" % nplex)
def convertMesh(): """Transform the element type of the selected meshes. """ if not selection.check(): selection.ask() narrow_selection(Mesh) if not selection.names: return meshes = [named(n) for n in selection.names] eltypes = set([m.elName() for m in meshes]) print("eltypes in selected meshes: %s" % eltypes) if len(eltypes) > 1: warning( "I can only convert meshes with the same element type\nPlease narrow your selection before trying conversion." ) return if len(eltypes) == 1: fromtype = elementType(eltypes.pop()) choices = [ "%s -> %s" % (fromtype, to) for to in fromtype.conversions.keys() ] if len(choices) == 0: warning("Sorry, can not convert a %s mesh" % fromtype) return res = askItems([ _I('_conversion', itemtype='vradio', text='Conversion Type', choices=choices), _I('_compact', True), _I('_merge', itemtype='hradio', text="Merge Meshes", choices=['None', 'Each', 'All']), ]) if res: globals().update(res) print("Selected conversion %s" % _conversion) totype = _conversion.split()[-1] names = ["%s_converted" % n for n in selection.names] meshes = [m.convert(totype) for m in meshes] if _merge == 'Each': meshes = [m.fuse() for m in meshes] elif _merge == 'All': #print(_merge) coords, elems = mergeMeshes(meshes) #print(elems) ## names = [ "_merged_mesh_%s" % e.nplex() for e in elems ] ## meshes = [ Mesh(coords,e,eltype=meshes[0].elType()) for e in elems ] ## print meshes[0].elems meshes = [ Mesh(coords, e, m.prop, m.eltype) for e, m in zip(elems, meshes) ] if _compact: print("compacting meshes") meshes = [m.compact() for m in meshes] export2(names, meshes) selection.set(names) clear() selection.draw()