int write_Octree(Octree *parentp, FILE *fp) { PtList *ptp; F_Hdr_Ptlist hdr_ptlist; off_t addr = bu_ftell( fp ); if (addr < 0) { bu_log("Error: couldn't get input file's current file position.\n"); return 0; } /* Write temperature and bogus number of points for this leaf. */ hdr_ptlist.f_temp = parentp->o_temp; hdr_ptlist.f_length = 0; if ( fwrite( (char *) &hdr_ptlist, sizeof(F_Hdr_Ptlist), 1, fp ) != 1 ) { bu_log( "\"%s\"(%d) Write failed!\n", __FILE__, __LINE__ ); return 0; } /* Write out list of points. */ for ( ptp = parentp->o_points->c_next; ptp != PTLIST_NULL; ptp = ptp->c_next ) { hdr_ptlist.f_length++; if ( fwrite( (char *) ptp->c_point, sizeof(ptp->c_point), 1, fp ) != 1 ) { bu_log( "\"%s\"(%d) Write failed.\n", __FILE__, __LINE__ ); return 0; } } if ( hdr_ptlist.f_length > 0 ) { /* Go back and fudge point count. */ if ( bu_fseek( fp, addr, 0 ) ) { bu_log( "\"%s\"(%d) Fseek failed.\n", __FILE__, __LINE__ ); return 0; } if ( fwrite( (char *) &hdr_ptlist, sizeof(hdr_ptlist), 1, fp ) != 1 ) { bu_log( "\"%s\"(%d) Write failed!\n", __FILE__, __LINE__ ); return 0; } /* Re-position write pointer to end-of-file. */ if ( bu_fseek( fp, 0, 2 ) ) { bu_log( "\"%s\"(%d) Fseek failed.\n", __FILE__, __LINE__ ); return 0; } } return 1; }
struct vfont_file get_font(const char* fontname, void (*vfont_log)(const char *fmt, ...)) { struct vfont_file font; struct header lochdr; static char fname[FONTNAMESZ]; /* Initialize vfont */ memset(&font, 0, sizeof(struct vfont_file)); if (fontname == NULL) fontname = FONTNAME; if (fontname[0] != '/') { /* absolute path */ const char *vfont = bu_brlcad_data("vfont", 1); if (vfont) snprintf(fname, FONTNAMESZ, "%s/%s", vfont, fontname); else bu_strlcpy(fname, fontname, sizeof(fname)); } else bu_strlcpy(fname, fontname, sizeof(fname)); /* Open the file and read in the header information. */ font.ffdes = fopen(fname, "rb"); if (font.ffdes == NULL) { if (vfont_log) vfont_log("Error opening font file '%s'\n", fname); font.ffdes = NULL; return font; } if (fread((char *)&lochdr, (int)sizeof(struct header), 1, font.ffdes) != 1) { if (vfont_log) vfont_log("get_Font() read failed!\n"); font.ffdes = NULL; return font; } SWAB(lochdr.magic); SWAB(lochdr.size); SWAB(lochdr.maxx); SWAB(lochdr.maxy); SWAB(lochdr.xtend); if (lochdr.magic != 0436) { if (vfont_log) vfont_log("Not a font file \"%s\": magic=0%o\n", fname, (int)lochdr.magic); font.ffdes = NULL; return font; } font.hdr = lochdr; /* Read in the directory for the font. */ if (fread((char *) font.dir, (int)sizeof(struct dispatch), 256, font.ffdes) != 256) { if (vfont_log) vfont_log("get_Font() read failed!\n"); font.ffdes = NULL; return font; } /* Addresses of characters in the file are relative to point in * the file after the directory, so grab the current position. */ font.offset = bu_ftell(font.ffdes); return font; }
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; }
void dofile(FILE *fp) { int c; while ((c = getc(fp)) != EOF) { switch (c) { /* One of a kind functions */ case 'e': case 'F': putchar(c); break; case 'f': case 't': putchar(c); copy_string(fp); break; case 'C': putchar(c); COPY(3); break; case 'c': /* map x, y? */ putchar(c); COPY(6); break; case 'a': /* map points? */ putchar(c); COPY(12); break; case 'p': case 'm': case 'n': /* Two coordinates in, three out. Change command. */ putchar(UPPER_CASE(c)); two_coord_out(fp, rmat); break; case 'l': putchar('L'); two_coord_out(fp, rmat); two_coord_out(fp, rmat); break; case 'P': case 'M': case 'N': putchar(c); three_coord_out(fp, rmat); break; case 'L': putchar(c); three_coord_out(fp, rmat); three_coord_out(fp, rmat); break; case 's': { /* 2-D integer SPACE command. * This is the only AT&T compatible space * command; be certain to only output * with pl_space(), to ensure that output * file is AT&T style if input was. */ long minx, miny, maxx, maxy; point_t min, max; minx = getshort(fp); miny = getshort(fp); maxx = getshort(fp); maxy = getshort(fp); VSET(min, minx, miny, -1); VSET(max, maxx, maxy, -1); model_rpp(min, max); minx = lrint(floor(space_min[X])); miny = lrint(floor(space_min[Y])); maxx = lrint(ceil(space_max[X])); maxy = lrint(ceil(space_max[Y])); if (minx < -32768) minx = -32768; if (miny < -32768) miny = -32768; if (maxx > 32767) maxx = 32767; if (maxy > 32767) maxy = 32767; pl_space(stdout, minx, miny, maxx, maxy); } break; case 'S': { /* BRL-extended 3-D integer SPACE command */ point_t min, max; min[X] = getshort(fp); min[Y] = getshort(fp); min[Z] = getshort(fp); max[X] = getshort(fp); max[Y] = getshort(fp); max[Z] = getshort(fp); model_rpp(min, max); pdv_3space(stdout, space_min, space_max); } break; /* 2D and 3D IEEE */ case 'w': { /* BRL 2-D floating point SPACE command */ point_t min, max; min[X] = getdouble(fp); min[Y] = getdouble(fp); min[Z] = -1.0; max[X] = getdouble(fp); max[Y] = getdouble(fp); max[Z] = 1.0; model_rpp(min, max); pdv_3space(stdout, space_min, space_max); } break; case 'W': { /* BRL 3-D floating point SPACE command */ point_t min, max; min[X] = getdouble(fp); min[Y] = getdouble(fp); min[Z] = getdouble(fp); max[X] = getdouble(fp); max[Y] = getdouble(fp); max[Z] = getdouble(fp); model_rpp(min, max); pdv_3space(stdout, space_min, space_max); } break; case 'i': putchar(c); COPY(3*8); break; case 'r': putchar(c); COPY(6*8); break; case 'x': case 'o': case 'q': /* Two coordinates in, three out. Change command. */ putchar(UPPER_CASE(c)); two_dcoord_out(fp, rmat); break; case 'v': /* Two coordinates in, three out. Change command. */ putchar('V'); two_dcoord_out(fp, rmat); two_dcoord_out(fp, rmat); break; case 'X': case 'O': case 'Q': putchar(c); three_dcoord_out(fp, rmat); break; case 'V': putchar(c); three_dcoord_out(fp, rmat); three_dcoord_out(fp, rmat); break; default: bu_log("plot3rot: unrecognized command '%c' (0x%x)\n", (isascii(c) && isprint(c)) ? c : '?', c); bu_log("plot3rot: ftell = %ld\n", bu_ftell(fp)); putchar(c); break; } } }
int main(int argc, char *argv[]) { int length, frame_number, number, success, maxnum; int first_frame, spread, reserve; off_t last_pos; char line[MAXLEN]; char pbuffer[MAXLEN*MAXLINES]; if (!get_args(argc, argv)) fprintf(stderr, "Get_args error\n"); /* copy any lines preceding the first "start" command */ last_pos = bu_ftell(stdin); while (bu_fgets(line, MAXLEN, stdin)!=NULL) { if (bu_strncmp(line, "start", 5)) { printf("%s", line); last_pos = bu_ftell(stdin); } else break; } /* read the frame number of the first "start" command */ sscanf(strpbrk(line, "0123456789"), "%d", &frame_number); /* find the highest frame number in the file */ maxnum = 0; while (bu_fgets(line, MAXLEN, stdin)!=NULL) { if (!bu_strncmp(line, "start", 5)) { sscanf(strpbrk(line, "0123456789"), "%d", &number); maxnum = (maxnum>number)?maxnum:number; } } length = maxnum - frame_number + 1; /* spread should initially be the smallest power of two larger than * or equal to length */ spread = 2; while (spread < length) spread = spread<<1; first_frame = frame_number; success = 1; while (length--) { number = -1; success = 0; /* tells whether or not any frames have been found which have the current frame number*/ if (incremental) { bu_fseek(stdin, 0, 0); } else { bu_fseek(stdin, last_pos, 0); } reserve = MAXLEN*MAXLINES; pbuffer[0] = '\0'; /* delete old pbuffer */ /* inner loop: search through the entire file for frames */ /* which have the current frame number */ while (!feof(stdin)) { /*read to next "start" command*/ while (bu_fgets(line, MAXLEN, stdin)!=NULL) { if (!bu_strncmp(line, "start", 5)) { sscanf(strpbrk(line, "0123456789"), "%d", &number); break; } } if (number==frame_number) { if (!success) { /*first successful match*/ printf("%s", line); if (!suppressed) printf("clean;\n"); success = 1; last_pos = bu_ftell(stdin); } /* print contents until next "end" */ while (bu_fgets(line, MAXLEN, stdin)!=NULL) { if (!bu_strncmp(line, "end;", 4)) break; else if (bu_strncmp(line, "clean", 5)) printf("%s", line); } /* save contents until next "start" */ while (bu_fgets(line, MAXLEN, stdin)!=NULL) { if (!bu_strncmp(line, "start", 5)) break; else { reserve -= strlen(line); reserve -= 1; if (reserve > 0) { bu_strlcat(pbuffer, line, reserve + strlen(line) + 1); } else { printf("ERROR: ran out of buffer space (%d characters)\n", MAXLEN*MAXLINES); } } } } } if (success) printf("end;\n"); /* print saved-up post-raytracing commands, if any */ printf("%s", pbuffer); /* get next frame number */ if (incremental) { frame_number = frame_number + 2*spread; while (frame_number > maxnum) { spread = spread>>1; frame_number = first_frame + spread; } } else { frame_number += 1; } }