Выделение текстовых объектов

Вопросы связанные с работой ГИС Аксиома
Аватара пользователя
SergeyV
Сообщения: 3
Зарегистрирован: 17 апр 2023, 04:29

Re: Выделение текстовых объектов

Сообщение SergeyV » 20 апр 2023, 12:53

А есть ли возможность получить доступ к атрибуту, отвечающему за наличие выноски у текстового объекта? Он связан с параметрами style (https://axioma-gis.ru/axipy/dev-guide/4 ... Style.html)?
Как при присваивании нового стиля средствами консоли не потерять выноску?
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

Re: Выделение текстовых объектов

Сообщение Александр » 20 апр 2023, 15:08

К сожалению, сейчас работа с выносками не реализована.
Сделаем в следующей версии...
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

Re: Выделение текстовых объектов

Сообщение Александр » 20 апр 2023, 15:11

radish писал(а): 19 апр 2023, 09:19 На скриншоте примерно такой случай, или не совсем?
text.jpg
Если начать растягивать верхний прямоугольник вручную, он подстраивается под текст.

Есть способ отсеять такие объекты, где прямоугольник выше текста (может, как-то "обновить", чтобы его размер подстроился под текст)? Высота прямоугольников на скриншоте одинакова, после scale они оба становятся в k раз меньше вместе с текстом.
Нам как-то нужно повторить ситуацию.
Верхний прямоугольник каким образом можно получить?
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

Re: Выделение текстовых объектов

Сообщение radish » 21 апр 2023, 03:45

Александр писал(а): 20 апр 2023, 15:11 Верхний прямоугольник каким образом можно получить?
Мы его получили, сохранив карту из Мапинфо и открыв в Аксиоме.
Средствами Аксиомы повторить такой прямоугольник у нас не получилось)
При изменении размера рамки руками (растягивая прямоугольник), он сразу подстраивается под текст, но при применении scale() этого не происходит, он масштабируется но остается выше текста. У меня и возник вопрос, может как-то можно из скрипта подстроить рамки под текст, или чтобы поведение при масштабировании было аналогично ручному растягиванию.
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

Re: Выделение текстовых объектов

Сообщение Александр » 21 апр 2023, 12:36

Да, 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("Нет выделенных текстовых объектов с некорректными рамками")
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

Re: Выделение текстовых объектов

Сообщение radish » 21 апр 2023, 17:03

Спасибо!
Ответить