void rt_vlist_import(struct bu_list *hp, struct bu_vls *namevls, const unsigned char *buf) { register const unsigned char *bp; const unsigned char *pp; /* point pointer */ size_t nelem; size_t namelen; size_t i; /* must be double for import and export */ double point[ELEMENTS_PER_POINT]; BU_CK_VLS(namevls); nelem = ntohl(*(uint32_t *)buf); bp = buf+4; namelen = strlen((char *)bp)+1; bu_vls_strncpy(namevls, (char *)bp, namelen); bp += namelen; pp = bp + nelem*1; for (i=0; i < nelem; i++) { int cmd; cmd = *bp++; ntohd((unsigned char *)point, pp, ELEMENTS_PER_POINT); pp += ELEMENTS_PER_POINT*SIZEOF_NETWORK_DOUBLE; BN_ADD_VLIST(&rt_g.rtg_vlfree, hp, point, cmd); } }
void rt_vlist_copy(struct bu_list *dest, const struct bu_list *src) { struct bn_vlist *vp; for (BU_LIST_FOR(vp, bn_vlist, src)) { register int i; register int nused = vp->nused; register int *cmd = vp->cmd; register point_t *pt = vp->pt; for (i = 0; i < nused; i++, cmd++, pt++) { BN_ADD_VLIST(&rt_g.rtg_vlfree, dest, *pt, *cmd); } } }
int rt_process_uplot_value(register struct bu_list **vhead, struct bn_vlblock *vbp, FILE *fp, register int c, double char_size, int mode) { mat_t mat; const struct uplot *up; #define CARG_LEN 256 #define ARG_LEN 6 char carg[CARG_LEN]; fastf_t arg[ARG_LEN]; vect_t a, b; point_t last_pos; static point_t lpnt; /* last point of a move/draw series */ static int moved = 0; /* moved since color change */ memset(carg, 0, sizeof(char)*CARG_LEN); memset(arg, 0, sizeof(fastf_t)*ARG_LEN); #undef ARG_LEN #undef CARG_LEN /* look it up */ if (c < 'A' || c > 'z') { up = &rt_uplot_error; } else { up = &rt_uplot_letters[ c - 'A' ]; } if (up->targ == TBAD) { fprintf(stderr, "Lee : Bad command '%c' (0x%02x)\n", c, c); return -1; } if (up->narg > 0) { if (mode == PL_OUTPUT_MODE_BINARY) rt_uplot_get_args(fp, up, carg, arg); else rt_uplot_get_text_args(fp, up, carg, arg); } switch (c) { case 's': case 'w': case 'S': case 'W': /* Space commands, do nothing. */ break; case 'm': case 'o': /* 2-D move */ arg[Z] = 0; BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_MOVE); VMOVE(lpnt, arg); moved = 1; break; case 'M': case 'O': /* 3-D move */ BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_MOVE); VMOVE(lpnt, arg); moved = 1; break; case 'n': case 'q': /* * If no move command was issued since the last color * change, insert one now using the last point from a * move/draw. */ if (!moved) { BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, lpnt, BN_VLIST_LINE_MOVE); moved = 1; } /* 2-D draw */ arg[Z] = 0; BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_DRAW); VMOVE(lpnt, arg); break; case 'N': case 'Q': /* * If no move command was issued since the last color * change, insert one now using the last point from a * move/draw. */ if (!moved) { BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, lpnt, BN_VLIST_LINE_MOVE); moved = 1; } /* 3-D draw */ BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_DRAW); VMOVE(lpnt, arg); break; case 'l': case 'v': /* 2-D line */ VSET(a, arg[0], arg[1], 0.0); VSET(b, arg[2], arg[3], 0.0); BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, a, BN_VLIST_LINE_MOVE); BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, b, BN_VLIST_LINE_DRAW); break; case 'L': case 'V': /* 3-D line */ VSET(a, arg[0], arg[1], arg[2]); VSET(b, arg[3], arg[4], arg[5]); BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, a, BN_VLIST_LINE_MOVE); BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, b, BN_VLIST_LINE_DRAW); break; case 'p': case 'x': /* 2-D point */ arg[Z] = 0; BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_MOVE); BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_DRAW); break; case 'P': case 'X': /* 3-D point */ BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_MOVE); BN_ADD_VLIST(vbp->free_vlist_hd, *vhead, arg, BN_VLIST_LINE_DRAW); break; case 'C': /* Color */ *vhead = rt_vlblock_find(vbp, carg[0], carg[1], carg[2]); moved = 0; break; case 't': /* Text string */ MAT_IDN(mat); if (BU_LIST_NON_EMPTY(*vhead)) { struct bn_vlist *vlp; /* Use coordinates of last op */ vlp = BU_LIST_LAST(bn_vlist, *vhead); VMOVE(last_pos, vlp->pt[vlp->nused-1]); } else { VSETALL(last_pos, 0); } bn_vlist_3string(*vhead, vbp->free_vlist_hd, carg, last_pos, mat, char_size); break; } return 0; }
void bn_vlist_rpp(struct bu_list *hd, const point_t minn, const point_t maxx) { point_t p; VSET(p, minn[X], minn[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_MOVE) /* first side */ VSET(p, minn[X], maxx[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) VSET(p, minn[X], maxx[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) VSET(p, minn[X], minn[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) VSET(p, minn[X], minn[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) /* across */ VSET(p, maxx[X], minn[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) /* second side */ VSET(p, maxx[X], maxx[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) VSET(p, maxx[X], maxx[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) VSET(p, maxx[X], minn[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) VSET(p, maxx[X], minn[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) /* front edge */ VSET(p, minn[X], maxx[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_MOVE) VSET(p, maxx[X], maxx[Y], minn[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) /* bottom back */ VSET(p, minn[X], minn[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_MOVE) VSET(p, maxx[X], minn[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) /* top back */ VSET(p, minn[X], maxx[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_MOVE) VSET(p, maxx[X], maxx[Y], maxx[Z]); BN_ADD_VLIST(&rt_g.rtg_vlfree, hd, p, BN_VLIST_LINE_DRAW) }
static size_t show_dangling_edges(struct ged *gedp, const uint32_t *magic_p, const char *name, int out_type) { FILE *plotfp = NULL; const char *manifolds = NULL; const struct edgeuse *eur; int done; point_t pt1, pt2; size_t i, cnt; struct bn_vlblock *vbp = NULL; struct bu_list *vhead = NULL; struct bu_ptbl faces; struct bu_vls plot_file_name = BU_VLS_INIT_ZERO; struct edgeuse *eu = NULL; struct face *fp = NULL; struct faceuse *fu, *fu1, *fu2; struct faceuse *newfu = NULL; struct loopuse *lu = NULL; /* out_type: 0 = none, 1 = show, 2 = plot */ if (out_type < 0 || out_type > 2) { bu_log("Internal error, open edge test failed.\n"); return 0; } if (out_type == 1) { vbp = rt_vlblock_init(); vhead = rt_vlblock_find(vbp, 0xFF, 0xFF, 0x00); } bu_ptbl_init(&faces, 64, "faces buffer"); nmg_face_tabulate(&faces, magic_p); cnt = 0; for (i = 0; i < (size_t)BU_PTBL_END(&faces) ; i++) { fp = (struct face *)BU_PTBL_GET(&faces, i); NMG_CK_FACE(fp); fu = fu1 = fp->fu_p; NMG_CK_FACEUSE(fu1); fu2 = fp->fu_p->fumate_p; NMG_CK_FACEUSE(fu2); done = 0; while (!done) { NMG_CK_FACEUSE(fu); for (BU_LIST_FOR(lu, loopuse, &fu->lu_hd)) { NMG_CK_LOOPUSE(lu); if (BU_LIST_FIRST_MAGIC(&lu->down_hd) == NMG_EDGEUSE_MAGIC) { for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { NMG_CK_EDGEUSE(eu); eur = nmg_radial_face_edge_in_shell(eu); newfu = eur->up.lu_p->up.fu_p; while (manifolds && NMG_MANIFOLDS(manifolds, newfu) & NMG_2MANIFOLD && eur != eu->eumate_p) { eur = nmg_radial_face_edge_in_shell(eur->eumate_p); newfu = eur->up.lu_p->up.fu_p; } if (eur == eu->eumate_p) { VMOVE(pt1, eu->vu_p->v_p->vg_p->coord); VMOVE(pt2, eu->eumate_p->vu_p->v_p->vg_p->coord); if (out_type == 1) { BN_ADD_VLIST(vbp->free_vlist_hd, vhead, pt1, BN_VLIST_LINE_MOVE); BN_ADD_VLIST(vbp->free_vlist_hd, vhead, pt2, BN_VLIST_LINE_DRAW); } else if (out_type == 2) { if (!plotfp) { bu_vls_sprintf(&plot_file_name, "%s.%p.pl", name, (void *)magic_p); if ((plotfp = fopen(bu_vls_addr(&plot_file_name), "wb")) == (FILE *)NULL) { bu_vls_free(&plot_file_name); bu_log("Error, unable to create plot file (%s), open edge test failed.\n", bu_vls_addr(&plot_file_name)); return 0; } } pdv_3line(plotfp, pt1, pt2); } cnt++; } } } } if (fu == fu1) fu = fu2; if (fu == fu2) done = 1; }; } if (out_type == 1) { /* Add overlay */ _ged_cvt_vlblock_to_solids(gedp, vbp, (char *)name, 0); rt_vlblock_free(vbp); bu_log("Showing open edges...\n"); } else if (out_type == 2) { if (plotfp) { (void)fclose(plotfp); bu_log("Wrote plot file (%s)\n", bu_vls_addr(&plot_file_name)); bu_vls_free(&plot_file_name); } } bu_ptbl_free(&faces); return cnt; }