void make_room(char *rname, fastf_t *imin, fastf_t *imax, fastf_t *thickness, struct wmember *headp) /* Interior RPP min point */ { struct wmember head; char name[32]; vect_t omin; vect_t omax; BU_LIST_INIT( &head.l ); VSUB2( omin, imin, thickness ); VADD2( omax, imax, thickness ); snprintf( name, 32, "o%s", rname ); mk_rpp( outfp, name, omin, omax ); (void)mk_addmember( name, &head.l, NULL, WMOP_UNION ); snprintf( name, 32, "i%s", rname ); mk_rpp( outfp, name, imin, imax ); mk_addmember( name, &head.l, NULL, WMOP_SUBTRACT ); mk_lfcomb( outfp, rname, &head, 1 ); (void)mk_addmember( rname, &(headp->l), NULL, WMOP_UNION ); }
void RegionList::create(rt_wdb* wdbp) { wmember allRegions; BU_LIST_INIT(&allRegions.l); for (std::map<std::string, Bot>::iterator it = m_list.begin(); it != m_list.end(); ++it) { it->second.write(wdbp); wmember regionContent; BU_LIST_INIT(®ionContent.l); mk_addmember(it->second.name().c_str(), ®ionContent.l, 0, WMOP_UNION); int id = (int)toValue(it->first.c_str()); mk_lrcomb(wdbp, it->first.c_str(), ®ionContent, 1, "plastic", "sh=4 sp=0.5 di=0.5 re=0.1", 0, id, 0, 0, 100, 0); mk_addmember(it->first.c_str(), &allRegions.l, 0, WMOP_UNION); mk_freemembers(®ionContent.l); } mk_lfcomb(wdbp, "all.g", &allRegions, 0); mk_freemembers(&allRegions.l); }
int main(int argc, char **argv) { if (argc != 2) { fputs(usage, stderr); return 1; } BU_LIST_INIT(&head.l); outfp = wdb_fopen("molecule.g"); mk_id(outfp, argv[1]); read_data(); /* Build the overall combination */ mk_lfcomb(outfp, "mol.g", &head, 0); wdb_close(outfp); return 0; }
void make_pillar(char *prefix, int ix, int iy, fastf_t *center, fastf_t *lwh, struct wmember *headp) /* center of base */ { vect_t min, max; unsigned char rgb[4]; /* needs all 4 */ char pilname[32], rname[32], sname[32], oname[32]; int i; struct wmember head; struct wmember *wp; BU_LIST_INIT( &head.l ); snprintf( pilname, 32, "%s%d,%d", prefix, ix, iy ); snprintf( rname, 32, "%s.r", pilname ); snprintf( sname, 32, "%s.s", pilname ); snprintf( oname, 32, "Obj%d,%d", ix, iy ); VMOVE( min, center ); min[X] -= lwh[X]; min[Y] -= lwh[Y]; VADD2( max, center, lwh ); mk_rpp( outfp, sname, min, max ); /* Needs to be in a region, with color! */ get_rgb(rgb); i = PICK_MAT; mk_region1( outfp, rname, sname, mtab[i].mt_name, mtab[i].mt_param, rgb ); (void)mk_addmember( rname, &head.l, NULL, WMOP_UNION ); wp = mk_addmember( oname, &head.l, NULL, WMOP_UNION ); MAT_DELTAS( wp->wm_mat, center[X], center[Y], center[Z]+lwh[Z] ); mk_lfcomb( outfp, pilname, &head, 0 ); (void)mk_addmember( pilname, &(headp->l), NULL, WMOP_UNION ); }
void createRegions(struct rt_wdb* wdbp) { struct wmember tophead; BU_LIST_INIT(&tophead.l); for (std::map<std::string, Region*>::iterator it = regionTable.begin(); it != regionTable.end(); ++it) { Region* regionp = it->second; std::cout << regionp->getDescription() << std::endl; if ((regionp->getMaterial() != 0) && (regionp->nonEmpty())) regionp->push(wdbp, &tophead); else std::cout << "Empty region: " << regionp->getCompNr() << (regionp->referred() ? " (referred)" : " (unreferred)") << std::endl; } mk_lfcomb(wdbp, "g_all", &tophead, 0); mk_freemembers(&tophead.l); }
void build_cyl(char *cname, int npts, double radius) { int i; vect_t v, h, a, b; char name[32]; struct wmember head; BU_LIST_INIT(&head.l); for (i=0; i<npts-1; i++) { VMOVE(v, sample[i]); VSUB2(h, sample[i+1], v); VSET(a, 0, radius, 0); VSET(b, 0, 0, radius); snprintf(name, 32, "%s%d", cname, i); mk_tgc(outfp, name, v, h, a, b, a, b); (void)mk_addmember(name, &head.l, NULL, WMOP_UNION); } mk_lfcomb(outfp, cname, &head, 0); }
int main(int argc, char **argv) { /* START # 1 */ struct rt_wdb *fpw; /* File to be written to. */ char filemged[26] = {0}; /* Mged file create. */ double hgt=0; /* Height, width, & depth of gas tank. */ double wid=0; double dpt=0; double rds=0; /* Radius of the corner of gas tank. */ point_t pts[8]; /* Points for arb8. */ point_t bs; /* Base of cylinder. */ vect_t ht; /* Height of cylinder. */ fastf_t rad; /* Radius of cylinder & sphere. */ point_t cent; /* Center of sphere. */ /* point_t and vect_t are set using typedef of type fastf_t. */ /* fastf_t is a type that is machine dependent. */ char *temp; /* Temporary character string. */ char temp1[16]; /* Temporary character string. */ char solnam[9]; /* Solid name. */ char regnam[9]; /* Region name. */ char grpnam[5]; /* Group name. */ int numtnk=0; /* Number of gas tanks to be created */ /* (<=26). */ struct wmember comb; /* Used to make regions. */ struct wmember comb1; /* Used to make groups. */ int i, j, k; /* Loop counters. */ int ret; /* Set up solid, region, and group names. */ solnam[0] = 's'; solnam[1] = '.'; solnam[2] = 't'; solnam[3] = 'n'; solnam[4] = 'k'; solnam[5] = ' '; solnam[6] = '#'; solnam[7] = '#'; solnam[8] = '\0'; regnam[0] = 'r'; regnam[1] = '.'; regnam[2] = 't'; regnam[3] = 'n'; regnam[4] = 'k'; regnam[5] = ' '; regnam[6] = '#'; regnam[7] = '#'; regnam[8] = '\0'; grpnam[0] = 't'; grpnam[1] = 'n'; grpnam[2] = 'k'; grpnam[3] = ' '; grpnam[4] = '\0'; /* If there are no arguments ask questions. */ if (argc == 1) { /* START # 3 */ /* Print info about the window. */ printf("\nThis program constructs a solid gas tank with all\n"); printf("edges and corners rounded.\n\n"); /* Find name of mged file to be created. */ printf("Enter the mged file to be created (25 char max).\n\t"); (void)fflush(stdout); ret = scanf("%26s", filemged); if (ret == 0) { perror("scanf"); } if (BU_STR_EQUAL(filemged, "")) bu_strlcpy(filemged, "gastank.g", sizeof(filemged)); /* Find the number of gas tanks to create. */ printf("Enter the number of gas tanks to create (26 max).\n\t"); (void)fflush(stdout); ret = scanf("%d", &numtnk); if (ret == 0) { perror("scanf"); numtnk = 1; } if (numtnk < 1) numtnk = 1; if (numtnk > 26) numtnk = 26; /* Find the dimensions of the gas tanks. */ printf("Enter the height, width, and depth of the gas tank.\n\t"); (void)fflush(stdout); ret = scanf("%lf %lf %lf", &hgt, &wid, &dpt); if (ret == 0) { perror("scanf"); hgt = 1000.0; wid = 1000.0; dpt = 1000.0; } if (hgt < SMALL_FASTF) hgt = SMALL_FASTF; if (wid < SMALL_FASTF) wid = SMALL_FASTF; if (dpt < SMALL_FASTF) dpt = SMALL_FASTF; printf("Enter the radius of the corners.\n\t"); (void)fflush(stdout); ret = scanf("%lf", &rds); if (ret == 0) { perror("scanf"); rds = 10.0; } if (rds < SMALL_FASTF) rds = SMALL_FASTF; } /* END # 3 */ /* If there are arguments get answers from arguments. */ else { /* START # 4 */ /* List options. */ /* -fname - name = mged file name. */ /* -n# - # = number of gas tanks. */ /* -h# - # = height of gas tank in mm. */ /* -w# - # = width of gas tank in mm. */ /* -d# - # = depth of gas tank in mm. */ /* -r# - # = radius of corners in mm. */ for (i=1; i<argc; i++) { /* START # 5 */ /* Put argument in temporary character string. */ temp = argv[i]; /* -f - mged file. */ if (temp[1] == 'f') { /* START # 6 */ j = 2; k = 0; while ((temp[j] != '\0') && (k < 25)) { /* START # 7 */ filemged[k] = temp[j]; j++; k++; } /* END # 7 */ filemged[k] = '\0'; } /* END # 6 */ /* All other options. */ else { /* START # 8 */ /* Set up temporary character string. */ j = 2; k = 0; while ((temp[j] != '\0') && (k < 15)) { /* START # 9 */ temp1[k] = temp[j]; j++; k++; } /* END # 9 */ temp1[k] = '\0'; if (temp[1] == 'n') { sscanf(temp1, "%d", &numtnk); if (numtnk > 26) numtnk = 26; } else if (temp[1] == 'h') { sscanf(temp1, "%lf", &hgt); } else if (temp[1] == 'w') { sscanf(temp1, "%lf", &wid); } else if (temp[1] == 'd') { sscanf(temp1, "%lf", &dpt); } else if (temp[1] == 'r') { sscanf(temp1, "%lf", &rds); } } /* END # 8 */ } /* END # 5 */ } /* END # 4 */ /* Print out all info. */ printf("\nmged file: %s\n", filemged); printf("height of gas tank: %f mm\n", hgt); printf("width of gas tank: %f mm\n", wid); printf("depth of gas tank: %f mm\n", dpt); printf("radius of corner: %f mm\n", rds); printf("number of gas tanks: %d\n\n", numtnk); (void)fflush(stdout); /* Open mged file. */ fpw = wdb_fopen(filemged); /* Write ident record. */ mk_id(fpw, "windows"); for (i=0; i<numtnk; i++) { /* START # 2 */ /* Create all solids. */ /* Create the 3 arb8s. */ pts[0][0] = (fastf_t)(dpt / 2.0); pts[0][1] = (fastf_t)(wid / 2.0 - rds); pts[0][2] = (fastf_t)(hgt / 2.0 - rds); pts[1][0] = pts[0][0]; pts[1][1] = pts[0][1]; pts[1][2] = (-pts[0][2]); pts[2][0] = pts[0][0]; pts[2][1] = (-pts[0][1]); pts[2][2] = pts[1][2]; pts[3][0] = pts[0][0]; pts[3][1] = pts[2][1]; pts[3][2] = pts[0][2]; pts[4][0] = (-pts[0][0]); pts[4][1] = pts[0][1]; pts[4][2] = pts[0][2]; pts[5][0] = pts[4][0]; pts[5][1] = pts[0][1]; pts[5][2] = (-pts[0][2]); pts[6][0] = pts[4][0]; pts[6][1] = (-pts[0][1]); pts[6][2] = pts[1][2]; pts[7][0] = pts[4][0]; pts[7][1] = pts[2][1]; pts[7][2] = pts[0][2]; solnam[5] = 97 + i; solnam[6] = '0'; solnam[7] = '1'; mk_arb8(fpw, solnam, &pts[0][X]); pts[0][0] = (fastf_t)(dpt / 2.0 - rds); pts[0][1] = (fastf_t)(wid / 2.0); pts[1][0] = pts[0][0]; pts[1][1] = pts[0][1]; pts[2][0] = pts[0][0]; pts[2][1] = (-pts[0][1]); pts[3][0] = pts[0][0]; pts[3][1] = pts[2][1]; pts[4][0] = (-pts[0][0]); pts[4][1] = pts[0][1]; pts[5][0] = pts[4][0]; pts[5][1] = pts[0][1]; pts[6][0] = pts[4][0]; pts[6][1] = pts[2][1]; pts[7][0] = pts[4][0]; pts[7][1] = pts[2][1]; solnam[7] = '2'; mk_arb8(fpw, solnam, &pts[0][X]); pts[0][1] = (fastf_t)(wid / 2.0 - rds); pts[0][2] = (fastf_t)(hgt / 2.0); pts[1][1] = pts[0][1]; pts[1][2] = (-pts[0][2]); pts[2][1] = (-pts[0][1]); pts[2][2] = pts[1][2]; pts[3][1] = pts[2][1]; pts[3][2] = pts[0][2]; pts[4][1] = pts[0][1]; pts[4][2] = pts[0][2]; pts[5][1] = pts[0][1]; pts[5][2] = (-pts[0][2]); pts[6][1] = (-pts[0][1]); pts[6][2] = pts[1][2]; pts[7][1] = pts[2][1]; pts[7][2] = pts[0][2]; solnam[7] = '3'; mk_arb8(fpw, solnam, &pts[0][X]); /* Make 8 spheres. */ cent[0] = (fastf_t)(dpt / 2.0 - rds); cent[1] = (fastf_t)(wid / 2.0 - rds); cent[2] = (fastf_t)(hgt / 2.0 - rds); rad = (fastf_t)(rds); solnam[7] = '4'; mk_sph(fpw, solnam, cent, rad); cent[2] = (-cent[2]); solnam[7] = '5'; mk_sph(fpw, solnam, cent, rad); cent[1] = (-cent[1]); solnam[7] = '6'; mk_sph(fpw, solnam, cent, rad); cent[2] = (-cent[2]); solnam[7] = '7'; mk_sph(fpw, solnam, cent, rad); cent[0] = (-cent[0]); cent[1] = (-cent[1]); solnam[7] = '8'; mk_sph(fpw, solnam, cent, rad); cent[2] = (-cent[2]); solnam[7] = '9'; mk_sph(fpw, solnam, cent, rad); cent[1] = (-cent[1]); solnam[6] = '1'; solnam[7] = '0'; mk_sph(fpw, solnam, cent, rad); cent[2] = (-cent[2]); solnam[7] = '1'; mk_sph(fpw, solnam, cent, rad); /* Make 12 cylinders. */ bs[0] = (fastf_t)(dpt / 2.0 - rds); bs[1] = (fastf_t)(wid / 2.0 - rds); bs[2] = (fastf_t)(hgt / 2.0 - rds); ht[0] = (fastf_t)(0.0); ht[1] = (fastf_t)(-wid + 2 * rds); ht[2] = (fastf_t)(0.0); solnam[7] = '2'; mk_rcc(fpw, solnam, bs, ht, rad); bs[2] = (-bs[2]); solnam[7] = '3'; mk_rcc(fpw, solnam, bs, ht, rad); bs[0] = (-bs[0]); solnam[7] = '4'; mk_rcc(fpw, solnam, bs, ht, rad); bs[2] = (-bs[2]); solnam[7] = '5'; mk_rcc(fpw, solnam, bs, ht, rad); bs[0] = (fastf_t)(dpt / 2.0 - rds); bs[1] = (fastf_t)(wid / 2.0 - rds); bs[2] = (fastf_t)(hgt / 2.0 - rds); ht[0] = (fastf_t)(0.0); ht[1] = (fastf_t)(0.0); ht[2] = (fastf_t)(-hgt + 2 * rds); solnam[7] = '6'; mk_rcc(fpw, solnam, bs, ht, rad); bs[1] = (-bs[1]); solnam[7] = '7'; mk_rcc(fpw, solnam, bs, ht, rad); bs[0] = (-bs[0]); solnam[7] = '8'; mk_rcc(fpw, solnam, bs, ht, rad); bs[1] = (-bs[1]); solnam[7] = '9'; mk_rcc(fpw, solnam, bs, ht, rad); bs[0] = (fastf_t)(dpt / 2.0 - rds); bs[1] = (fastf_t)(wid / 2.0 - rds); bs[2] = (fastf_t)(hgt / 2.0 - rds); ht[0] = (fastf_t)(-dpt + 2 * rds); ht[1] = (fastf_t)(0.0); ht[2] = (fastf_t)(0.0); solnam[6] = '2'; solnam[7] = '0'; mk_rcc(fpw, solnam, bs, ht, rad); bs[2] = (-bs[2]); solnam[7] = '1'; mk_rcc(fpw, solnam, bs, ht, rad); bs[1] = (-bs[1]); solnam[7] = '2'; mk_rcc(fpw, solnam, bs, ht, rad); bs[2] = (-bs[2]); solnam[7] = '3'; mk_rcc(fpw, solnam, bs, ht, rad); /* Make all regions. */ /* Initialize list. */ BU_LIST_INIT(&comb.l); /* Region 1. */ solnam[5] = 97 + i; solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[5] = 97 + i; regnam[6] = '0'; regnam[7] = '1'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 2. */ solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[7] = '2'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 3. */ solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); regnam[7] = '3'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 4. */ solnam[7] = '4'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '1'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '6'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '0'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[7] = '4'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 5. */ solnam[6] = '0'; solnam[7] = '5'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '1'; solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '6'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[7] = '5'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 6. */ solnam[6] = '0'; solnam[7] = '6'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '1'; solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '7'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[7] = '6'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 7. */ solnam[6] = '0'; solnam[7] = '7'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '1'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '7'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[7] = '7'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 8. */ solnam[6] = '0'; solnam[7] = '8'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '1'; solnam[7] = '5'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '9'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '0'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[7] = '8'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 9. */ solnam[6] = '0'; solnam[7] = '9'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '1'; solnam[7] = '4'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '9'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[7] = '9'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 10. */ solnam[6] = '1'; solnam[7] = '0'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[7] = '4'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '8'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '0'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 11. */ solnam[6] = '1'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[7] = '5'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '8'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[6] = '2'; solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '1'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 12. */ solnam[6] = '1'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '2'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 13. */ solnam[6] = '1'; solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '3'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 14. */ solnam[6] = '1'; solnam[7] = '4'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '4'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 15. */ solnam[6] = '1'; solnam[7] = '5'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '5'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 16. */ solnam[6] = '1'; solnam[7] = '6'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '6'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 17. */ solnam[6] = '1'; solnam[7] = '7'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '7'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 18. */ solnam[6] = '1'; solnam[7] = '8'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '8'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 19. */ solnam[6] = '1'; solnam[7] = '9'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '1'; regnam[7] = '9'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 20. */ solnam[6] = '2'; solnam[7] = '0'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '2'; regnam[7] = '0'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 21. */ solnam[6] = '2'; solnam[7] = '1'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '2'; regnam[7] = '1'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 22. */ solnam[6] = '2'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '2'; regnam[7] = '2'; mk_lfcomb(fpw, regnam, &comb, 1); /* Region 23. */ solnam[6] = '2'; solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_INTERSECT); solnam[6] = '0'; solnam[7] = '2'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); solnam[7] = '3'; (void)mk_addmember(solnam, &comb.l, NULL, WMOP_SUBTRACT); regnam[6] = '2'; regnam[7] = '3'; mk_lfcomb(fpw, regnam, &comb, 1); /* Create group. */ /* Initialize list. */ BU_LIST_INIT(&comb1.l); regnam[6] = '0'; regnam[7] = '1'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '2'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '3'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '4'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '5'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '6'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '7'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '8'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '9'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[6] = '1'; regnam[7] = '0'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '1'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '2'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '3'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '4'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '5'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '6'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '7'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '8'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '9'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[6] = '2'; regnam[7] = '0'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '1'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '2'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); regnam[7] = '3'; (void)mk_addmember(regnam, &comb1.l, NULL, WMOP_UNION); grpnam[3] = 97 + i; mk_lfcomb(fpw, grpnam, &comb1, 0); } /* START # 2 */ /* Close file. */ wdb_close(fpw); return 0; } /* END # 1 */
int main(int argc, char **argv) { vect_t norm; unsigned char rgb[3]; int ix; double x; double size; int quant; struct wmember head; vect_t bmin, bmax, bthick; vect_t r1min, r1max, r1thick; vect_t lwh; /* length, width, height */ vect_t pbase; BU_LIST_INIT( &head.l ); MAT_IDN( identity ); sin60 = sin(60.0 * 3.14159265358979323846264 / 180.0); outfp = wdb_fopen("room.g"); mk_id( outfp, "Procedural Rooms" ); /* Create the building */ VSET( bmin, 0, 0, 0 ); VSET( bmax, 80000, 60000, HEIGHT ); VSET( bthick, 100, 100, 100 ); make_room( "bldg", bmin, bmax, bthick, &head ); /* Create the first room */ VSET( r1thick, 100, 100, 0 ); VMOVE( r1min, bmin ); VSET( r1max, 40000, 10000, HEIGHT ); VADD2( r1max, r1min, r1max ); make_walls( "rm1", r1min, r1max, r1thick, NORTH|EAST, &head ); make_carpet( "rm1carpet", r1min, r1max, "carpet.pix", &head ); /* Create the golden earth */ VSET( norm, 0, 0, 1 ); mk_half( outfp, "plane", norm, -bthick[Z]-10.0 ); rgb[0] = 240; /* gold/brown */ rgb[1] = 180; rgb[2] = 64; mk_region1( outfp, "plane.r", "plane", NULL, NULL, rgb ); (void)mk_addmember( "plane.r", &head.l, NULL, WMOP_UNION ); /* Create the display pillars */ size = 4000; /* separation between centers */ quant = 5; /* pairs */ VSET( lwh, 400, 400, 1000 ); for ( ix=quant-1; ix>=0; ix-- ) { x = 10000 + ix*size; VSET( pbase, x, 10000*.25, r1min[Z] ); make_pillar( "Pil", ix, 0, pbase, lwh, &head ); VSET( pbase, x, 10000*.75, r1min[Z] ); make_pillar( "Pil", ix, 1, pbase, lwh, &head ); } #ifdef never /* Create some light */ white[0] = white[1] = white[2] = 255; base = size*(quant/2+1); VSET( aim, 0, 0, 0 ); VSET( pos, base, base, minheight+maxheight*bn_rand0to1(randp) ); do_light( "l1", pos, aim, 1, 100.0, white, &head ); VSET( pos, -base, base, minheight+maxheight*bn_rand0to1(randp) ); do_light( "l2", pos, aim, 1, 100.0, white, &head ); VSET( pos, -base, -base, minheight+maxheight*bn_rand0to1(randp) ); do_light( "l3", pos, aim, 1, 100.0, white, &head ); VSET( pos, base, -base, minheight+maxheight*bn_rand0to1(randp) ); do_light( "l4", pos, aim, 1, 100.0, white, &head ); #endif /* Build the overall combination */ mk_lfcomb( outfp, "room", &head, 0 ); return 0; }
void make_walls(char *rname, fastf_t *imin, fastf_t *imax, fastf_t *thickness, int bits, struct wmember *headp) /* Interior RPP min point */ { struct wmember head; char name[32]; vect_t omin, omax; /* outer dimensions */ vect_t wmin, wmax; int mask; BU_LIST_INIT( &head.l ); /* thickness[Z] = 0; */ /* * Set exterior dimensions to interior dimensions. * Then, thicken them as necessary due to presence of * exterior walls. * It may be useful to return the exterior min, max. */ VMOVE( omin, imin ); VMOVE( omax, imax ); if ( bits & EAST ) omax[X] += thickness[X]; if ( bits & WEST ) omin[X] -= thickness[X]; if ( bits & NORTH ) omax[Y] += thickness[Y]; if ( bits & SOUTH ) omin[Y] -= thickness[Y]; for ( mask=8; mask > 0; mask >>= 1 ) { if ( (bits & mask) == 0 ) continue; VMOVE( wmin, omin ); VMOVE( wmax, omax ); switch ( mask ) { case SOUTH: /* South (-Y) wall */ snprintf( name, 32, "S%s", rname ); wmax[Y] = imin[Y]; break; case WEST: /* West (-X) wall */ snprintf( name, 32, "W%s", rname ); wmax[X] = imin[X]; break; case NORTH: /* North (+Y) wall */ snprintf( name, 32, "N%s", rname ); wmin[Y] = imax[Y]; break; case EAST: /* East (+X) wall */ snprintf( name, 32, "E%s", rname ); wmin[X] = imax[X]; break; } mk_rpp( outfp, name, wmin, wmax ); (void)mk_addmember( name, &head.l, NULL, WMOP_UNION ); } mk_lfcomb( outfp, rname, &head, 1 ); (void)mk_addmember( rname, &(headp->l), NULL, WMOP_UNION ); }
void Groups(void) { struct points *ptr; char tag[NAMESIZE]; char *pipe_group=".pipe"; char *fluid_group=".fluid"; int comblen=0; struct wmember head; BU_LIST_INIT(&head.l); ptr = root; if ( ptr == NULL ) return; while ( ptr->next != NULL ) { if ( !nothing && !mitre && comblen) /* count elbow sections (except first point) */ comblen++; comblen++; /* count pipe sections */ ptr = ptr->next; } if ( comblen ) { /* Make name for pipe group = "name".pipe */ Make_name( tag, pipe_group, name, 0 ); /* Make group */ ptr = root; while ( ptr->next != NULL ) { mk_addmember( ptr->tube_r, &head.l, NULL, WMOP_UNION ); /* tube regions */ if ( !nothing && !mitre && ptr != root ) mk_addmember( ptr->elbow_r, &head.l, NULL, WMOP_UNION ); /* elbows */ ptr = ptr->next; } mk_lfcomb( fdout, tag, &head, 0 ); if ( !cable ) { /* Make name for fluid group = "name".fluid */ Make_name( tag, fluid_group, name, 0 ); /* Make group */ ptr = root; while ( ptr->next != NULL ) { mk_addmember( ptr->tubflu_r, &head.l, NULL, WMOP_UNION ); /* fluid in tubes */ if ( !nothing && !mitre && ptr != root ) mk_addmember( ptr->elbflu_r, &head.l, NULL, WMOP_UNION ); /* fluid in elbows */ ptr = ptr->next; } mk_lfcomb( fdout, tag, &head, 0 ); } } }
void Elbows(void) /* make a tubing elbow and fluid elbow */ { vect_t RN1, RN2; point_t pts[8]; fastf_t len; struct points *ptr; struct wmember head; if ( nothing || mitre ) return; if ( root == NULL ) return; BU_LIST_INIT(&head.l); ptr = root->next; while ( ptr->next != NULL ) { /* Make outside elbow solid */ if ( torus ) mk_tor( fdout, ptr->elbow, ptr->center, ptr->norm, ( MINR+1 )*radius, radius ); else if ( sphere ) mk_sph( fdout, ptr->elbow, ptr->p, radius ); if ( !cable ) /* Make inside elbow solid */ { if ( torus ) mk_tor( fdout, ptr->elbflu, ptr->center, ptr->norm, ( MINR+1 )*radius, radius-wall ); else if ( sphere ) mk_sph( fdout, ptr->elbflu, ptr->p, radius-wall ); } if ( torus ) /* Make ARB8 solid */ { len = ((MINR+2)*radius + delta) / cos( (pi-ptr->alpha)/4.0 ); /* vector from center of torus to rcc end */ VSUB2( RN1, ptr->p1, ptr->center ); VUNITIZE( RN1 ); /* unit vector */ /* beginning of next rcc */ VSUB2( RN2, ptr->p2, ptr->center ); VUNITIZE( RN2 ); /* and unitize again */ /* build the eight points for the ARB8 */ VJOIN1( pts[0], ptr->center, radius+delta, ptr->norm ); VJOIN1( pts[1], pts[0], len, RN1 ); VJOIN1( pts[2], pts[0], -len, ptr->nmitre ); VJOIN1( pts[3], pts[0], len, RN2 ); VJOIN1( pts[4], ptr->center, -radius-delta, ptr->norm ); VJOIN1( pts[5], pts[4], len, RN1 ); VJOIN1( pts[6], pts[4], -len, ptr->nmitre ); VJOIN1( pts[7], pts[4], len, RN2 ); mk_arb8( fdout, ptr->cut, &pts[0][X] ); } if ( torus ) { mk_addmember( ptr->elbow, &head.l, NULL, WMOP_UNION ); /* make 'u' member record */ if ( !cable ) mk_addmember( ptr->elbflu, &head.l, NULL, WMOP_SUBTRACT ); /* make '-' member record */ mk_addmember( ptr->cut, &head.l, NULL, WMOP_INTERSECT ); mk_lfcomb( fdout, ptr->elbow_r, &head, REGION ); /* make REGION comb record */ if ( !cable ) { mk_addmember( ptr->elbflu, &head.l, NULL, WMOP_UNION ); /* make 'u' member record */ mk_addmember( ptr->cut, &head.l, NULL, WMOP_INTERSECT ); mk_lfcomb( fdout, ptr->elbflu_r, &head, REGION ); /* make REGION comb record */ } } else if ( sphere ) { mk_addmember( ptr->elbow, &head.l, NULL, WMOP_UNION ); /* make 'u' member record */ if ( !cable ) mk_addmember( ptr->elbflu, &head.l, NULL, WMOP_SUBTRACT ); /* make '-' member record */ mk_addmember( ptr->tube, &head.l, NULL, WMOP_SUBTRACT ); mk_addmember( ptr->prev->tube, &head.l, NULL, WMOP_SUBTRACT ); mk_lfcomb( fdout, ptr->elbow_r, &head, REGION ); /* make REGION comb record */ if ( !cable ) { mk_addmember( ptr->elbflu, &head.l, NULL, WMOP_UNION ); /* make 'u' member record */ mk_addmember( ptr->tube, &head.l, NULL, WMOP_SUBTRACT ); mk_addmember( ptr->prev->tube, &head.l, NULL, WMOP_SUBTRACT ); mk_lfcomb( fdout, ptr->elbflu_r, &head, REGION ); /* make REGION comb record */ } } ptr = ptr->next; } }
void Pipes(void) { vect_t ht; struct points *ptr; fastf_t len; int comblen; struct wmember head; BU_LIST_INIT(&head.l); ptr = root; if ( ptr == NULL ) return; while ( ptr->next != NULL ) { /* Make the basic pipe solids */ VSUB2( ht, ptr->next->p1, ptr->p2); mk_rcc( fdout, ptr->tube, ptr->p2, ht, radius ); /* make a solid record */ if ( !cable ) /* make inside solid */ mk_rcc( fdout, ptr->tubflu, ptr->p2, ht, radius-wall ); if ( torus ) { /* Make tubing region */ mk_addmember( ptr->tube, &head.l, NULL, WMOP_UNION ); /* make 'u' member record */ if ( !cable ) { /* Subtract inside solid */ mk_addmember( ptr->tubflu, &head.l, NULL, WMOP_SUBTRACT ); /* make '-' member record */ /* Make fluid region */ mk_comb1( fdout, ptr->tubflu_r, ptr->tubflu, 1 ); } mk_lfcomb( fdout, ptr->tube_r, &head, 1 ); } else if ( mitre ) { if ( ptr->prev != NULL ) { len = VDOT( ptr->p, ptr->mnorm ); mk_half( fdout, ptr->cut, ptr->mnorm, len ); } comblen = 4 - cable; if ( ptr->next->next == NULL ) comblen--; if ( ptr->prev == NULL ) comblen--; mk_addmember( ptr->tube, &head.l, NULL, WMOP_UNION ); /* make 'u' member record */ if ( !cable ) mk_addmember( ptr->tubflu, &head.l, NULL, WMOP_SUBTRACT ); /* make '-' member record */ if ( ptr->next->next != NULL ) mk_addmember( ptr->next->cut, &head.l, NULL, WMOP_SUBTRACT ); /* make '+' member record */ if ( ptr->prev != NULL ) mk_addmember( ptr->cut, &head.l, NULL, WMOP_INTERSECT ); /* subtract HAF */ mk_lfcomb( fdout, ptr->tube_r, &head, 1 ); if ( !cable ) { /* Make fluid region */ comblen = 3; if ( ptr->next->next == NULL ) comblen--; if ( ptr->prev == NULL ) comblen--; mk_addmember( ptr->tubflu, &head.l, NULL, WMOP_UNION ); /* make 'u' member record */ if ( ptr->next->next != NULL ) mk_addmember( ptr->next->cut, &head.l, NULL, WMOP_SUBTRACT ); /* make '+' member record */ if ( ptr->prev != NULL ) mk_addmember( ptr->cut, &head.l, NULL, WMOP_INTERSECT ); /* subtract */ mk_lfcomb( fdout, ptr->tubflu_r, &head, 1 ); /* make REGION comb record */ } } else if ( sphere ) { /* make REGION comb record for tube */ comblen = 2; if ( cable ) comblen--; if ( ptr->next->tube[0] != '\0' ) comblen++; if ( !cable && ptr->prev != NULL ) comblen++; /* make 'u' member record */ mk_addmember( ptr->tube, &head.l, NULL, WMOP_UNION ); /* make '-' member record */ if ( !cable ) mk_addmember( ptr->tubflu, &head.l, NULL, WMOP_SUBTRACT ); if ( ptr->next->tube[0] != '\0' ) /* subtract outside of next tube */ mk_addmember( ptr->next->tube, &head.l, NULL, WMOP_SUBTRACT ); if ( !cable && ptr->prev != NULL ) /* subtract inside of previous tube */ mk_addmember( ptr->prev->tubflu, &head.l, NULL, WMOP_SUBTRACT ); mk_lfcomb( fdout, ptr->tube_r, &head, REGION ); if ( !cable ) { /* make REGION for fluid */ /* make 'u' member record */ mk_addmember( ptr->tubflu, &head.l, NULL, WMOP_UNION ); if ( ptr->next->tubflu[0] != '\0' ) /* subtract inside of next tube */ mk_addmember( ptr->next->tubflu, &head.l, NULL, WMOP_SUBTRACT ); mk_lfcomb( fdout, ptr->tubflu_r, &head, REGION ); } } else if ( nothing ) { /* make REGION comb record for tube */ comblen = 2; if ( cable ) comblen--; if ( ptr->next->tube[0] != '\0' ) comblen++; if ( !cable && ptr->prev != NULL ) comblen++; /* make 'u' member record */ mk_addmember( ptr->tube, &head.l, NULL, WMOP_UNION ); /* make '-' member record */ if ( !cable ) mk_addmember( ptr->tubflu, &head.l, NULL, WMOP_SUBTRACT ); if ( ptr->next->tube[0] != '\0' ) /* subtract outside of next tube */ mk_addmember( ptr->next->tube, &head.l, NULL, WMOP_SUBTRACT ); if ( !cable && ptr->prev != NULL ) /* subtract inside of previous tube */ mk_addmember( ptr->prev->tubflu, &head.l, NULL, WMOP_SUBTRACT ); mk_lfcomb( fdout, ptr->tube_r, &head, REGION ); if ( !cable ) { /* make REGION for fluid */ /* make 'u' member record */ mk_addmember( ptr->tubflu, &head.l, NULL, WMOP_UNION ); if ( ptr->next->tubflu[0] != '\0' ) /* subtract inside of next tube */ mk_addmember( ptr->next->tubflu, &head.l, NULL, WMOP_SUBTRACT ); mk_lfcomb( fdout, ptr->tubflu_r, &head, REGION ); } } ptr = ptr->next; } }
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; }