А есть ли возможность получить доступ к атрибуту, отвечающему за наличие выноски у текстового объекта? Он связан с параметрами style (https://axioma-gis.ru/axipy/dev-guide/4 ... Style.html)?
Как при присваивании нового стиля средствами консоли не потерять выноску?
			
			
									
									
						Выделение текстовых объектов
Re: Выделение текстовых объектов
К сожалению, сейчас работа с выносками не реализована.
Сделаем в следующей версии...
			
			
									
									
						Сделаем в следующей версии...
Re: Выделение текстовых объектов
Нам как-то нужно повторить ситуацию.radish писал(а): ↑19 апр 2023, 12:19 На скриншоте примерно такой случай, или не совсем?
text.jpg
Если начать растягивать верхний прямоугольник вручную, он подстраивается под текст.
Есть способ отсеять такие объекты, где прямоугольник выше текста (может, как-то "обновить", чтобы его размер подстроился под текст)? Высота прямоугольников на скриншоте одинакова, после scale они оба становятся в k раз меньше вместе с текстом.
Верхний прямоугольник каким образом можно получить?
Re: Выделение текстовых объектов
Мы его получили, сохранив карту из Мапинфо и открыв в Аксиоме.
Средствами Аксиомы повторить такой прямоугольник у нас не получилось)
При изменении размера рамки руками (растягивая прямоугольник), он сразу подстраивается под текст, но при применении scale() этого не происходит, он масштабируется но остается выше текста. У меня и возник вопрос, может как-то можно из скрипта подстроить рамки под текст, или чтобы поведение при масштабировании было аналогично ручному растягиванию.
Re: Выделение текстовых объектов
Да, scale пока использует старый механизм и не корректирует рамку
Пока можно воспользоваться:
			
			
									
									
						Пока можно воспользоваться:
Code: Select all
import axipy
def get_text_style_from_effects(effects: axipy.TextStyleEffects, bg_type: axipy.TextBackgroundType) -> int:
    """
    Получить дополнительные параметры стиля из эффектов
    :param effects: Эффекты применяемые к текстовому объекту
    :param bg_type: Тип отрисовки фона текста
    :return: Дополнительные параметры стиля текстового объекта
    """
    style = (
            int(effects.bold) +
            int(effects.italic) * 2 +
            int(effects.underline) * 4 +
            int(effects.shadow) * 32 +
            int(effects.capital) * 512 +
            int(effects.spacing) * 1024
    )
    
    if bg_type == axipy.TextBackgroundType.Frame:
        style += 16
    elif bg_type == axipy.TextBackgroundType.Outline:
        style += 256
    
    return style
def create_text(text: axipy.Text, style: axipy.TextStyle, view: axipy.MapView, new_size: float) -> axipy.Text:
    """
    Создать новый текстовый объект из существующего, но с новым размером в пунктах
    :param text: Текстовый объект
    :param style: Стиль
    :param view: Окно просмотра карты
    :param new_size: Новый размер текстового объекта
    :return: Текстовый объект с новым размером
    """
    # создадим дополнительные параметры стиля из эффектов
    text_style = get_text_style_from_effects(style.effects, style.bg_type)
    # стиль нового текстового объекта с изменённым размером
    style_new = axipy.TextStyle(style.fontname, new_size, text_style, style.color, style.bg_color)
    # создадим новый текстовый объект
    return axipy.Text.create_by_style(text.text, text.startPoint, style_new, view, text.angle, text.coordsystem)
def get_text_size(text: axipy.Text, style: axipy.TextStyle, view: axipy.MapView) -> (float, float):
    """
    Вычислить размер текста на карте в пунктах
    :param text: Текстовый объект
    :param style: Стиль
    :param view: Окно просмотра карты
    :return: Размер текста в пунктах исходя из высоты и исходя из ширины
    """
    # МБР текстового объекта
    bounds = text.bounds
    # создадим новый текстовый объект с размером 100pt
    text_new = create_text(text, style, view, 100)
    # МБР нового текстового объекта
    bounds_new = text_new.bounds
    # Пропорционально расчитываем размер текста
    return 100 / (bounds_new.height / bounds.height) , 100 / (bounds_new.width / bounds.width)
    
flag = False
# Устанавливаем рамки
if isinstance(axipy.view_manager.active, axipy.MapView) and axipy.data_manager.selection:
    for feature in axipy.data_manager.selection:
        if isinstance(feature.geometry, axipy.Text):
            view = axipy.view_manager.active
            style = feature.style
            text = feature.geometry
            
            sz_h, sz_w = get_text_size(text, style, view)
            if abs(sz_h - sz_w) / max(sz_h, sz_w) > 0.1:
                style = axipy.TextStyle(style.fontname, min(sz_h, sz_w), get_text_style_from_effects(style.effects, style.bg_type), style.color, style.bg_color)
                feature.geometry = axipy.Text.create_by_style(text.text, text.startPoint, style, view, text.angle, text.coordsystem)
                axipy.data_manager.selection.update(feature)
                flag = True
if not flag:
    print("Нет выделенных текстовых объектов с некорректными рамками")
Re: Выделение текстовых объектов
Спасибо!
			
			
									
									
						

