import axipy
from PySide2.QtCore import Qt

# Получаем активное представление карты
mv: axipy.MapView = axipy.view_manager.active

# Проверяем, является ли активное представление картой
if not isinstance(mv, axipy.MapView):
    axipy.message('Перейдите в окно карты, на которую будут размещены текстовые объекты')
else:
    # Получаем список таблиц
    table_names = [table.name for table in axipy.data_manager.tables]
    
    # Запрашиваем у пользователя выбор таблицы
    table_name = axipy.prompt_item('Выберите таблицу для подписывания', 'Создание текста из семантики', table_names)
    
    if table_name:
        table: axipy.Table = axipy.data_manager[table_name]
        
        # Запрашиваем у пользователя выбор колонки
        column_name = axipy.prompt_item('Выберите колонку для подписывания', 'Создание текста из семантики', table.schema.attribute_names)
        
        if column_name:
            cosmetic: axipy.CosmeticTable = mv.map.cosmetic.data_object
            
            # Проверяем наличие объектов на косметическом слое
            if cosmetic.count() > 0:
                dr = axipy.show_dialog(
                    'На косметическом слое есть объекты\nСтереть их?', 
                    'Создание текста из семантики', 
                    axipy.DlgButtons.YES_NO_CANCEL
                )
                
                if dr == axipy.DlgButtons.CANCEL:
                    cosmetic = None
                elif dr == axipy.DlgButtons.YES:
                    cosmetic.rollback()
            
            if cosmetic is not None:
                transformer = axipy.CoordTransformer(table.coordsystem, mv.coordsystem)
                style = txt = axipy.Style.for_geometry(axipy.Text('', axipy.Rect(0, 0, 10, 10)))
                
                # Создаем текстовые объекты для каждого элемента таблицы
                for item in table.items():
                    if item.geometry:
                        centroid = item.geometry.centroid()
                        pnt = transformer.transform(axipy.Pnt(centroid.x, centroid.y))
                        text = axipy.Text.create_by_style(str(item[column_name]), pnt, style, mv, 0, mv.coordsystem)
                        text = text.shift(-text.bounds.width / 2, 0)  # Центрируем текст
                        cosmetic.insert(axipy.Feature(geometry=text, style=style))
