Выбор объектов в таблице
Выбор объектов в таблице
Доброго времени суток!
Как можно самому выбрать записи в таблице в Выборку?
Как можно самому выбрать записи в таблице в Выборку?
Re: Выбор объектов в таблице
Добрый день.
Если речь о API Python , то существет несколько вариантов :
- SQL если смотреть в документации то раздел "Модуль источников данных sql"
- используя методы класса axioma.core.dp.Table select*
Если речь о API Python , то существет несколько вариантов :
- SQL если смотреть в документации то раздел "Модуль источников данных sql"
- используя методы класса axioma.core.dp.Table select*
Re: Выбор объектов в таблице
Как оказалось, функции непосредственного выбора записей в таблицу Выборка не были вынесены в API разработчика на Python.
Это должно быть в классе dp.SelectionManager, но сейчас там этого нет.
В следующей версии Аксиомы появится.
В текущем виде можно попробовать найти какой-то обходной путь через gui.MapView.selectionModel().setSelection(mapFeatureItems). Там надо сконструировать правильный список mapFeatureItem, но это нетривиальная задача. Не уверен, что такое решение будет концептуально правильным.
Это должно быть в классе dp.SelectionManager, но сейчас там этого нет.
В следующей версии Аксиомы появится.
В текущем виде можно попробовать найти какой-то обходной путь через gui.MapView.selectionModel().setSelection(mapFeatureItems). Там надо сконструировать правильный список mapFeatureItem, но это нетривиальная задача. Не уверен, что такое решение будет концептуально правильным.
Re: Выбор объектов в таблице
Спасибо! Будем ждать. (И да - обходной путь помог)
Re: Выбор объектов в таблице
Здравствуйте! Перестал работать "обходной путь"...
Код вкратце описывает суть подхода и проблеммы..
Фича выбирается правильно, по крайней мере айдишник совпадает, но в выборку всегда попадает первый объект из таблицы.
Код: Выделить всё
context = SimpleTableContext(table)
query = 'SELECT * FROM Пекло WHERE Ид = "666"
sel = select(query, context)
mapview = axioma.app.mainWindow.mapViewManager().currentMapView()
layers = mapview.allTableLayersWithoutCosmetic()
for item in layers:
if item.name() == "Пекло":
layer = item
selmodel = mapview.selectionModel()
for feature in sel.features:
selmodel.setSelection(MapFeatureItem(layer, feature, feature, mapview.viewport()))
Фича выбирается правильно, по крайней мере айдишник совпадает, но в выборку всегда попадает первый объект из таблицы.
Re: Выбор объектов в таблице
А раньше "обходной путь" работал? Что поменялось? Надо разбираться...
Кстати, в версии Аксиома 2.4.1 уже есть нужные методы для выборки в классе SelectionManager, но они не попали в документацию разработчика.
Вот пример кода, как использовать новые методы:
Кстати, в версии Аксиома 2.4.1 уже есть нужные методы для выборки в классе SelectionManager, но они не попали в документацию разработчика.
Вот пример кода, как использовать новые методы:
Код: Выделить всё
# Получаем каталог открытых данных
catalog = axioma.app.mainWindow.dataCatalog()
# Выбираем открытую таблицу
table = catalog.allDataObjects()[0]
# Получаем объект класса SelectionManager
manager = catalog.selectionManager()
# Создаем выборку из объектов таблицы с номерами 1, 3 и 5
manager.setSelection(table, [1, 3, 5])
# Добавляем в созданную выборку объект таблицы с номером 2
manager.addToSelection(table, [2])
# Удаляем выборку
manager.deselect(table, [1, 2, 3, 5])
Re: Выбор объектов в таблице
Вот реализовал новый подход с недокументированными функциями.. Тоже самое - всегда выбирается первый объект в таблице.
Скорее всего дело в функции сравнения фич..
Дело в том, что в sel id() фичи всегда равно 0.
В старом коде при создании MapFeatureItem фича передавалась целиком.
Видимо сейчас фичи сравниваются по id() => 0 всегда возвращает первый объект.
Данный код работает идеально..
id() находится банальным перебором.
Код: Выделить всё
catalog = axioma.app.mainWindow.dataCatalog()
table = catalog.findDataObjectByName('Пекло')
context = SimpleTableContext(table)
query = SELECT * FROM Пекло WHERE Ид = "666"'
sel = select(query, context)
if len(sel.features) > 0:
mapview = axioma.app.mainWindow.mapViewManager().currentMapView()
manager = catalog.selectionManager()
ids = [feature.id() for feature in sel.features]
manager.setSelection(table, ids)
mapview.showSelection()
Работал)) Я писал об этом.. Поменялась версия Аксиомы.. Разобрался..А раньше "обходной путь" работал? Что поменялось? Надо разбираться...
Скорее всего дело в функции сравнения фич..
Дело в том, что в sel id() фичи всегда равно 0.
В старом коде при создании MapFeatureItem фича передавалась целиком.
Видимо сейчас фичи сравниваются по id() => 0 всегда возвращает первый объект.
Код: Выделить всё
id = -1
features = table.allFeatures()
for feature in features:
value = str(feature.getAttribute('Ид', Qt.CaseInsensitive))
if value == '666':
id = feature.id()
break
if id >= 0:
mapview = axioma.app.mainWindow.mapViewManager().currentMapView()
manager = catalog.selectionManager()
manager.setSelection(table, [id])
mapview.showSelection()
id() находится банальным перебором.