Beispiel #1
0
 def __init__(self):
     self.__blocks = dict() # {"Block name" : IPFBlock}
     self.connections = set() 
     self._grid_width = 5
     self._grid_height = 5
     
     # Create empty 2-dimension list for __blocks in grid
     self._grid_model = self._get_clear_grid_model()
     
     
     # Block classes list
     self.block_classes = get_ipfblock_classes()
def load(file):
    tree = ElementTree()
    tree.parse(file)
    
    # Load blocks
    ipfgraph_node = tree.find("IPFGraph")
    if ipfgraph_node is None:
        return None
    
    graph = IPFGraph()
           
    blocks_node = ipfgraph_node.find("Blocks")
    
    if blocks_node is None:
        return graph
    
    ipfblock_classes = get_ipfblock_classes()
    type_classes = get_type_classes()
    
    for block_node in blocks_node.getiterator("Block"):
        block_name = block_node.attrib["name"]
        grid_row = int(block_node.attrib["grid_row"])
        grid_column = int(block_node.attrib["grid_column"])
        block_class_node = list(block_node)[0]
        class_name = block_class_node.tag
        
        # Test for unknown block
        if class_name not in ipfblock_classes:
            raise TypeError("Unknown block class '%s'" % class_name)
        
        graph.add_block(class_name, block_name, grid_row, grid_column)
        block = graph.get_block(block_name)
        properties_node = block_class_node.find("Properties")
        
        # Add properties to block
        for property_node in properties_node.getiterator("Property"):
            property_name = property_node.attrib["name"]
            value_node = property_node.find("PropertyValue")
            property_type = value_node.attrib["data_type"]
            max_value = value_node.attrib["max_value"]
            if len(max_value) == 0:
                max_value = None
            else:
                # Convert limit value to property data type
                max_value = type_classes[property_type].convert(max_value)
            min_value = value_node.attrib["min_value"]
            if len(min_value) == 0:
                min_value = None
            else:
                # Convert limit value to property data type
                min_value = type_classes[property_type].convert(min_value)
            value = value_node.attrib["value"]
            property = Property(type_classes[property_type])
            property.max_value = max_value
            property.min_value = min_value
            property.set_value(value)
            block.properties[property_name] = property
            
        # !!! In this version we don`t load ports information 
        # because ports created in block constructor and can`t be deleted or created
        
    # Load connections
    connections_node = ipfgraph_node.find("Connections")
    for connection_node in connections_node.getiterator("Connection"):
        con_output_node = connection_node.find("ConnectionOutput")
        oblock_name = con_output_node.attrib["block"]
        oblock_port = con_output_node.attrib["port"]
        oport = graph.get_block(oblock_name).output_ports[oblock_port]
        con_input_node = connection_node.find("ConnectionInput")
        iblock_name = con_input_node.attrib["block"]
        iblock_port = con_input_node.attrib["port"]
        iport = graph.get_block(iblock_name).input_ports[iblock_port]
        graph.add_connection(oport, iport)
        
    return graph