int main(int argc, char **argv) { struct vfont *vfp; bu_setprogname(argv[0]); if (!get_args(argc, argv)) { fputs(usage, stderr); bu_exit(1, NULL); } if ((fbp = fb_open(framebuffer, scr_width, scr_height)) == NULL) { fprintf(stderr, "fblabel: Unable to open framebuffer %s\n", framebuffer); bu_exit(12, NULL); } if (clear) { fb_clear(fbp, PIXEL_NULL); } if ((vfp = vfont_get(font1)) == VFONT_NULL) { fprintf(stderr, "fblabel: Can't get font \"%s\"\n", font1 == NULL ? "(null)" : font1); bu_exit(1, NULL); } do_line(vfp, textstring); fb_close(fbp); vfont_free(vfp); return 0; }
int main(int argc, char **argv) { FILE *fpin; struct rt_wdb *fpout; bu_setprogname(argv[0]); tol.magic = BN_TOL_MAGIC; /* Copied from proc-db/nmgmodel.c */ tol.dist = 0.01; tol.dist_sq = 0.01 * 0.01; tol.perp = 0.001; tol.para = 0.999; /* Get filenames and open the files. */ if (argc != 3) { bu_exit(2, "Usage: off-g file.off file.g\n"); } if ((fpin = fopen(argv[1], "r")) == NULL) { bu_exit(1, "%s: cannot open %s for reading\n", argv[0], argv[1]); } if ((fpout = wdb_fopen(argv[2])) == NULL) { bu_exit(1, "%s: cannot create %s\n", argv[0], argv[2]); } off2nmg(fpin, fpout); fclose(fpin); wdb_close(fpout); return 0; }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { char **argv; int argc; char *p; Tcl_SetPanicProc(BwishPanic); /* * Create the console channels and install them as the standard channels. * All I/O will be discarded until Tk_CreateConsoleWindow is called to * attach the console to a text widget. */ consoleRequired = TRUE; /* * Set up the default locale to be standard "C" locale so parsing is * performed correctly. */ setlocale(LC_ALL, "C"); /* * Get our args from the c-runtime. Ignore lpszCmdLine. */ argc = __argc; argv = __argv; /* * Forward slashes substituted for backslashes. */ for (p = argv[0]; *p != '\0'; p++) { if (*p == '\\') { *p = '/'; } } bu_setprogname(argv[0]); #ifdef TK_LOCAL_MAIN_HOOK TK_LOCAL_MAIN_HOOK(&argc, &argv); #endif Tk_Main(argc, argv, TK_LOCAL_APPINIT); return 1; }
/* * Get ascii input file and output file names. */ int main(int argc, char **argv) { char *afile = "-", *bfile = "nmg.g"; FILE *fpin; struct rt_wdb *fpout; if ( BU_STR_EQUAL(argv[1],"-h") || BU_STR_EQUAL(argv[1],"-?")) { usage(); bu_exit(1, NULL); } if (isatty(fileno(stdin)) && isatty(fileno(stdout)) && argc == 1) { usage(); bu_log(" Program continues running:\n"); } bu_setprogname(argv[0]); /* Get ascii NMG input file name. */ if (bu_optind >= argc || (int)(*argv[1]) == '-') { fpin = stdin; setmode(fileno(fpin), O_BINARY); bu_log("%s: will be reading from stdin\n",argv[0]); } else { afile = argv[bu_optind]; if ((fpin = fopen(afile, "rb")) == NULL) { fprintf(stderr, "%s: cannot open %s for reading\n", argv[0], afile); bu_exit(1, NULL); } bu_log("%s: will be reading from file %s\n",argv[0],afile); } /* Get BRL-CAD output data base name. */ bu_optind++; if (bu_optind < argc) bfile = argv[bu_optind]; if ((fpout = wdb_fopen(bfile)) == NULL) { fprintf(stderr, "%s: cannot open %s for writing\n", argv[0], bfile); bu_exit(1, NULL); } bu_log("%s: will be creating file %s\n",argv[0],bfile); ascii_to_brlcad(fpin, fpout, "nmg", NULL); fclose(fpin); wdb_close(fpout); return 0; }
int parse_args (int ac, char *av[], struct beset_options *opts) { int c; bu_setprogname(av[0]); /* handle options */ bu_opterr = 0; bu_optind = 0; av++; ac--; while ((c=bu_getopt(ac, av, OPTIONS)) != -1) { switch (c) { case 'm': opts->mut_rate = atoi(bu_optarg); continue; case 'c': opts->cross_rate = atoi(bu_optarg); continue; case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug ); continue; case 'p': opts->pop_size = atoi(bu_optarg); continue; case 'g': opts->gens = atoi(bu_optarg); continue; case 'r': opts->res = atoi(bu_optarg); continue; case 'u': opts->keep_upper = atoi(bu_optarg); continue; case 'l': opts->kill_lower = atoi(bu_optarg); continue; default: fprintf(stderr, "Unrecognized option: -%c\n", c); usage(); } } opts->keep_upper *= opts->pop_size/100.0; opts->kill_lower *= opts->pop_size/100.0; return bu_optind; }
/* * M A I N */ int main(int argc, char **argv) { char *dot, *fig_file; int c; double percent; int size; bu_setprogname(argv[0]); bu_setlinebuf( stderr ); jack_tree_state = rt_initial_tree_state; /* struct copy */ jack_tree_state.ts_tol = &tol; jack_tree_state.ts_ttol = &ttol; jack_tree_state.ts_m = &the_model; ttol.magic = RT_TESS_TOL_MAGIC; /* Defaults, updated by command line options. */ ttol.abs = 0.0; ttol.rel = 0.01; ttol.norm = 0.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; rt_init_resource( &rt_uniresource, 0, NULL ); the_model = nmg_mm(); BU_LIST_INIT( &rt_g.rtg_vlfree ); /* for vlist macros */ /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "a:dn:p:r:vx:P:X:")) != -1) { switch (c) { case 'a': /* Absolute tolerance. */ ttol.abs = atof(bu_optarg); break; case 'd': debug_plots = 1; break; case 'n': /* Surface normal tolerance. */ ttol.norm = atof(bu_optarg); break; case 'p': /* Prefix for Jack file names. */ prefix = bu_optarg; break; case 'r': /* Relative tolerance. */ ttol.rel = atof(bu_optarg); break; case 'v': verbose++; break; case 'P': ncpu = atoi( bu_optarg ); rt_g.debug = 1; break; case 'x': sscanf( bu_optarg, "%x", (unsigned int *)&rt_g.debug ); break; case 'X': sscanf( bu_optarg, "%x", (unsigned int *)&rt_g.NMG_debug ); NMG_debug = rt_g.NMG_debug; break; default: bu_exit(1, usage, argv[0]); break; } } if (bu_optind+1 >= argc) { bu_exit(1, usage, argv[0]); } /* Open BRL-CAD database */ argc -= bu_optind; argv += bu_optind; if ((dbip = db_open(argv[0], "r")) == DBI_NULL) { perror(argv[0]); bu_exit(1, "ERROR: Unable to open geometry database (%s)\n", argv[0]); } if ( db_dirbuild( dbip ) ) { bu_exit(1, "db_dirbuild failed\n" ); } /* Create .fig file name and open it. */ size = sizeof(prefix) + sizeof(argv[0] + 4); fig_file = bu_malloc(size, "st"); /* Ignore leading path name. */ if ((dot = strrchr(argv[0], '/')) != (char *)NULL) { if (prefix) { snprintf(fig_file, size, "%s%s", prefix, 1+dot); } else { snprintf(fig_file, size, "%s", 1+dot); } } else { if (prefix) snprintf(fig_file, size, "%s%s", prefix, argv[0]); else snprintf(fig_file, size, "%s", argv[0]); } /* Get rid of any file name extension (probably .g). */ if ((dot = strrchr(fig_file, '.')) != (char *)NULL) *dot = '\0'; bu_strlcat(fig_file, ".fig", size); /* Add required Jack suffix. */ if ((fp_fig = fopen(fig_file, "wb")) == NULL) perror(fig_file); fprintf(fp_fig, "figure {\n"); /* Walk indicated tree(s). Each region will be output separately */ (void)db_walk_tree(dbip, argc-1, (const char **)(argv+1), 1, /* ncpu */ &jack_tree_state, 0, /* take all regions */ do_region_end, nmg_booltree_leaf_tess, (genptr_t)NULL); /* in librt/nmg_bool.c */ fprintf(fp_fig, "\troot=%s_seg.base;\n", bu_vls_addr(&base_seg)); fprintf(fp_fig, "}\n"); fclose(fp_fig); bu_free(fig_file, "st"); bu_vls_free(&base_seg); percent = 0; if (regions_tried>0) percent = ((double)regions_done * 100) / regions_tried; printf("Tried %d regions, %d converted successfully. %g%%\n", regions_tried, regions_done, percent); return 0; }
int main(int argc, char **argv) { int i; int c; struct plate_mode pm; bu_setprogname(argv[0]); bu_setlinebuf( stderr ); the_model = nmg_mm(); tree_state = rt_initial_tree_state; /* struct copy */ tree_state.ts_tol = &tol; tree_state.ts_ttol = &ttol; tree_state.ts_m = &the_model; ttol.magic = RT_TESS_TOL_MAGIC; /* Defaults, updated by command line options. */ ttol.abs = 0.0; ttol.rel = 0.01; ttol.norm = 0.0; /* FIXME: These need to be improved */ tol.magic = BN_TOL_MAGIC; tol.dist = BN_TOL_DIST; tol.dist_sq = tol.dist * tol.dist; tol.perp = 1e-6; tol.para = 1 - tol.perp; /* NOTE: For visualization purposes, in the debug plot files */ { /* WTF: This value is specific to the Bradley */ nmg_eue_dist = 2.0; } BU_LIST_INIT( &RTG.rtg_vlfree ); /* for vlist macros */ BARRIER_CHECK; /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "d:a:n:o:r:vx:P:X:u:h?")) != -1) { switch (c) { case 'a': /* Absolute tolerance. */ ttol.abs = atof(bu_optarg); ttol.rel = 0.0; break; case 'd': /* calculational tolerance */ tol.dist = atof( bu_optarg ); tol.dist_sq = tol.dist * tol.dist; break; case 'n': /* Surface normal tolerance. */ ttol.norm = atof(bu_optarg)*DEG2RAD; ttol.rel = 0.0; break; case 'o': /* Output file name */ out_file = bu_optarg; break; case 'r': /* Relative tolerance. */ ttol.rel = atof(bu_optarg); break; case 'v': verbose++; break; case 'P': ncpu = atoi(bu_optarg); break; case 'x': sscanf( bu_optarg, "%x", (unsigned int *)&RTG.debug ); break; case 'X': sscanf( bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug ); NMG_debug = RTG.NMG_debug; break; case 'u': units = bu_strdup( bu_optarg ); scale_factor = bu_units_conversion( units ); if ( ZERO(scale_factor) ) bu_exit(1, "Unrecognized units (%s)\n", units ); scale_factor = 1.0 / scale_factor; break; default: print_usage(argv[0]); } } if (bu_optind+1 >= argc) print_usage(argv[0]); /* Open BRL-CAD database */ if ((dbip = db_open( argv[bu_optind], DB_OPEN_READONLY)) == DBI_NULL) { perror(argv[0]); bu_exit(1, "Cannot open geometry database file %s\n", argv[bu_optind] ); } if ( db_dirbuild( dbip ) ) bu_exit(1, "db_dirbuild() failed!\n" ); if (out_file == NULL) { outfp = stdout; setmode(fileno(outfp), O_BINARY); } else { if ((outfp = fopen( out_file, "wb")) == NULL) { perror( argv[0] ); bu_exit(2, "Cannot open %s\n", out_file ); } } writeX3dHeader(outfp, out_file); bu_optind++; BARRIER_CHECK; pm.num_bots = 0; pm.num_nonbots = 0; pm.array_size = 5; pm.bots = (struct rt_bot_internal **)bu_calloc( pm.array_size, sizeof( struct rt_bot_internal *), "pm.bots" ); for ( i=bu_optind; i<argc; i++ ) { struct directory *dp; dp = db_lookup( dbip, argv[i], LOOKUP_QUIET ); if ( dp == RT_DIR_NULL ) { bu_log( "Cannot find %s\n", argv[i] ); continue; } /* light source must be a combination */ if ( !(dp->d_flags & RT_DIR_COMB) ) continue; /* walk trees selecting only light source regions */ (void)db_walk_tree(dbip, 1, (const char **)(&argv[i]), ncpu, &tree_state, select_lights, do_region_end, leaf_tess, (void *)&pm); /* in librt/nmg_bool.c */ } BARRIER_CHECK; /* Walk indicated tree(s). Each non-light-source region will be output separately */ (void)db_walk_tree(dbip, argc-bu_optind, (const char **)(&argv[bu_optind]), ncpu, &tree_state, select_non_lights, do_region_end, leaf_tess, (void *)&pm); /* in librt/nmg_bool.c */ BARRIER_CHECK; /* Release dynamic storage */ nmg_km(the_model); db_close(dbip); /* Now we need to close each group set */ writeX3dEnd(outfp); if ( verbose ) bu_log( "Total of %d regions converted of %d regions attempted\n", regions_converted, regions_tried ); return 0; }
int main(int argc, char **argv) { int i, j; int c; double percent; bu_setprogname(argv[0]); bu_setlinebuf(stderr); RTG.debug = 0; ttol.magic = RT_TESS_TOL_MAGIC; /* Defaults, updated by command line options. */ ttol.abs = 0.0; ttol.rel = 0.01; ttol.norm = 0.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; the_model = (struct model *)NULL; tree_state = rt_initial_tree_state; /* struct copy */ tree_state.ts_m = &the_model; tree_state.ts_tol = &tol; tree_state.ts_ttol = &ttol; rt_init_resource(&rt_uniresource, 0, NULL); /* For visualization purposes, in the debug plot files */ { /* WTF: This value is specific to the Bradley */ nmg_eue_dist = 2.0; } BU_LIST_INIT(&RTG.rtg_vlfree); /* for vlist macros */ /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "a:n:o:r:vx:P:X:h?")) != -1) { switch (c) { case 'a': /* Absolute tolerance. */ ttol.abs = atof(bu_optarg); ttol.rel = 0.0; break; case 'n': /* Surface normal tolerance. */ ttol.norm = atof(bu_optarg); ttol.rel = 0.0; break; case 'o': /* Output file name */ out_file = bu_optarg; break; case 'r': /* Relative tolerance. */ ttol.rel = atof(bu_optarg); break; case 'v': verbose++; break; case 'P': ncpu = atoi(bu_optarg); break; case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug); NMG_debug = RTG.NMG_debug; break; default: usage(argv[0]); } } if (bu_optind+1 >= argc) usage(argv[0]); /* Open BRL-CAD database */ if ((dbip = db_open(argv[bu_optind], DB_OPEN_READONLY)) == DBI_NULL) { perror(argv[0]); bu_exit(1, "Cannot open geometry database file %s\n", argv[bu_optind]); } if (db_dirbuild(dbip)) { bu_exit(1, "db_dirbuild failed\n"); } if (out_file == NULL) { fp_out = stdout; setmode(fileno(fp_out), O_BINARY); } else { if ((fp_out = fopen(out_file, "wb")) == NULL) { bu_log("Cannot open %s\n", out_file); perror(argv[0]); return 2; } } bu_optind++; fprintf(fp_out, "$03"); /* First produce an unordered list of region ident codes */ (void)db_walk_tree(dbip, argc-bu_optind, (const char **)(&argv[bu_optind]), 1, /* ncpu */ &tree_state, get_reg_id, /* put id in table */ region_stub, leaf_stub, (void *)NULL); /* Process regions in ident order */ curr_id = 0; for (i = 0; i < ident_length; i++) { int next_id = 99999999; for (j = 0; j < ident_length; j++) { int test_id; test_id = idents[j]; if (test_id > curr_id && test_id < next_id) next_id = test_id; } curr_id = next_id; face_count = 0; bu_log("Processing id %d\n", curr_id); /* Walk indicated tree(s). Each region will be output separately */ tree_state = rt_initial_tree_state; /* struct copy */ the_model = nmg_mm(); tree_state.ts_m = &the_model; tree_state.ts_tol = &tol; tree_state.ts_ttol = &ttol; (void)db_walk_tree(dbip, argc-bu_optind, (const char **)(&argv[bu_optind]), ncpu, &tree_state, select_region, do_region_end, nmg_booltree_leaf_tess, (void *)NULL); /* in librt/nmg_bool.c */ nmg_km(the_model); } percent = 0; if (regions_tried > 0) percent = ((double)regions_converted * 100) / regions_tried; printf("Tried %d regions, %d converted successfully. %g%%\n", regions_tried, regions_converted, percent); percent = 0; if (regions_tried > 0) percent = ((double)regions_written * 100) / regions_tried; printf(" %d written successfully. %g%%\n", regions_written, percent); /* Release dynamic storage */ rt_vlist_cleanup(); db_close(dbip); return 0; }
int main(int argc, char **argv) { int c; double percent; int i; bu_setprogname(argv[0]); bu_setlinebuf(stderr); RTG.debug = 0; tree_state = rt_initial_tree_state; /* struct copy */ tree_state.ts_tol = &tol; tree_state.ts_ttol = &ttol; tree_state.ts_m = &the_model; ttol.magic = RT_TESS_TOL_MAGIC; /* Defaults, updated by command line options. */ ttol.abs = 0.0; ttol.rel = 0.01; ttol.norm = 0.0; /* FIXME: These need to be improved */ tol.magic = BN_TOL_MAGIC; tol.dist = BN_TOL_DIST; tol.dist_sq = tol.dist * tol.dist; tol.perp = 1e-6; tol.para = 1 - tol.perp; the_model = nmg_mm(); BU_LIST_INIT(&RTG.rtg_vlfree); /* for vlist macros */ /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "a:n:o:r:vx:D:P:X:e:ih?")) != -1) { switch (c) { case 'a': /* Absolute tolerance. */ ttol.abs = atof(bu_optarg); ttol.rel = 0.0; break; case 'n': /* Surface normal tolerance. */ ttol.norm = atof(bu_optarg); ttol.rel = 0.0; break; case 'o': /* Output file name. */ output_file = bu_optarg; break; case 'r': /* Relative tolerance. */ ttol.rel = atof(bu_optarg); break; case 'v': verbose++; break; case 'P': ncpu = atoi(bu_optarg); break; case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); break; case 'D': tol.dist = atof(bu_optarg); tol.dist_sq = tol.dist * tol.dist; rt_pr_tol(&tol); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug); NMG_debug = RTG.NMG_debug; break; case 'e': /* Error file name. */ error_file = bu_optarg; break; case 'i': inches = 1; break; default: usage(argv[0]); } } if (bu_optind+1 >= argc) usage(argv[0]); if (!output_file) { fp = stdout; setmode(fileno(fp), O_BINARY); } else { /* Open output file */ if ((fp=fopen(output_file, "wb+")) == NULL) { perror(argv[0]); bu_exit(1, "Cannot open output file (%s) for writing\n", output_file); } } /* Open g-acad error log file */ if (!error_file) { fpe = stderr; setmode(fileno(fpe), O_BINARY); } else if ((fpe=fopen(error_file, "wb")) == NULL) { perror(argv[0]); bu_exit(1, "Cannot open output file (%s) for writing\n", error_file); } /* Open BRL-CAD database */ argc -= bu_optind; argv += bu_optind; if ((dbip = db_open(argv[0], DB_OPEN_READONLY)) == DBI_NULL) { perror(argv[0]); bu_exit(1, "Cannot open geometry database file (%s)\n", argv[0]); } if (db_dirbuild(dbip)) { bu_exit(1, "db_dirbuild failed\n"); } BN_CK_TOL(tree_state.ts_tol); RT_CK_TESS_TOL(tree_state.ts_ttol); fprintf(fpe, "Model: %s\n", argv[0]); fprintf(fpe, "Objects:"); for (i=1; i<argc; i++) fprintf(fpe, " %s", argv[i]); fprintf(fpe, "\nTessellation tolerances:\n\tabs = %g mm\n\trel = %g\n\tnorm = %g\n", tree_state.ts_ttol->abs, tree_state.ts_ttol->rel, tree_state.ts_ttol->norm); fprintf(fpe, "Calculational tolerances:\n\tdist = %g mm perp = %g\n", tree_state.ts_tol->dist, tree_state.ts_tol->perp); bu_log("Model: %s\n", argv[0]); bu_log("Objects:"); for (i=1; i<argc; i++) bu_log(" %s", argv[i]); bu_log("\nTessellation tolerances:\n\tabs = %g mm\n\trel = %g\n\tnorm = %g\n", tree_state.ts_ttol->abs, tree_state.ts_ttol->rel, tree_state.ts_ttol->norm); bu_log("Calculational tolerances:\n\tdist = %g mm perp = %g\n", tree_state.ts_tol->dist, tree_state.ts_tol->perp); /* Write out ACAD facet header */ if (inches) fprintf(fp, "BRL-CAD generated ACAD FACET FILE (Units in)\n"); else fprintf(fp, "BRL-CAD generated ACAD FACET FILE (Units mm)\n"); /* Generate space for number of facet entities, will write over later */ fprintf(fp, " "); /* Walk indicated tree(s). Each region will be output separately */ (void) db_walk_tree(dbip, argc-1, (const char **)(argv+1), 1, /* ncpu */ &tree_state, 0, /* take all regions */ do_region_end, nmg_booltree_leaf_tess, (void *)NULL); /* in librt/nmg_bool.c */ percent = 0; if (regions_tried>0) { percent = ((double)regions_converted * 100) / regions_tried; printf("Tried %d regions, %d converted to NMG's successfully. %g%%\n", regions_tried, regions_converted, percent); } percent = 0; if (regions_tried > 0) { percent = ((double)regions_written * 100) / regions_tried; printf(" %d triangulated successfully. %g%%\n", regions_written, percent); } bu_log("%ld triangles written\n", tot_polygons); fprintf(fpe, "%ld triangles written\n", tot_polygons); /* Write out number of facet entities to .facet file */ rewind(fp); bu_fseek(fp, 46, 0); /* Re-position pointer to 2nd line */ fprintf(fp, "%d\n", regions_written); /* Write out number of regions */ fclose(fp); /* Release dynamic storage */ nmg_km(the_model); rt_vlist_cleanup(); db_close(dbip); return 0; }
int main( int argc, char *argv[] ) { char line[MAX_LINE_SIZE]; char *input_file, *output_file; FILE *fd_parts; struct obj_info **top_level_assems = NULL; int top_level_assem_count = 0; int curr_top_level = -1; fastf_t tmp; int id; int c; bu_setprogname(argv[0]); local_tol = 0.0005; local_tol_sq = local_tol * local_tol; ident = 1000; while ( (c=bu_getopt( argc, argv, "vi:t:n:l:h?" ) ) != -1 ) { switch ( c ) { case 'v': /* verbose */ verbose = 1; break; case 'i': /* starting ident number */ ident = atoi( bu_optarg ); break; case 't': /* tolerance */ tmp = atof( bu_optarg ); if ( tmp <= 0.0 ) bu_exit( 1, "%s: Illegal tolerance (%g), must be > 0.0\n", progname,tmp ); break; case 'n': /* part name list */ part_name_file = bu_optarg; use_part_name_hash = 1; break; case 'l': /* max name length */ max_name_len = atoi( bu_optarg ); if ( max_name_len < 5 ) bu_exit( 1, "%s: Unreasonable name length limitation\n",progname ); break; default: Usage(); bu_exit( 1, NULL ); } } if ( argc - bu_optind != 2 ) { bu_log( "Not enough arguments!! (need at least input & output file names)\n" ); Usage(); bu_exit( 1, NULL ); } input_file = bu_strdup( argv[bu_optind] ); if ((fd_in=fopen(input_file, "rb")) == NULL) { bu_log( "%s: Cannot open %s for reading\n", progname,input_file ); perror( argv[0] ); bu_exit( 1, NULL ); } output_file = bu_strdup( argv[bu_optind+1] ); if ( (fd_out=wdb_fopen( output_file )) == NULL ) { bu_log( "%s: Cannot open %s for writing\n", progname,output_file ); perror( argv[0] ); bu_exit( 1, NULL ); } if ( use_part_name_hash ) { if ( (fd_parts=fopen( part_name_file, "rb" )) == NULL ) { bu_log( "%s,Cannot open part name file (%s)\n", progname,part_name_file ); perror( argv[0] ); bu_exit( 1, NULL ); } create_name_hash( fd_parts ); } tree_root = create_vert_tree(); /* finally, start processing the input */ while ( bu_fgets( line, MAX_LINE_SIZE, fd_in ) ) { if ( !bu_strncmp( line, "FileName", 8 ) ) { bu_log( "Converting facets originally from %s", &line[9] ); } else if ( !bu_strncmp( line, "TopAssemblies", 13 ) ) { bu_log( "Top level assemblies: %s", &line[14] ); top_level_assem_count = atoi( &line[14] ); if ( top_level_assem_count < 1 ) { top_level_assems = (struct obj_info **)NULL; } else { top_level_assems = (struct obj_info **)bu_calloc( top_level_assem_count, sizeof( struct obj_info * ), "top_level_assems" ); } } else if ( !bu_strncmp( line, "PartCount", 9 ) ) { bu_log( "Part count: %s", &line[10] ); } else if ( !bu_strncmp( line, "AssemblyId", 10 ) ) { id = atoi( &line[11] ); curr_top_level++; if ( curr_top_level >= top_level_assem_count ) { bu_log( "Warning: too many top level assemblies\n" ); bu_log( "\texpected %d, this os number %d\n", top_level_assem_count, curr_top_level+1 ); top_level_assem_count = curr_top_level+1; top_level_assems = (struct obj_info **)bu_realloc( top_level_assems, top_level_assem_count * sizeof( struct obj_info * ), "top_level_assems" ); } top_level_assems[curr_top_level] = Assembly_import( id ); } else if ( !bu_strncmp( line, "PartId", 6 ) ) { /* found a top-level part */ id = atoi( &line[7] ); (void)Part_import( id ); } } if ( name_not_converted ) { bu_log( "Warning %d objects were not found in the part number to name mapping,\n", name_not_converted ); bu_log( "\ttheir names remain as part numbers.\n" ); } return 0; }
int main(int argc, char *argv[]) { size_t i; int ret; int c; double percent; char copy_buffer[CP_BUF_SIZE] = {0}; struct directory *dp; bu_setprogname(argv[0]); bu_setlinebuf(stderr); bu_log("%s", brlcad_ident("BRL-CAD to IGES Translator")); bu_log("Please direct bug reports to <*****@*****.**>\n\n"); tree_state = rt_initial_tree_state; /* struct copy */ tree_state.ts_tol = &tol; tree_state.ts_ttol = &ttol; tree_state.ts_m = &the_model; ttol.magic = RT_TESS_TOL_MAGIC; /* Defaults, updated by command line options. */ ttol.abs = 0.0; ttol.rel = 0.01; ttol.norm = 0.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; the_model = nmg_mm(); BU_LIST_INIT(&RTG.rtg_vlfree); /* for vlist macros */ rt_init_resource(&rt_uniresource, 0, NULL); prog_name = argv[0]; /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "ftsmd:a:n:o:p:r:vx:P:X:")) != -1) { switch (c) { case 'f': /* Select facetized output */ mode = FACET_MODE; multi_file = 0; break; case 't': mode = TRIMMED_SURF_MODE; multi_file = 0; break; case 'm': /* multi-file mode */ multi_file = 1; mode = TRIMMED_SURF_MODE; break; case 's': /* Select NURB output */ do_nurbs = 1; break; case 'v': verbose++; break; case 'a': /* Absolute tolerance. */ ttol.abs = atof(bu_optarg); break; case 'r': /* Relative tolerance. */ ttol.rel = atof(bu_optarg); break; case 'n': /* Surface normal tolerance. */ ttol.norm = atof(bu_optarg); break; case 'd': /* distance tolerance */ tol.dist = atof(bu_optarg); tol.dist_sq = tol.dist * tol.dist; break; case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug); NMG_debug = RTG.NMG_debug; break; case 'o': /* Output file name. */ output_file = bu_optarg; break; case 'P': ncpu = atoi(bu_optarg); break; default: usage(argv[0]); break; } } if (bu_optind+1 >= argc) { usage(argv[0]); } /* Open BRL-CAD database */ argc -= bu_optind; argv += bu_optind; db_name = argv[0]; if ((DBIP = db_open(db_name, DB_OPEN_READONLY)) == DBI_NULL) { perror("g-iges"); bu_exit(1, "ERROR: unable to open geometry database file (%s)\n", db_name); } /* Scan the database */ if (db_dirbuild(DBIP)) { bu_exit(1, "db_dirbuild failed\n"); } if (!multi_file) { /* let the IGES routines know the selected tolerances and the database pointer */ iges_init(&tol, &ttol, verbose, DBIP); /* Open the output file */ if (output_file == NULL) fp_dir = stdout; else { if ((fp_dir = fopen(output_file, "wb")) == NULL) { perror(output_file); bu_exit(1, "Cannot open output file: %s\n", output_file); } } /* Open the temporary file for the parameter section */ if ((fp_param = bu_temp_file(NULL, 0)) == NULL) { perror("g-iges"); bu_exit(1, "Cannot open temporary file\n"); } /* Write start and global sections of the IGES file */ w_start_global(fp_dir, fp_param, argv[0], prog_name, output_file, __DATE__, brlcad_version()); } else { if (!bu_file_directory(output_file)) { bu_exit(1, "-o option must provide a directory, %s is not a directory\n", output_file); } } /* Count object references */ /* for (i = 1; i < argc; i++) { dp = db_lookup(DBIP, argv[i], 1); db_functree(DBIP, dp, count_refs, 0, NULL); } */ /* tree tops must have independent status, so we need to remember them */ independent = (argv+1); no_of_indeps = (size_t)argc-1; if (mode == FACET_MODE) { /* Walk indicated tree(s). Each region will be output * as a single manifold solid BREP object */ ret = db_walk_tree(DBIP, argc-1, (const char **)(argv+1), ncpu, &tree_state, 0, /* take all regions */ do_nmg_region_end, nmg_booltree_leaf_tess, (void *)NULL); /* in librt/nmg_bool.c */ if (ret) bu_exit(1, "g-iges: Could not facetize anything!"); if (!multi_file) { /* Now walk the same trees again, but only output groups */ for (i = 1; i < (size_t)argc; i++) { char *ptr; ptr = strrchr(argv[i], '/'); if (ptr != NULL) { ptr++; } else { ptr = argv[i]; } dp = db_lookup(DBIP, ptr, 1); if (!dp) { bu_log("WARNING: Unable to locate %s in %s\n, skipping\n", ptr, db_name); continue; } db_functree(DBIP, dp, csg_comb_func, 0, &rt_uniresource, NULL); } } } else if (mode == CSG_MODE) { /* Walk indicated tree(s). Each combination and solid will be output * as a CSG object, unless there is no IGES equivalent (then the * solid will be tessellated and output as a BREP object) */ for (i = 1; i < (size_t)argc; i++) { dp = db_lookup(DBIP, argv[i], 1); if (!dp) { bu_log("WARNING: Unable to locate %s in %s\n, skipping\n", argv[i], db_name); continue; } db_functree(DBIP, dp, csg_comb_func, csg_leaf_func, &rt_uniresource, NULL); } } else if (mode == TRIMMED_SURF_MODE) { /* Walk the indicated tree(s). Each region is output as a collection * of trimmed NURBS */ ret = db_walk_tree(DBIP, argc-1, (const char **)(argv+1), ncpu, &tree_state, 0, /* take all regions */ do_nmg_region_end, nmg_booltree_leaf_tess, (void *)NULL); /* in librt/nmg_bool.c */ if (ret) bu_exit(1, "g-iges: Could not facetize anything!"); } if (!multi_file) { /* Copy the parameter section from the temporary file to the output file */ if ((bu_fseek(fp_param, 0, 0))) { perror("g-iges"); bu_exit(1, "Cannot seek to start of temporary file\n"); } while ((i = fread(copy_buffer, 1, CP_BUF_SIZE, fp_param))) if (fwrite(copy_buffer, 1, i, fp_dir) != i) { perror("g-iges"); bu_exit(1, "Error in copying parameter data to %s\n", output_file); } /* Write the terminate section */ w_terminate(fp_dir); } /* Print some statistics */ Print_stats(stdout); /* report on the success rate for facetizing regions */ if (mode == FACET_MODE || mode == TRIMMED_SURF_MODE) { percent = 0; if (regions_tried>0) percent = ((double)regions_done * 100) / regions_tried; bu_log("Tried %d regions, %d converted to nmg's successfully. %g%%\n", regions_tried, regions_done, percent); } /* re-iterate warnings */ if (scale_error || solid_error || comb_error) bu_log("WARNING: the IGES file produced has errors:\n"); if (scale_error) bu_log("\t%d scaled objects found, written to IGES file without being scaled\n", scale_error); if (solid_error) bu_log("\t%d solids were not converted to IGES format\n", solid_error); if (comb_error) bu_log("\t%d combinations were not converted to IGES format\n", comb_error); return 0; }
int main(int argc, char *argv[]) { struct user_data your_data = {0, BN_TOL_INIT_ZERO}; int i; int c; char idbuf[132] = {0}; struct rt_i *rtip; struct db_tree_state init_state; bu_setprogname(argv[0]); bu_setlinebuf(stderr); /* calculational tolerances * mostly used by NMG routines */ your_data.tol.magic = BN_TOL_MAGIC; your_data.tol.dist = BN_TOL_DIST; your_data.tol.dist_sq = your_data.tol.dist * your_data.tol.dist; your_data.tol.perp = 1e-6; your_data.tol.para = 1 - your_data.tol.perp; /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "t:a:n:o:r:x:X:")) != -1) { switch (c) { case 't': /* calculational tolerance */ your_data.tol.dist = atof(bu_optarg); your_data.tol.dist_sq = your_data.tol.dist * your_data.tol.dist; case 'o': /* Output file name */ /* grab output file name */ break; case 'x': /* librt debug flag */ sscanf(bu_optarg, "%x", &RTG.debug); bu_printb("librt RT_G_DEBUG", RT_G_DEBUG, DEBUG_FORMAT); bu_log("\n"); break; case 'X': /* NMG debug flag */ sscanf(bu_optarg, "%x", &RTG.NMG_debug); bu_printb("librt RTG.NMG_debug", RTG.NMG_debug, NMG_DEBUG_FORMAT); bu_log("\n"); break; default: print_usage(argv[0]); break; } } if (bu_optind+1 >= argc) { print_usage(argv[0]); } /* Open BRL-CAD database */ /* Scan all the records in the database and build a directory */ rtip=rt_dirbuild(argv[bu_optind], idbuf, sizeof(idbuf)); if (rtip == RTI_NULL) { bu_exit(1, "g-xxx: rt_dirbuild failure\n"); } init_state = rt_initial_tree_state; bu_optind++; /* Walk the trees named on the command line * outputting combinations and primitives */ for (i=bu_optind; i<argc; i++) { db_walk_tree(rtip->rti_dbip, argc - i, (const char **)&argv[i], 1 /* bu_avail_cpus() */, &init_state, region_start, region_end, primitive_func, (void *) &your_data); } return 0; }
int main(int argc, char **argv) { int c; int i; struct pshell *psh; struct pbar *pbp; struct wmember head; struct wmember all_head; char *nastran_file = "Converted from NASTRAN file (stdin)"; bu_setprogname(argv[0]); fpin = stdin; units = INCHES; /* 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; while ((c=bu_getopt(argc, argv, "x:X:t:ni:o:mh?")) != -1) { switch (c) { case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); bu_printb("librt RT_G_DEBUG", RT_G_DEBUG, DEBUG_FORMAT); bu_log("\n"); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug); bu_printb("librt RTG.NMG_debug", RTG.NMG_debug, NMG_DEBUG_FORMAT); bu_log("\n"); break; case 't': /* calculational tolerance */ tol.dist = atof(bu_optarg); tol.dist_sq = tol.dist * tol.dist; break; case 'n': polysolids = 0; break; case 'm': units = MM; break; case 'i': fpin = fopen(bu_optarg, "rb"); if (fpin == (FILE *)NULL) { bu_log("Cannot open NASTRAN file (%s) for reading!\n", bu_optarg); bu_exit(1, Usage, argv[0]); } nastran_file = bu_optarg; break; case 'o': output_file = bu_optarg; break; default: bu_exit(1, Usage, argv[0]); } } fpout = wdb_fopen(output_file); if (fpout == NULL) { bu_log("Cannot open BRL-CAD file (%s) for writing!\n", output_file); bu_exit(1, Usage, argv[0]); } if (!fpin || !fpout) { bu_exit(1, Usage, argv[0]); } line = (char *)bu_malloc(MAX_LINE_SIZE, "line"); next_line = (char *)bu_malloc(MAX_LINE_SIZE, "next_line"); prev_line = (char *)bu_malloc(MAX_LINE_SIZE, "prev_line"); curr_rec = (char **)bu_calloc(NO_OF_FIELDS, sizeof(char *), "curr_rec"); for (i=0; i<NO_OF_FIELDS; i++) curr_rec[i] = (char *)bu_malloc(sizeof(char)*FIELD_LENGTH, "curr_rec[i]"); prev_rec = (char **)bu_calloc(NO_OF_FIELDS, sizeof(char *), "prev_rec"); for (i=0; i<NO_OF_FIELDS; i++) prev_rec[i] = (char *)bu_malloc(sizeof(char)*FIELD_LENGTH, "prev_rec[i]"); /* first pass, find start of NASTRAN "bulk data" */ start_off = (-1); bulk_data_start_line = 0; while (bu_fgets(line, MAX_LINE_SIZE, fpin)) { bulk_data_start_line++; if (bu_strncmp(line, "BEGIN BULK", 10)) continue; start_off = bu_ftell(fpin); break; } if (start_off < 0) { bu_log("Cannot find start of bulk data in NASTRAN file!\n"); bu_exit(1, Usage, argv[0]); } /* convert BULK data deck into something reasonable */ fptmp = bu_temp_file(NULL, 0); if (fptmp == NULL) { perror(argv[0]); bu_exit(1, "Cannot open temporary file\n"); } convert_input(); /* initialize some lists */ BU_LIST_INIT(&coord_head.l); BU_LIST_INIT(&pbar_head.l); BU_LIST_INIT(&pshell_head.l); BU_LIST_INIT(&all_head.l); nmg_model = (struct model *)NULL; /* count grid points */ bu_fseek(fptmp, 0, SEEK_SET); while (bu_fgets(line, MAX_LINE_SIZE, fptmp)) { if (!bu_strncmp(line, "GRID", 4)) grid_count++; } if (!grid_count) { bu_exit(1, "No geometry in this NASTRAN file!\n"); } /* get default values and properties */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { if (!bu_strncmp(curr_rec[0], "BAROR", 5)) { /* get BAR defaults */ bar_def_pid = atoi(curr_rec[2]); } else if (!bu_strncmp(curr_rec[0], "PBAR", 4)) { struct pbar *pb; BU_ALLOC(pb, struct pbar); pb->pid = atoi(curr_rec[1]); pb->mid = atoi(curr_rec[2]); pb->area = atof(curr_rec[3]); BU_LIST_INIT(&pb->head.l); BU_LIST_INSERT(&pbar_head.l, &pb->l); } else if (!bu_strncmp(curr_rec[0], "PSHELL", 6)) { BU_ALLOC(psh, struct pshell); psh->s = (struct shell *)NULL; psh->pid = atoi(curr_rec[1]); psh->mid = atoi(curr_rec[2]); psh->thick = atof(curr_rec[3]); BU_LIST_INSERT(&pshell_head.l, &psh->l); pshell_count++; } } /* allocate storage for grid points */ g_pts = (struct grid_point *)bu_calloc(grid_count, sizeof(struct grid_point), "grid points"); /* get all grid points */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { int gid; int cid; double tmp[3]; if (bu_strncmp(curr_rec[0], "GRID", 4)) continue; gid = atoi(curr_rec[1]); cid = atoi(curr_rec[2]); for (i=0; i<3; i++) { tmp[i] = atof(curr_rec[i+3]); } g_pts[grid_used].gid = gid; g_pts[grid_used].cid = cid; g_pts[grid_used].v = (struct vertex **)bu_calloc(pshell_count + 1, sizeof(struct vertex *), "g_pts vertex array"); VMOVE(g_pts[grid_used].pt, tmp); grid_used++; } /* find coordinate systems */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { if (bu_strncmp(curr_rec[0], "CORD", 4)) continue; get_coord_sys(); } /* convert everything to BRL-CAD coordinate system */ i = 0; while (convert_all_cs() || convert_all_pts()) { i++; if (i > 10) { bu_exit(1, "Cannot convert to default coordinate system, check for circular definition\n"); } } mk_id(fpout, nastran_file); /* get elements */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { if (!bu_strncmp(curr_rec[0], "CBAR", 4)) get_cbar(); else if (!bu_strncmp(curr_rec[0], "CROD", 4)) get_cbar(); else if (!bu_strncmp(curr_rec[0], "CTRIA3", 6)) get_ctria3(); else if (!bu_strncmp(curr_rec[0], "CQUAD4", 6)) get_cquad4(); } if (nmg_model) { nmg_rebound(nmg_model, &tol); if (polysolids) mk_bot_from_nmg(fpout, "pshell.0", nmg_shell); else mk_nmg(fpout, "pshell.0", nmg_model); } BU_LIST_INIT(&head.l); for (BU_LIST_FOR(psh, pshell, &pshell_head.l)) { struct model *m; char name[NAMESIZE+1]; if (!psh->s) continue; m = nmg_find_model(&psh->s->l.magic); nmg_rebound(m, &tol); nmg_fix_normals(psh->s, &tol); if (psh->thick > tol.dist) { nmg_model_face_fuse(m, &tol); nmg_hollow_shell(psh->s, psh->thick*conv[units], 1, &tol); } sprintf(name, "pshell.%d", psh->pid); if (polysolids) mk_bot_from_nmg(fpout, name, psh->s); else mk_nmg(fpout, name, m); mk_addmember(name, &head.l, NULL, WMOP_UNION); } if (BU_LIST_NON_EMPTY(&head.l)) { mk_lfcomb(fpout, "shells", &head, 0); mk_addmember("shells", &all_head.l, NULL, WMOP_UNION); } BU_LIST_INIT(&head.l); for (BU_LIST_FOR(pbp, pbar, &pbar_head.l)) { char name[NAMESIZE+1]; if (BU_LIST_IS_EMPTY(&pbp->head.l)) continue; sprintf(name, "pbar_group.%d", pbp->pid); mk_lfcomb(fpout, name, &pbp->head, 0); mk_addmember(name, &head.l, NULL, WMOP_UNION); } if (BU_LIST_NON_EMPTY(&head.l)) { mk_lfcomb(fpout, "pbars", &head, 0); mk_addmember("pbars", &all_head.l, NULL, WMOP_UNION); } if (BU_LIST_NON_EMPTY(&all_head.l)) { mk_lfcomb(fpout, "all", &all_head, 0); } wdb_close(fpout); return 0; }
int main(int argc, char *argv[]) { int c; struct directory* dp; struct db_i *dbip; /* setup BRL-CAD environment */ bu_setprogname(argv[0]); bu_setlinebuf(stderr); /* process command line arguments */ while ((c = bu_getopt(argc, argv, "vo:ys:fh?")) != -1) { switch (c) { case 'v': verbose++; break; case 'o': out_file = bu_optarg; break; case 'y': yup++; break; case 's': sscanf(bu_optarg, "%f", &scale); break; case 'f': flip_normals++; break; default: print_usage(argv[0]); } } /* param check */ if (bu_optind+1 >= argc) print_usage(argv[0]); /* get database filename and object */ db_file = argv[bu_optind++]; object = argv[bu_optind]; /* open BRL-CAD database */ if ((dbip = db_open(db_file, DB_OPEN_READONLY)) == DBI_NULL) { perror(argv[0]); bu_exit(1, "Cannot open geometry database file %s\n", db_file); } if (db_dirbuild(dbip)) bu_exit(1, "db_dirbuild() failed!\n"); if (verbose) fprintf(stderr, ">> opened db '%s'\n", dbip->dbi_title); /* setup output stream */ if (out_file == NULL) { fp_out = stdout; setmode(fileno(fp_out), O_BINARY); } else { if ((fp_out = fopen(out_file, "wb")) == NULL) { bu_log("Cannot open %s\n", out_file); perror(argv[0]); return 2; } } /* find requested object */ db_update_nref(dbip, &rt_uniresource); dp = db_lookup(dbip, object, 0); if (dp == RT_DIR_NULL) bu_exit(1, "Object %s not found in database!\n", object); /* generate mesh list */ db_functree(dbip, dp, NULL, mesh_tracker, &rt_uniresource, NULL); if (verbose) fprintf(stderr, ">> mesh count: %d\n", mesh_count); /* write out header */ write_header(dbip); /* write out meshes */ write_mesh_data(); /* finish */ dealloc_mesh_list(); db_close(dbip); return 0; }
int main(int argc, char *argv[]) { struct rt_i *rtip = NULL; char db_title[TITLE_LEN+1];/* title from MGED file */ const char *tmp_str; extern char local_u_name[65]; extern double base2local; extern double local2base; FILE *fPtr; int Ch; /* Option name */ int mat_flag = 0; /* Read matrix from stdin? */ int use_of_air = 0; int print_ident_flag = 1; char ocastring[1024] = {0}; struct bu_list script_list; /* For -e and -f options */ struct script_rec *srp; extern outval ValTab[]; /* from if.c, callback functions for overlap, hit, and miss shots */ int if_overlap(struct application *, struct partition *, struct region *, struct region *, struct partition *); int if_hit(struct application *, struct partition *, struct seg *); int if_miss(struct application *); BU_LIST_INIT(&script_list); bu_setprogname(argv[0]); ocname[OVLP_RESOLVE] = "resolve"; ocname[OVLP_REBUILD_FASTGEN] = "rebuild_fastgen"; ocname[OVLP_REBUILD_ALL] = "rebuild_all"; ocname[OVLP_RETAIN] = "retain"; *ocastring = '\0'; bu_optind = 1; /* restart */ /* Handle command-line options */ while ((Ch = bu_getopt(argc, argv, OPT_STRING)) != -1) { if (bu_optopt == '?') Ch='h'; switch (Ch) { case 'A': attrib_add(bu_optarg, &need_prep); break; case 'B': rt_bot_minpieces = atoi(bu_optarg); break; case 'T': setenv("LIBRT_BOT_MINTIE", bu_optarg, 1); break; case 'b': do_backout = 1; break; case 'E': if (nirt_debug & DEBUG_SCRIPTS) show_scripts(&script_list, "before erasure"); while (BU_LIST_WHILE(srp, script_rec, &script_list)) { BU_LIST_DEQUEUE(&(srp->l)); free_script(srp); } if (nirt_debug & DEBUG_SCRIPTS) show_scripts(&script_list, "after erasure"); break; case 'e': enqueue_script(&script_list, READING_STRING, bu_optarg); if (nirt_debug & DEBUG_SCRIPTS) show_scripts(&script_list, "after enqueueing a literal"); break; case 'f': enqueue_script(&script_list, READING_FILE, bu_optarg); if (nirt_debug & DEBUG_SCRIPTS) show_scripts(&script_list, "after enqueueing a file name"); break; case 'L': listformats(); bu_exit(EXIT_SUCCESS, NULL); case 'M': mat_flag = 1; break; case 'O': sscanf(bu_optarg, "%1024s", ocastring); break; case 's': silent_flag = SILENT_YES; /* Positively yes */ break; case 'v': silent_flag = SILENT_NO; /* Positively no */ break; case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&nirt_debug); break; case 'u': if (sscanf(bu_optarg, "%d", &use_of_air) != 1) { (void) fprintf(stderr, "Illegal use-air specification: '%s'\n", bu_optarg); return 1; } break; case 'H': if (sscanf(bu_optarg, "%d", &print_ident_flag) != 1) { (void) fprintf(stderr, "Illegal header output option specified: '%s'\n", bu_optarg); return 1; } break; default: printusage(); bu_exit (Ch != 'h', NULL); } } /* end while getopt */ if (argc - bu_optind < 2) { printusage(); return 1; } if (isatty(0)) { if (silent_flag != SILENT_YES) silent_flag = SILENT_NO; } else { /* stdin is not a TTY */ if (silent_flag != SILENT_NO) silent_flag = SILENT_YES; } if (silent_flag != SILENT_YES && print_ident_flag) (void) fputs(brlcad_ident("Natalie's Interactive Ray Tracer"), stdout); if (use_of_air && (use_of_air != 1)) { fprintf(stderr, "Warning: useair=%d specified, will set to 1\n", use_of_air); use_of_air = 1; } switch (*ocastring) { case '\0': overlap_claims = OVLP_RESOLVE; break; case '0': case '1': case '2': case '3': if (ocastring[1] == '\0') { sscanf(ocastring, "%d", &overlap_claims); } else { fprintf(stderr, "Illegal overlap_claims specification: '%s'\n", ocastring); return 1; } break; case 'r': if (BU_STR_EQUAL(ocastring, "resolve")) overlap_claims = OVLP_RESOLVE; else if (BU_STR_EQUAL(ocastring, "rebuild_fastgen")) overlap_claims = OVLP_REBUILD_FASTGEN; else if (BU_STR_EQUAL(ocastring, "rebuild_all")) overlap_claims = OVLP_REBUILD_ALL; else if (BU_STR_EQUAL(ocastring, "retain")) overlap_claims = OVLP_RETAIN; else { fprintf(stderr, "Illegal overlap_claims specification: '%s'\n", ocastring); return 1; } break; default: fprintf(stderr, "Illegal overlap_claims specification: '%s'\n", ocastring); return 1; } db_name = argv[bu_optind]; /* build directory for target object */ if (silent_flag != SILENT_YES) { printf("Database file: '%s'\n", db_name); printf("Building the directory..."); } if ((rtip = rt_dirbuild(db_name, db_title, TITLE_LEN)) == RTI_NULL) { fflush(stdout); fprintf(stderr, "Could not load file %s\n", db_name); return 1; } rti_tab[use_of_air] = rtip; rti_tab[1 - use_of_air] = RTI_NULL; rtip->useair = use_of_air; rtip->rti_save_overlaps = (overlap_claims > 0); ++bu_optind; do_rt_gettrees(rtip, argv + bu_optind, argc - bu_optind, &need_prep); /* Initialize the table of resource structures */ rt_init_resource(&res_tab, 0, rtip); /* initialization of the application structure */ RT_APPLICATION_INIT(&ap); ap.a_hit = if_hit; /* branch to if_hit routine */ ap.a_miss = if_miss; /* branch to if_miss routine */ ap.a_overlap = if_overlap;/* branch to if_overlap routine */ ap.a_logoverlap = rt_silent_logoverlap; ap.a_onehit = 0; /* continue through shotline after hit */ ap.a_resource = &res_tab; ap.a_purpose = "NIRT ray"; ap.a_rt_i = rtip; /* rt_i pointer */ ap.a_zero1 = 0; /* sanity check, sayth raytrace.h */ ap.a_zero2 = 0; /* sanity check, sayth raytrace.h */ ap.a_uptr = (void *)a_tab.attrib; /* initialize variables */ azimuth() = 0.0; elevation() = 0.0; direct(X) = -1.0; direct(Y) = 0.0; direct(Z) = 0.0; grid(HORZ) = 0.0; grid(VERT) = 0.0; grid(DIST) = 0.0; grid2targ(); set_diameter(rtip); /* initialize the output specification */ default_ospec(); /* initialize NIRT's local units */ base2local = rtip->rti_dbip->dbi_base2local; local2base = rtip->rti_dbip->dbi_local2base; tmp_str = bu_units_string(local2base); if (tmp_str) { bu_strlcpy(local_u_name, tmp_str, sizeof(local_u_name)); } else { bu_strlcpy(local_u_name, "Unknown units", sizeof(local_u_name)); } if (silent_flag != SILENT_YES) { printf("Database title: '%s'\n", db_title); printf("Database units: '%s'\n", local_u_name); printf("model_min = (%g, %g, %g) model_max = (%g, %g, %g)\n", rtip->mdl_min[X] * base2local, rtip->mdl_min[Y] * base2local, rtip->mdl_min[Z] * base2local, rtip->mdl_max[X] * base2local, rtip->mdl_max[Y] * base2local, rtip->mdl_max[Z] * base2local); } /* Run the run-time configuration file, if it exists */ if ((fPtr = fopenrc()) != NULL) { interact(READING_FILE, fPtr, rtip); fclose(fPtr); } /* Run all scripts specified on the command line */ run_scripts(&script_list, rtip); /* Perform the user interface */ if (mat_flag) { read_mat(rtip); return 0; } else { interact(READING_FILE, stdin, rtip); } return 0; }
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; }
or poly-bot file_poly.g file_bot.g\n\ Convert polysolids to BOT solids in v4 database format only\n"; int main(int argc, char **argv) { FILE *ifp; FILE *ofp; union record record; union record *poly; long poly_limit=0; long curr_poly=0; struct bn_tol tol; int polys=0; int frees=0; int others=0; int bots=0; int i; int num_rec; int first=1; bu_setprogname(argv[0]); ifp = stdin; ofp = stdout; /* 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; if (argc >= 3) { ifp = fopen(argv[1], "rb"); if (!ifp) perror(argv[1]); ofp = fopen(argv[2], "wb"); if (!ofp) perror(argv[2]); if (ifp == NULL || ofp == NULL) { bu_exit(1, "poly-bot: can't open files."); } #if defined(_WIN32) && !defined(__CYGWIN__) } else { setmode(fileno(ifp), O_BINARY); setmode(fileno(ofp), O_BINARY); #endif } if (isatty(fileno(ifp))) { bu_exit(1, "%s", usage); } poly = (union record *)bu_malloc( POLY_BLOCK * sizeof( union record ), "poly" ); poly_limit = POLY_BLOCK; /* Read database file */ while ( fread( (char *)&record, sizeof record, 1, ifp ) == 1 && !feof(ifp) ) { top: switch ( record.u_id ) { case ID_FREE: frees++; continue; case DBID_SKETCH: num_rec = ntohl(*(uint32_t *)&record.skt.skt_count); others += num_rec + 1; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying a SKETCH\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case DBID_EXTR: num_rec = ntohl(*(uint32_t *)&record.extr.ex_count); others += num_rec + 1; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying an EXTRUSION\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case DBID_NMG: num_rec = ntohl(*(uint32_t *)&record.nmg.N_count); others += num_rec + 1; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying an ARBN\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case DBID_PIPE: num_rec = ntohl(*(uint32_t *)&record.pwr.pwr_count); others += num_rec + 1; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying a PIPE\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case DBID_ARBN: num_rec = ntohl(*(uint32_t *)&record.n.n_grans); others += num_rec + 1; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying an ARBN\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case DBID_STRSOL: num_rec = DB_SS_NGRAN - 1; others += num_rec + 1; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying a STRSOL\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case ID_BSURF: num_rec = record.d.d_nknots + record.d.d_nctls; others += num_rec + 1; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying a NURB\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case DBID_BOT: bots++; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); num_rec = ntohl(*(uint32_t *)&record.bot.bot_nrec); for ( i=0; i<num_rec; i++ ) { if ( fread( (char *)&record, sizeof record, 1, ifp ) != 1 ) bu_exit(1, "Unexpected EOF encountered while copying a BOT\n" ); if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } break; case ID_P_HEAD: { struct rt_db_internal intern; struct bu_external ext; struct bu_external ext2; polys++; curr_poly = 0; poly[curr_poly++] = record; /* struct copy */ bu_log( "Converting %s\n", poly[0].p.p_name ); while ( fread( (char *)&record, sizeof record, 1, ifp ) == 1 && !feof(ifp) && record.u_id == ID_P_DATA ) { if ( curr_poly >= poly_limit ) { poly_limit += POLY_BLOCK; poly = (union record *)bu_realloc( poly, poly_limit*sizeof( union record ), "poly realloc" ); } poly[curr_poly++] = record; /* struct copy */ } BU_EXTERNAL_INIT( &ext ); ext.ext_nbytes = curr_poly * sizeof( union record ); ext.ext_buf = (uint8_t *)poly; if ( rt_functab[ID_POLY].ft_import4( &intern, &ext, bn_mat_identity, (struct db_i *)NULL, &rt_uniresource ) ) { bu_exit(1, "Import failed for polysolid %s\n", poly[0].p.p_name ); } /* Don't free this ext buffer! */ if ( rt_pg_to_bot( &intern, &tol, &rt_uniresource ) < 0 ) { bu_exit(1, "Unable to convert polysolid %s\n", poly[0].p.p_name ); } BU_EXTERNAL_INIT( &ext2 ); if ( rt_functab[ID_POLY].ft_export4( &ext2, &intern, 1.0, (struct db_i *)NULL, &rt_uniresource ) < 0 ) { bu_exit(1, "Unable to export v4 BoT %s\n", poly[0].p.p_name ); } rt_db_free_internal(&intern); if ( db_fwrite_external( ofp, poly[0].p.p_name, &ext2 ) < 0 ) { bu_exit(1, "Unable to fwrite v4 BoT %s\n", poly[0].p.p_name ); } bu_free_external( &ext2 ); if ( feof( ifp ) ) break; goto top; } case ID_P_DATA: /* This should not happen! */ bu_log( "ERROR: Unattached polysolid data record!\n" ); continue; default: if ( first ) { if ( record.u_id != ID_IDENT ) { bu_exit(1, "This is not a BRL-CAD 'v4' database, aborting.\n" ); } first = 0; } others++; if ( fwrite( &record, sizeof( union record ), 1, ofp ) < 1 ) bu_exit(1, "Write failed!\n" ); } } bu_log( "%d polysolids converted to BOT solids\n", polys ); bu_log( "%d BOT solids copied without change\n", bots ); bu_log( "%d other records copied without change\n", others ); bu_log( "%d free records skipped\n", frees ); fclose(ofp); return 0; }
int main(int argc, char *argv[]) { int verbose = 0; int ncpu = 1; /* Number of processors */ char *output_file = NULL; /* output filename */ struct db_i *dbip; struct model *the_model; struct rt_tess_tol ttol; /* tessellation tolerance in mm */ struct db_tree_state tree_state; /* includes tol & model */ int i, use_mc = 0, use_bottess = 0; struct egg_conv_data conv_data; struct gcv_region_end_data gcvwriter = {nmg_to_egg, NULL}; gcvwriter.client_data = (void *)&conv_data; bu_setprogname(argv[0]); bu_setlinebuf(stderr); tree_state = rt_initial_tree_state; /* struct copy */ tree_state.ts_tol = &conv_data.tol; tree_state.ts_ttol = &ttol; tree_state.ts_m = &the_model; /* Set up tessellation tolerance defaults */ ttol.magic = RT_TESS_TOL_MAGIC; /* Defaults, updated by command line options. */ ttol.abs = 0.0; ttol.rel = 0.01; ttol.norm = 0.0; /* Set up calculation tolerance defaults */ /* FIXME: These need to be improved */ conv_data.tol.magic = BN_TOL_MAGIC; conv_data.tol.dist = BN_TOL_DIST; conv_data.tol.dist_sq = conv_data.tol.dist * conv_data.tol.dist; conv_data.tol.perp = 1e-6; conv_data.tol.para = 1 - conv_data.tol.perp; conv_data.tot_polygons = 0; /* make empty NMG model */ the_model = nmg_mm(); BU_LIST_INIT(&RTG.rtg_vlfree); /* for vlist macros */ /* Get command line arguments. */ while ((i = bu_getopt(argc, argv, "a:89n:o:r:vx:D:P:X:h?")) != -1) { switch (i) { case 'a': /* Absolute tolerance. */ ttol.abs = atof(bu_optarg); ttol.rel = 0.0; break; case 'n': /* Surface normal tolerance. */ ttol.norm = atof(bu_optarg); ttol.rel = 0.0; break; case 'o': /* Output file name. */ output_file = bu_optarg; break; case 'r': /* Relative tolerance. */ ttol.rel = atof(bu_optarg); break; case 'v': verbose++; break; case 'P': ncpu = atoi(bu_optarg); break; case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); break; case 'D': conv_data.tol.dist = atof(bu_optarg); conv_data.tol.dist_sq = conv_data.tol.dist * conv_data.tol.dist; rt_pr_tol(&conv_data.tol); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug); break; case '8': use_mc = 1; break; case '9': use_bottess = 1; break; default: usage(argv[0]); } } if (bu_optind+1 >= argc) usage(argv[0]); conv_data.fp = stdout; if (output_file) { if ((conv_data.fp=fopen(output_file, "wb+")) == NULL) { perror(argv[0]); bu_exit(1, "Cannot open ASCII output file (%s) for writing\n", output_file); } } /* Open brl-cad database */ argc -= bu_optind; argv += bu_optind; if (argc < 2 || argv[0] == NULL || argv[1] == NULL) usage(argv[0]); gcvwriter.write_region = nmg_to_egg; if ((dbip = db_open(argv[0], DB_OPEN_READONLY)) == DBI_NULL) { perror(argv[0]); bu_exit(1, "Unable to open geometry database file (%s)\n", argv[0]); } if (db_dirbuild(dbip)) { bu_exit(1, "ERROR: db_dirbuild failed\n"); } BN_CK_TOL(tree_state.ts_tol); RT_CK_TESS_TOL(tree_state.ts_ttol); if (verbose) { bu_log("Model: %s\n", argv[0]); bu_log("Objects:"); for (i=1; i<argc; i++) bu_log(" %s", argv[i]); bu_log("\nTessellation tolerances:\n\tabs = %g mm\n\trel = %g\n\tnorm = %g\n", tree_state.ts_ttol->abs, tree_state.ts_ttol->rel, tree_state.ts_ttol->norm); bu_log("Calculational tolerances:\n\tdist = %g mm perp = %g\n", tree_state.ts_tol->dist, tree_state.ts_tol->perp); } /* print the egg header stuff, including the command line to execute it */ fprintf(conv_data.fp, "<CoordinateSystem> { Z-Up }\n\n"); fprintf(conv_data.fp, "<Comment> {\n \"%s", *argv); for (i=1; i<argc; i++) fprintf(conv_data.fp, " %s", argv[i]); fprintf(conv_data.fp, "\"\n}\n"); /* Walk indicated tree(s). Each region will be output separately */ while (--argc) { fprintf(conv_data.fp, "<Group> %s {\n", *(argv+1)); (void) db_walk_tree(dbip, /* db_i */ 1, /* argc */ (const char **)(++argv), /* argv */ ncpu, /* ncpu */ &tree_state, /* state */ NULL, /* start func */ use_mc?gcv_region_end_mc:use_bottess?gcv_bottess_region_end:gcv_region_end, /* end func */ use_mc?NULL:nmg_booltree_leaf_tess, /* leaf func */ (void *)&gcvwriter); /* client_data */ fprintf(conv_data.fp, "}\n"); } bu_log("%ld triangles written\n", conv_data.tot_polygons); if (output_file) fclose(conv_data.fp); /* Release dynamic storage */ nmg_km(the_model); rt_vlist_cleanup(); db_close(dbip); return 0; }
int main(int argc, char **argv) { int c; double percent; bu_setprogname(argv[0]); bu_setlinebuf(stderr); tree_state = rt_initial_tree_state; /* struct copy */ tree_state.ts_tol = &tol; tree_state.ts_ttol = &ttol; tree_state.ts_m = &the_model; /* Set up tessellation tolerance defaults */ ttol.magic = RT_TESS_TOL_MAGIC; /* Defaults, updated by command line options. */ ttol.abs = 0.0; ttol.rel = 0.01; ttol.norm = 0.0; /* Set up calculation tolerance defaults */ /* 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; /* init resources we might need */ rt_init_resource(&rt_uniresource, 0, NULL); /* make empty NMG model */ the_model = nmg_mm(); /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "r:a:n:o:vx:D:X:h?")) != -1) { switch (c) { case 'r': /* Relative tolerance. */ ttol.rel = atof(bu_optarg); break; case 'a': /* Absolute tolerance. */ ttol.abs = atof(bu_optarg); ttol.rel = 0.0; break; case 'n': /* Surface normal tolerance. */ ttol.norm = atof(bu_optarg); ttol.rel = 0.0; break; case 'o': /* Output file name. */ /* grab output file name */ break; case 'v': verbose++; break; case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); break; case 'D': tol.dist = atof(bu_optarg); tol.dist_sq = tol.dist * tol.dist; rt_pr_tol(&tol); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug); NMG_debug = RTG.NMG_debug; break; default: bu_exit(1, usage, argv[0]); } } if (bu_optind+1 >= argc) bu_exit(1, usage, argv[0]); /* Open output file */ /* Open BRL-CAD database */ argc -= bu_optind; argv += bu_optind; if ((dbip = db_open(argv[0], DB_OPEN_READONLY)) == DBI_NULL) { perror(argv[0]); bu_exit(1, "ERROR: Unable to open geometry database file (%s)\n", argv[0]); } if (db_dirbuild(dbip)) bu_exit(1, "db_dirbuild failed\n"); BN_CK_TOL(tree_state.ts_tol); RT_CK_TESS_TOL(tree_state.ts_ttol); if (verbose) { int i; bu_log("Model: %s\n", argv[0]); bu_log("Objects:"); for (i = 1; i < argc; i++) bu_log(" %s", argv[i]); bu_log("\nTessellation tolerances:\n\tabs = %g mm\n\trel = %g\n\tnorm = %g\n", tree_state.ts_ttol->abs, tree_state.ts_ttol->rel, tree_state.ts_ttol->norm); bu_log("Calculational tolerances:\n\tdist = %g mm perp = %g\n", tree_state.ts_tol->dist, tree_state.ts_tol->perp); } /* Walk indicated tree(s). Each region will be output separately */ (void) db_walk_tree(dbip, argc-1, (const char **)(argv+1), 1, /* ncpu */ &tree_state, 0, /* take all regions */ do_region_end, nmg_booltree_leaf_tess, (void *)NULL); /* in librt/nmg_bool.c */ percent = 0; if (regions_tried>0) { percent = ((double)regions_converted * 100) / regions_tried; bu_log("Tried %d regions, %d converted to NMG's successfully. %g%%\n", regions_tried, regions_converted, percent); } percent = 0; if (regions_tried > 0) { percent = ((double)regions_written * 100) / regions_tried; bu_log(" %d triangulated successfully. %g%%\n", regions_written, percent); } bu_log("%zd triangles written\n", tot_polygons); bu_log("Tessellation parameters used:\n"); bu_log(" abs [-a] %g\n", ttol.abs); bu_log(" rel [-r] %g\n", ttol.rel); bu_log(" norm [-n] %g\n", ttol.norm); bu_log(" dist [-D] %g\n", tol.dist); /* Release dynamic storage */ nmg_km(the_model); rt_vlist_cleanup(); db_close(dbip); return 0; }
int icv_rot(size_t argc, const char *argv[]) { const size_t MAXPIXELS = 16768 * 16768; /* boo hiss */ ssize_t x, y; size_t j; int ret = 0; off_t outbyte, outplace; FILE *ifp, *ofp; unsigned char *obuf; unsigned char *buffer; double angle = 0.0; ssize_t wrote = 0; ifp = stdin; ofp = stdout; bu_setprogname(argv[0]); if (!get_args(argc, argv, &ifp, &ofp, &angle)) { bu_exit(1, "Usage: %s [-rifb | -a angle] [-# bytes] [-s squaresize] [-w width] [-n height] [-o outputfile] inputfile [> outputfile]\n", argv[0]); } scanbytes = nxin * pixbytes; buflines = MAXPIXELS / nxin; if (buflines <= 0) { bu_exit(1, "ERROR: %s is not compiled to handle a scanline that long!\n", argv[0]); } if (buflines > nyin) buflines = nyin; buffer = (unsigned char *)bu_malloc(buflines * scanbytes, "buffer"); obuf = (unsigned char *)bu_malloc((nyin > nxin) ? nyin*pixbytes : nxin*pixbytes, "obuf"); /* * Break out to added arbitrary angle routine */ if (angle > 0.0) { arbrot(angle, ifp, buffer); goto done; } /* * Clear our "file pointer." We need to maintain this * In order to tell if seeking is required. ftell() always * fails on pipes, so we can't use it. */ outplace = 0; yin = 0; while (yin < nyin) { /* Fill buffer */ fill_buffer(ifp, buffer); if (!buflines) break; if (reverse) reverse_buffer(buffer); if (plus90) { for (x = 0; x < nxin; x++) { obp = obuf; bp = &buffer[ (lasty-firsty)*scanbytes + x*pixbytes ]; for (y = lasty+1; y > yin; y--) { /* firsty? */ for (j = 0; j < pixbytes; j++) *obp++ = *bp++; bp -= scanbytes + pixbytes; } yout = x; xout = (nyin - 1) - lasty; outbyte = ((yout * nyin) + xout) * pixbytes; if (outplace != outbyte) { if (bu_fseek(ofp, outbyte, SEEK_SET) < 0) { ret = 3; perror("fseek"); bu_log("ERROR: %s can't seek on output (ofp=%p, outbyte=%zd)\n", argv[0], (void *)ofp, outbyte); goto done; } outplace = outbyte; } wrote = fwrite(obuf, pixbytes, buflines, ofp); if (wrote != buflines) { ret = 4; perror("fwrite"); bu_log("ERROR: %s can't out write image data (wrote %zd of %zd)\n", argv[0], wrote, buflines); goto done; } outplace += buflines*pixbytes; } } else if (minus90) { for (x = nxin; x > 0; x--) { obp = obuf; bp = &buffer[ (x-1)*pixbytes ]; for (y = firsty+1; (ssize_t)y < lasty; y++) { for (j = 0; j < pixbytes; j++) *obp++ = *bp++; bp += scanbytes - pixbytes; } yout = (nxin - 1) - x + 1; xout = yin; outbyte = ((yout * nyin) + xout) * pixbytes; if (outplace != outbyte) { if (bu_fseek(ofp, outbyte, SEEK_SET) < 0) { ret = 3; perror("fseek"); bu_log("ERROR: %s can't seek on output (ofp=%p, outbyte=%zd)\n", argv[0], (void *)ofp, outbyte); goto done; } outplace = outbyte; } wrote = fwrite(obuf, pixbytes, buflines, ofp); if (wrote != buflines) { ret = 4; perror("fwrite"); bu_log("ERROR: %s can't out write image data (wrote %zd of %zd)\n", argv[0], wrote, buflines); goto done; } outplace += buflines*pixbytes; } } else if (invert) { for (y = lasty+1; (ssize_t)y > firsty; y--) { yout = (nyin - 1) - y + 1; outbyte = yout * scanbytes; if (outplace != outbyte) { if (bu_fseek(ofp, outbyte, SEEK_SET) < 0) { ret = 3; perror("fseek"); bu_log("ERROR: %s can't seek on output (ofp=%p, outbyte=%zd)\n", argv[0], (void *)ofp, outbyte); goto done; } outplace = outbyte; } wrote = fwrite(&buffer[(y-firsty-1)*scanbytes], 1, scanbytes, ofp); if (wrote != scanbytes) { ret = 4; perror("fwrite"); bu_log("ERROR: %s can't out write image data (wrote %zd of %zd)\n", argv[0], wrote, scanbytes); goto done; } outplace += scanbytes; } } else { /* Reverse only */ for (y = 0; y < buflines; y++) { wrote = fwrite(&buffer[y*scanbytes], 1, scanbytes, ofp); if (wrote != scanbytes) { ret = 4; perror("fwrite"); bu_log("ERROR: %s can't out write image data (wrote %zd of %zd)\n", argv[0], wrote, scanbytes); goto done; } } } yin += buflines; } done: fclose(ifp); bu_free(buffer, "buffer"); bu_free(obuf, "obuf"); return ret; }