Во вложении данные, на которых тестируется проблема.
11 версия, с ней работает как ожидается:
Линковка с gisacces.lib.
Версия, судя по подписи gisacces.dll, 11.13.12.23
12 версия, с ней другое поведение:
Линковка с gisuacces.lib (у gisuacces.dll подпись 12.5.2.16) и libgislink12x32.lib
Приведу фрагмент тестового кода добавления нового объекта (с перемещением объектов те же проблемы):
Код |
---|
//...
std::vector<CIC_Point3DD>& vPoints = sxfLayer.GetCurrentSelectionVector();
/********************************************************
Метод для создания произвольного объекта на пользовательской карте*
********************************************************/
auto CreateObject = [&]()->bool
{
//0.Ищем куда мы попали
CIC_Rect3DD siteRect, polyRect;
CSXFLayer::CSITE* targetSite = NULL;
auto minmaxX = std::minmax_element(vPoints.begin(), vPoints.end(), [](CIC_Point3DD & pt, CIC_Point3DD & pt2){ return pt.x < pt2.x; });
auto minmaxY = std::minmax_element(vPoints.begin(), vPoints.end(), [](CIC_Point3DD & pt, CIC_Point3DD & pt2){ return pt.y < pt2.y; });
polyRect.SetRect(minmaxX.first->x, minmaxY.second->y, minmaxX.second->x, minmaxY.first->y);
polyRect.NormalizeGeoRect();
//Работаем только с sits у которых классификатор "Errors"
std::vector<CSXFLayer::CSITE*> vErrorsSites = GetErrorsSites(&sxfLayer);
auto sitesIter = vErrorsSites.begin();
auto alternativeSite = vErrorsSites.end();
for(; sitesIter != vErrorsSites.end(); ++sitesIter)
{
(*sitesIter)->GetBoundRect(siteRect);
if(siteRect.RectInRectGeo(&polyRect))
break;
if(siteRect.IntersectGeoRect(&siteRect,&polyRect))
{
if(alternativeSite == vErrorsSites.end())
alternativeSite = sitesIter;
else
{
CIC_Rect3DD currentAlternativeRect;
(*alternativeSite)->GetBoundRect(currentAlternativeRect);
currentAlternativeRect.IntersectGeoRect(¤tAlternativeRect, &polyRect);
if(siteRect.GetSquare() > currentAlternativeRect.GetSquare())
alternativeSite = sitesIter;
}
}
}
HMAP targetHmap;
HSITE targetHsite;
if(sitesIter != vErrorsSites.end())
{
targetHmap = (*sitesIter)->GetMap();
targetHsite = (*sitesIter)->GetSite();
}
else if(alternativeSite != vErrorsSites.end())
{
targetHmap = (*alternativeSite)->GetMap();
targetHsite = (*alternativeSite)->GetSite();
}
else
{
ASSERT(0);
return false;
}
//1.Cоздать пустой объект пользовательской карты
HOBJ hNewObj = mapCreateSiteObject(targetHmap, targetHsite);
if(hNewObj)
{
//2.Добавить метрику
for(size_t i = 0; i < vPoints.size(); ++i)
mapAppendPointPlane3D(hNewObj, vPoints.at(i).y, vPoints.at(i).x, vPoints.at(i).z);
//3.Сформировать описание нового объекта
mapRegisterObject(hNewObj, pObjInfo->m_rscObjectInfo.Code, pObjInfo->m_rscObjectInfo.Local);
//Добавить текст подписи если это соответствующий тип
if(pObjInfo->m_rscObjectInfo.Local == LOCAL_TITLE)
{
#ifdef UNICODE
mapPutTextUnicode(hNewObj, pObjInfo->m_sTitleLabel.GetString(), 0);
#else
mapPutText(hNewObj, pObjInfo->m_sTitleLabel.GetString(), 0);
#endif
//Если в метрике одна точка - посчитать вторую
if(vPoints.size() == 1)
{
double dLenghtInMicrons = mapGetTextLengthMkm(hNewObj, 0);
double dMapScale = mapGetMapScale(targetHmap) / 1000000.;
double dLength = dLenghtInMicrons * dMapScale;
CIC_Point3DD secondP(vPoints.at(0));
secondP.x += dLength;//TODO(optional): подумать о работе с углами
mapAppendPointPlane3D(hNewObj, secondP.y, secondP.x, secondP.z);
}
}
//4.Добавить семантики
std::vector<CMapObjectData::SEM_VARIANT> vSemantics = pObjInfo->GetSemantics();
for_each(vSemantics.begin(), vSemantics.end(), [&] (const CMapObjectData::SEM_VARIANT& semantic)
{
switch(semantic.m_storedType)
{
case CMapObjectData::SEM_VARIANT::SEM_TYPE_DOUBLE:
mapAppendSemanticDouble(hNewObj, semantic.m_iSemCode, semantic.m_value.doubleValue);
break;
case CMapObjectData::SEM_VARIANT::SEM_TYPE_LONG:
mapAppendSemanticLong(hNewObj, semantic.m_iSemCode, semantic.m_value.longValue);
break;
case CMapObjectData::SEM_VARIANT::SEM_TYPE_STR:
#ifdef UNICODE
mapAppendSemanticUnicode(hNewObj, semantic.m_iSemCode, semantic.m_value.strValue, _tcslen(semantic.m_value.strValue));
#else
mapAppendSemantic(hNewObj, semantic.m_iSemCode, semantic.m_value.strValue, _tcslen(semantic.m_value.strValue));
#endif
break;
default: ASSERT(0);
}
});
//5.Сommit в карту
mapCommitWithPlace(hNewObj);
//6.Освободить память
mapFreeObject(hNewObj);
}
else
return false;
return true;
};
|