Пример (с учетом новой версии mapSelectOrSelect) - может быть собран в виде DLL/SO и запущен из меню Задачи - Запуск приложений (или добавить на пользовательскую панель) .
Открыть карту Ногинск из примеров в инсталляции ГИС Панорама и запустить задачу.
#include "mapapi.h"
// --------------------------------------------------------------
// Собственно задача
// --------------------------------------------------------------
int CallApplication(HMAP hMap, const TASKPARMEX * parm)
{
HRSC hrsc = mapGetRscIdent(hMap, hMap);
TEMPHSELECT hselect1(mapCreateSiteSelectContext(hMap, hMap));
mapSelectObject(hselect1, -1, 0);
int objectcode = mapGetRscObjectCodeByNumber(hrsc, 71111110, LOCAL_SQUARE, 1); // ЛЕСА
mapSelectObject(hselect1, objectcode, 1);
int semanticcode = 3193;
const WCHAR* value = WTEXT("wood");
mapSelectSemanticAppendExUn(hselect1, CMEQUAL, semanticcode, value, 1);
int count1 = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP); // 6 451
mapSelectSampleBySelectObjects(hselect1);
int samplecount1 = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP); // 6 451
if (count1 != samplecount1)
{
const WCHAR* text = WTEXT("count1 != samplecount1");
const WCHAR* caption = WTEXT("Проверка функции mapSelectSampleBySelectObjects");
mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
}
TEMPHSELECT hselect2(mapCreateSiteSelectContext(hMap, hMap));
mapSelectObject(hselect2, -1, 0);
objectcode = mapGetRscObjectCodeByNumber(hrsc, 31120002, LOCAL_SQUARE, 1); // ОЗЕРА
mapSelectObject(hselect2, objectcode, 1);
semanticcode = 9;
mapSelectSemanticAppendExUn(hselect2, CMANY, semanticcode, 0, 1);
int count2 = mapSeekSelectObjectCountEx(hMap, hselect2, WO_INMAP); // 223
objectcode = mapGetRscObjectCodeByNumber(hrsc, 71111110, LOCAL_SQUARE, 1); // ЛЕСА
mapSelectObject(hselect2, objectcode, 1);
count2 = mapSeekSelectObjectCountEx(hMap, hselect2, WO_INMAP); // 223 + 63 = 286
mapSelectSampleBySelectObjects(hselect2);
int samplecount2 = mapSeekSelectObjectCountEx(hMap, hselect2, WO_INMAP); // 286
if (count2 != samplecount2)
{
const WCHAR* text = WTEXT("count2 != samplecount2");
const WCHAR* caption = WTEXT("Проверка функции mapSelectSampleBySelectObjects");
mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
}
TEMPHSELECT hselect3(mapCreateSiteSelectContext(hMap, hMap));
mapSelectObject(hselect3, -1, 0);
objectcode = mapGetRscObjectCodeByNumber(hrsc, 61330000, LOCAL_LINE, 1); // ТРОПЫ
mapSelectObject(hselect3, objectcode, 1);
semanticcode = 3172;
value = WTEXT("track");
mapSelectSemanticAppendExUn(hselect3, CMEQUAL, semanticcode, value, 1);
int count3 = mapSeekSelectObjectCountEx(hMap, hselect3, WO_INMAP); // 6 326
mapSelectSampleBySelectObjects(hselect3);
int samplecount3 = mapSeekSelectObjectCountEx(hMap, hselect3, WO_INMAP); // 6 326
if (count3 != samplecount3)
{
const WCHAR* text = WTEXT("count3 != samplecount3");
const WCHAR* caption = WTEXT("Проверка функции mapSelectSampleBySelectObjects");
mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
}
mapSelectOrSelect(hselect1, hselect2); // 6 451 + 223 + 3 = 6 677 // 3 имеют семантику 9, но не имеют 3193
int check1 = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP); // 6 677
mapSelectOrSelect(hselect1, hselect3); // 6 677 + 6 326 = 13 003;
int total = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP); // 13 003
if (total != 13003)
{
const WCHAR* text = WTEXT("total != 13003");
const WCHAR* caption = WTEXT("Проверка функции mapSelectOrSelect");
mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
}
else
{
const WCHAR* text = WTEXT("total = 13003");
const WCHAR* caption = WTEXT("Проверка функции mapSelectOrSelect");
mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
}
return 1;
}
// --------------------------------------------------------------
// Точка входа в задачу
// --------------------------------------------------------------
extern "C"
{
__declspec(dllexport) long int WINAPI GetInterfaceVersion() { return 0; }
// Точка входа в задачу без интерактивных обработчиков для ГИС Панорама
__declspec(dllexport) long int WINAPI CallMapFunctionEx(HMAP hmap, const TASKPARMEX * parm)
{
if (hmap == 0) return 0;
return CallApplication(hmap, parm);
}
// Точка входа в задачу без интерактивных обработчиков для ГИС Оператор
__declspec(dllexport) long int WINAPI CallGisFunctionEx(HMAP hmap, const TASKPARMEX * parm)
{
return CallMapFunctionEx(hmap, parm);
}
}