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

Вопросы связанные с работой ГИС Аксиома
Аватара пользователя
iven
Сообщения: 26
Зарегистрирован: 29 дек 2022, 07:01

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

Сообщение iven » 14 апр 2023, 12:11

Добрый день.
В Sql запросах возможно географическое объединение таблиц. Но если через Contains или Within Объединять таблицу содержащую текстовые объекты с таблицей полигонов, то текстовые объекты не попадают в запрос.
Как можно выбрать текстовые объекты, которые лежат в границах другого слоя?
Аватара пользователя
Александр
Сообщения: 424
Зарегистрирован: 18 апр 2019, 08:21

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

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

В текущей версии - к текстовой геометрии нельзя применять запросы.
Мы добавили такую поддержку и она будет в новой версии Аксиомы.
Если Вам нужна такая версия сейчас - пожалуйста напишите нам на forum@axioma-gis.ru
Аватара пользователя
SergeyV
Сообщения: 3
Зарегистрирован: 17 апр 2023, 04:29

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

Сообщение SergeyV » 17 апр 2023, 04:34

Доброе утро! Присоединяюсь к вопросу: есть ли возможность выделения текстовых объектов в одном слое по размеру шрифта? Допустим с помощью консоли Python?
Аватара пользователя
SergeyV
Сообщения: 3
Зарегистрирован: 17 апр 2023, 04:29

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

Сообщение SergeyV » 17 апр 2023, 05:25

А также изменить только шрифт выделенных объектов, не затрагивая настроенный для них цвет?
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

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

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

Всем привет! В тему вопросов про текст.
При выполнении такого скрипта из встроенного редактора:

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

import axipy
table_txt = axipy.provider_manager.openfile(r'F:\axioma\Txt_some.tab')
axipy.data_manager.add(table_txt)
layer_txt = axipy.Layer.create(table_txt)
map_world = axipy.Map([ layer_txt ])
mapview = axipy.view_manager.create_mapview(map_world)
features = table_txt.items()
for feature in features:
    text_style = feature[3]
    print(type(text_style))     # вывод: <class 'axipy.da.TextStyle'>
    fs = text_style.fontstyle
Выводится ошибка:
AttributeError: 'LineStyle' object has no attribute 'fontname'

Подскажите пожалуйста, в чем может быть ошибка?

И еще вопрос: какой аттрибут отвечает за размер шрифта?
Аватара пользователя
Александр
Сообщения: 424
Зарегистрирован: 18 апр 2019, 08:21

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

Сообщение Александр » 17 апр 2023, 17:50

SergeyV писал(а): 17 апр 2023, 05:25 изменить только шрифт выделенных объектов, не затрагивая настроенный для них цвет?
В модуле Дополнительные инструменты есть инструмент - Изменить размер текста.
Возможно потребуется обновить модуль в диалоге Модули чтобы инструмент появился.
radish писал(а): 17 апр 2023, 11:42 И еще вопрос: какой аттрибут отвечает за размер шрифта?
Размер шрифта - это не атрибут.
Размер шрифта определяет прямоугольник текстового объекта и его стиль. Размер шрифта меняется в зависимости от масштаба карты.
SergeyV писал(а): 17 апр 2023, 04:34 есть ли возможность выделения текстовых объектов в одном слое по размеру шрифта? Допустим с помощью консоли Python?
Сейчас сделать это проблематично,
Постараюсь завтра выложить пример как получить размер шрифта и как его установить.
В следующей версии добавим сервисную функцию.

radish писал(а): 17 апр 2023, 11:42 При выполнении такого скрипта из встроенного редактора:
тут ошибка в скрипте
fs = text_style.fontstyle

а должно быть:
fs = text_style.fontname

по индексу к колонке стилей не обязательно обращаться, можно просто

Code: Select all

if isinstance(feature.style, axipy.TextStyle):
print(feature.style.fontname)
Аватара пользователя
radish
Сообщения: 4
Зарегистрирован: 17 апр 2023, 09:20

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

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

Да, прошу прощения, я в скрипте в сообщении ошибся, много чего пробовал и не тот кусок скопировал.
Но так тоже не работает:

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

fs = text_style.fontname
ошибка та же
AttributeError: 'LineStyle' object has no attribute 'fontname'
Тут вопрос, почему объект TextStyle, а в ошибке ругается на отсутствие такого свойства в LineStyle.

а вот так работает, спасибо)

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

if isinstance(feature.style, axipy.TextStyle):
        print(feature.style.fontname)
Но еще есть пара вопросов:
- размер шрифта - чтобы его изменить, нужно, получается, изменить размер рамки? Было бы очень здорово, если был бы пример скрипта..
- пытаюсь поменять цвет шрифта следующим образом, но цвет не изменяется

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

print(feature.style.color.redF())                       # получаю красную составляющую цвета текста, например 0.0
feature.style.color.setRgbF(1.0, 0.0, 0.0, 1.0)  # пытаюсь его изменить
print(feature.style.color.redF())                       # значение red остается тем же
Последний раз редактировалось radish 18 апр 2023, 05:54, всего редактировалось 3 раза.
Аватара пользователя
SergeyV
Сообщения: 3
Зарегистрирован: 17 апр 2023, 04:29

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

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

Александр писал(а): 17 апр 2023, 17:50
SergeyV писал(а): 17 апр 2023, 05:25 изменить только шрифт выделенных объектов, не затрагивая настроенный для них цвет?
В модуле Дополнительные инструменты есть инструмент - Изменить размер текста.
Возможно потребуется обновить модуль в диалоге Модули чтобы инструмент появился.
В таком случае ломаются все имеющиеся выноски текста (перенесенного из mapinfo).
выноски.png
выноски.png (26.08 КБ) 13911 просмотров
Последний раз редактировалось SergeyV 18 апр 2023, 03:56, всего редактировалось 1 раз.
Аватара пользователя
Александр
Сообщения: 424
Зарегистрирован: 18 апр 2019, 08:21

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

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

radish писал(а): 18 апр 2023, 03:41 а вот так работает, спасибо)
Видимо были и линии, не только Тексты
Аватара пользователя
Александр
Сообщения: 424
Зарегистрирован: 18 апр 2019, 08:21

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

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

Пример работы с размером Текста

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:
"""
Вычислить размер текста на карте в пунктах
: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)

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):
sz = get_text_size(feature.geometry, feature.style, axipy.view_manager.active)
print(sz)
flag = True
if not flag:
print("Нет выделенных текстовых объектов на карте")

Ответить