|
|
|
from rue import dessiner_immeuble
|
|
|
|
|
|
|
|
def dessiner_rue_decrite(description: str) -> None:
|
|
|
|
"""Dessine une rue en fonction d'une description textuelle.
|
|
|
|
|
|
|
|
:: param description(str) :: description textuelle de la rue,
|
|
|
|
contenant le nombre d'immeubles et leurs caractéristiques
|
|
|
|
:: return (None) :: fonction sans retour
|
|
|
|
|
|
|
|
"""
|
|
|
|
lignes = description.strip().split('\n')
|
|
|
|
nombre_immeubles = int(lignes[1].split()[0]) # Récupère le nombre d'immeubles
|
|
|
|
|
|
|
|
for i in range(2, 2 + nombre_immeubles):
|
|
|
|
immeuble_description = lignes[i].strip()
|
|
|
|
immeuble = parser_immeuble(immeuble_description, i - 2)
|
|
|
|
dessiner_immeuble(immeuble)
|
|
|
|
|
|
|
|
def parser_immeuble(description: str, numero: int) -> dict:
|
|
|
|
"""Analyse et convertit une description d'immeuble en un dictionnaire d'attributs.
|
|
|
|
|
|
|
|
:: param description(str) :: description d'un immeuble sous la forme d'une chaîne de caractères,
|
|
|
|
séparant les attributs par " - "
|
|
|
|
:: param numero(int) :: numéro de l'immeuble dans la rue, utilisé pour calculer sa position
|
|
|
|
:: return (dict) :: dictionnaire contenant les attributs de l'immeuble,
|
|
|
|
notamment couleur de façade, nombre d'étages, position de la porte,
|
|
|
|
type de toit, et couleur du toit
|
|
|
|
|
|
|
|
"""
|
|
|
|
attributs = description.split(' - ')
|
|
|
|
|
|
|
|
# Récupération de la couleur et du nombre d'étages
|
|
|
|
facade = attributs[0].split(' ')[1] # couleur de façade
|
|
|
|
etages = int(attributs[1].split(' ')[0]) * 80 # Conversion en pixels
|
|
|
|
porte_position = attributs[2].split(' ')[-1] # Position de la porte
|
|
|
|
toit_type = attributs[3].split(' ')[1] # Type de toit
|
|
|
|
toit_couleur = 'black' # On suppose que le toit est toujours noir
|
|
|
|
|
|
|
|
porte_coord = coordonnees_porte_avec_position(numero, porte_position)
|
|
|
|
print(attributs)
|
|
|
|
return {
|
|
|
|
'couleur_facade': facade,
|
|
|
|
'numero': numero,
|
|
|
|
'etages': etages,
|
|
|
|
'porte': porte_coord,
|
|
|
|
'toit_type': toit_type,
|
|
|
|
'toit_couleur': toit_couleur
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def coordonnees_porte_avec_position(numero: int, position: str) -> tuple:
|
|
|
|
"""Calcule les coordonnées de la porte d'un immeuble en fonction de sa position.
|
|
|
|
|
|
|
|
:: param numero(int) :: numéro de l'immeuble dans la rue, utilisé pour calculer sa position en X
|
|
|
|
:: param position(str) :: position de la porte sur la façade de l'immeuble,
|
|
|
|
qui peut être "au milieu", "à gauche" ou "à droite"
|
|
|
|
:: return (tuple) :: tuple contenant les coordonnées X et Y de la porte en pixels
|
|
|
|
|
|
|
|
"""
|
|
|
|
x_gauche = -400 + 200 * numero
|
|
|
|
y_bas = -200
|
|
|
|
|
|
|
|
if position == 'au milieu':
|
|
|
|
return (x_gauche + 55, y_bas)
|
|
|
|
elif position == 'à gauche':
|
|
|
|
return (x_gauche + 12.5, y_bas)
|
|
|
|
elif position == 'à droite':
|
|
|
|
return (x_gauche + 97.5, y_bas)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
# Lire la description depuis le fichier
|
|
|
|
with open('description_rue.txt', 'r') as fichier:
|
|
|
|
description = fichier.read()
|
|
|
|
|
|
|
|
# Dessiner la rue décrite dans le fichier
|
|
|
|
dessiner_rue_decrite(description)
|
|
|
|
|
|
|
|
|