コード例 #1
0
Stage *PipelineReaderXML::parseElement_Writer(const ptree& tree)
{
    Options options;
    StageParserContext context;
    std::string filename;

    map_t attrs;
    collect_attributes(attrs, tree);

    std::vector<Stage *> prevStages;
    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
    {
        const std::string& name = iter->first;
        const ptree& subtree = iter->second;

        if (name == "<xmlattr>")
        {
            // already parsed -- ignore it
        }
        else if (name == "Option")
        {
            Option option = parseElement_Option(subtree);
            if (option.getName() == "filename")
                filename = option.getValue();
            options.add(option);
        }
        else if (name == "Metadata")
        {
            // ignored
        }
        else if (name == "Filter" || name == "Reader")
        {
            context.addStage();
            prevStages.push_back(parseElement_anystage(name, subtree));
        }
        else
        {
            context.addUnknown(name);
        }
    }

    std::string type;
    if (attrs.count("type"))
    {
        type = attrs["type"];
        context.addType();
    }

    context.validate();
    Stage& writer = m_manager.makeWriter(filename, type);
    for (auto sp : prevStages)
        writer.setInput(*sp);
    writer.removeOptions(options);
    writer.addOptions(options);
    return &writer;
}
コード例 #2
0
Stage *PipelineReaderXML::parseElement_Reader(const ptree& tree)
{
    Options options;
    StageParserContext context;
    std::string filename;
    context.setCardinality(StageParserContext::None);

    map_t attrs;
    collect_attributes(attrs, tree);

    auto iter = tree.begin();
    while (iter != tree.end())
    {
        const std::string& name = iter->first;
        const ptree& subtree = iter->second;

        if (name == "<xmlattr>")
        {
            // already parsed
        }
        else if (name == "Option")
        {
            Option option = parseElement_Option(subtree);
            if (option.getName() == "filename")
                filename = option.getValue();
            options.add(option);
        }
        else if (name == "Metadata")
        {
            // ignored for now
        }
        else
        {
            context.addUnknown(name);
        }
        ++iter;
    }

    std::string type;
    if (attrs.count("type"))
    {
        type = attrs["type"];
    }

    Stage& reader = m_manager.makeReader(filename, type);
    reader.removeOptions(options);
    reader.addOptions(options);

    context.addType();
    context.validate();
    return &reader;
}
コード例 #3
0
ファイル: PipelineReader.cpp プロジェクト: rskelly/PDAL
Writer* PipelineReader::parseElement_Writer(const ptree& tree)
{
    Options options(m_baseOptions);
    Stage* prevStage = NULL;
    StageParserContext context;

    map_t attrs;
    collect_attributes(attrs, tree);

    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
    {
        const std::string& name = iter->first;
        const ptree& subtree = iter->second;

        if (name == "<xmlattr>")
        {
            // already parsed -- ignore it
        }
        else if (name == "Option")
        {
            Option option = parseElement_Option(subtree);
            options.add(option);
        }
        else if (name == "Metadata")
        {
            // ignored
        }
        else if (name == "Filter" || name == "Reader")
        {
            context.addStage();
            prevStage = parseElement_anystage(name, subtree);
        }
        else
        {
            context.addUnknown(name);
        }
    }

    std::string type;
    if (attrs.count("type"))
    {
        type = attrs["type"];
        context.addType();
    }

    context.validate();
    Writer* writer = m_manager.addWriter(type, prevStage);
    writer->setOptions(options);
    return writer;
}
コード例 #4
0
ファイル: PipelineReader.cpp プロジェクト: rskelly/PDAL
Filter* PipelineReader::parseElement_Filter(const ptree& tree)
{
    Options options(m_baseOptions);
//    Stage* prevStage = NULL;

    StageParserContext context;

    map_t attrs;
    collect_attributes(attrs, tree);

    std::vector<Stage *> prevStages;
    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
    {
        const std::string& name = iter->first;
        const ptree& subtree = iter->second;

        if (name == "<xmlattr>")
        {
            // already parsed
        }
        else if (name == "Option")
        {
            Option option = parseElement_Option(subtree);
            options.add(option);
        }
        else if (name == "Metadata")
        {
            // ignored
        }
        else if (name == "Filter" || name == "Reader")
        {
            context.addStage();
            prevStages.push_back(parseElement_anystage(name, subtree));
        }
        else
        {
            context.addUnknown(name);
        }
    }

    std::string type;
    if (attrs.count("type"))
    {
        type = attrs["type"];
        context.addType();
    }

    Filter* ptr = m_manager.addFilter(type, prevStages);
    ptr->setOptions(options);
    if (dynamic_cast<MultiFilter *>(ptr))
        context.setCardinality(StageParserContext::Many);
    context.validate();
    return ptr;
}
コード例 #5
0
ファイル: PipelineReader.cpp プロジェクト: rskelly/PDAL
Reader* PipelineReader::parseElement_Reader(const ptree& tree)
{
    Options options(m_baseOptions);

    StageParserContext context;
    context.setCardinality(StageParserContext::None);

    map_t attrs;
    collect_attributes(attrs, tree);

    auto iter = tree.begin();
    while (iter != tree.end())
    {
        const std::string& name = iter->first;
        const ptree& subtree = iter->second;

        if (name == "<xmlattr>")
        {
            // already parsed
        }
        else if (name == "Option")
        {
            Option option = parseElement_Option(subtree);
            options.add(option);
        }
        else if (name == "Metadata")
        {
            // ignored for now
        }
        else
        {
            context.addUnknown(name);
        }
        ++iter;
    }

    std::string type;
    if (attrs.count("type"))
    {
        type = attrs["type"];
        context.addType();
    }

    // If we aren't provided a type, try to infer the type from the filename
    // #278
    if (context.getNumTypes() == 0)
    {
        try
        {
            const std::string filename = options.getValueOrThrow<std::string>("filename");
            type = StageFactory::inferReaderDriver(filename);
            if (!type.empty())
            {
                context.addType();
            }
        }
        catch (option_not_found)
        {} // noop
    }

    context.validate();

    Reader* reader =m_manager.addReader(type);
    reader->setOptions(options);
    return reader;
}