Skip to content

Commit

Permalink
Refactor geometry #286
Browse files Browse the repository at this point in the history
  • Loading branch information
cleder committed Dec 21, 2023
1 parent dda94ed commit 54467e8
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 173 deletions.
217 changes: 77 additions & 140 deletions fastkml/geometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# along with this library; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

import contextlib
import logging
import re
from functools import partial
Expand All @@ -38,6 +37,10 @@
from fastkml.enums import Verbosity
from fastkml.exceptions import KMLParseError
from fastkml.exceptions import KMLWriteError
from fastkml.helpers import bool_subelement
from fastkml.helpers import enum_subelement
from fastkml.helpers import subelement_bool_kwarg
from fastkml.helpers import subelement_enum_kwarg
from fastkml.types import Element

__all__ = [
Expand Down Expand Up @@ -77,15 +80,20 @@ class _Geometry(_BaseObject):
"""

extrude: Optional[bool]
tessellate: Optional[bool]
altitude_mode: Optional[AltitudeMode]
geometry: Optional[AnyGeometryType]

def __init__(
self,
*,
ns: Optional[str] = None,
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: Optional[AnyGeometryType] = None,
) -> None:
Expand All @@ -102,9 +110,9 @@ def __init__(
element are interpreted.
"""
super().__init__(ns=ns, id=id, name_spaces=name_spaces, target_id=target_id)
self._extrude = extrude
self._tessellate = tessellate
self._altitude_mode = altitude_mode
self.extrude = extrude
self.tessellate = tessellate
self.altitude_mode = altitude_mode
self.geometry = geometry

def __repr__(self) -> str:
Expand All @@ -120,33 +128,13 @@ def __repr__(self) -> str:
f")"
)

@property
def extrude(self) -> Optional[bool]:
return self._extrude

@extrude.setter
def extrude(self, extrude: bool) -> None:
self._extrude = extrude

@property
def tessellate(self) -> Optional[bool]:
return self._tessellate

@tessellate.setter
def tessellate(self, tessellate: bool) -> None:
self._tessellate = tessellate

@property
def altitude_mode(self) -> Optional[AltitudeMode]:
return self._altitude_mode

@altitude_mode.setter
def altitude_mode(self, altitude_mode: Optional[AltitudeMode]) -> None:
self._altitude_mode = altitude_mode
def __bool__(self) -> bool:
return bool(self.geometry)

def _etree_coordinates(
self,
coordinates: Sequence[PointType],
precision: Optional[int],
) -> Element:
element = cast(
Element,
Expand All @@ -168,45 +156,30 @@ def _etree_coordinates(
element.text = " ".join(tuples)
return element

def _set_altitude_mode(self, element: Element) -> None:
if self.altitude_mode:
am_element = config.etree.SubElement( # type: ignore[attr-defined]
element,
f"{self.ns}altitudeMode",
)
am_element.text = self.altitude_mode.value

def _set_extrude(self, element: Element) -> None:
if self.extrude is not None:
et_element = cast(
Element,
config.etree.SubElement( # type: ignore[attr-defined]
element,
f"{self.ns}extrude",
),
)
et_element.text = str(int(self.extrude))

def _set_tessellate(self, element: Element) -> None:
if self.tessellate is not None:
t_element = cast(
Element,
config.etree.SubElement( # type: ignore[attr-defined]
element,
f"{self.ns}tessellate",
),
)
t_element.text = str(int(self.tessellate))

def etree_element(
self,
precision: Optional[int] = None,
verbosity: Verbosity = Verbosity.normal,
) -> Element:
element = super().etree_element(precision=precision, verbosity=verbosity)
self._set_extrude(element)
self._set_altitude_mode(element)
self._set_tessellate(element)
bool_subelement(
self,
element=element,
attr_name="extrude",
node_name="extrude",
)
bool_subelement(
self,
element=element,
attr_name="tessellate",
node_name="tessellate",
)
enum_subelement(
self,
element=element,
attr_name="altitude_mode",
node_name="altitudeMode",
)
return element

@classmethod
Expand Down Expand Up @@ -240,69 +213,6 @@ def _get_coordinates(
]
return []

@classmethod
def _get_extrude(
cls,
*,
ns: str,
element: Element,
strict: bool,
) -> Optional[bool]:
extrude = element.find(f"{ns}extrude")
if extrude is None:
return None
with contextlib.suppress(ValueError, AttributeError):
return bool(int(extrude.text.strip()))
return None

@classmethod
def _get_tessellate(
cls,
*,
ns: str,
element: Element,
strict: bool,
) -> Optional[bool]:
tessellate = element.find(f"{ns}tessellate")
if tessellate is None:
return None
with contextlib.suppress(ValueError):
return bool(int(tessellate.text.strip()))
return None

@classmethod
def _get_altitude_mode(
cls,
*,
ns: str,
element: Element,
strict: bool,
) -> Optional[AltitudeMode]:
altitude_mode = element.find(f"{ns}altitudeMode")
if altitude_mode is None:
return None
with contextlib.suppress(ValueError):
return AltitudeMode(altitude_mode.text.strip())
return None

@classmethod
def _get_geometry_kwargs(
cls,
*,
ns: str,
element: Element,
strict: bool,
) -> Dict[str, Any]:
return {
"extrude": cls._get_extrude(ns=ns, element=element, strict=strict),
"tessellate": cls._get_tessellate(ns=ns, element=element, strict=strict),
"altitude_mode": cls._get_altitude_mode(
ns=ns,
element=element,
strict=strict,
),
}

@classmethod
def _get_geometry(
cls,
Expand All @@ -328,7 +238,34 @@ def _get_kwargs(
element=element,
strict=strict,
)
kwargs.update(cls._get_geometry_kwargs(ns=ns, element=element, strict=strict))
kwargs.update(
subelement_bool_kwarg(
element=element,
ns=ns,
node_name="extrude",
kwarg="extrude",
strict=strict,
),
)
kwargs.update(
subelement_bool_kwarg(
element=element,
ns=ns,
node_name="tessellate",
kwarg="tessellate",
strict=strict,
),
)
kwargs.update(
subelement_enum_kwarg(
element=element,
ns=ns,
node_name="altitudeMode",
kwarg="altitude_mode",
enum_class=AltitudeMode,
strict=strict,
),
)
kwargs.update(
{"geometry": cls._get_geometry(ns=ns, element=element, strict=strict)},
)
Expand All @@ -343,8 +280,8 @@ def __init__(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: geo.Point,
) -> None:
Expand All @@ -367,7 +304,7 @@ def etree_element(
element = super().etree_element(precision=precision, verbosity=verbosity)
assert isinstance(self.geometry, geo.Point)
coords = self.geometry.coords
element.append(self._etree_coordinates(coords))
element.append(self._etree_coordinates(coords, precision=precision))
return element

@classmethod
Expand Down Expand Up @@ -400,8 +337,8 @@ def __init__(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: geo.LineString,
) -> None:
Expand All @@ -424,7 +361,7 @@ def etree_element(
element = super().etree_element(precision=precision, verbosity=verbosity)
assert isinstance(self.geometry, geo.LineString)
coords = self.geometry.coords
element.append(self._etree_coordinates(coords))
element.append(self._etree_coordinates(coords, precision=precision))
return element

@classmethod
Expand Down Expand Up @@ -457,8 +394,8 @@ def __init__(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: geo.LinearRing,
) -> None:
Expand Down Expand Up @@ -503,8 +440,8 @@ def __init__(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: geo.Polygon,
) -> None:
Expand Down Expand Up @@ -652,8 +589,8 @@ def __init__(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: MultiGeometryType,
) -> None:
Expand Down Expand Up @@ -722,8 +659,8 @@ def create_kml_geometry(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
) -> _Geometry:
"""
Expand Down
8 changes: 4 additions & 4 deletions fastkml/gx.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,8 @@ def __init__(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: Optional[geo.LineString] = None,
track_items: Optional[Sequence[TrackItem]] = None,
Expand Down Expand Up @@ -318,8 +318,8 @@ def __init__(
name_spaces: Optional[Dict[str, str]] = None,
id: Optional[str] = None,
target_id: Optional[str] = None,
extrude: Optional[bool] = False,
tessellate: Optional[bool] = False,
extrude: Optional[bool] = None,
tessellate: Optional[bool] = None,
altitude_mode: Optional[AltitudeMode] = None,
geometry: Optional[geo.MultiLineString] = None,
tracks: Optional[Sequence[Track]] = None,
Expand Down
Loading

0 comments on commit 54467e8

Please sign in to comment.