/* restore a combination that was created during save_comb() */ static void restore_comb(struct ged *gedp, struct directory *dp, const char *oldname) { const char *av[4]; char *name; if (!gedp || !dp || !oldname) return; /* get rid of previous comb */ name = bu_strdup(dp->d_namep); av[0] = "kill"; av[1] = name; av[2] = NULL; av[3] = NULL; (void)ged_kill(gedp, 2, (const char **)av); av[0] = "mv"; av[1] = oldname; av[2] = name; (void)ged_move(gedp, 3, (const char **)av); bu_free(name, "bu_strdup'd name"); }
int ged_killall(struct ged *gedp, int argc, const char *argv[]) { int nflag; int ret; static const char *usage = "[-n] object(s)"; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_DRAWABLE(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; } /* Process the -n option */ if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'n' && argv[1][2] == '\0') { int i; nflag = 1; /* Objects that would be killed are in the first sublist */ bu_vls_printf(gedp->ged_result_str, "{"); for (i = 2; i < argc; i++) bu_vls_printf(gedp->ged_result_str, "%s ", argv[i]); bu_vls_printf(gedp->ged_result_str, "} {"); } else nflag = 0; gedp->ged_internal_call = 1; if ((ret = ged_killrefs(gedp, argc, argv)) != GED_OK) { gedp->ged_internal_call = 0; bu_vls_printf(gedp->ged_result_str, "KILL skipped because of earlier errors.\n"); return ret; } gedp->ged_internal_call = 0; if (nflag) { /* Close the sublist of objects that reference the would-be killed objects. */ bu_vls_printf(gedp->ged_result_str, "}"); return GED_OK; } /* ALL references removed...now KILL the object[s] */ /* reuse argv[] */ argv[0] = "kill"; return ged_kill(gedp, argc, argv); }
static int plot_shaded_eval( struct ged *gedp, const char *path_name, struct _ged_client_data *dgcdp) { int ret; const char *av[3]; const char *tmp_basename = "tmp_shaded_eval_obj"; char *brep_name; /* make a name for the temp brep */ av[0] = "make_name"; av[1] = tmp_basename; ged_make_name(gedp, 2, (const char **)av); brep_name = bu_vls_strdup(gedp->ged_result_str); bu_vls_trunc(gedp->ged_result_str, 0); /* create temp evaluated brep from named object */ av[0] = "brep"; av[1] = path_name; av[2] = brep_name; ret = ged_brep(gedp, 3, av); if (ret == GED_OK) { int brep_made = 0; struct db_tree_state ts; struct rt_db_internal brep_intern; struct db_full_path input_path, brep_path; RT_DB_INTERNAL_INIT(&brep_intern); db_full_path_init(&input_path); db_full_path_init(&brep_path); /* get brep internal */ ret = get_path_and_state(&ts, &brep_path, brep_name, gedp); if (ret == GED_OK) { struct directory *dp = DB_FULL_PATH_CUR_DIR(&brep_path); if (dp->d_flags & RT_DIR_COMB) { ret = rt_db_get_internal(&brep_intern, dp, ts.ts_dbip, NULL, ts.ts_resp); } else { ret = rt_db_get_internal(&brep_intern, dp, ts.ts_dbip, ts.ts_mat, ts.ts_resp); } if (ret >= 0) { brep_made = 1; } db_free_full_path(&brep_path); } /* plot brep, but use the path and state of the input object */ if (brep_made) { ret = get_path_and_state(&ts, &input_path, path_name, gedp); if (ret == GED_OK) { plot_shaded(&ts, &input_path, &brep_intern, dgcdp); rt_db_free_internal(&brep_intern); db_free_full_path(&input_path); } } /* kill temp brep */ av[0] = "kill"; av[1] = brep_name; ged_kill(gedp, 2, av); } bu_free((char *)brep_name, "vls_strdup"); return ret; }
int ged_put_comb(struct ged *gedp, int argc, const char *argv[]) { struct directory *dp; struct rt_db_internal intern; struct rt_comb_internal *comb; char new_name_v4[NAMESIZE+1]; char *new_name; int offset; int save_comb_flag = 0; static const char *usage = "comb_name is_Region id air material los color shader inherit boolean_expr"; static const char *noregionusage = "comb_name n color shader inherit boolean_expr"; static const char *regionusage = "comb_name y id air material los color shader inherit boolean_expr"; const char *saved_name = NULL; 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 < 7 || 11 < argc) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } comb = (struct rt_comb_internal *)NULL; 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: %s is not a combination, so cannot be edited this way\n", argv[0], 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, "%s: Database read error, aborting\n", argv[0]); return GED_ERROR; } comb = (struct rt_comb_internal *)intern.idb_ptr; saved_name = save_comb(gedp, dp); /* Save combination to a temp name */ save_comb_flag = 1; } /* empty the existing combination */ if (comb) { db_free_tree(comb->tree, &rt_uniresource); comb->tree = NULL; } else { /* make an empty combination structure */ BU_ALLOC(comb, struct rt_comb_internal); if (comb == NULL) bu_bomb("Unable to allocate comb memory"); RT_COMB_INTERNAL_INIT(comb); } if (db_version(gedp->ged_wdbp->dbip) < 5) { new_name = new_name_v4; if (dp == RT_DIR_NULL) NAMEMOVE(argv[1], new_name_v4); else NAMEMOVE(dp->d_namep, new_name_v4); } else { if (dp == RT_DIR_NULL) new_name = (char *)argv[1]; else new_name = dp->d_namep; } if (*argv[2] == 'y' || *argv[2] == 'Y') comb->region_flag = 1; else comb->region_flag = 0; if (comb->region_flag) { if (argc != 11) { bu_vls_printf(gedp->ged_result_str, "region_flag is set, incorrect number of arguments supplied.\n"); bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], regionusage); return GED_ERROR; } comb->region_id = atoi(argv[3]); comb->aircode = atoi(argv[4]); comb->GIFTmater = atoi(argv[5]); comb->los = atoi(argv[6]); offset = 6; } else { if (argc != 7) { bu_vls_printf(gedp->ged_result_str, "region_flag is not set, incorrect number of arguments supplied.\n"); bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], noregionusage); return GED_ERROR; } offset = 2; } put_rgb_into_comb(comb, argv[offset + 1]); bu_vls_strcpy(&comb->shader, argv[offset +2]); if (*argv[offset + 3] == 'y' || *argv[offset + 3] == 'Y') comb->inherit = 1; else comb->inherit = 0; if (put_tree_into_comb(gedp, comb, dp, argv[1], new_name, argv[offset + 4]) == GED_ERROR) { if (comb && dp) { restore_comb(gedp, dp, saved_name); bu_vls_printf(gedp->ged_result_str, "%s: \toriginal restored\n", argv[0]); } bu_file_delete(_ged_tmpfil); return GED_ERROR; } else if (save_comb_flag) { /* eliminate the temporary combination */ const char *av[3]; av[0] = "kill"; av[1] = saved_name; av[2] = NULL; (void)ged_kill(gedp, 2, (const char **)av); } bu_file_delete(_ged_tmpfil); return GED_OK; }