Страница 1 из 1

Выбор объектов в таблице

Добавлено: 23 окт 2019, 12:02
pahanbl4
Доброго времени суток!

Как можно самому выбрать записи в таблице в Выборку?

Re: Выбор объектов в таблице

Добавлено: 24 окт 2019, 07:47
gisamap
Добрый день.
Если речь о API Python , то существет несколько вариантов :
- SQL если смотреть в документации то раздел "Модуль источников данных sql"
- используя методы класса axioma.core.dp.Table select*

Re: Выбор объектов в таблице

Добавлено: 24 окт 2019, 10:07
Артём
Как оказалось, функции непосредственного выбора записей в таблицу Выборка не были вынесены в API разработчика на Python.
Это должно быть в классе dp.SelectionManager, но сейчас там этого нет.
В следующей версии Аксиомы появится.

В текущем виде можно попробовать найти какой-то обходной путь через gui.MapView.selectionModel().setSelection(mapFeatureItems). Там надо сконструировать правильный список mapFeatureItem, но это нетривиальная задача. Не уверен, что такое решение будет концептуально правильным.

Re: Выбор объектов в таблице

Добавлено: 25 окт 2019, 04:31
pahanbl4
Спасибо! Будем ждать. (И да - обходной путь помог)

Re: Выбор объектов в таблице

Добавлено: 19 ноя 2019, 06:28
pahanbl4
Здравствуйте! Перестал работать "обходной путь"... :cry:

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

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: Выбор объектов в таблице

Добавлено: 19 ноя 2019, 08:34
Артём
А раньше "обходной путь" работал? Что поменялось? Надо разбираться...

Кстати, в версии Аксиома 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: Выбор объектов в таблице

Добавлено: 19 ноя 2019, 11:33
pahanbl4
Вот реализовал новый подход с недокументированными функциями.. Тоже самое - всегда выбирается первый объект в таблице.

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

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() находится банальным перебором.