int mk_id_editunits( struct rt_wdb *wdbp, const char *title, double local2mm) { RT_CK_WDB(wdbp); return db_update_ident(wdbp->dbip, title, local2mm); }
int ged_keep(struct ged *gedp, int argc, const char *argv[]) { int i; struct keep_node_data knd; struct rt_wdb *keepfp; struct directory *dp; struct bu_vls title = BU_VLS_INIT_ZERO; struct db_i *new_dbip; const char *cmd = argv[0]; static const char *usage = "[-R] file object(s)"; int c; int flag_R = 0; GED_CHECK_DATABASE_OPEN(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", cmd, usage); return GED_HELP; } /* check for options */ bu_optind = 1; while ((c = bu_getopt(argc, (char * const *)argv, "R")) != -1) { switch (c) { case 'R': /* not recursively */ flag_R = 1; break; default: bu_vls_printf(gedp->ged_result_str, "Unrecognized option - %c", c); return GED_ERROR; } } /* skip options processed plus command name */ argc -= bu_optind; argv += bu_optind; if (argc < 2) { bu_vls_printf(gedp->ged_result_str, "ERROR: missing file or object names\n"); bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", cmd, usage); return GED_ERROR; } /* First, clear any existing counts */ for (i = 0; i < RT_DBNHASH; i++) { for (dp = gedp->ged_wdbp->dbip->dbi_Head[i]; dp != RT_DIR_NULL; dp = dp->d_forw) dp->d_nref = 0; } /* Alert user if named file already exists */ new_dbip = db_open(argv[0], DB_OPEN_READWRITE); if (new_dbip != DBI_NULL) { if (db_version(new_dbip) != db_version(gedp->ged_wdbp->dbip)) { bu_vls_printf(gedp->ged_result_str, "%s: File format mismatch between '%s' and '%s'\n", cmd, argv[0], gedp->ged_wdbp->dbip->dbi_filename); return GED_ERROR; } if ((keepfp = wdb_dbopen(new_dbip, RT_WDB_TYPE_DB_DISK)) == NULL) { bu_vls_printf(gedp->ged_result_str, "%s: Error opening '%s'\n", cmd, argv[0]); return GED_ERROR; } else { bu_vls_printf(gedp->ged_result_str, "%s: Appending to '%s'\n", cmd, argv[0]); /* --- Scan geometry database and build in-memory directory --- */ db_dirbuild(new_dbip); } } else { /* Create a new database */ keepfp = wdb_fopen_v(argv[0], db_version(gedp->ged_wdbp->dbip)); if (keepfp == NULL) { perror(argv[0]); return GED_ERROR; } } knd.wdbp = keepfp; knd.gedp = gedp; /* ident record */ if (bu_strncmp(gedp->ged_wdbp->dbip->dbi_title, "Parts of: ", 10) != 0) { bu_vls_strcat(&title, "Parts of: "); } bu_vls_strcat(&title, gedp->ged_wdbp->dbip->dbi_title); if (db_update_ident(keepfp->dbip, bu_vls_addr(&title), gedp->ged_wdbp->dbip->dbi_local2base) < 0) { perror("fwrite"); bu_vls_printf(gedp->ged_result_str, "db_update_ident() failed\n"); wdb_close(keepfp); bu_vls_free(&title); return GED_ERROR; } bu_vls_free(&title); for (i = 1; i < argc; i++) { if ((dp = db_lookup(gedp->ged_wdbp->dbip, argv[i], LOOKUP_NOISY)) == RT_DIR_NULL) continue; if (!flag_R) { /* recursively keep objects */ db_functree(gedp->ged_wdbp->dbip, dp, node_write, node_write, &rt_uniresource, (void *)&knd); } else { /* keep just this object */ node_write(gedp->ged_wdbp->dbip, dp, (void *)&knd); } } wdb_close(keepfp); return GED_OK; }
int main(int argc, char **argv) { struct rt_wdb *fp; struct db_i *dbip; struct directory *dp; long errors = 0; struct bn_tol tol; char name[17]; bu_setprogname(argv[0]); /* FIXME: These need to be improved */ tol.magic = BN_TOL_MAGIC; tol.dist = 0.0005; tol.dist_sq = tol.dist * tol.dist; tol.perp = 1e-6; tol.para = 1 - tol.perp; bu_debug = BU_DEBUG_COREDUMP; rt_init_resource( &rt_uniresource, 0, NULL ); if ( argc != 3 ) { fprintf(stderr, "Usage: %s v4.g v5.g\n", argv[0]); return 1; } if ( (dbip = db_open(argv[1], DB_OPEN_READONLY)) == DBI_NULL ) { perror( argv[1] ); return 2; } if ( (fp = wdb_fopen( argv[2] )) == NULL ) { perror( argv[2] ); return 3; } if ( db_version(dbip) != 4 ) { bu_log( "Input database must be a version 4 database!!!!\n" ); return 4; } RT_CK_DBI(dbip); if ( db_dirbuild( dbip ) ) bu_exit(1, "db_dirbuild failed\n" ); db_update_ident( fp->dbip, dbip->dbi_title, dbip->dbi_local2base ); /* Retrieve every item in the input database */ FOR_ALL_DIRECTORY_START(dp, dbip) { struct rt_db_internal intern; int id; int ret; fprintf(stderr, "%.16s\n", dp->d_namep ); id = rt_db_get_internal( &intern, dp, dbip, NULL, &rt_uniresource ); if ( id < 0 ) { fprintf(stderr, "%s: rt_db_get_internal(%s) failure, skipping\n", argv[0], dp->d_namep); errors++; continue; } if ( id == ID_COMBINATION ) { struct rt_comb_internal *comb; char *ptr; comb = (struct rt_comb_internal *)intern.idb_ptr; RT_CK_COMB( comb ); /* Convert "plastic" to "phong" in the shader string */ while ( (ptr=strstr( bu_vls_addr( &comb->shader), "plastic" )) != NULL ) { ptr[0] = 'p'; /* p */ ptr[1] = 'h'; /* l */ ptr[2] = 'o'; /* a */ ptr[3] = 'n'; /* s */ ptr[4] = 'g'; /* t */ ptr[5] = ' '; /* i */ ptr[6] = ' '; /* c */ } } if ( id == ID_HF ) { if (rt_hf_to_dsp( &intern )) { fprintf(stderr, "%s: Conversion from HF to DSP failed for solid %s\n", argv[0], dp->d_namep ); errors++; continue; } } if ( id == ID_POLY) { if ( rt_pg_to_bot( &intern, &tol, &rt_uniresource ) ) { fprintf( stderr, "%s: Conversion from polysolid to BOT failed for solid %s\n", argv[0], dp->d_namep ); errors++; continue; } } /* to insure null termination */ bu_strlcpy( name, dp->d_namep, sizeof(name) ); ret = wdb_put_internal( fp, name, &intern, 1.0 ); if ( ret < 0 ) { fprintf(stderr, "%s: wdb_put_internal(%s) failure, skipping\n", argv[0], dp->d_namep); rt_db_free_internal(&intern); errors++; continue; } rt_db_free_internal(&intern); } FOR_ALL_DIRECTORY_END wdb_close( fp ); db_close( dbip ); fprintf(stderr, "%ld objects failed to convert\n", errors); return 0; }
int ged_units(struct ged *gedp, int argc, const char *argv[]) { double loc2mm; const char *str; int sflag = 0; static const char *usage = "[-s] [mm|cm|m|in|ft|...]"; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); if (argc > 2) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } if (argc == 2) { if (BU_STR_EQUAL(argv[1], "-s")) { --argc; ++argv; sflag = 1; } else if (BU_STR_EQUAL(argv[1], "-t")) { struct bu_vls *vlsp = bu_units_strings_vls(); bu_vls_printf(gedp->ged_result_str, "%V", vlsp); bu_vls_free(vlsp); bu_free(vlsp, "ged_units: vlsp"); return GED_OK; } } /* Get units */ if (argc == 1) { str = bu_units_string(gedp->ged_wdbp->dbip->dbi_local2base); if (!str) str = "Unknown_unit"; if (sflag) bu_vls_printf(gedp->ged_result_str, "%s", str); else bu_vls_printf(gedp->ged_result_str, "You are editing in '%s'. 1 %s = %g mm \n", str, str, gedp->ged_wdbp->dbip->dbi_local2base); return GED_OK; } /* Set units */ /* Allow inputs of the form "25cm" or "3ft" */ if ((loc2mm = bu_mm_value(argv[1])) <= 0) { bu_vls_printf(gedp->ged_result_str, "%s: unrecognized unit\nvalid units: <um|mm|cm|m|km|in|ft|yd|mi>\n", argv[1]); return GED_ERROR; } if (db_update_ident(gedp->ged_wdbp->dbip, gedp->ged_wdbp->dbip->dbi_title, loc2mm) < 0) { bu_vls_printf(gedp->ged_result_str, "Warning: unable to stash working units into database\n"); } gedp->ged_wdbp->dbip->dbi_local2base = loc2mm; gedp->ged_wdbp->dbip->dbi_base2local = 1.0 / loc2mm; str = bu_units_string(gedp->ged_wdbp->dbip->dbi_local2base); if (!str) str = "Unknown_unit"; bu_vls_printf(gedp->ged_result_str, "You are now editing in '%s'. 1 %s = %g mm \n", str, str, gedp->ged_wdbp->dbip->dbi_local2base); return GED_OK; }