Skip to content

Latest commit

 

History

History
101 lines (78 loc) · 4.13 KB

CoreInterface_Tree_Walker_Example.md

File metadata and controls

101 lines (78 loc) · 4.13 KB

category:Code examples

#include  #include 

#include <brlcad/ConstDatabase.h> #include <brlcad/Combination.h>

class CombinationsCb;

void ListTreeNode(const BRLCAD::Combination::ConstTreeNode& node,                   const BRLCAD::ConstDatabase&              database,                   CombinationsCb&                           callback);

class CombinationsCb : public BRLCAD::ConstDatabase::ObjectCallback { public:     CombinationsCb(const BRLCAD::ConstDatabase& database) : BRLCAD::ConstDatabase::ObjectCallback(),                                                             m_database(database),                                                             m_prefix() {}

    CombinationsCb(const BRLCAD::ConstDatabase& database,                    const std::string&           prefix) : BRLCAD::ConstDatabase::ObjectCallback(),                                                           m_database(database),                                                           m_prefix(prefix) {}

    void         Print(const char* name) {         std::cout << m_prefix << name << std::endl;     }

    virtual void operator()(const BRLCAD::Object& object) {         const BRLCAD::Combination* comb = dynamic_cast<const BRLCAD::Combination*>(&object);

        if (comb != 0)             ListTreeNode(comb->Tree(), m_database, CombinationsCb(m_database, m_prefix + '\t'));     }

private:     const BRLCAD::ConstDatabase& m_database;     std::string                  m_prefix; };

void ListTreeNode (     const BRLCAD::Combination::ConstTreeNode& node,     const BRLCAD::ConstDatabase&              database,     CombinationsCb&                           callback ) {     switch (node.Operation()) {         case BRLCAD::Combination::ConstTreeNode::Union:         case BRLCAD::Combination::ConstTreeNode::Intersection:         case BRLCAD::Combination::ConstTreeNode::Subtraction:         case BRLCAD::Combination::ConstTreeNode::ExclusiveOr:             ListTreeNode(node.LeftOperand(), database, callback);             ListTreeNode(node.RightOperand(), database, callback);             break;

        case BRLCAD::Combination::ConstTreeNode::Not:             ListTreeNode(node.Operand(), database, callback);             break;

        case BRLCAD::Combination::ConstTreeNode::Leaf:             callback.Print(node.Name());             database.Get(node.Name(), callback);     } }

int main (     int   argc,     char* argv[] ) {     int ret = 0;

    if (argc < 2) {         std::cout << "Usage: " << argv[0] << " " << std::endl;         ret = 1;     }     else {         BRLCAD::ConstDatabase database;

        if (database.Load(argv[1])) {             BRLCAD::ConstDatabase::TopObjectIterator it = database.FirstTopObject();             CombinationsCb                           callback(database);

            while (it.Good()) {                 std::cout << it.Name() << std::endl;                 database.Get(it.Name(), callback);                 ++it;             }         }         else             ret = 2;     }

    return ret; }