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

Вопросы связанные с работой ГИС Аксиома
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

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

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

radish писал(а): 18 апр 2023, 03:41 - пытаюсь поменять цвет шрифта следующим образом, но цвет не изменяется
В настоящее время так нельзя менять свойства. Они не "пробрасываются" по цепочке в обратную сторону. Т.е. вы работаете с копией объекта. Изменение его свойств не поменяет свойства родительского объекта.
Мы поменяем это поведение в следующей версии - сейчас активно тестируем.

Code: Select all

from PySide2.QtGui import QColor
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

flag = False
# Меняем цвет выделенных Текстовых объектов на красный
if axipy.data_manager.selection:
for feature in axipy.data_manager.selection:
if isinstance(feature.geometry, axipy.Text):
style = feature.style
style = axipy.TextStyle(style.fontname, 0, get_text_style_from_effects(style.effects, style.bg_type), QColor.fromRgb(255,0,0), style.bg_color)
feature.style = style
axipy.data_manager.selection.update(feature)
flag = True

if not flag:
print("Нет выделенных текстовых объектов")
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

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

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

SergeyV писал(а): 18 апр 2023, 03:55 В таком случае ломаются все имеющиеся выноски текста (перенесенного из mapinfo).
выноски.png
Сейчас выноски ограниченно поддерживаются в Аксиоме.
Отображаются, но не редактируются.
Надеюсь в следующей версии можно будет их редактировать, тогда и эта проблема исчезнет.
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

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

Сообщение radish » 18 апр 2023, 19:15

Спасибо большое!
А правильно понимаю, что новый текстовый объект еще нужно вставить в эту же / новую таблицу?
На примере задачи, когда весь шрифт нужно уменьшить в два раза

Код: Выделить всё

new_features=[]
for feature in features:
    if isinstance(feature.geometry, axipy.Text):
        sz = get_text_size(feature.geometry, feature.style, axipy.view_manager.active)
        sz /= 2
        newtext = create_text(feature.geometry, feature.style, axipy.view_manager.active, sz)
        new_feature = ..........  # как здесь передать новый текстовый объект?
        new_features.append(new_feature)
newtable.insert(new_features)
Как здесь передать новый текстовый объект в новую таблицу?
Попытался сделать

Код: Выделить всё

new_feature = feature
new_feature.geometry = newtext
Но тогда текст в newtable отображается некорректно, огромным шрифтом.
Последний раз редактировалось radish 18 апр 2023, 19:21, всего редактировалось 1 раз.
Аватара пользователя
SergeyV
Сообщения: 3
Зарегистрирован: 17 апр 2023, 04:29

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

Сообщение SergeyV » 19 апр 2023, 03:35

SergeyV писал(а): 17 апр 2023, 05:25 В таком случае ломаются все имеющиеся выноски текста (перенесенного из mapinfo).
выноски.png
То есть сейчас нет никакой возможности одновременного редактирования размера шрифта для нескольких объектов текста с выносками?
Последний раз редактировалось SergeyV 19 апр 2023, 03:37, всего редактировалось 1 раз.
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

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

Сообщение radish » 19 апр 2023, 04:27

У нас в целом вопрос такой - есть текстовые объекты, которые налезают друг на друга, хотим массово уменьшить/выровнять их размер. Для такой задачи ведь size не подходит? На разных масштабах выводятся разные значени переменной sz.
Чтобы уменьшить размер текста, нужно уменьшить прямоугольник, в который он вписан (Rect), или ошибаюсь?
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

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

Сообщение Александр » 19 апр 2023, 07:52

radish писал(а): 19 апр 2023, 04:27 У нас в целом вопрос такой - есть текстовые объекты, которые налезают друг на друга, хотим массово уменьшить/выровнять их размер. Для такой задачи ведь size не подходит? На разных масштабах выводятся разные значени переменной sz.
Чтобы уменьшить размер текста, нужно уменьшить прямоугольник, в который он вписан (Rect), или ошибаюсь?
Текстовые объекты - особый вид географического объекта.
В Аксиоме можно считать, что текст нарисован на поверхности земли. Текст в Аксиоме всегда рисуется одним размером и масштабируется, размер текста в координатах не зависит от подбираемого кегля и кернинговых пар (в отличии от MapInfo).
В Аксиоме Текст задаётся не повёрнутым прямоугольником, а начальной точкой, высотой в координатах и углом. Длина текста рассчитывается на основе самого текста, который будет написан, и его стиля. В предыдущих версиях Аксиомы текст задавался как в MapInfo - рамкой, в итоге рамка могла быть неполностью заполнена текстом, а иногда (при перепроецировании) текст вылезал за её границы - ситуация аналогичная MapInfo. Этот функционал реализован в ядре, но API слегка запаздывает и функции для удобной работы с текстом пока не вынесены.
К тексту, как и к другим географическим объектам можно применять аффинные преобразования и проецировать. При этом текст не будет скашиваться или зеркалироваться.

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

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

Сообщение Александр » 19 апр 2023, 07:55

SergeyV писал(а): 19 апр 2023, 03:35 То есть сейчас нет никакой возможности одновременного редактирования размера шрифта для нескольких объектов текста с выносками?
Попробуем внести изменения в инструмент. По результатам отпишусь здесь.
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

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

Сообщение radish » 19 апр 2023, 09:19

С помощью scale() получилось поменять размер текста пропорционально исходному, спасибо за помощь!
Александр писал(а): 19 апр 2023, 07:52 в итоге рамка могла быть неполностью заполнена текстом
На скриншоте примерно такой случай, или не совсем?
text.jpg
text.jpg (104.87 КБ) 16794 просмотра
Если начать растягивать верхний прямоугольник вручную, он подстраивается под текст.

Есть способ отсеять такие объекты, где прямоугольник выше текста (может, как-то "обновить", чтобы его размер подстроился под текст)? Высота прямоугольников на скриншоте одинакова, после scale они оба становятся в k раз меньше вместе с текстом.
Последний раз редактировалось radish 19 апр 2023, 09:22, всего редактировалось 1 раз.
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

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

Сообщение Александр » 19 апр 2023, 16:38

Александр писал(а): 19 апр 2023, 07:55
SergeyV писал(а): 19 апр 2023, 03:35 То есть сейчас нет никакой возможности одновременного редактирования размера шрифта для нескольких объектов текста с выносками?
Попробуем внести изменения в инструмент. По результатам отпишусь здесь.
Нет, не получилось. Только с новой версией Аксиомы.
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

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

Сообщение radish » 20 апр 2023, 11:28

Меняю шрифт выделенного текста следующим образом:

Код: Выделить всё

if axipy.data_manager.selection:
    for feature in axipy.data_manager.selection:
        if isinstance(feature.geometry, axipy.Text):
            style = feature.style
            style = axipy.TextStyle("Century", 0, get_text_style_from_effects(style.effects, style.bg_type), style.color, style.bg_color)
            feature.style = style
            axipy.data_manager.selection.update(feature)
При этом у текстов исчезают выноски. Подскажите пожалуйста, есть какой-нибудь другой способ менять шрифт?

Если выделяем несколько текстовых элементов вручную и меняем у них шрифт также вручную без скрипта, то выноски в каких-то выборках исчезают, а в каких-то нет.
Последний раз редактировалось radish 20 апр 2023, 11:37, всего редактировалось 1 раз.
Ответить