Difference between revisions of "Example db walk tree"
m |
Asadmorgoth (talk | contribs) (Adding link for latest db_walk_tree) |
||
Line 1: | Line 1: | ||
[[category:Code examples]] | [[category:Code examples]] | ||
+ | |||
+ | <blockquote> | ||
+ | '''This example is for current stable release 7.24.X. In latest release (7.26.1) the function prototype for db_walk_tree has changed, the corresponding changes to the code are: [[Db_walk_tree|Latest db_walk_tree()]]''' | ||
+ | </blockquote> | ||
+ | |||
This is a simple example program that shows how to walk a geometry database while performing some operation on geometry as it is encountered. In this particular example, we iterate just over regions and simply count them: | This is a simple example program that shows how to walk a geometry database while performing some operation on geometry as it is encountered. In this particular example, we iterate just over regions and simply count them: | ||
− | < | + | |
+ | <source lang="c"> | ||
#include "common.h" | #include "common.h" | ||
#include "raytrace.h" | #include "raytrace.h" | ||
Line 53: | Line 59: | ||
return 0; | return 0; | ||
} | } | ||
− | </ | + | |
+ | </source> | ||
If we compile this program and run it on a sample geometry database, we get the following: | If we compile this program and run it on a sample geometry database, we get the following: | ||
− | < | + | |
+ | <source lang="bash"> | ||
$ gcc db_walk_tree_example.c -L/usr/brlcad/lib -lrt -lbu -I/usr/brlcad/include -I/usr/brlcad/include/brlcad | $ gcc db_walk_tree_example.c -L/usr/brlcad/lib -lrt -lbu -I/usr/brlcad/include -I/usr/brlcad/include/brlcad | ||
$ ./a.out db/ktank.g tank | $ ./a.out db/ktank.g tank | ||
Line 67: | Line 75: | ||
...incrementing... | ...incrementing... | ||
counter is 80 | counter is 80 | ||
− | </ | + | |
+ | </source> |
Revision as of 10:58, 1 August 2016
This example is for current stable release 7.24.X. In latest release (7.26.1) the function prototype for db_walk_tree has changed, the corresponding changes to the code are: Latest db_walk_tree()
This is a simple example program that shows how to walk a geometry database while performing some operation on geometry as it is encountered. In this particular example, we iterate just over regions and simply count them:
<source lang="c">
- include "common.h"
- include "raytrace.h"
int incr_region(struct db_tree_state *tsp, struct db_full_path *pathp, const struct rt_comb_internal *combp, genptr_t data) {
int *counter = (int*)data; bu_log("...incrementing...\n"); (*counter)++; return 0;
}
int main(int argc, char *argv[]) {
struct db_i *dbip; int counter = 0; struct db_tree_state state = rt_initial_tree_state;
if (argc < 2) { bu_exit(0, "need more, db.g obj\n"); }
dbip = db_open(argv[1], "r"); if (dbip == NULL) { bu_exit(1, "Unable to open %s\n", argv[1]); }
if (db_dirbuild(dbip) < 0) { db_close(dbip); bu_exit(1, "Unable to load %s\n", argv[1]); }
bu_log("Database title is:\n%s\n", dbip->dbi_title); bu_log("Units: %s\n", bu_units_string(dbip->dbi_local2base));
if (db_lookup(dbip, argv[2], 1) == NULL) { db_close(dbip); bu_exit(1, "Unable to find %s\n", argv[2]); }
state.ts_dbip = dbip; state.ts_resp = &rt_uniresource; rt_init_resource( &rt_uniresource, 0, NULL );
db_walk_tree(dbip, 1, (const char **)argv+2, 1, &state, incr_region, NULL, NULL, &counter);
bu_log("counter is %d\n", counter);
return 0;
}
</source>
If we compile this program and run it on a sample geometry database, we get the following:
<source lang="bash">
$ gcc db_walk_tree_example.c -L/usr/brlcad/lib -lrt -lbu -I/usr/brlcad/include -I/usr/brlcad/include/brlcad
$ ./a.out db/ktank.g tank
Database title is:
Keith's Tank
Units: in
...incrementing...
<... trimmed output ...>
...incrementing...
counter is 80
</source>