razaali10's picture
Upload 22 files
f7a6add verified
Raw
History Blame Contribute Delete
2.4 kB
from __future__ import annotations
from typing import Any
from .exceptions import LayerNotFoundError
from .project import ProjectService
DEFAULT_LAYER_NAMES = [
"Rain Gages", "Subcatchments", "Junctions", "Outfalls",
"Dividers", "Storage Units", "Conduits", "Pumps",
"Orifices", "Weirs", "Outlets",
]
class LayerService:
def __init__(self, pcpy: Any, project: ProjectService):
self._pcpy = pcpy
self._project = project
def get(self, layer_name: str):
self._project.require_open()
try:
return self._pcpy.Map.Layer[layer_name]
except Exception as exc:
raise LayerNotFoundError(
f"PCSWMM map layer not found: {layer_name}"
) from exc
def names(self) -> list[str]:
self._project.require_open()
for attribute_name in ("Names", "keys", "Keys"):
try:
value = getattr(self._pcpy.Map.Layer, attribute_name)
value = value() if callable(value) else value
names = [str(item) for item in list(value)]
if names:
return sorted(set(names))
except Exception:
pass
names = []
for layer_name in DEFAULT_LAYER_NAMES:
try:
self.get(layer_name)
names.append(layer_name)
except LayerNotFoundError:
pass
return names
def attributes(self, layer_name: str) -> list[str]:
layer = self.get(layer_name)
try:
return [str(name) for name in list(layer.Attributes)]
except Exception:
return []
def entities(self, layer_name: str, query: str | None = None) -> list[Any]:
layer = self.get(layer_name)
if query:
return list(layer.get_entities(query))
return list(layer.get_entities())
def records(self, layer_name: str, query: str | None = None) -> list[dict[str, Any]]:
attributes = self.attributes(layer_name)
records = []
for entity in self.entities(layer_name, query=query):
row = {}
for attribute in attributes:
try:
row[attribute] = entity[attribute]
except Exception:
row[attribute] = None
records.append(row)
return records