Changeset 5944 for geovis


Ignore:
Timestamp:
Dec 11, 2015, 12:21:12 AM (9 years ago)
Author:
ldelgass
Message:

Add command to configure attributes to display in feature info placard.

Location:
geovis/trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • geovis/trunk/Makefile.in

    r5938 r5944  
    127127                IData.cpp \
    128128                Picker.cpp \
     129                Placard.cpp \
    129130                PPMWriter.cpp \
    130131                ReadBuffer.cpp \
     
    203204idatatest.o: IData.h
    204205md5.o: md5.h
    205 Picker.o: Picker.h Renderer.h Trace.h
     206Picker.o: Picker.h Renderer.h Trace.h Placard.h
     207Placard.o: Placard.h Trace.h
    206208PPMWriter.o: PPMWriter.h ResponseQueue.h Trace.h
    207209ReadBuffer.o: ReadBuffer.h Trace.h
    208 Renderer.o: Renderer.h Trace.h Picker.h MouseCoordsTool.h ScaleBar.h FileUtil.h Util.h
     210Renderer.o: Renderer.h Trace.h Picker.h Placard.h MouseCoordsTool.h ScaleBar.h FileUtil.h Util.h
    209211RendererCmd.o: Renderer.h ReadBuffer.h ResponseQueue.h Trace.h CmdProc.h PPMWriter.h TGAWriter.h
    210212RenderServer.o: RenderServer.h RendererCmd.h Renderer.h ReadBuffer.h ResponseQueue.h Trace.h PPMWriter.h TGAWriter.h Stats.h
  • geovis/trunk/Picker.cpp

    r5942 r5944  
    2222
    2323#include "Picker.h"
     24#include "Placard.h"
    2425#include "Renderer.h"
    2526#include "RendererCmd.h"
     
    188189    osgEarth::Features::FeatureIndex *index = osgEarth::Registry::objectIndex()->get<osgEarth::Features::FeatureIndex>(id);
    189190    osgEarth::Features::Feature *feature = index ? index->getFeature(id) : 0L;
    190     INFO("Select hit oid: %lu", id);
     191    INFO("Select hit oid: %lu at %g,%g", id, _pickPoint.x(), _pickPoint.y());
    191192    if (feature) {
    192         INFO("Hit feature ID: %lu (of %d)", feature->getFID(), index->size());
    193         const osgEarth::Features::AttributeTable &attrs = feature->getAttrs();
    194         std::ostringstream oss;
    195         for (osgEarth::Features::AttributeTable::const_iterator itr = attrs.begin(); itr != attrs.end(); ++itr) {
    196             INFO(" attr: %s", itr->first.c_str());
    197             oss << itr->first.c_str() << ": ";
    198             switch (itr->second.first) {
    199             case osgEarth::Features::ATTRTYPE_STRING:
    200                 INFO(" value: %s", itr->second.getString().c_str());
    201                 oss << itr->second.getString() << std::endl;
    202                 break;
    203             case osgEarth::Features::ATTRTYPE_INT:
    204                 INFO(" value: %d", itr->second.getInt());
    205                 oss << itr->second.getInt() << std::endl;
    206                 break;
    207             case osgEarth::Features::ATTRTYPE_DOUBLE:
    208                 INFO(" value: %g", itr->second.getDouble());
    209                 oss << itr->second.getDouble() << std::endl;
    210                 break;
    211             case osgEarth::Features::ATTRTYPE_BOOL:
    212                 INFO(" value: %s", itr->second.getBool() ? "true" : "false");
    213                 oss << (itr->second.getBool() ? "true" : "false") << std::endl;
    214                 break;
    215             default:
    216                 INFO(" value: unknown type");
     193        osgEarth::Features::FeatureSourceIndex *fsi = dynamic_cast<osgEarth::Features::FeatureSourceIndex *>(index);
     194        std::string layerName;
     195        if (fsi) {
     196            osgEarth::Features::FeatureSource *source = fsi->getFeatureSource();
     197            if (source) {
     198                layerName = source->getFeatureSourceOptions().name().get();
    217199            }
    218200        }
    219         INFO("Point: %g %g", _pickPoint.x(), _pickPoint.y());
    220         //INFO("Label: %s", oss.str().c_str());
     201        INFO("Hit feature ID: %lu (of %d) layer: %s", feature->getFID(), index->size(), layerName.c_str());
     202
    221203        osgEarth::Symbology::Style style;
    222204        osgEarth::Symbology::TextSymbol *ts = style.getOrCreateSymbol<osgEarth::Symbology::TextSymbol>();
     
    229211        //ts->encoding() = osgEarth::Symbology::TextSymbol::ENCODING_UTF8;
    230212        clearSelection();
    231         osgEarth::Annotation::LabelNode *label =
    232             new osgEarth::Annotation::LabelNode(_renderer->getMapNode(), _pickPoint, oss.str(), style);
     213
     214        const osgEarth::Features::AttributeTable &attrs = feature->getAttrs();
     215        Placard placard = _renderer->getPlacardConfig(layerName);
     216        if (placard.getNumEntries() == 0) {
     217            placard.addAllAttributes(attrs);
     218        }
     219        PlacardNode *label =
     220            new PlacardNode(_renderer->getMapNode(), _pickPoint, placard, attrs, style);
    233221        label->getOrCreateStateSet()->setRenderBinDetails(INT_MAX, "RenderBin");
    234222        _renderer->getAnnotations()->addChild(label);
     223
    235224        char mesg[256];
    236         std::string layerName;
    237         osgEarth::Features::FeatureSourceIndex *fsi = dynamic_cast<osgEarth::Features::FeatureSourceIndex *>(index);
    238         if (fsi) {
    239             osgEarth::Features::FeatureSource *source = fsi->getFeatureSource();
    240             if (source) {
    241                 layerName = source->getFeatureSourceOptions().name().get();
    242             }
    243         }
    244225        snprintf(mesg, sizeof(mesg), "nv>select feature %u %lu %d {%s}\n", id, feature->getFID(), index->size(), layerName.c_str());
    245226        size_t length = strlen(mesg);
  • geovis/trunk/Renderer.cpp

    r5942 r5944  
    15131513        }
    15141514    }
     1515}
     1516
     1517void Renderer::setPlacardConfig(const Placard& placardConf, const char *layerName)
     1518{
     1519    osgEarth::ModelLayer *layer = _map->getModelLayerByName(layerName);
     1520    if (layer == NULL) {
     1521        ERROR("Unknown layer '%s'", layerName);
     1522        return;
     1523    }
     1524    //PlacardNode *node;
     1525    //node->setConfig(placardConf);
     1526    _placardConfigs[layerName] = placardConf;
    15151527}
    15161528
  • geovis/trunk/Renderer.h

    r5942 r5944  
    5252#include "MouseCoordsTool.h"
    5353#include "ScaleBar.h"
     54#include "Placard.h"
    5455
    5556// Controls if TGA format is sent to client
     
    514515    void writeScene(const std::string& file);
    515516
     517    void setPlacardConfig(const Placard& placardConf, const char *layerName);
     518
    516519    void selectFeatures(std::vector<unsigned long>& featureIDs, const char *layerName);
    517520
     
    550553        return _placeNodes.get();
    551554    }
     555    Placard getPlacardConfig(const std::string& layerName)
     556    {
     557        Placard ret;
     558        PlacardHashmap::iterator itr = _placardConfigs.find(layerName);
     559        if (itr != _placardConfigs.end()) {
     560            ret = itr->second;
     561        }
     562        return ret;
     563    }
    552564
    553565private:
    554566    typedef std::tr1::unordered_map<ColorMapId, osg::ref_ptr<osg::TransferFunction1D> > ColorMapHashmap;
    555567    typedef std::tr1::unordered_map<ViewpointId, osgEarth::Viewpoint> ViewpointHashmap;
     568    typedef std::tr1::unordered_map<std::string, Placard> PlacardHashmap;
    556569
    557570    void initAnnotations();
     
    603616    osg::ref_ptr<osg::Group> _graticule;
    604617    osg::ref_ptr<osg::Group> _annotations;
     618    PlacardHashmap _placardConfigs;
    605619    double _anchorLat, _anchorLong;
    606620    osg::ref_ptr<osgEarth::Annotation::FeatureNode> _selectionBox;
  • geovis/trunk/RendererCmd.cpp

    r5942 r5944  
    30383038
    30393039static int
     3040PlacardConfigOp(ClientData clientData, Tcl_Interp *interp, int objc,
     3041                Tcl_Obj *const *objv)
     3042{
     3043    int namec;
     3044    Tcl_Obj **namev = NULL;
     3045    const char *layerName = Tcl_GetString(objv[3]);
     3046
     3047    if (Tcl_ListObjGetElements(interp, objv[2], &namec, &namev) != TCL_OK) {
     3048        return TCL_ERROR;
     3049    }
     3050    if (namec % 2 != 0) {
     3051        Tcl_AppendResult(interp, "invalid attribute list",
     3052                         (char *)NULL);
     3053        return TCL_ERROR;
     3054    }
     3055    Placard placardConf;
     3056    for (int i = 0; i < namec; i+=2) {
     3057        std::string name(Tcl_GetString(namev[i]));
     3058        std::string label(Tcl_GetString(namev[i+1]));
     3059        placardConf.addEntry(name, label);
     3060    }
     3061    g_renderer->setPlacardConfig(placardConf, layerName);
     3062    return TCL_OK;
     3063}
     3064
     3065static CmdSpec placardOps[] = {
     3066    {"config", 1, PlacardConfigOp, 4, 4, "attrlist layerName"},
     3067};
     3068static int nPlacardOps = NumCmdSpecs(placardOps);
     3069
     3070static int
     3071PlacardCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     3072          Tcl_Obj *const *objv)
     3073{
     3074    Tcl_ObjCmdProc *proc;
     3075
     3076    proc = GetOpFromObj(interp, nPlacardOps, placardOps,
     3077                        CMDSPEC_ARG1, objc, objv, 0);
     3078    if (proc == NULL) {
     3079        return TCL_ERROR;
     3080    }
     3081    return (*proc) (clientData, interp, objc, objv);
     3082}
     3083
     3084static int
    30403085RendererRenderOp(ClientData clientData, Tcl_Interp *interp, int objc,
    30413086                 Tcl_Obj *const *objv)
     
    32263271}
    32273272
     3273static int
     3274SelectModeOp(ClientData clientData, Tcl_Interp *interp, int objc,
     3275             Tcl_Obj *const *objv)
     3276{
     3277    //const char *modeStr = Tcl_GetString(objv[2]);
     3278    // Parse mode string
     3279    //Renderer::SelectMode mode;
     3280    //g_renderer->setSelectMode(mode);
     3281    return TCL_OK;
     3282}
     3283
    32283284static CmdSpec selectOps[] = {
    32293285    {"feature", 1, SelectFeatureOp, 4, 4, "idlist layerName"},
     3286    {"mode",    1, SelectModeOp, 3, 3, "mode"},
    32303287};
    32313288static int nSelectOps = NumCmdSpecs(selectOps);
     
    34783535    Tcl_CreateObjCommand(interp, "map",        MapCmd,        clientData, NULL);
    34793536    Tcl_CreateObjCommand(interp, "mouse",      MouseCmd,      clientData, NULL);
     3537    Tcl_CreateObjCommand(interp, "placard",    PlacardCmd,    clientData, NULL);
    34803538    Tcl_CreateObjCommand(interp, "renderer",   RendererCmd,   clientData, NULL);
    34813539    Tcl_CreateObjCommand(interp, "screen",     ScreenCmd,     clientData, NULL);
     
    34973555    Tcl_DeleteCommand(interp, "map");
    34983556    Tcl_DeleteCommand(interp, "mouse");
     3557    Tcl_DeleteCommand(interp, "placard");
    34993558    Tcl_DeleteCommand(interp, "renderer");
    35003559    Tcl_DeleteCommand(interp, "screen");
Note: See TracChangeset for help on using the changeset viewer.