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

Вопросы связанные с работой ГИС Аксиома
Ответить
Аватара пользователя
pahanbl4
Сообщения: 23
Зарегистрирован: 11 окт 2019, 08:55

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

Сообщение pahanbl4 » 23 окт 2019, 12:02

Доброго времени суток!

Как можно самому выбрать записи в таблице в Выборку?
Аватара пользователя
gisamap
Сообщения: 191
Зарегистрирован: 18 окт 2019, 08:03

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

Сообщение gisamap » 24 окт 2019, 07:47

Добрый день.
Если речь о API Python , то существет несколько вариантов :
- SQL если смотреть в документации то раздел "Модуль источников данных sql"
- используя методы класса axioma.core.dp.Table select*
Аватара пользователя
Артём
Сообщения: 12
Зарегистрирован: 07 июн 2019, 11:48

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

Сообщение Артём » 24 окт 2019, 10:07

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

В текущем виде можно попробовать найти какой-то обходной путь через gui.MapView.selectionModel().setSelection(mapFeatureItems). Там надо сконструировать правильный список mapFeatureItem, но это нетривиальная задача. Не уверен, что такое решение будет концептуально правильным.
Аватара пользователя
pahanbl4
Сообщения: 23
Зарегистрирован: 11 окт 2019, 08:55

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

Сообщение pahanbl4 » 25 окт 2019, 04:31

Спасибо! Будем ждать. (И да - обходной путь помог)
Аватара пользователя
pahanbl4
Сообщения: 23
Зарегистрирован: 11 окт 2019, 08:55

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

Сообщение pahanbl4 » 19 ноя 2019, 06:28

Здравствуйте! Перестал работать "обходной путь"... :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()))
Код вкратце описывает суть подхода и проблеммы..
Фича выбирается правильно, по крайней мере айдишник совпадает, но в выборку всегда попадает первый объект из таблицы.
Аватара пользователя
Артём
Сообщения: 12
Зарегистрирован: 07 июн 2019, 11:48

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])
Аватара пользователя
pahanbl4
Сообщения: 23
Зарегистрирован: 11 окт 2019, 08:55

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

Сообщение pahanbl4 » 19 ноя 2019, 11:33

Вот реализовал новый подход с недокументированными функциями.. Тоже самое - всегда выбирается первый объект в таблице.

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

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