def __init__(self, patch, fromname, index, name): self.patch = patch self.fromname = fromname self.index = index self.name = name self.modules = [] self.cables = [] self.netlist = NetList() self.free_indexes = range(1, MAX_MODULES + 1)
def __init__(self, patch, fromname, index, name): self.patch = patch self.fromname = fromname self.index = index self.name = name self.modules = [] self.cables = [] self.netlist = NetList() self.free_indexes = range(1, MAX_MODULES+1)
def parse(self): lines = self.lines line = lines.pop(0) fields = line.split() if len(fields) > 1: if len(fields) == 8: l = fields[0] line = ' '.join(fields[1:]) lines.insert(0, line) sect = int(l) else: sect = int(line) if sect: area = self.patch.voice else: area = self.patch.fx area.cables = [] area.netlist = NetList() area.cables = [None] * len(self.lines) for i in xrange(len(self.lines)): values = eval_fields(lines[i]) c = Cable(area) c.color, dmod, dconn, ddir, smod, sconn, sdir = values dmodule = area.find_module(dmod) smodule = area.find_module(smod) if ddir: dest = dmodule.outputs[dconn] else: dest = dmodule.inputs[dconn] if sdir: source = smodule.outputs[sconn] else: source = smodule.inputs[sconn] # if dest is an output, make it the source if dest.direction: dest, source = source, dest area.cables[i] = c c.source, c.dest = source, dest source.cables.append(c) dest.cables.append(c) # update netlist with source and dest area.netlist.add(source, dest)
class Area(object): '''Area class for patch voice and fx area data (modules, cables, etc...) This class maintains the modules, cable connections, and netlist for the voice and fx areas of a nord modules g2 patch. \tuseful members: \tpatch\tpatch containing area. \tmodules\tarray of modules within area. \tcables\tarray of cables connections within area. ''' def __init__(self, patch, fromname, index, name): self.patch = patch self.fromname = fromname self.index = index self.name = name self.modules = [] self.cables = [] self.netlist = NetList() self.free_indexes = range(1, MAX_MODULES + 1) def find_module(self, index): '''find_module(index) -> module at index or None''' for module in self.modules: if module.index == index: return module return None modmembers = ['name', 'index', 'color', 'horiz', 'vert', 'uprate', 'leds'] def add_module(self, shortnm, **kw): '''add_module(shortnm, **kw) -> Module \tshortnm\tmodule short type name to add. \t**kw: \tname\tname of module (label displayed in upper left corner. \tcolor\tcolor of module (nord.g2.color.g2modulecolors. \thoriz\tcolumn where module is placed (<32). \tvert\trow where module is placed (<127) ''' if len(self.modules) >= MAX_MODULES: raise Exception('Too many modules') type = self.fromname(shortnm) m = Module(type, self) m.name = type.shortnm if len(self.free_indexes) == 0: raise Exception('No free module indexes') m.index = self.free_indexes.pop(0) m.color = m.horiz = m.vert = m.uprate = m.leds = 0 #print 'update kw=', kw m.__dict__.update(kw) self.modules.append(m) return m def del_module(self, module): '''del_module(module) -> None \tdelete module from modules sequence. ''' self.free_indexes.insert(0, module.index) self.modules.remove(module) def connect(self, source, dest, color): '''connect(source, dest, color) -> None \tconnect input/output to input from source port to dest port using color. \tcolor is in nord.g2.colors.g2cablecolors or nord.nm1.colors.nm1cablecolors. \tcannot connect 2 Outputs together. ''' sid = (source.module.index << 16) + source.index did = (dest.module.index << 16) + dest.index if source.direction == dest.direction and sid > did: source, dest = dest, source cable = Cable(self) self.cables.append(cable) cable.color = color cable.source = source source.cables.append(cable) cable.dest = dest dest.cables.append(cable) self.netlist.add(source, dest) def disconnect(self, cable): '''disconnect(cable) -> None \tdisconnect a input or output port - update all cables connected to port ''' source, dest = cable.source, cable.dest #printf('disconnect %s:%s -> %s:%s\n' ( # cable.source.module.name, cable.source.type.name, # cable.dest.module.name, cable.dest.type.name) #printf(' cable %s', self.netlist.nettos(cable.source.net)) # collect all the cables on the net cables = [] for input in source.net.inputs: for c in input.cables: if not c in cables: cables.append(c) cables.remove(cable) source.cables.remove(cable) dest.cables.remove(cable) self.cables.remove(cable) self.netlist.delete(source, dest) source.net = dest.net = None for c in cables: #printf('connect\n source %s\n', self.netlist.nettos(c.source.net)) #printf(' dest %s\n', self.netlist.nettos(c.dest.net)) self.netlist.add(c.source, c.dest) #printf('after disconnect\n source %s\n', self.netlist.nettos(source.net)) #printf(' dest %s\n', self.netlist.nettos(dest.net)) def removeconnector(self, connector): '''removeconnector(connector) -> connector \tremove connector from the cable net and cable connections. \tconnector is a member of the Module object. ''' connectors = [] minconn = None mindist = 1000000 #printf('removeconnector %s:%s\n', connector.module.name, # connector.type.name) #printf('before remove %s\n', self.netlist.nettos(connector.net)) while len(connector.cables): cable = connector.cables[0] source, dest = cable.source, cable.dest self.disconnect(cable) if connector == source: other = dest else: other = source dist = self.connection_length(connector, other) if dist < mindist: if minconn: connectors.append(minconn) mindist = dist minconn = other elif not other in connectors: connectors.append(other) if len(connectors) != 0: for connector in connectors: #printf(' new %s:%s -> %s:%s\n', minconn.module.name, minconn.type.name, # connector.module.name, connector.type.name) if minconn.direction: self.connect(minconn, connector, 0) else: self.connect(connector, minconn, 0) #printf(' done %s\n', self.netlist.nettos(connector.net)) #printf('after remove %s\n', self.netlist.nettos(minconn.net)) return minconn # quick cable length calculation def cable_length(self, cable): '''cable_length(cable) -> length of cable''' return self.connection_length(cable.source, cable.dest) # quick connection length calculation (returns square distance) def connection_length(self, start, end): '''connection_length(start, end) -> distance from start port to end port''' # horiz coordinates about 20 times bigger. sm, em = start.module, end.module dh = (19 * em.horiz + end.type.horiz) - (19 * sm.horiz + start.type.horiz) dv = (em.vert + end.type.vert) - (sm.vert + start.type.vert) return (dh**2) + (dv**2) def shorten_cables(self): '''shorten_cables() \tmake all cable as short as possible. ''' # copy netlist before changes for later netlist = self.netlist.copy() # remove all cables cables = self.cables[:] while len(cables): cable = cables.pop(0) cable.source.net.color = cable.color self.disconnect(cable) def findclosest(g2area, fromlist, tolist): mincablelen = 1000000 mincable = None for fromconn in fromlist: for toconn in tolist: cablelen = g2area.connection_length(fromconn, toconn) if cablelen < mincablelen: mincablelen = cablelen mincable = [fromconn, toconn] return mincable # on each net, successively connect closet connector # net list will change while modifying so we need a static copy for net in netlist.nets: inputs = net.inputs if net.output: fromconn, toconn = findclosest(self, [net.output], inputs) else: conn = inputs.pop(0) fromconn, toconn = findclosest(self, [conn], inputs) self.connect(fromconn, toconn, net.color) inputs.remove(toconn) connected = [fromconn, toconn] while len(inputs): fromconn, toconn = findclosest(self, connected, inputs) self.connect(fromconn, toconn, net.color) inputs.remove(toconn) connected.append(toconn)
class Area(object): '''Area class for patch voice and fx area data (modules, cables, etc...) This class maintains the modules, cable connections, and netlist for the voice and fx areas of a nord modules g2 patch. \tuseful members: \tpatch\tpatch containing area. \tmodules\tarray of modules within area. \tcables\tarray of cables connections within area. ''' def __init__(self, patch, fromname, index, name): self.patch = patch self.fromname = fromname self.index = index self.name = name self.modules = [] self.cables = [] self.netlist = NetList() self.free_indexes = range(1, MAX_MODULES+1) def find_module(self, index): '''find_module(index) -> module at index or None''' for module in self.modules: if module.index == index: return module return None modmembers = [ 'name', 'index', 'color', 'horiz', 'vert', 'uprate', 'leds' ] def add_module(self, shortnm, **kw): '''add_module(shortnm, **kw) -> Module \tshortnm\tmodule short type name to add. \t**kw: \tname\tname of module (label displayed in upper left corner. \tcolor\tcolor of module (nord.g2.color.g2modulecolors. \thoriz\tcolumn where module is placed (<32). \tvert\trow where module is placed (<127) ''' if len(self.modules) >= MAX_MODULES: raise Exception('Too many modules') type = self.fromname(shortnm) m = Module(type, self) m.name = type.shortnm if len(self.free_indexes) == 0: raise Exception('No free module indexes') m.index = self.free_indexes.pop(0) m.color = m.horiz = m.vert = m.uprate = m.leds = 0 #print 'update kw=', kw m.__dict__.update(kw) self.modules.append(m) return m def del_module(self, module): '''del_module(module) -> None \tdelete module from modules sequence. ''' self.free_indexes.insert(0, module.index) self.modules.remove(module) def connect(self, source, dest, color): '''connect(source, dest, color) -> None \tconnect input/output to input from source port to dest port using color. \tcolor is in nord.g2.colors.g2cablecolors or nord.nm1.colors.nm1cablecolors. \tcannot connect 2 Outputs together. ''' sid = (source.module.index << 16) + source.index did = (dest.module.index << 16) + dest.index if source.direction == dest.direction and sid > did: source, dest = dest, source cable = Cable(self) self.cables.append(cable) cable.color = color cable.source = source source.cables.append(cable) cable.dest = dest dest.cables.append(cable) self.netlist.add(source, dest) def disconnect(self, cable): '''disconnect(cable) -> None \tdisconnect a input or output port - update all cables connected to port ''' source, dest = cable.source, cable.dest #printf('disconnect %s:%s -> %s:%s\n' ( # cable.source.module.name, cable.source.type.name, # cable.dest.module.name, cable.dest.type.name) #printf(' cable %s', self.netlist.nettos(cable.source.net)) # collect all the cables on the net cables = [] for input in source.net.inputs: for c in input.cables: if not c in cables: cables.append(c) cables.remove(cable) source.cables.remove(cable) dest.cables.remove(cable) self.cables.remove(cable) self.netlist.delete(source, dest) source.net = dest.net = None for c in cables: #printf('connect\n source %s\n', self.netlist.nettos(c.source.net)) #printf(' dest %s\n', self.netlist.nettos(c.dest.net)) self.netlist.add(c.source, c.dest) #printf('after disconnect\n source %s\n', self.netlist.nettos(source.net)) #printf(' dest %s\n', self.netlist.nettos(dest.net)) def removeconnector(self, connector): '''removeconnector(connector) -> connector \tremove connector from the cable net and cable connections. \tconnector is a member of the Module object. ''' connectors = [] minconn = None mindist = 1000000 #printf('removeconnector %s:%s\n', connector.module.name, # connector.type.name) #printf('before remove %s\n', self.netlist.nettos(connector.net)) while len(connector.cables): cable = connector.cables[0] source, dest = cable.source, cable.dest self.disconnect(cable) if connector == source: other = dest else: other = source dist = self.connection_length(connector, other) if dist < mindist: if minconn: connectors.append(minconn) mindist = dist minconn = other elif not other in connectors: connectors.append(other) if len(connectors) != 0: for connector in connectors: #printf(' new %s:%s -> %s:%s\n', minconn.module.name, minconn.type.name, # connector.module.name, connector.type.name) if minconn.direction: self.connect(minconn, connector, 0) else: self.connect(connector, minconn, 0) #printf(' done %s\n', self.netlist.nettos(connector.net)) #printf('after remove %s\n', self.netlist.nettos(minconn.net)) return minconn # quick cable length calculation def cable_length(self, cable): '''cable_length(cable) -> length of cable''' return self.connection_length(cable.source, cable.dest) # quick connection length calculation (returns square distance) def connection_length(self, start, end): '''connection_length(start, end) -> distance from start port to end port''' # horiz coordinates about 20 times bigger. sm, em = start.module, end.module dh = (19*em.horiz+end.type.horiz)-(19*sm.horiz+start.type.horiz) dv = (em.vert+end.type.vert)-(sm.vert+start.type.vert) return (dh**2)+(dv**2) def shorten_cables(self): '''shorten_cables() \tmake all cable as short as possible. ''' # copy netlist before changes for later netlist = self.netlist.copy() # remove all cables cables = self.cables[:] while len(cables): cable = cables.pop(0) cable.source.net.color = cable.color self.disconnect(cable) def findclosest(g2area, fromlist, tolist): mincablelen = 1000000 mincable = None for fromconn in fromlist: for toconn in tolist: cablelen = g2area.connection_length(fromconn, toconn) if cablelen < mincablelen: mincablelen = cablelen mincable = [fromconn, toconn] return mincable # on each net, successively connect closet connector # net list will change while modifying so we need a static copy for net in netlist.nets: inputs = net.inputs if net.output: fromconn, toconn = findclosest(self, [net.output], inputs) else: conn = inputs.pop(0) fromconn, toconn = findclosest(self, [conn], inputs) self.connect(fromconn, toconn, net.color) inputs.remove(toconn) connected = [fromconn, toconn] while len(inputs): fromconn, toconn = findclosest(self, connected, inputs) self.connect(fromconn, toconn, net.color) inputs.remove(toconn) connected.append(toconn)