def __init__(self): EObject.__init__(self) self.__nodes = {} self.__attributes = {} self.__connections = {} self.__availableNodes = None self.__tAttrId = None self.__pluginManager = EManager()
class EGraphHandle(EObject): kMessageNodeAdded = EObject() kMessageNodeRemoved = EObject() kMessageNodeUpdate = EObject() kMessageEditBegin = EObject() kMessageEditEnd = EObject() kMessageUnknown = EObject() kMessageInternalError = EObject() kMessageConnectionMade = EObject() kMessageConnectionBroke = EObject() def __init__(self): EObject.__init__(self) self.__nodes = {} self.__attributes = {} self.__connections = {} self.__availableNodes = None self.__tAttrId = None self.__pluginManager = EManager() def __create__(self): return def __messageFilter(self, message): if message.match(ENodeHandle.kMessageAttributeAdded): self.__attributes[message.getData().Id] = message.getData() def getConnectionFromAttributeId(self, attrId): for key, value in self.__connections.iteritems(): if attrId in [value.Head.Id, value.Tail.Id]: return key return None def getHandleFromId(self, id): if not isinstance(id, uuid.UUID): raise AttributeError if self.__attributes.has_key(id): return self.__attributes[id].Handle.Id return None def ls(self): return self.__nodes.values() def lsConnected(self): return self.__connections def select(self, nodeName): for handle in self.__nodes.itervalues(): if nodeName == handle.Name: return handle return None def createNode(self, name=None): if name in self.__pluginManager.lsPlugins(): nodeHandle = self.__pluginManager.loadPlugin(name) else: nodeHandle = ENodeHandle() nodeHandle.Name = name self.addNode(nodeHandle) return nodeHandle def addNode(self, handle): if not isinstance(handle, ENodeHandle): raise AttributeError handle.Message.connect(self.__messageFilter) if not handle.Name: handle.Name = "EUnknown_%s" % str(len(self.__nodes.keys())) self.__nodes[handle.Id] = handle for attribute in handle.ls(): self.__attributes[attribute.Id] = attribute self.Message.emit(self.kMessageNodeAdded.setData(handle)) def delNode(self, handle): self.Message.emit(self.kMessageNodeRemoved.setData(handle)) def updateNode(self, handle): if self.__nodes.has_key(handle.Id): self.__nodes[handle.Id] = handle self.Message.emit(self.kMessageNodeUpdate) def isConnected(self, attribute): if not isinstance(attribute, EAttribute): raise AttributeError return self.__attributes.has_key(attribute.Id) def connectAttributes(self, attributeOne, attributeTwo): if isinstance(attributeOne, EAttribute): attributeOne = attributeOne.Id if isinstance(attributeTwo, EAttribute): attributeTwo = attributeTwo.Id if self.__attributes.has_key( attributeOne) and self.__attributes.has_key(attributeTwo): if self.__attributes[attributeOne].Type.match( self.__attributes[attributeTwo].Type): self.Message.emit(self.kMessageInternalError.setData(None)) return False if self.__attributes[attributeOne].Handle.match( self.__attributes[attributeTwo].Handle): self.Message.emit(self.kMessageInternalError.setData(None)) return False conn1 = self.getConnectionFromAttributeId(attributeOne) conn2 = self.getConnectionFromAttributeId(attributeTwo) if conn1 and conn2 and conn1 == conn2: self.Message.emit(self.kMessageInternalError.setData(None)) return False connection = EConnection(self.__attributes[attributeOne], self.__attributes[attributeTwo]) self.__connections[connection.Id] = connection self.Message.emit( self.kMessageConnectionMade.setData( [attributeOne, attributeTwo, connection.Id])) return True return False def disconnectAttribute(self, attribute): if isinstance(attribute, EAttribute): attribute = attribute.Id if self.__attributes.has_key(attribute): conn = self.getConnectionFromAttributeId(attribute) self.__connections.pop(conn, None) self.Message.emit(self.kMessageConnectionBroke.setData(conn)) return True return False def disconnectAttributes(self, attributeOne, attributeTwo): return def process(self, attrId): if self.__attributes.has_key(attrId) and self.__tAttrId is None: self.__tAttrId = attrId self.Message.emit(self.kMessageEditBegin.setData(None)) return if self.__tAttrId: if self.__attributes.has_key(attrId): self.connectAttributes(self.__tAttrId, attrId) else: self.disconnectAttribute(self.__tAttrId) self.__tAttrId = None self.Message.emit(self.kMessageEditEnd.setData(None))
class EGraphHandle(EObject): kMessageNodeAdded = EObject() kMessageNodeRemoved = EObject() kMessageNodeUpdate = EObject() kMessageEditBegin = EObject() kMessageEditEnd = EObject() kMessageUnknown = EObject() kMessageInternalError = EObject() kMessageConnectionMade = EObject() kMessageConnectionBroke = EObject() def __init__(self): EObject.__init__(self) self.__nodes = {} self.__attributes = {} self.__connections = {} self.__availableNodes = None self.__tAttrId = None self.__pluginManager = EManager() def __create__(self): return def __messageFilter(self, message): if message.match(ENodeHandle.kMessageAttributeAdded): self.__attributes[message.getData().Id] = message.getData() def getConnectionFromAttributeId(self, attrId): for key, value in self.__connections.iteritems(): if attrId in [value.Head.Id, value.Tail.Id]: return key return None def getHandleFromId(self, id): if not isinstance(id, uuid.UUID): raise AttributeError if self.__attributes.has_key(id): return self.__attributes[id].Handle.Id return None def ls(self): return self.__nodes.values() def lsConnected(self): return self.__connections def select(self, nodeName): for handle in self.__nodes.itervalues(): if nodeName == handle.Name: return handle return None def createNode(self, name=None): if name in self.__pluginManager.lsPlugins(): nodeHandle = self.__pluginManager.loadPlugin(name) else: nodeHandle = ENodeHandle() nodeHandle.Name = name self.addNode(nodeHandle) return nodeHandle def addNode(self, handle): if not isinstance(handle, ENodeHandle): raise AttributeError handle.Message.connect(self.__messageFilter) if not handle.Name: handle.Name = "EUnknown_%s" % str(len(self.__nodes.keys())) self.__nodes[handle.Id] = handle for attribute in handle.lsAttributes(): self.__attributes[attribute.Id] = attribute self.Message.emit(self.kMessageNodeAdded.setData(handle)) def delNode(self, handle): self.Message.emit(self.kMessageNodeRemoved.setData(handle)) def updateNode(self, handle): if self.__nodes.has_key(handle.Id): self.__nodes[handle.Id] = handle self.Message.emit(self.kMessageNodeUpdate) def isConnected(self, attribute): if not isinstance(attribute, EAttribute): raise AttributeError return self.__attributes.has_key(attribute.Id) def connectAttributes(self, attributeOne, attributeTwo): if isinstance(attributeOne, EAttribute): attributeOne = attributeOne.Id if isinstance(attributeTwo, EAttribute): attributeTwo = attributeTwo.Id if self.__attributes.has_key(attributeOne) and self.__attributes.has_key(attributeTwo): if self.__attributes[attributeOne].Type.match(self.__attributes[attributeTwo].Type): self.Message.emit(self.kMessageInternalError.setData(None)) return False if self.__attributes[attributeOne].Handle.match(self.__attributes[attributeTwo].Handle): self.Message.emit(self.kMessageInternalError.setData(None)) return False #conn1 = self.getConnectionFromAttributeId(attributeOne) #conn2 = self.getConnectionFromAttributeId(attributeTwo) #if conn1 and conn2 and conn1 == conn2: # self.Message.emit(self.kMessageInternalError.setData(None)) # return False if self.__attributes[attributeOne].Type.match(EAttribute.kTypeInput): #print self.__attributes[attributeOne].Handle.Name, self.__attributes[attributeOne].Name inputAttr = self.__attributes[attributeOne] else: #print self.__attributes[attributeTwo].Handle.Name, self.__attributes[attributeTwo].Name inputAttr = self.__attributes[attributeTwo] if inputAttr.isConnected: self.disconnectAttribute(inputAttr) connection = EConnection(self.__attributes[attributeOne], self.__attributes[attributeTwo]) self.__connections[connection.Id] = connection self.__attributes[attributeOne].isConnected = True self.__attributes[attributeTwo].isConnected = True connection.update() self.Message.emit(self.kMessageConnectionMade.setData([attributeOne, attributeTwo, connection.Id])) return True return False def disconnectAttribute(self, attribute): if isinstance(attribute, EAttribute): attrId = attribute.Id if self.__attributes.has_key(attrId): conn = self.getConnectionFromAttributeId(attrId) attribute.isConnected = False self.Message.emit(self.kMessageConnectionBroke.setData(conn)) self.__connections.pop(conn, None) return True return False def disconnectAttributes(self, attributeOne, attributeTwo): return def process(self, data): if isinstance(data, list): for item in data: if self.__connections.has_key(item): attrOne, attrTwo = self.__connections[item].Head, self.__connections[item].Tail if attrOne.Type.match(EAttribute.kTypeInput): self.disconnectAttribute(attrOne) else: self.disconnectAttribute(attrTwo) return if self.__attributes.has_key(data) and self.__tAttrId is None: self.__tAttrId = data self.Message.emit(self.kMessageEditBegin.setData(None)) return if self.__tAttrId: if self.__attributes.has_key(data): self.connectAttributes(self.__tAttrId, data) self.__tAttrId = None self.Message.emit(self.kMessageEditEnd.setData(None))