void writePlateBot ( rt_wdb* wdbp, Form& form, bool translate ) { char name[NAMELEN + 1]; fastf_t vertices[MAX_NPTS * 3]; if (translate) { for (size_t i = 0; i < form.data.bot.num_vertices; ++i) { vertices[i * 3] = (form.data.bot.vertices[i * 3] + form.tr_vec[0]) * IntavalUnitInMm; vertices[i * 3 + 1] = (form.data.bot.vertices[i * 3 + 1] + form.tr_vec[1]) * IntavalUnitInMm; vertices[i * 3 + 2] = (form.data.bot.vertices[i * 3 + 2] + form.tr_vec[2]) * IntavalUnitInMm; } } else { for (size_t i = 0; i<form.data.bot.num_vertices; ++i) { vertices[i * 3] = form.data.bot.vertices[i * 3] * IntavalUnitInMm; vertices[i * 3 + 1] = form.data.bot.vertices[i * 3 + 1] * IntavalUnitInMm; vertices[i * 3 + 2] = form.data.bot.vertices[i * 3 + 2] * IntavalUnitInMm; } } fastf_t thickness[MAX_TRIANGLES]; for (size_t i = 0; i < form.data.bot.num_faces; ++i) thickness[i] = form.thickness * IntavalUnitInMm; bu_bitv* faceMode = bu_bitv_new(form.data.bot.num_faces); sprintf(name, "s%lu.pbot", (long unsigned)++bot_counter); mk_bot(wdbp, name, RT_BOT_PLATE, RT_BOT_UNORIENTED, 0, form.data.bot.num_vertices, form.data.bot.num_faces, vertices, form.data.bot.faces, thickness, faceMode); addToRegion(form.compnr, name); if (form.s_compnr >= 1000) excludeFromRegion(form.s_compnr, name); bu_bitv_free(faceMode); }
static void make_bot_object(const char *name, struct rt_wdb *wdbp) { int i; int max_pt=0, min_pt=999999; int num_vertices; struct bu_bitv *bv=NULL; int bot_mode; int count; struct rt_bot_internal bot_ip; bot_ip.magic = RT_BOT_INTERNAL_MAGIC; for (i = 0; i < face_count; i++) { V_MIN(min_pt, faces[i*3]); V_MAX(max_pt, faces[i*3]); V_MIN(min_pt, faces[i*3+1]); V_MAX(max_pt, faces[i*3+1]); V_MIN(min_pt, faces[i*3+2]); V_MAX(max_pt, faces[i*3+2]); } num_vertices = max_pt - min_pt + 1; bot_ip.num_vertices = num_vertices; bot_ip.vertices = (fastf_t *)bu_calloc(num_vertices*3, sizeof(fastf_t), "BOT vertices"); for (i = 0; i < num_vertices; i++) VMOVE(&bot_ip.vertices[i*3], grid_pts[min_pt+i]); for (i = 0; i < face_count * 3; i++) faces[i] -= min_pt; bot_ip.num_faces = face_count; bot_ip.faces = bu_calloc(face_count*3, sizeof(int), "BOT faces"); for (i = 0; i < face_count*3; i++) bot_ip.faces[i] = faces[i]; bot_ip.face_mode = (struct bu_bitv *)NULL; bot_ip.thickness = (fastf_t *)NULL; if (mode == PLATE_MODE) { bot_mode = RT_BOT_PLATE; bv = bu_bitv_new(face_count); for (i = 0; i < face_count; i++) { if (facemode[i] == POS_FRONT) BU_BITSET(bv, i); } bot_ip.face_mode = bv; bot_ip.thickness = (fastf_t *)bu_calloc(face_count, sizeof(fastf_t), "BOT thickness"); for (i = 0; i < face_count; i++) bot_ip.thickness[i] = thickness[i]; } else bot_mode = RT_BOT_SOLID; bot_ip.mode = bot_mode; bot_ip.orientation = RT_BOT_UNORIENTED; bot_ip.bot_flags = 0; count = rt_bot_vertex_fuse(&bot_ip, &wdbp->wdb_tol); count = rt_bot_face_fuse(&bot_ip); if (count) bu_log("WARNING: %d duplicate faces eliminated from group %d component %d\n", count, group_id, comp_id); rt_mk_bot(wdbp, name, bot_mode, RT_BOT_UNORIENTED, 0, bot_ip.num_vertices, bot_ip.num_faces, bot_ip.vertices, bot_ip.faces, bot_ip.thickness, bot_ip.face_mode); if (mode == PLATE_MODE) { bu_free((char *)bot_ip.thickness, "BOT thickness"); bu_free((char *)bot_ip.face_mode, "BOT face_mode"); } bu_free((char *)bot_ip.vertices, "BOT vertices"); bu_free((char *)bot_ip.faces, "BOT faces"); }
void writeRingModeBox ( rt_wdb* wdbp, Form& form, bool translate ) { char name[NAMELEN + 1]; // get the transformed outer points vect_t outer[MAX_NPTS]; if (translate) { for (size_t i = 0; i < form.npts; ++i) VADD2(outer[i], form.data.pt[i], form.tr_vec); } else { for (size_t i = 0; i < form.npts; ++i) { VMOVE(outer[i], form.data.pt[i]); } } for (size_t i1 = 0; i1 < form.npts; ++i1) { VSCALE(outer[i1], outer[i1], IntavalUnitInMm); } // compute inner points vect_t inner[MAX_NPTS]; for (size_t i2 = 0; i2 < form.npts; ++i2) { vect_t a, b, c; VMOVE(a, outer[i2]); if (i2 == 0) { VMOVE(b, outer[i2 + 1]); VMOVE(c, outer[form.npts-1]); } else if (i2 == form.npts-1) { VMOVE(b, outer[0]); VMOVE(c, outer[i2 - 1]); } else { VMOVE(b, outer[i2 + 1]); VMOVE(c, outer[i2 - 1]); } vect_t b_v, c_v; VSUB2(b_v, b, a); VSUB2(c_v, c, a); vect_t n_v; VCROSS(n_v, b_v, c_v); // with on b_v vect_t width_b_v; VCROSS(width_b_v, b_v, n_v); if (VDOT(width_b_v, c_v) < 0) VREVERSE(width_b_v, width_b_v); VUNITIZE(width_b_v); VSCALE(width_b_v, width_b_v, form.width * IntavalUnitInMm); // with on c_v vect_t width_c_v; VCROSS(width_c_v, c_v, n_v); if (VDOT(width_c_v, b_v) < 0) VREVERSE(width_c_v, width_c_v); VUNITIZE(width_c_v); VSCALE(width_c_v, width_c_v, form.width * IntavalUnitInMm); // intersection VUNITIZE(b_v); VUNITIZE(c_v); vect_t cb_v; VSUB2(cb_v, b_v, c_v); fastf_t l_cb_v = MAGNITUDE(cb_v); if (!NEAR_ZERO(l_cb_v, VUNITIZE_TOL)) { vect_t width_cb_v; VSUB2(width_cb_v, width_b_v, width_c_v); vect_t s_b_v; VSCALE(s_b_v, b_v, MAGNITUDE(width_cb_v) / l_cb_v); vect_t res; VADD2(res, a, width_c_v); VADD2(res, res, s_b_v); VMOVE(inner[i2], res); } else { VMOVE(inner[i2], outer[i2]); } } // bot parameters // vertices size_t num_vertices = 0; size_t outer_i[MAX_NPTS]; size_t inner_i[MAX_NPTS]; fastf_t vertices[MAX_NPTS * 3]; for (size_t i3 = 0; i3 < form.npts; ++i3) { size_t i = 0; // outer // search for duplicate vertex for (; i < num_vertices; ++i) { if (NEAR_EQUAL(outer[i3][0], vertices[3 * i], VUNITIZE_TOL) && NEAR_EQUAL(outer[i3][1], vertices[3 * i + 1], VUNITIZE_TOL) && NEAR_EQUAL(outer[i3][2], vertices[3 * i + 2], VUNITIZE_TOL)) { outer_i[i3] = i; break; } } if (i == num_vertices) { // add a new vertex vertices[num_vertices * 3] = outer[i3][0]; vertices[num_vertices * 3 + 1] = outer[i3][1]; vertices[num_vertices * 3 + 2] = outer[i3][2]; outer_i[i3] = num_vertices; ++num_vertices; } // inner // search for duplicate vertex for (i = 0; i < num_vertices; ++i) { if (NEAR_EQUAL(inner[i3][0], vertices[3 * i], VUNITIZE_TOL) && NEAR_EQUAL(inner[i3][1], vertices[3 * i + 1], VUNITIZE_TOL) && NEAR_EQUAL(inner[i3][2], vertices[3 * i + 2], VUNITIZE_TOL)) { inner_i[i3] = i; break; } } if (i == num_vertices) { // add a new vertex vertices[num_vertices * 3] = inner[i3][0]; vertices[num_vertices * 3 + 1] = inner[i3][1]; vertices[num_vertices * 3 + 2] = inner[i3][2]; inner_i[i3] = num_vertices; ++num_vertices; } } // faces size_t num_faces = 0; int faces[MAX_TRIANGLES * 3]; for (size_t i4 = 0; i4 < form.npts; ++i4) { size_t nextIndex = (i4 + 1) % form.npts; addTriangle(faces, num_faces, outer_i[i4], outer_i[nextIndex], inner_i[i4]); addTriangle(faces, num_faces, inner_i[i4], outer_i[nextIndex], inner_i[nextIndex]); } fastf_t thickness[MAX_TRIANGLES]; for (size_t i5 = 0; i5 < num_faces; ++i5) thickness[i5] = form.thickness * IntavalUnitInMm; bu_bitv* faceMode = bu_bitv_new(num_faces); sprintf(name, "s%lu.pbot", (long unsigned)++bot_counter); mk_bot(wdbp, name, RT_BOT_PLATE, RT_BOT_UNORIENTED, 0, num_vertices, num_faces, vertices, faces, thickness, faceMode); addToRegion(form.compnr, name); if (form.s_compnr >= 1000) excludeFromRegion(form.s_compnr, name); bu_bitv_free(faceMode); }
int main(int argc, char **argv) { int faces[15]; fastf_t vertices[36]; fastf_t thickness[4]; struct rt_wdb *outfp = NULL; struct bu_bitv *face_mode = NULL; static const char *filename = "bot-test.g"; if (BU_STR_EQUAL(argv[1], "-h") || BU_STR_EQUAL(argv[1], "-?")) { printusage(); return 0; } if (argc == 1) { printusage(); fprintf(stderr," Program continues running (will create file bot-test.g because 'filename' was blank):\n"); } else if (argc > 1) filename = argv[1]; outfp = wdb_fopen(filename); mk_id(outfp, "BOT test"); VSET(vertices, 0.0, 0.0, 0.0); VSET(&vertices[3], 0.0, 100.0, 0.0); VSET(&vertices[6], 0.0, 100.0, 50.0); VSET(&vertices[9], 200.0, 0.0, 0.0); /* face #1 */ faces[0] = 0; faces[1] = 1; faces[2] = 2; /* face #2 */ faces[3] = 0; faces[4] = 2; faces[5] = 3; /* face #3 */ faces[6] = 0; faces[7] = 1; faces[8] = 3; /* face #4 */ faces[9] = 1; faces[10] = 2; faces[11] = 3; mk_bot(outfp, "bot_u_surf", RT_BOT_SURFACE, RT_BOT_UNORIENTED, 0, 4, 4, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); /* face #1 */ faces[0] = 0; faces[1] = 2; faces[2] = 1; /* face #2 */ faces[3] = 0; faces[4] = 3; faces[5] = 2; /* face #3 */ faces[6] = 0; faces[7] = 1; faces[8] = 3; /* face #4 */ faces[9] = 1; faces[10] = 2; faces[11] = 3; mk_bot(outfp, "bot_ccw_surf", RT_BOT_SURFACE, RT_BOT_CCW, 0, 4, 4, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); /* face #1 */ faces[0] = 1; faces[1] = 2; faces[2] = 0; /* face #2 */ faces[3] = 2; faces[4] = 3; faces[5] = 0; /* face #3 */ faces[6] = 3; faces[7] = 1; faces[8] = 0; /* face #4 */ faces[9] = 3; faces[10] = 2; faces[11] = 1; mk_bot(outfp, "bot_cw_surf", RT_BOT_SURFACE, RT_BOT_CW, 0, 4, 4, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); /* face #1 */ faces[0] = 0; faces[1] = 1; faces[2] = 2; /* face #2 */ faces[3] = 0; faces[4] = 2; faces[5] = 3; /* face #3 */ faces[6] = 0; faces[7] = 1; faces[8] = 3; /* face #4 */ faces[9] = 1; faces[10] = 2; faces[11] = 3; mk_bot(outfp, "bot_u_solid", RT_BOT_SOLID, RT_BOT_UNORIENTED, 0, 4, 4, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); /* face #1 */ faces[0] = 0; faces[1] = 2; faces[2] = 1; /* face #2 */ faces[3] = 0; faces[4] = 3; faces[5] = 2; /* face #3 */ faces[6] = 0; faces[7] = 1; faces[8] = 3; /* face #4 */ faces[9] = 1; faces[10] = 2; faces[11] = 3; mk_bot(outfp, "bot_ccw_solid", RT_BOT_SOLID, RT_BOT_CCW, 0, 4, 4, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); /* face #1 */ faces[0] = 1; faces[1] = 2; faces[2] = 0; /* face #2 */ faces[3] = 2; faces[4] = 3; faces[5] = 0; /* face #3 */ faces[6] = 3; faces[7] = 1; faces[8] = 0; /* face #4 */ faces[9] = 3; faces[10] = 2; faces[11] = 1; mk_bot(outfp, "bot_cw_solid", RT_BOT_SOLID, RT_BOT_CW, 0, 4, 4, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); face_mode = bu_bitv_new(4); BU_BITSET(face_mode, 1); thickness[0] = 2.1; thickness[1] = 2.2; thickness[2] = 2.3; thickness[3] = 2.4; /* face #1 */ faces[0] = 0; faces[1] = 1; faces[2] = 2; /* face #2 */ faces[3] = 0; faces[4] = 2; faces[5] = 3; /* face #3 */ faces[6] = 0; faces[7] = 1; faces[8] = 3; /* face #4 */ faces[9] = 1; faces[10] = 2; faces[11] = 3; mk_bot(outfp, "bot_u_plate", RT_BOT_PLATE, RT_BOT_UNORIENTED, 0, 4, 4, vertices, faces, thickness, face_mode); /* face #1 */ faces[0] = 0; faces[1] = 2; faces[2] = 1; /* face #2 */ faces[3] = 0; faces[4] = 3; faces[5] = 2; /* face #3 */ faces[6] = 0; faces[7] = 1; faces[8] = 3; /* face #4 */ faces[9] = 1; faces[10] = 2; faces[11] = 3; mk_bot(outfp, "bot_ccw_plate", RT_BOT_PLATE, RT_BOT_CCW, 0, 4, 4, vertices, faces, thickness, face_mode); /* face #1 */ faces[0] = 1; faces[1] = 2; faces[2] = 0; /* face #2 */ faces[3] = 2; faces[4] = 3; faces[5] = 0; /* face #3 */ faces[6] = 3; faces[7] = 1; faces[8] = 0; /* face #4 */ faces[9] = 3; faces[10] = 2; faces[11] = 1; mk_bot(outfp, "bot_cw_plate", RT_BOT_PLATE, RT_BOT_CW, 0, 4, 4, vertices, faces, thickness, face_mode); /* Make a bot with duplicate vertices to test the "fuse" and "condense" code */ VSET(vertices, 0.0, 0.0, 0.0); VSET(&vertices[3], 0.0, 100.0, 0.0); VSET(&vertices[6], 0.0, 100.0, 50.0); VMOVE(&vertices[9], &vertices[0]); VMOVE(&vertices[12], &vertices[6]); VSET(&vertices[15], 200.0, 0.0, 0.0); VMOVE(&vertices[18], &vertices[0]); VMOVE(&vertices[21], &vertices[3]); VMOVE(&vertices[24], &vertices[15]); VMOVE(&vertices[27], &vertices[3]); VMOVE(&vertices[30], &vertices[6]); VMOVE(&vertices[33], &vertices[15]); /* face #1 */ faces[0] = 0; faces[1] = 1; faces[2] = 2; /* face #2 */ faces[3] = 3; faces[4] = 4; faces[5] = 5; /* face #3 */ faces[6] = 6; faces[7] = 7; faces[8] = 8; /* face #4 */ faces[9] = 9; faces[10] = 10; faces[11] = 11; mk_bot(outfp, "bot_solid_dup_vs", RT_BOT_SOLID, RT_BOT_UNORIENTED, 0, 12, 4, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); faces[12] = 9; faces[13] = 10; faces[14] = 11; mk_bot(outfp, "bot_solid_dup_fs", RT_BOT_SOLID, RT_BOT_UNORIENTED, 0, 12, 5, vertices, faces, (fastf_t *)NULL, (struct bu_bitv *)NULL); bu_free((char *)face_mode, "bottest: face_mode"); wdb_close(outfp); return 0; }