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)