На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Падает onCreateNetDlgEx

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Падает onCreateNetDlgEx
 
Пытаюсь строить граф на карте Подольска под Astra Linux
Код

    HRSC hRsc = mapGetRscIdent(hMap, hMap);
    HSEL ECT hSel ect = mapCreateMapSelectContext(hMap);

    mapSelectObject(hSelect, -1, 0);
    long code = mapGetRscObjectKeyIncode(hRsc, "L0061210000"); //автомагистрали
    mapSelectObject(hSelect, code, 1);

    mapSetSiteSeekSelect(hMap, hMap, hSelect);

    qDebug()<<"found count = "<<mapSeekSelectObjectCount(hMap, hSelect); //находит 7 объектов

    QString appPath = qApp->applicationDirPath();
    QByteArray rscPath = QByteArray().append(appPath+"/map/road25.rsc");
    QByteArray graphSitePath = QByteArray().append(appPath+QString("/map/graph_site%1.sit")
arg(QString::number(++m_counter));

    // создаем граф------------------------
    TASKPARMEX  parm;//параметры диалога
    memset(&parm, 0, sizeof(TASKPARMEX));

    qDebug()<<"before onCreateNetDlgEx";
    HSITE graphSite = onCreateNetDlgEx(hMap, &parm, graphSitePath.data(), rscPath.data(), 1);
    qDebug()<<"graphSite done";

    mapDeleteSelectContext(hSelect);


Появляется диалог. Нажимаю кнопку "Построить" - программа вылетает, лог перед onCreateNetDlgEx выводится, второй нет.
Сам граф строится, на жестком диске появляется требуемый файл с графом, его можно открыть и посмотреть.

вывод gdb

Код
#0  0x00007f6318e58692 in MapSortProcessEx () from /usr/local/gis/lib/libqdmapvecex.so
(gdb) bt
#0  0x00007f6318e58692 in MapSortProcessEx () from /usr/local/gis/lib/libqdmapvecex.so
#1  0x00007f6318e58977 in MapSortProcess () from /usr/local/gis/lib/libqdmapvecex.so
#2  0x00007f631c118ba7 in TCreateNetDlg::BuildPathNet() () from /usr/local/gis/lib/libqdobjnet.so
#3  0x00007f631c11610c in TCreateNetDlg::BuildNet() () from /usr/local/gis/lib/libqdobjnet.so
#4  0x00007f631c115c03 in TCreateNetDlg::OkButtonClick() () from /usr/local/gis/lib/libqdobjnet.so
#5  0x00007f631c121809 in ?? () from /usr/local/gis/lib/libqdobjnet.so
#6  0x00007f631d21832f in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#7  0x00007f631dda6012 in QAbstractButton::clicked(bool) () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#8  0x00007f631daf932e in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#9  0x00007f631daf9b60 in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#10 0x00007f631daf9dcc in QAbstractButton::mouseReleaseEvent(QMouseEvent*) () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#11 0x00007f631d789bd0 in QWidget::event(QEvent*) () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#12 0x00007f631d73a1dc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#13 0x00007f631d73eebb in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#14 0x00007f631d2026de in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#15 0x00007f631d73b01b in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) ()
   from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#16 0x00007f631d7b9424 in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#17 0x00007f631d7b831f in QApplication::x11ProcessEvent(_XEvent*) () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#18 0x00007f631d7e0552 in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#19 0x00007f631a64b205 in g_main_context_dispatch () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#20 0x00007f631a64b538 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#21 0x00007f631a64b5f4 in g_main_context_iteration () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#22 0x00007f631d230fa6 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#23 0x00007f631d7e01ce in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#24 0x00007f631d20142f in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#25 0x00007f631d2016b8 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#26 0x00007f631dbf3b78 in QDialog::exec() () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#27 0x00007f631c0e27ea in onCreateNetDlgEx () from /usr/local/gis/lib/libqdobjnet.so
Изменено: Игорь Михейчев - 31.08.2015 18:48:25
 
Проверил работу на простом примере, код ниже. Замечаний нет.
Код
#include <Qt/qapplication.h>

#include "mapapi.h"
#include "netapi.h"


int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    char* mapName = "/usr/share/qt4/examples/gisdesigner11/Data/Podolsk/Podolsk.map";
    HMAP hMap = mapOpenData(mapName, 0);
    HRSC hRsc = mapGetRscIdent(hMap, hMap); 
    HSELECT hSelect = mapCreateMapSelectContext(hMap); 

    mapSelectObject(hSelect, -1, 0); 
    mapSelectLocal(hSelect, -1, 0); 
    mapSelectLayer(hSelect, -1, 0);

    mapSelectLocal(hSelect, LOCAL_LINE, 1); 
    mapSelectLayer(hSelect, 10, 1);

    long code = mapGetRscObjectKeyIncode(hRsc, "L0061210000"); //автомагистрали 
    mapSelectObject(hSelect, code, 1); 

    mapSetSiteSeekSelect(hMap, hMap, hSelect); 

    printf("objcount=%d\n", mapSeekSelectObjectCount(hMap, hSelect)); //находит 7 объектов 

    char *rscPath = "/usr/Operator11/road25.rsc"; 
    char *graphSitePath = "/usr/Operator11/graph_site1.sit";

    // создаем граф------------------------ 
    TASKPARMEX  parm;//параметры диалога 
    memset(&parm, 0, sizeof(TASKPARMEX)); 

    HSITE graphSite = onCreateNetDlgEx(hMap, &parm, graphSitePath, rscPath, 1); 

    mapDeleteSelectContext(hSelect); 

  mapCloseData(hMap);

  return 1;
}

Рекомендации:
1.Обновить до последней версии ГИС Конструктор по ссылке - http://gisinfo.ru/download_linux?id=56
2.В начале программы обязательно должен присутствовать код:
Код
    QApplication a( argc, argv );

3.В конце программы не забываем закрывать данные:
Код
  mapCloseData(hMap);
 
Ваш пример работает
добавил условия поиска
Код
    //АВТОМАГИСТРАЛИ (АВТОСТРАДЫ)
    long code = mapGetRscObjectKeyIncode(hRsc, "L0061210000");
    mapSelectObject(hSelect, code, 1);
    //УСОВЕРШЕНСТВОВАННЫЕ ШОССЕ
    code = mapGetRscObjectKeyIncode(hRsc, "L0061220000");
    mapSelectObject(hSelect, code, 1);
    //ШОССЕ
    code = mapGetRscObjectKeyIncode(hRsc, "L0061230000");
    mapSelectObject(hSelect, code, 1);
    //УЛУЧШЕННЫЕ ГРУНТОВЫЕ ДОРОГИ
    code = mapGetRscObjectKeyIncode(hRsc, "L0061310000");
    mapSelectObject(hSelect, code, 1);
    //ГРУНТОВЫЕ ПРОСЕЛОЧНЫЕ ДОРОГИ
    code = mapGetRscObjectKeyIncode(hRsc, "L0061320000");
    mapSelectObject(hSelect, code, 1);
    //ТРУДНОПРОЕЗ.УЧАСТ.ГРУНТ.ДОРОГ
    code = mapGetRscObjectKeyIncode(hRsc, "L0061940000");
    mapSelectObject(hSelect, code, 1);
    //ТРУДНОПРОЕЗ.УЧ.УЛУЧШЕН.ГР.ДОР.
    code = mapGetRscObjectKeyIncode(hRsc, "L00619400001");
    mapSelectObject(hSelect, code, 1);
    //ПОЛЕВЫЕ И ЛЕСНЫЕ ДОРОГИ
    code = mapGetRscObjectKeyIncode(hRsc, "L0061330000");
    mapSelectObject(hSelect, code, 1);
    //УЛИЦЫ МАГИСТРАЛЬНЫЕ И ГЛАВНЫЕ
    code = mapGetRscObjectKeyIncode(hRsc, "L0045200000");
    mapSelectObject(hSelect, code, 1);
    //УЛИЦЫ МАГИСТР.И ГЛАВ.С ЗАЛИВ.
    code = mapGetRscObjectKeyIncode(hRsc, "L00452000001");
    mapSelectObject(hSelect, code, 1);


программа зависает, при этом загрузка ЦП под 100%
для 1070 найденых объектов это нормально?

если уменьшить число условий, то при запуске одного того же exe-шника может зависнуть может отработать
пробовал менять "Допуск согласования" на  1м - один раз привело к падению, повторить не удалось
Код
#0  0x00007faa9bacb2fe in deXDouble(TDataEdit*) () from /usr/local/gis/lib/libqdmapacces.so
(gdb) bt
#0  0x00007faa9bacb2fe in deXDouble(TDataEdit*) () from /usr/local/gis/lib/libqdmapacces.so
#1  0x00007faa9bace506 in TDataEdit::XDouble() () from /usr/local/gis/lib/libqdmapacces.so
#2  0x00007faa9bad455d in TDataEdit::ObjectFrame(DFRAME&) () from /usr/local/gis/lib/libqdmapacces.so
#3  0x00007faa9bb571b8 in TObjectInfo::ObjectFramePlane(DFRAME*) () from /usr/local/gis/lib/libqdmapacces.so
#4  0x00007faa9bb5dac9 in TObjectInfo::IsCrossObjectFrame(TObjectInfo*, double) () from /usr/local/gis/lib/libqdmapacces.so
#5  0x00007faa9bca0c8c in mapCreateObjectCrossPointsEx () from /usr/local/gis/lib/libqdmapacces.so
#6  0x00007faa9b7990dc in TCreateNetDlg::BuildCut() () from /usr/local/gis/lib/libqdobjnet.so
#7  0x00007faa9b798053 in TCreateNetDlg::BuildNet() () from /usr/local/gis/lib/libqdobjnet.so
#8  0x00007faa9b797c03 in TCreateNetDlg::OkButtonClick() () from /usr/local/gis/lib/libqdobjnet.so


Любое всплывающее окно ("Файл уже существует..", "Сформированно более 3 сетей...")
при нажатие на крестик в правом верхнем углу (закрытие), приводит к принудительному завершению программы Fatal IO error: client killed
если исправть пример на
Код
QApplication a( argc, argv ); 
...
return 0;

то код выхода при закрытии диалога 1
Изменено: Игорь Михейчев - 02.09.2015 11:54:17
 
много раз запускал приложение с параметрами
Код
   //АВТОМАГИСТРАЛИ (АВТОСТРАДЫ)
    long code = mapGetRscObjectKeyIncode(hRsc, "L0061210000");
    mapSelectObject(hSelect, code, 1);
    //УСОВЕРШЕНСТВОВАННЫЕ ШОССЕ
    code = mapGetRscObjectKeyIncode(hRsc, "L0061220000");
    mapSelectObject(hSelect, code, 1); 


чаще всего отрабатывает, иногда пишет "Сеть не построена",
один раз упал
Код
Program terminated with signal 11, Segmentation fault.
#0  0x00007f665261941b in deYDouble(TDataEdit*) () from /usr/local/gis/lib/libqdmapacces.so
(gdb) bt
#0  0x00007f665261941b in deYDouble(TDataEdit*) () from /usr/local/gis/lib/libqdmapacces.so
#1  0x00007f665261c532 in TDataEdit::YDouble() () from /usr/local/gis/lib/libqdmapacces.so
#2  0x00007f66526225a0 in TDataEdit::ObjectFrame(DFRAME&) () from /usr/local/gis/lib/libqdmapacces.so
#3  0x00007f66526a51b8 in TObjectInfo::ObjectFramePlane(DFRAME*) () from /usr/local/gis/lib/libqdmapacces.so
#4  0x00007f66526abac9 in TObjectInfo::IsCrossObjectFrame(TObjectInfo*, double) () from /usr/local/gis/lib/libqdmapacces.so
#5  0x00007f66527eec8c in mapCreateObjectCrossPointsEx () from /usr/local/gis/lib/libqdmapacces.so
#6  0x00007f66522e70dc in TCreateNetDlg::BuildCut() () from /usr/local/gis/lib/libqdobjnet.so
#7  0x00007f66522e6053 in TCreateNetDlg::BuildNet() () from /usr/local/gis/lib/libqdobjnet.so
 
Запустил программу с параметрами
Цитата
//АВТОМАГИСТРАЛИ (АВТОСТРАДЫ)
   long code = mapGetRscObjectKeyIncode(hRsc, "L0061210000");
   mapSelectObject(hSelect, code, 1);
   //УСОВЕРШЕНСТВОВАННЫЕ ШОССЕ
   code = mapGetRscObjectKeyIncode(hRsc, "L0061220000");
   mapSelectObject(hSelect, code, 1);
Выдается каждый раз сообщение: "Сформировано более 3 сетей! Откорректируйте исходные данные!" В данном сообщении достаточно нажать кнопку "Да" или клавишу "Enter".
Карта Подольск подходит для построения графа дорог по коду L0061210000. Что и следует ожидать. Для построения графа дорог исходную карту надо подготовить, а это нетривиальная задача.
Советую внимательно ознакомиться с документом " Граф дорог. Руководство пользователя", которое можно скачать по ссылке - http://gistoolkit.ru/download/doc/graphofroad.pdf
 
ГИС Оператор замечательно строит граф для всего слоя "Дорожная сеть"
onCreateNetDlgEx умирает на 4-5 типах объектов для одной и той же карты,
можно ли как нибудь вызывать диалог используемый Оператором?
 
Для ГИС Оператор используется новый, эксперементальный алгоритм построения графа дорог. Позднее он будет внесен в ГИС Конструктор. Тем не менее базовая карта должна соответствовать рекомендациям и требованиям, которые изложены в документе "Граф дорог. Руководство пользователя" (ссылка для скачивания - http://gistoolkit.ru/download/doc/graphofroad.pdf).
 
Цитата
gislinux написал:
Проверил работу на простом примере, код ниже. Замечаний нет.
Код
 #include <Qt/qapplication.h>

#include "mapapi.h"
#include "netapi.h"


int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    char* mapName = "/usr/share/qt4/examples/gisdesigner11/Data/Podolsk/Podolsk.map";
    HMAP hMap = mapOpenData(mapName, 0);
    HRSC hRsc = mapGetRscIdent(hMap, hMap); 
    HSELECT hSelect = mapCreateMapSelectContext(hMap); 

    mapSelectObject(hSelect, -1, 0); 
    mapSelectLocal(hSelect, -1, 0); 
    mapSelectLayer(hSelect, -1, 0);

    mapSelectLocal(hSelect, LOCAL_LINE, 1); 
    mapSelectLayer(hSelect, 10, 1);

    long code = mapGetRscObjectKeyIncode(hRsc, "L0061210000"); //автомагистрали 
    mapSelectObject(hSelect, code, 1); 

    mapSetSiteSeekSelect(hMap, hMap, hSelect); 

    printf("objcount=%d\n", mapSeekSelectObjectCount(hMap, hSelect)); //находит 7 объектов 

    char *rscPath = "/usr/Operator11/road25.rsc"; 
    char *graphSitePath = "/usr/Operator11/graph_site1.sit";

    // создаем граф------------------------ 
    TASKPARMEX  parm;//параметры диалога 
    memset(&parm, 0, sizeof(TASKPARMEX)); 

    HSITE graphSite = onCreateNetDlgEx(hMap, &parm, graphSitePath, rscPath, 1); 

    mapDeleteSelectContext(hSelect); 

  mapCloseData(hMap);

  return 1;
}
 

Данный код был проверен с версиями ядра 11.06.1 и 11.10.3

Смысл был проверить работу onCreateNetDlgEx в режиме без диалога, т.е : onCreateNetDlgEx(hMap, &parm, graphSitePath, rscPath, 0);
При использовании версии 11.06.1 - работает..
При использовании версии 11.10.3 программа вылетает на onCreateNetDlgEx. Если вызвать диалог, то видим, что имена файлов graphSitePath, rscPath никак не используются (в отличии от 11.06.1). Функция сама создаёт Graph/grap_podolsk.sit.
Как правильно работать с функцией onCreateNetDlgEx без диалогов в версии 11.10.3?
 
Запрос понятен. Будем разбираться. Обязательно оповестим о результатах проверки.
 
Устранили ошибку при использовании функции без вызова диалога. Пожалуйста, скачайте и  проверьте на новой версии. Ссылка для скачивания - http://gisinfo.ru/download_linux?id=56
Страницы: 1 2 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности