// Add geometries from portal to STO bool addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const int& linkIndex, const int& geomIdIndex) { bool flag=true; map<int, int> geomIds; //verify if the portal has geometry (multi geometries) string geomId = string(portal->getData(geomIdIndex)); string objId = string(portal->getData(linkIndex)); int gId = atoi(geomId.c_str()); //There are no geometries in the portal. This happens when //the objects have multi geometries (ex.: obj 1 is line and obj 2 is ponit). //The portal must point to the next object. if(geomId.empty()) { do { flag = portal->fetchRow(); } while(flag && (string(portal->getData(linkIndex)) == sto.objectId())); return flag; } //The portal points to other object. This happens when //the objects have more than one geometrical representation and, at the same time, //the theme has an external table. if(objId!=sto.objectId()) { do { flag = portal->fetchRow(); objId = string(portal->getData(linkIndex)); } while(flag && ( objId != sto.objectId())); gId = atoi(portal->getData(geomIdIndex)); } //There are geometries while( flag && (objId == sto.objectId()) && (geomIds.find(gId) == geomIds.end())) { geomIds[gId] = gId; if(geomRep == TePOLYGONS) { TePolygon pol; flag = portal->fetchGeometry(pol, geomIdIndex); sto.addGeometry(pol); } else if (geomRep==TeLINES) { TeLine2D lin; flag = portal->fetchGeometry(lin, geomIdIndex); sto.addGeometry(lin); } else if (geomRep == TePOINTS) { TePoint point; flag = portal->fetchGeometry(point, geomIdIndex); sto.addGeometry(point); } else if (geomRep == TeCELLS) { TeCell cell; flag = portal->fetchGeometry(cell, geomIdIndex); sto.addGeometry(cell); } else if (geomRep == TeTEXT) { TeText text; flag = portal->fetchGeometry(text, geomIdIndex); sto.addGeometry(text); } else flag = portal->fetchRow(); if(flag) { gId = atoi(portal->getData(geomIdIndex)); objId = string(portal->getData(linkIndex)); } } return flag; }