Source code for aequilibrae.project.network.link_types
from sqlite3 import IntegrityError
from aequilibrae.project.field_editor import FieldEditor
from aequilibrae.project.network.link_type import LinkType
from aequilibrae.project.table_loader import TableLoader
from aequilibrae.utils.db_utils import commit_and_close
from aequilibrae.utils.spatialite_utils import connect_spatialite
[docs]
class LinkTypes:
"""
Access to the API resources to manipulate the link_types table in the network.
.. code-block:: python
>>> from aequilibrae import Project
>>> p = Project.from_path("/tmp/test_project")
>>> link_types = p.network.link_types
# We can get a dictionary of link types in the model
>>> all_link_types = link_types.all_types()
# And do a bulk change and save it
>>> for link_type_id, link_type_obj in all_link_types.items():
... link_type_obj.beta = 1
# We can save changes for all link types in one go
>>> link_types.save()
# or just get one link_type in specific
>>> default_link_type = link_types.get('y')
# or just get it by name
>>> default_link_type = link_types.get_by_name('default')
# We can change the description of the link types
>>> default_link_type.description = 'My own new description'
# Let's say we are using alpha to store lane capacity during the night as 90% of the standard
>>> default_link_type.alpha = 0.9 * default_link_type.lane_capacity
# To save this link types we can simply
>>> default_link_type.save()
# We can also create a completely new link_type and add to the model
>>> new_type = link_types.new('a')
>>> new_type.link_type = 'Arterial' # Only ASCII letters and *_* allowed # other fields are not mandatory
# We then save it to the database
>>> new_type.save()
# we can even keep editing and save it directly once we have added it to the project
>>> new_type.lanes = 3
>>> new_type.lane_capacity = 1100
>>> new_type.save()
"""
[docs]
def __init__(self, net):
self.__items = {}
self.project = net.project
self.logger = net.project.logger
tl = TableLoader()
with commit_and_close(connect_spatialite(self.project.path_to_file)) as conn:
link_types_list = tl.load_table(conn, "link_types")
existing_list = [lt["link_type_id"] for lt in link_types_list]
self.__fields = list(tl.fields)
for lt in link_types_list:
if lt["link_type_id"] not in self.__items:
self.__items[lt["link_type_id"]] = LinkType(lt, self.project)
to_del = [key for key in self.__items.keys() if key not in existing_list]
for key in to_del:
del self.__items[key]
[docs]
def new(self, link_type_id: str) -> LinkType:
if link_type_id in self.__items:
raise ValueError(f"Link Type ID ({link_type_id}) already exists in the model. It must be unique.")
tp = {key: None for key in self.__fields}
tp["link_type_id"] = link_type_id
lt = LinkType(tp, self.project)
self.__items[link_type_id] = lt
return lt
[docs]
def delete(self, link_type_id: str) -> None:
"""Removes the link_type with *link_type_id* from the project"""
try:
lt = self.__items[link_type_id] # type: LinkType
lt.delete()
del self.__items[link_type_id]
except IntegrityError as e:
self.logger.error(f"Failed to remove link_type {link_type_id}. {e.args}")
raise e
self.logger.warning(f"Link type {link_type_id} was successfully removed from the project database")
[docs]
def get(self, link_type_id: str) -> LinkType:
"""Get a link_type from the network by its *link_type_id*"""
if link_type_id not in self.__items:
raise ValueError(f"Link type {link_type_id} does not exist in the model")
return self.__items[link_type_id]
[docs]
def get_by_name(self, link_type: str) -> LinkType:
"""Get a link_type from the network by its *link_type* (i.e. name)"""
for lt in self.__items.values():
if lt.link_type.lower() == link_type.lower():
return lt
[docs]
def fields(self) -> FieldEditor:
"""Returns a FieldEditor class instance to edit the Link_Types table fields and their metadata"""
return FieldEditor(self.project.project_base_path, "link_types")
[docs]
def all_types(self) -> dict:
"""Returns a dictionary with all LinkType objects available in the model. link_type_id as key"""
return self.__items
[docs]
def save(self):
for lt in self.__items.values(): # type: LinkType
lt.save()
def __copy__(self):
raise Exception("Link Types object cannot be copied")
def __deepcopy__(self, memodict=None):
raise Exception("Link Types object cannot be copied")
def __del__(self):
self.__items.clear()