Использую Gtk12 Вроде код правильный, вершины графа на карте реально существуют и находятся, Оператор 11 по этому же графу для этих вершин кратчайший путь находит. А программно не получается, MapNet.GetShotWayDlg возвращает 0. Причем в отладке видно, что 0 возвращает функция fDll_onSeekPathDlgGraph внутри метода компонента.hSiteNet установлен правильно, поскольку на этом слое другие операции нормально совершаются. Что самое интересно, в Gtk10 другой наш рабочий пример нормально искал, а тот же пример в 12 уже искать отказывается.
Код
procedure TMForm.ToolButton22Click(Sender: TObject);
var
Obj1,Obj2,res1,res2:HOBJ;
code:integer;
begin
//hSiteNet установлен в FormCreate
MapNet.NetSitName:=ExtractFileDir(MapFile)+'\'+NetSite;
code:=MapNet.OpenGraph(vMap.MapHandle,hSiteNet);
if code=0 then exit;
Obj1:=mapCreateSiteObject(vMap.MapHandle,hSiteNet);
Obj2:=mapCreateSiteObject(vMap.MapHandle,hSiteNet);
if (Obj1>0) and (Obj2>0) then begin
res1:=mapSeekSiteObject(vMap.MapHandle,hSiteNet,Obj1,1750);
res2:=mapSeekSiteObject(vMap.MapHandle,hSiteNet,Obj2,1796);
if (res1>0) and (res2>0) then
code:=MapNet.GetShotWayDlg(Obj1,Obj2);
end;
И попутный вопрос, в netapi.inc написано, что в нем описаны устаревшие функции, а новые в GRAPHAPI.H, который ссылается на MAPACCES.DLL. Эту dll-ку я нашел в каталоге Оператора, это она? Нет ли готового pas-файла?
Диалог построения маршрута не открывается потому, что в классификаторе графа не найдена семантика "Тип (класс) дороги" - код 1052. В следующей версии будем выдавать предупреждение.
Все равно не показывает диалог с вашим доработанным классификатором. Но хоть путь искать начал с помощью MapNet.GetShotWay. Попробовал двумя способами:
Код
procedure TMForm.ToolButton22Click(Sender: TObject);
var
PathObj,Obj1,Obj2,res1,res2:HOBJ;
code:integer;
p1,p2:TDOUBLEPOINT;
Select:HSELECT;
pc:GTKPChar;
begin
Obj1:=mapCreateSiteObject(vMap.MapHandle,hSiteNet);
Obj2:=mapCreateSiteObject(vMap.MapHandle,hSiteNet);
if (Obj1>0) and (Obj2>0) then begin
res1:=mapSeekSiteObject(vMap.MapHandle,hSiteNet,Obj1,1750);
res2:=mapSeekSiteObject(vMap.MapHandle,hSiteNet,Obj2,1796);
if (res1>0) and (res2>0) then begin
//**************** Способ №1 *********************
//Пустой объект - маршрут
PathObj:=mapCreateSiteObject(vMap.MapHandle,hSiteNet);
mapRegisterObject(PathObj,5559,OL_LINE);
//найти кратчайший путь и создать объект маршрута
code:=MapNet.GetShotWay(Obj1,Obj2);
code:=MapNet.GetShotWayAndCreateObject(PathObj,Obj1,Obj2);//*** Почему-то без вызова MapNet.GetShotWay не ракботает !!!****
if code>0 then begin
mapCommit(PathObj);
end;
mapFreeObject(PathObj);
//**************** Способ №2 *********************
//Пустой объект - маршрут
PathObj:=mapCreateSiteObject(vMap.MapHandle,hSiteNet);
mapRegisterObject(PathObj,5559,OL_LINE);
//найти кратчайший путь, исключая дуги с семантикой 500020=1 и создать объект маршрута
mapGetObjectCenter(vMap.MapHandle,Obj1,p1.X,p1.Y);
mapGetObjectCenter(vMap.MapHandle,Obj2,p2.X,p2.Y);
Select := mapCreateSiteSelectContext(vMap.MapHandle, hSiteNet);
pc:='0';
mapSelectSemanticAppend(Select,4,50020,pc);//>0
mapSetSiteSeekSelect(vMap.MapHandle,hSiteNet,Select);
code:=MapNet.GetShotWayByPointExAndCreateObject(PathObj,p1,p2,Select);
if code=-1 then begin
mapCommit(PathObj);
end;
mapDeleteSelectContext(Select);
mapFreeObject(PathObj);
vMap.Repaint;
end;
end;
mapFreeObject(Obj1);
mapFreeObject(Obj2);
end;
Способ №1 работает, хотя странно, что GetShotWayAndCreateObject без вызова GetShotWay ничего не создает. Но он не подходит, поскольку надо исключать дуги с семантикой 50020 со значеним 1
Способ №2 не работает. Может Select формирую не так?
У Вас неправильно установлен Select для функции GetShotWayByPointExAndCreateObject. Нужно установить в Select объекты для исключения из поиска мининимального пути. Например: // Установить в select линейные объекты (дуги) с семантикой 50020 и значениями равными 1 mapSelectLocal(select, -1, 0); mapSelectLocal(select, LOCAL_LINE, 1); mapSelectSemanticAppendUn(select, CMEQUAL, 50020, L"1");
перешел на GTK13. Заработало. Но есть несколько замечаний: 1) GetShotWayByPointExAndCreateObject всегда возвращает 0, есть маршрут, нету маршрута - все равно. 2) При построении кратчайшего маршрута с диалогом появляется ошибка "atan2 DOMAIN error", но маршрут строится 3) при применении mapSetSemanticValue, к семантике с кодом 9 (собственное название) если строка начинается с цифры или точки, семантика пишется как число, например "123 рбр" запишется как 123, ".23 объект" запишется как 0.23. Вынужден начинать названия с подчеркивания, иначе ерунда получается. в 12 такого не было. 4) При открытии карты выдаются ошибки, хотя карта грузится и работает: