city_retrofit/city_model_structure/city_object.py

113 lines
2.7 KiB
Python

"""
CityObject module
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
"""
from pathlib import Path
from typing import List, Union
from city_model_structure.attributes.surface import Surface
from helpers.geometry_helper import GeometryHelper
from city_model_structure.attributes.polyhedron import Polyhedron
import math
class CityObject:
"""
class CityObject
"""
def __init__(self, lod, surfaces, name):
self._name = name
self._lod = lod
self._surfaces = surfaces
self._polyhedron = None
self._geometry = GeometryHelper()
@property
def lod(self):
"""
City object level of detail 1, 2, 3 or 4
:return: int
"""
lod = math.log(self._lod, 2) + 1
return lod
@property
def volume(self):
"""
City object volume in cubic meters
:return: float
"""
return self.polyhedron.volume
@property
def polyhedron(self):
"""
City object polyhedron
:return: Polyhedron
"""
if self._polyhedron is None:
self._polyhedron = Polyhedron(self.surfaces)
return self._polyhedron
@property
def surfaces(self) -> List[Surface]:
"""
City object surfaces
:return: [Surface]
"""
return self._surfaces
def surface(self, name) -> Union[Surface, None]:
"""
Get the city object surface with a given name
:param name: str
:return: None or Surface
"""
for s in self.surfaces:
if s.name == name:
return s
return None
@property
def location(self):
"""
City object location
:return: [x,y,z]
"""
if self._polyhedron is None:
self._polyhedron = Polyhedron(self.surfaces)
return self._polyhedron.center
def stl_export(self, path):
"""
Export the city object to stl file (city_object_name.stl) to the given path
:param path: str
:return: None
"""
# todo: this is a method just for debugging, it will be soon removed
if self._polyhedron is None:
self._polyhedron = Polyhedron(self.surfaces)
full_path = (Path(path) / (self._name + '.stl')).resolve()
self._polyhedron.stl_export(full_path)
def obj_export(self, path):
if self._polyhedron is None:
self._polyhedron = Polyhedron(self.surfaces)
full_path = (Path(path) / (self._name + '.obj')).resolve()
self._polyhedron.obj_export(full_path)
def show(self):
if self._polyhedron is None:
self._polyhedron = Polyhedron(self.surfaces)
self._polyhedron.show()
@property
def max_height(self):
"""
City object maximal height in meters
:return: float
"""
if self._polyhedron is None:
self._polyhedron = Polyhedron(self.surfaces)
return self._polyhedron.max_z