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; }