Управление маркерами вершин через API

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
GIS-dev
Участник
Сообщения: 54
Зарегистрирован: 27 авг 2009, 11:01
Репутация: 1

Управление маркерами вершин через API

Сообщение GIS-dev » 04 май 2011, 07:44

Никак не найду, каком образом устанавливается вид маркеров вершин на карте в режиме редактирования геометрии (по-умолчанию красные крестики на каждой вершине в режиме редактирования векторного слоя)! Если цвет заливки выбранной фичи удалось задать методом "QgsRenderer::setSelectionColor()", то для управления маркерами логической цепочки не прослеживается в исходниках. Например в файле "qgsoptions.cpp" считывается, задается и сохраняется стиль маркеров, в виде креста: "settings.setValue( "/qgis/digitizing/marker_style", "Cross" );" и т.п. Но обращение к объекту "settings" более нигде не обнаруживается, кроме самого вышеназванного файла... Интуитивно угадать какие переменные или методы и где непосредственно в других классах или в самих библиотеках API задают внешний вид маркеров вершин, мне пока не удалось. Если кто-то знает, в каком классе они запрятаны, подскажите, плз! Мне их нужно попросту отключить, я сам отрисовываю анимированное выделение поверх растра карты, и эти красные кресты здорово портят внешний вид. :(

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Управление маркерами вершин через API

Сообщение Дмитрий Барышников » 04 май 2011, 11:56

Я насколько бегло смотрел - надо искать не переменную settings, а ее тип. Ибо имя переменной может быть любое. Еще наверное надо искать по "/qgis/digitizing/marker_style".
Может вам стоить переопределить переменную примерно так: settings.setValue( "/qgis/digitizing/marker_style", "Circle" );

GIS-dev
Участник
Сообщения: 54
Зарегистрирован: 27 авг 2009, 11:01
Репутация: 1

Re: Управление маркерами вершин через API

Сообщение GIS-dev » 04 май 2011, 12:39

Я пробовал найти ключ "/qgis/digitizing/marker_style", предполагая, что в любом случае обращение к настройкам должно идти через него(больше просто ничего не меняется в "qgsoptions.cpp"). Однако в исходниках QGIS его нет, что заставляет предположить обращение к нему где-то в недрах библиотек API.
Я пробовал так: в функцию "main()" на первое место ставил код:

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

QSettings settings;
settings.setValue( "/qgis/digitizing/marker_only_for_selected",true);

Если бы он сработал, маркерами по идее выделялся бы только объект, с которым производятся действия (так происходит в самом QGIS). Но выделяются по-прежнему вершины всех объектов слоя... Да и мне кажется было бы странно управлять параметрами отображения через объект QSettings, предназначенный только для запоминания конфигураций. Должен быть какой-то вызов вроде "QgsMapcanvas->setSelMarkerType(xxx);" или что-то подобное. Но ничего похожего поиском я не нашел ни в исходниках, ни в "справочнике" по API на сайте QGIS.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Управление маркерами вершин через API

Сообщение Voltron » 04 май 2011, 19:36

Установка произовольных маркеров вершин в данный момент не возможна, вы можете использовать только один из трех вариантов: перекрестие, полупрозрачный круг и без маркера. Т.о, чтобы отключить маркеры достаточно записать в /qgis/digitizing/marker_style значение None.

Ах, да. Код, отвечающий за отрисовку маркеров ищите в файле qgsvectorlayer.cpp.

Hint: в TotalCommander есть возможность искать по содержимому, да и в других нормальных файловых менеджерах тоже (про Linux вообще молчу). Это если не удается «проследить цепочку»

GIS-dev
Участник
Сообщения: 54
Зарегистрирован: 27 авг 2009, 11:01
Репутация: 1

Re: Управление маркерами вершин через API

Сообщение GIS-dev » 06 май 2011, 16:27

Хм. Да. Вот фрагмент необходимого кода в функции main(), чтобы всё наконец-то заработало (спасибо разработчикам Qt за подробный мануал, в частности по QSettings):

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

int main(int argc, char *argv[])
{
QgsApplication a(argc, argv, true, QObject::tr(""));

QCoreApplication::setOrganizationName( "QuantumGIS" );
QCoreApplication::setOrganizationDomain( "qgis.org" );
QCoreApplication::setApplicationName( "QGIS" );
QSettings settings;
settings.setValue( "/qgis/digitizing/marker_style","None");
........................
}

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя