Ignore:
Timestamp:
Sep 18, 2014 2:01:56 PM (6 years ago)
Author:
ldelgass
Message:

Add resources directory command line option, preliminary testing of new map
coords syntax

File:
1 edited

Legend:

Unmodified
Added
Removed
  • geovis/trunk/RendererCmd.cpp

    r4632 r4635  
    1313#include <string>
    1414#include <sstream>
     15#include <limits>
    1516#include <vector>
    1617#include <unistd.h>
     
    766767    return (*proc) (clientData, interp, objc, objv);
    767768}
    768 
     769#if 1
     770static int
     771MapCoordsOp(ClientData clientData, Tcl_Interp *interp, int objc,
     772            Tcl_Obj *const *objv)
     773{
     774    int tokenLength;
     775    const char *token = Tcl_GetStringFromObj(objv[2], &tokenLength);
     776    int numCoords;
     777    Tcl_Obj **coords;
     778    if (Tcl_ListObjGetElements(interp, objv[3], &numCoords, &coords) != TCL_OK) {
     779        return TCL_ERROR;
     780    }
     781    if (numCoords == 0) {
     782        Tcl_AppendResult(interp, "no x,y coordinates in list", (char *)NULL);
     783        return TCL_ERROR;
     784    }
     785    if (numCoords & 1) {
     786        Tcl_AppendResult(interp, "odd number of x, y coordinates in list",
     787                         (char *)NULL);
     788        return TCL_ERROR;
     789    }
     790    const osgEarth::SpatialReference *outSRS = NULL;
     791    if (objc > 4) {
     792        std::string srsInit;
     793        std::string verticalDatum;
     794        srsInit = Tcl_GetString(objv[4]);
     795        if (objc > 5) {
     796            verticalDatum = Tcl_GetString(objv[5]);
     797        }
     798        outSRS = osgEarth::SpatialReference::get(srsInit, verticalDatum);
     799        if (outSRS == NULL) {
     800            Tcl_AppendResult(interp, "bad SRS \"", srsInit.c_str(), "\"",
     801                             (char*)NULL);
     802            return TCL_ERROR;
     803        }
     804    }
     805    Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL);
     806    std::vector<osg::Vec3d> coordVec;
     807    for (int i = 0; i < numCoords; i += 2) {
     808        int x, y;
     809        if ((Tcl_GetIntFromObj(interp, coords[i], &x) != TCL_OK) ||
     810            (Tcl_GetIntFromObj(interp, coords[i+1], &y) != TCL_OK)) {
     811            return TCL_ERROR;
     812        }
     813        osgEarth::GeoPoint mapPoint;
     814        if (g_renderer->mapMouseCoords(x, y, mapPoint)) {
     815            // altmode absolute
     816            coordVec.push_back(osg::Vec3d(mapPoint.x(), mapPoint.y(), mapPoint.z()));
     817#if 0
     818            if (outSRS != NULL) {
     819                mapPoint = mapPoint.transform(outSRS);
     820                if (!mapPoint.isValid()) {
     821                    Tcl_DecrRefCount(listObjPtr);
     822                    Tcl_AppendResult(interp, "Could not transform map point to requested SRS", (char*)NULL);
     823                    return TCL_ERROR;
     824                }
     825            }
     826            Tcl_Obj *objPtr = Tcl_NewDoubleObj(mapPoint.x());
     827            Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     828            objPtr = Tcl_NewDoubleObj(mapPoint.y());
     829            Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     830            objPtr = Tcl_NewDoubleObj(mapPoint.z());
     831            Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     832#endif
     833        } else {
     834            coordVec.push_back(osg::Vec3d(std::numeric_limits<double>::quiet_NaN(),
     835                                          std::numeric_limits<double>::quiet_NaN(),
     836                                          std::numeric_limits<double>::quiet_NaN()));
     837#if 0
     838            Tcl_Obj *objPtr = Tcl_NewStringObj("NaN", 3);
     839            Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     840            Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     841            Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     842#endif
     843        }
     844    }
     845    if (outSRS != NULL) {
     846        g_renderer->getMapSRS()->transform(coordVec, outSRS);
     847    } else {
     848        outSRS = g_renderer->getMapSRS();
     849    }
     850    for (std::vector<osg::Vec3d>::iterator itr = coordVec.begin();
     851         itr != coordVec.end(); ++itr) {
     852        Tcl_Obj *objPtr = Tcl_NewDoubleObj(itr->x());
     853        Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     854        objPtr = Tcl_NewDoubleObj(itr->y());
     855        Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     856        objPtr = Tcl_NewDoubleObj(itr->z());
     857        Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     858    }
     859    // send coords to client
     860    int listLength;
     861    const char *string = Tcl_GetStringFromObj(listObjPtr, &listLength);
     862    size_t length = listLength + tokenLength +
     863        outSRS->getHorizInitString().length() +
     864        outSRS->getVertInitString().length() +
     865        25;
     866    char *mesg = new char[length];
     867    length = snprintf(mesg, length, "nv>map coords %s {%s} {%s} {%s}\n", token, string,
     868                      outSRS->getHorizInitString().c_str(),
     869                      outSRS->getVertInitString().c_str());
     870    Tcl_DecrRefCount(listObjPtr);
     871    queueResponse(mesg, length, Response::VOLATILE);
     872    delete [] mesg;
     873    return TCL_OK;
     874}
     875#else
    769876static int
    770877MapCoordsOp(ClientData clientData, Tcl_Interp *interp, int objc,
     
    821928    return TCL_OK;
    822929}
    823 
     930#endif
    824931static int
    825932MapGraticuleOp(ClientData clientData, Tcl_Interp *interp, int objc,
     
    16361743
    16371744static CmdSpec mapOps[] = {
    1638     {"coords",   1, MapCoordsOp,          5, 7, "token x y ?srs? ?verticalDatum?"},
     1745    {"coords",   1, MapCoordsOp,          4, 6, "token coords ?srs? ?verticalDatum?"},
    16391746    {"grid",     1, MapGraticuleOp,       3, 4, "bool ?type?"},
    16401747    {"layer",    2, MapLayerOp,           3, 0, "op ?params...?"},
Note: See TracChangeset for help on using the changeset viewer.