int rt_comb_export4( struct bu_external *ep, const struct rt_db_internal *ip, double UNUSED(local2mm), const struct db_i *dbip, struct resource *resp) { struct rt_comb_internal *comb; size_t node_count; size_t actual_count; struct rt_tree_array *rt_tree_array; union tree *tp; union record *rp; size_t j; char *endp; struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; RT_CK_DB_INTERNAL(ip); if (dbip) RT_CK_DBI(dbip); RT_CK_RESOURCE(resp); if (ip->idb_type != ID_COMBINATION) bu_bomb("rt_comb_export4() type not ID_COMBINATION"); comb = (struct rt_comb_internal *)ip->idb_ptr; RT_CK_COMB(comb); if (comb->tree && db_ck_v4gift_tree(comb->tree) < 0) { db_non_union_push(comb->tree, resp); if (db_ck_v4gift_tree(comb->tree) < 0) { /* Need to further modify tree */ bu_log("rt_comb_export4() Unable to V4-ify tree, aborting.\n"); rt_pr_tree(comb->tree, 0); return -1; } } /* Count # leaves in tree -- that's how many Member records needed. */ node_count = db_tree_nleaves(comb->tree); if (node_count > 0) { rt_tree_array = (struct rt_tree_array *)bu_calloc(node_count, sizeof(struct rt_tree_array), "rt_tree_array"); /* Convert tree into array form */ actual_count = db_flatten_tree(rt_tree_array, comb->tree, OP_UNION, 1, resp) - rt_tree_array; BU_ASSERT_SIZE_T(actual_count, ==, node_count); comb->tree = TREE_NULL; } else {
static int list_children(struct ged *gedp, struct directory *dp) { size_t i; struct rt_db_internal intern; struct rt_comb_internal *comb; if (!(dp->d_flags & RT_DIR_COMB)) return GED_OK; if (rt_db_get_internal(&intern, dp, gedp->ged_wdbp->dbip, (fastf_t *)NULL, &rt_uniresource) < 0) { bu_vls_printf(gedp->ged_result_str, "Database read error, aborting"); return GED_ERROR; } comb = (struct rt_comb_internal *)intern.idb_ptr; if (comb->tree) { struct bu_vls vls = BU_VLS_INIT_ZERO; size_t node_count; size_t actual_count; struct rt_tree_array *rt_tree_array; if (db_ck_v4gift_tree(comb->tree) < 0) { db_non_union_push(comb->tree, &rt_uniresource); if (db_ck_v4gift_tree(comb->tree) < 0) { bu_vls_printf(gedp->ged_result_str, "Cannot flatten tree for listing"); return GED_ERROR; } } node_count = db_tree_nleaves(comb->tree); if (node_count > 0) { rt_tree_array = (struct rt_tree_array *)bu_calloc(node_count, sizeof(struct rt_tree_array), "tree list"); actual_count = (struct rt_tree_array *)db_flatten_tree( rt_tree_array, comb->tree, OP_UNION, 1, &rt_uniresource) - rt_tree_array; BU_ASSERT_SIZE_T(actual_count, ==, node_count); comb->tree = TREE_NULL; } else {
int ged_get_comb(struct ged *gedp, int argc, const char *argv[]) { struct directory *dp; struct rt_db_internal intern; struct rt_comb_internal *comb; struct rt_tree_array *rt_tree_array; size_t i; size_t node_count; size_t actual_count; static const char *usage = "comb"; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_READ_ONLY(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); /* must be wanting help */ if (argc == 1) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_HELP; } if (argc != 2) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } dp = db_lookup(gedp->ged_wdbp->dbip, argv[1], LOOKUP_QUIET); if (dp != RT_DIR_NULL) { if (!(dp->d_flags & RT_DIR_COMB)) { bu_vls_printf(gedp->ged_result_str, "%s is not a combination, so cannot be edited this way\n", argv[1]); return GED_ERROR; } if (rt_db_get_internal(&intern, dp, gedp->ged_wdbp->dbip, (fastf_t *)NULL, &rt_uniresource) < 0) { bu_vls_printf(gedp->ged_result_str, "Database read error, aborting\n"); return GED_ERROR; } comb = (struct rt_comb_internal *)intern.idb_ptr; if (comb->tree && db_ck_v4gift_tree(comb->tree) < 0) { db_non_union_push(comb->tree, &rt_uniresource); if (db_ck_v4gift_tree(comb->tree) < 0) { bu_vls_printf(gedp->ged_result_str, "Cannot flatten tree for editing\n"); return GED_ERROR; } } node_count = db_tree_nleaves(comb->tree); if (node_count > 0) { rt_tree_array = (struct rt_tree_array *)bu_calloc(node_count, sizeof(struct rt_tree_array), "tree list"); actual_count = (struct rt_tree_array *)db_flatten_tree(rt_tree_array, comb->tree, OP_UNION, 1, &rt_uniresource) - rt_tree_array; BU_ASSERT_SIZE_T(actual_count, ==, node_count); comb->tree = TREE_NULL; } else {