Changeset 5882


Ignore:
Timestamp:
Sep 23, 2015 2:34:40 PM (9 years ago)
Author:
ldelgass
Message:

Initial support for generic feature layer with styles, scripts and selectors.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • geovis/trunk/RendererCmd.cpp

    r5877 r5882  
    2626#include <osgEarth/Registry>
    2727#include <osgEarth/Units>
     28#include <osgEarth/Config>
    2829#include <osgEarthFeatures/FeatureModelSource>
    2930#include <osgEarthSymbology/Color>
     
    14381439            return TCL_ERROR;
    14391440        }
     1441    } else if (type[0] == 'f' && strcmp(type, "feature") == 0) {
     1442        // Generic feature geometry layer
     1443        char *driver = Tcl_GetString(objv[5]);
     1444        char *format = Tcl_GetString(objv[6]);
     1445        if (format && strlen(format) > 0 &&
     1446            strcmp(format, "json") != 0 && strcmp(format, "gml") != 0) {
     1447            Tcl_AppendResult(interp, "unknown format \"", format,
     1448                             "\": should be 'json' or 'gml'", (char*)NULL);
     1449            return TCL_ERROR;
     1450        }
     1451        char *typeName = Tcl_GetString(objv[7]);
     1452        char *urlIn = Tcl_GetString(objv[8]);
     1453        std::string url = g_renderer->getCanonicalPath(std::string(urlIn));
     1454        if (url.empty()) {
     1455            Tcl_AppendResult(interp, "file not found: \"",
     1456                             urlIn, "\"", (char*)NULL);
     1457            return TCL_ERROR;
     1458        }
     1459        if (GetBooleanFromObj(interp, objv[9], &cache) != TCL_OK) {
     1460            return TCL_ERROR;
     1461        }
     1462
     1463        bool lighting = true;
     1464        osgEarth::Drivers::FeatureGeomModelOptions geomOpts;
     1465        osgEarth::Config styleConf("style", Tcl_GetString(objv[10]));
     1466        styleConf.add("type", "text/css");
     1467        INFO("style CSS: %s", styleConf.value().c_str());
     1468        osgEarth::Config stylesheetConf;
     1469        stylesheetConf.add(styleConf);
     1470        geomOpts.styles() = new osgEarth::Symbology::StyleSheet(stylesheetConf);
     1471
     1472        if (objc > 11) {
     1473            std::string scripts(Tcl_GetString(objv[11]));
     1474            if (!scripts.empty()) {
     1475                INFO("script: %s", scripts.c_str());
     1476                osg::ref_ptr<osgEarth::Symbology::StyleSheet::ScriptDef> scriptDef =
     1477                    new osgEarth::Symbology::StyleSheet::ScriptDef(scripts);
     1478                geomOpts.styles()->setScript(scriptDef.get());
     1479            } else {
     1480                INFO("no script");
     1481            }
     1482        }
     1483        if (objc > 12) {
     1484            int numSelectors;
     1485            Tcl_Obj **selectors;
     1486            if (Tcl_ListObjGetElements(interp, objv[12], &numSelectors, &selectors) != TCL_OK) {
     1487                return TCL_ERROR;
     1488            }
     1489            for (int i = 0; i < numSelectors; i++) {
     1490                int numFields;
     1491                Tcl_Obj **fields;
     1492                if (Tcl_ListObjGetElements(interp, selectors[i], &numFields, &fields) != TCL_OK ||
     1493                    numFields % 2 != 0) {
     1494                    return TCL_ERROR;
     1495                }
     1496                std::map<std::string, std::string> fieldMap;
     1497                std::map<std::string, std::string>::iterator itr;
     1498                for (int f = 0; f < numFields; f+=2) {
     1499                    char *name = Tcl_GetString(fields[f]);
     1500                    char *value = Tcl_GetString(fields[f+1]);
     1501                    fieldMap[name] = value;
     1502                    INFO("selector[%s] = %s", name, value);
     1503                }
     1504                osgEarth::Symbology::StyleSelector ss;
     1505                itr = fieldMap.find("name");
     1506                if (itr != fieldMap.end()) {
     1507                    ss.name() = itr->second;
     1508                }
     1509                itr = fieldMap.find("style");
     1510                if (itr != fieldMap.end()) {
     1511                    ss.styleName() = itr->second;
     1512                }
     1513                itr = fieldMap.find("styleExpression");
     1514                if (itr != fieldMap.end()) {
     1515                    INFO("selector: %s", itr->second.c_str());
     1516                    ss.styleExpression() = osgEarth::Symbology::StringExpression(itr->second);
     1517                }
     1518                itr = fieldMap.find("query");
     1519                if (itr != fieldMap.end()) {
     1520                    osgEarth::Symbology::Query query;
     1521                    query.expression() = itr->second;
     1522                    itr = fieldMap.find("queryOrderBy");
     1523                    if (itr != fieldMap.end()) {
     1524                        query.orderby() = itr->second;
     1525                    }
     1526                    itr = fieldMap.find("queryBounds");
     1527                    if (itr !=  fieldMap.end()) {
     1528                        double xmin, ymin, xmax, ymax;
     1529                        if (sscanf(itr->second.c_str(), "%lf %lf %lf %lf", &xmin, &ymin, &xmax, &ymax) != 4) {
     1530                            return TCL_ERROR;
     1531                        }
     1532                        INFO("query bounds: %g %g %g %g", xmin, ymin, xmax, ymax);
     1533                        query.bounds() = osgEarth::Bounds(xmin, ymin, xmax, ymax);
     1534                    }
     1535                    ss.query() = query;
     1536                }
     1537                geomOpts.styles()->selectors().push_back(ss);
     1538            }
     1539        }
     1540        geomOpts.enableLighting() = lighting;
     1541        geomOpts.minRange() = 0.f;
     1542        geomOpts.maxRange() = FLT_MAX;
     1543        if (objc > 13) {
     1544            float min, max;
     1545            if (GetFloatFromObj(interp, objv[13], &min) != TCL_OK ||
     1546                GetFloatFromObj(interp, objv[14], &max) != TCL_OK) {
     1547                return TCL_ERROR;
     1548            }
     1549            geomOpts.minRange() = min;
     1550            geomOpts.maxRange() = max;
     1551        }
     1552        if (driver[0] == 'o' && strcmp(driver, "ogr") == 0) {
     1553            osgEarth::Drivers::OGRFeatureOptions opts;
     1554            if (osgDB::getLowerCaseFileExtension(url) == "csv") {
     1555                url = loadCSVLayer(url.c_str());
     1556            }
     1557            opts.url() = url;
     1558            geomOpts.featureOptions() = opts;
     1559        } else if (driver[0] == 't' && strcmp(driver, "tfs") == 0) {
     1560            osgEarth::Drivers::TFSFeatureOptions opts;
     1561            opts.url() = url;
     1562            opts.format() = format;
     1563            geomOpts.featureOptions() = opts;
     1564        } else if (driver[0] == 'w' && strcmp(driver, "wfs") == 0) {
     1565            osgEarth::Drivers::WFSFeatureOptions opts;
     1566            opts.url() = url;
     1567            opts.outputFormat() = format;
     1568            opts.typeName() = typeName;
     1569            geomOpts.featureOptions() = opts;
     1570        } else {
     1571            Tcl_AppendResult(interp, "unknown feature driver \"", driver,
     1572                             "\": should be 'ogr', 'tfs', or 'wfs'", (char*)NULL);
     1573            return TCL_ERROR;
     1574        }
     1575        g_renderer->addModelLayer(name, geomOpts, cache, lighting, visible);
    14401576    } else if (type[0] == 'i' && strcmp(type, "icon") == 0) {
    14411577        char *driver = Tcl_GetString(objv[5]);
     
    14971633        alt->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_DRAPE;
    14981634        //alt->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_GPU;
     1635        //alt->verticalOffset() = osgEarth::Symbology::NumericExpression();
     1636        //alt->verticalScale() = osgEarth::Symbology::NumericExpression();
    14991637#endif
    15001638#ifdef USE_DEPTH_OFFSET
     
    15931731        alt->clamping() = clamping;
    15941732        alt->technique() = technique;
     1733        //alt->verticalOffset() = osgEarth::Symbology::NumericExpression();
     1734        //alt->verticalScale() = osgEarth::Symbology::NumericExpression();
    15951735
    15961736#if 1 || defined(USE_DEPTH_OFFSET)
     
    17101850        alt->clamping() = clamping;
    17111851        alt->technique() = technique;
     1852        //alt->verticalOffset() = osgEarth::Symbology::NumericExpression();
     1853        //alt->verticalScale() = osgEarth::Symbology::NumericExpression();
    17121854
    17131855#if 1 || defined(USE_DEPTH_OFFSET)
     
    18341976        alt->clamping() = clamping;
    18351977        alt->technique() = technique;
     1978        //alt->clampingResolution() = 1.0f;
     1979        //alt->binding() = osgEarth::Symbology::AltitudeSymbol::BINDING_VERTEX; //BINDING_CENTROID
     1980        //alt->verticalOffset() = osgEarth::Symbology::NumericExpression();
     1981        //alt->verticalScale() = osgEarth::Symbology::NumericExpression();
    18361982
    18371983#if 1 || defined(USE_DEPTH_OFFSET)
     
    31633309    Tcl_MakeSafe(interp);
    31643310
    3165     Tcl_CreateObjCommand(interp, "camera",         CameraCmd,         clientData, NULL);
    3166     Tcl_CreateObjCommand(interp, "clientinfo",     ClientInfoCmd,    clientData, NULL);
    3167     Tcl_CreateObjCommand(interp, "colormap",       ColorMapCmd,       clientData, NULL);
    3168     Tcl_CreateObjCommand(interp, "file",           FileCmd,           clientData, NULL);
    3169     Tcl_CreateObjCommand(interp, "imgflush",       ImageFlushCmd,    clientData, NULL);
    3170     Tcl_CreateObjCommand(interp, "key",            KeyCmd,            clientData, NULL);
    3171     Tcl_CreateObjCommand(interp, "legend",         LegendCmd,         clientData, NULL);
    3172     Tcl_CreateObjCommand(interp, "map",            MapCmd,            clientData, NULL);
    3173     Tcl_CreateObjCommand(interp, "mouse",          MouseCmd,          clientData, NULL);
    3174     Tcl_CreateObjCommand(interp, "renderer",       RendererCmd,       clientData, NULL);
    3175     Tcl_CreateObjCommand(interp, "screen",         ScreenCmd,         clientData, NULL);
     3311    Tcl_CreateObjCommand(interp, "camera",     CameraCmd,     clientData, NULL);
     3312    Tcl_CreateObjCommand(interp, "clientinfo", ClientInfoCmd, clientData, NULL);
     3313    Tcl_CreateObjCommand(interp, "colormap",   ColorMapCmd,   clientData, NULL);
     3314    Tcl_CreateObjCommand(interp, "file",       FileCmd,       clientData, NULL);
     3315    Tcl_CreateObjCommand(interp, "imgflush",   ImageFlushCmd, clientData, NULL);
     3316    Tcl_CreateObjCommand(interp, "key",        KeyCmd,        clientData, NULL);
     3317    Tcl_CreateObjCommand(interp, "legend",     LegendCmd,     clientData, NULL);
     3318    Tcl_CreateObjCommand(interp, "map",        MapCmd,        clientData, NULL);
     3319    Tcl_CreateObjCommand(interp, "mouse",      MouseCmd,      clientData, NULL);
     3320    Tcl_CreateObjCommand(interp, "renderer",   RendererCmd,   clientData, NULL);
     3321    Tcl_CreateObjCommand(interp, "screen",     ScreenCmd,     clientData, NULL);
    31763322}
    31773323
Note: See TracChangeset for help on using the changeset viewer.