Выделение текстовых объектов
Выделение текстовых объектов
Добрый день.
В Sql запросах возможно географическое объединение таблиц. Но если через Contains или Within Объединять таблицу содержащую текстовые объекты с таблицей полигонов, то текстовые объекты не попадают в запрос.
Как можно выбрать текстовые объекты, которые лежат в границах другого слоя?
В Sql запросах возможно географическое объединение таблиц. Но если через Contains или Within Объединять таблицу содержащую текстовые объекты с таблицей полигонов, то текстовые объекты не попадают в запрос.
Как можно выбрать текстовые объекты, которые лежат в границах другого слоя?
Re: Выделение текстовых объектов
В текущей версии - к текстовой геометрии нельзя применять запросы.
Мы добавили такую поддержку и она будет в новой версии Аксиомы.
Если Вам нужна такая версия сейчас - пожалуйста напишите нам на forum@axioma-gis.ru
Мы добавили такую поддержку и она будет в новой версии Аксиомы.
Если Вам нужна такая версия сейчас - пожалуйста напишите нам на forum@axioma-gis.ru
Re: Выделение текстовых объектов
Доброе утро! Присоединяюсь к вопросу: есть ли возможность выделения текстовых объектов в одном слое по размеру шрифта? Допустим с помощью консоли Python?
Re: Выделение текстовых объектов
А также изменить только шрифт выделенных объектов, не затрагивая настроенный для них цвет?
Re: Выделение текстовых объектов
Всем привет! В тему вопросов про текст.
При выполнении такого скрипта из встроенного редактора:
Выводится ошибка:
AttributeError: 'LineStyle' object has no attribute 'fontname'
Подскажите пожалуйста, в чем может быть ошибка?
И еще вопрос: какой аттрибут отвечает за размер шрифта?
При выполнении такого скрипта из встроенного редактора:
Код: Выделить всё
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'
Подскажите пожалуйста, в чем может быть ошибка?
И еще вопрос: какой аттрибут отвечает за размер шрифта?
Re: Выделение текстовых объектов
В модуле Дополнительные инструменты есть инструмент - Изменить размер текста.
Возможно потребуется обновить модуль в диалоге Модули чтобы инструмент появился.
Размер шрифта - это не атрибут.
Размер шрифта определяет прямоугольник текстового объекта и его стиль. Размер шрифта меняется в зависимости от масштаба карты.
Сейчас сделать это проблематично,
Постараюсь завтра выложить пример как получить размер шрифта и как его установить.
В следующей версии добавим сервисную функцию.
тут ошибка в скрипте
fs = text_style.fontstyle
а должно быть:
fs = text_style.fontname
по индексу к колонке стилей не обязательно обращаться, можно просто
Code: Select all
if isinstance(feature.style, axipy.TextStyle):
print(feature.style.fontname)
Re: Выделение текстовых объектов
Да, прошу прощения, я в скрипте в сообщении ошибся, много чего пробовал и не тот кусок скопировал.
Но так тоже не работает:
ошибка та же
AttributeError: 'LineStyle' object has no attribute 'fontname'
Тут вопрос, почему объект TextStyle, а в ошибке ругается на отсутствие такого свойства в LineStyle.
а вот так работает, спасибо)
Но еще есть пара вопросов:
- размер шрифта - чтобы его изменить, нужно, получается, изменить размер рамки? Было бы очень здорово, если был бы пример скрипта..
- пытаюсь поменять цвет шрифта следующим образом, но цвет не изменяется
Но так тоже не работает:
Код: Выделить всё
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 раза.
Re: Выделение текстовых объектов
В таком случае ломаются все имеющиеся выноски текста (перенесенного из mapinfo).
Последний раз редактировалось SergeyV 18 апр 2023, 03:56, всего редактировалось 1 раз.
Re: Выделение текстовых объектов
Пример работы с размером Текста
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("Нет выделенных текстовых объектов на карте")