int main(int argc, char** argv) { assert(argc == 2); ego context; CALL(EG_open(&context)); ego model; CALL(EG_loadModel(context, 0, argv[1], &model)); ego model_geom; int model_oclass; int model_mtype; int nbodies; ego* bodies; int* body_senses; CALL(EG_getTopology(model, &model_geom, &model_oclass, &model_mtype, nullptr, &nbodies, &bodies, &body_senses)); printf("model oclass \"%s\" mtype %d has %d bodies\n", get_oclass_name(model_oclass), model_mtype, nbodies); auto body = bodies[0]; int nfaces; ego* faces; CALL(EG_getBodyTopos(body, nullptr, FACE, &nfaces, &faces)); printf("first body has %d faces\n", nfaces); int nedges; ego* edges; CALL(EG_getBodyTopos(body, nullptr, EDGE, &nedges, &edges)); printf("first body has %d edges\n", nedges); EG_free(edges); int nverts; ego* verts; CALL(EG_getBodyTopos(body, nullptr, NODE, &nverts, &verts)); printf("first body has %d verts\n", nverts); for (int i = 0; i < nverts; ++i) { auto pt = get_point(verts[i]); printf("point %d at %f %f %f\n", i + 1, pt[0], pt[1], pt[2]); } EG_free(verts); print_closest_point(faces, 1, {{0.0, 0.75, 0.5}}); print_closest_point(faces, 2, {{0.5, 0.5, 1.0}}); print_closest_point(faces, 3, {{0.5, 1.0, 0.5}}); print_closest_point(faces, 4, {{0.5, 0.5, 0.0}}); print_closest_point(faces, 5, {{0.5 / sqrt(2), 0.5 / sqrt(2), 0.5}}); print_closest_point(faces, 6, {{1.0, 0.5, 0.5}}); print_closest_point(faces, 7, {{0.75, 0.0, 0.5}}); EG_free(faces); CALL(EG_deleteObject(model)); CALL(EG_close(context)); }
int main(int argc, char *argv[]) { int i, mtype, oclass, nbody, nface, nedge, iface, *senses; ego context, model1, model2, wModel, newModel, geom, body; ego *bodies1, *bodies2, *faces, *facEdge; if (argc != 4) { printf("\n Usage: intersect model(body) model(face) face#\n\n"); return 1; } iface = atoi(argv[3]); /* initialize */ printf(" EG_open = %d\n", EG_open(&context)); printf(" EG_loadModel 1 = %d\n", EG_loadModel(context, 0, argv[1], &model1)); printf(" EG_loadModel 2 = %d\n", EG_loadModel(context, 0, argv[2], &model2)); /* get all bodies */ printf(" EG_getTopology 1 = %d\n", EG_getTopology(model1, &geom, &oclass, &mtype, NULL, &nbody, &bodies1, &senses)); printf(" EG_getTopology 2 = %d\n", EG_getTopology(model2, &geom, &oclass, &mtype, NULL, &nbody, &bodies2, &senses)); printf(" EG_getBodyTopos = %d\n", EG_getBodyTopos(bodies2[0], NULL, FACE, &nface, &faces)); if ((iface < 1) || (iface > nface)) { printf(" ERROR: face # = %d [1-%d]!\n\n", iface, nface); printf(" EG_deleteObject = %d\n", EG_deleteObject(model2)); printf(" EG_deleteObject = %d\n", EG_deleteObject(model1)); printf(" EG_close = %d\n", EG_close(context)); return 1; } iface--; printf(" \n"); printf(" EG_intersection = %d\n", EG_intersection(bodies1[0], faces[iface], &nedge, &facEdge, &wModel)); printf(" nedge = %d\n", nedge); printf(" EG_saveModel = %d\n", EG_saveModel(wModel, "wModel.egads")); printf(" EG_imprintBody = %d\n", EG_imprintBody(bodies1[0], nedge, facEdge, &body)); for (i = 0; i < nedge; i++) facEdge[2*i] = faces[2]; printf(" EG_imprintBody = %d\n", EG_imprintBody(bodies2[0], nedge, facEdge, &body)); printf(" EG_makeTopology = %d\n", EG_makeTopology(context, NULL, MODEL, 0, NULL, 1, &body, NULL, &newModel)); printf(" EG_saveModel = %d\n", EG_saveModel(newModel, "newModel.egads")); printf("\n"); printf(" EG_deleteObject = %d\n", EG_deleteObject(newModel)); printf(" EG_deleteObject = %d\n", EG_deleteObject( wModel)); EG_free(facEdge); EG_free(faces); printf(" EG_deleteObject = %d\n", EG_deleteObject(model2)); printf(" EG_deleteObject = %d\n", EG_deleteObject(model1)); printf(" EG_close = %d\n", EG_close(context)); return 0; }
int main(int argc, char *argv[]) { int i, j, status, oclass, mtype, nbody, nvert, ntriang, nface, *triang; char filename[20]; float arg; double params[3], box[6], size, *verts; FILE *fp; ego context, model, geom, *bodies, tess, *dum, *faces; if ((argc != 2) && (argc != 5)) { printf(" Usage: egads2cart Model [angle relSide relSag]\n\n"); return 1; } /* look at EGADS revision */ EG_revision(&i, &j); printf("\n Using EGADS %2d.%02d\n\n", i, j); /* initialize */ status = EG_open(&context); if (status != EGADS_SUCCESS) { printf(" EG_open = %d!\n\n", status); return 1; } status = EG_loadModel(context, 0, argv[1], &model); if (status != EGADS_SUCCESS) { printf(" EG_loadModel = %d\n\n", status); return 1; } status = EG_getBoundingBox(model, box); if (status != EGADS_SUCCESS) { printf(" EG_getBoundingBox = %d\n\n", status); return 1; } size = sqrt((box[0]-box[3])*(box[0]-box[3]) + (box[1]-box[4])*(box[1]-box[4]) + (box[2]-box[5])*(box[2]-box[5])); /* get all bodies */ status = EG_getTopology(model, &geom, &oclass, &mtype, NULL, &nbody, &bodies, &triang); if (status != EGADS_SUCCESS) { printf(" EG_getTopology = %d\n\n", status); return 1; } params[0] = 0.025*size; params[1] = 0.001*size; params[2] = 15.0; if (argc == 5) { sscanf(argv[2], "%f", &arg); params[2] = arg; sscanf(argv[3], "%f", &arg); params[0] = arg; sscanf(argv[4], "%f", &arg); params[1] = arg; printf(" Using angle = %lf, relSide = %lf, relSag = %lf\n", params[2], params[0], params[1]); params[0] *= size; params[1] *= size; } printf(" Number of Bodies = %d\n\n", nbody); /* write out each body as a different Cart3D ASCII tri file */ for (i = 0; i < nbody; i++) { sprintf(filename, "egads.%3.3d.a.tri", i+1); mtype = 0; EG_getTopology(bodies[i], &geom, &oclass, &mtype, NULL, &j, &dum, &triang); if (mtype != SOLIDBODY) continue; /* only Solid Bodies! */ status = EG_makeTessBody(bodies[i], params, &tess); if (status != EGADS_SUCCESS) { printf(" EG_makeTessBody %d = %d\n", i, status); continue; } status = EG_getBodyTopos(bodies[i], NULL, FACE, &nface, &faces); if (status != EGADS_SUCCESS) { printf(" EG_getBodyTopos %d = %d\n", i, status); EG_deleteObject(tess); continue; } EG_free(faces); /* zip up the tessellation */ status = bodyTessellation(tess, nface, &nvert, &verts, &ntriang, &triang); EG_deleteObject(tess); if (status != EGADS_SUCCESS) continue; /* write it out */ fp = fopen(filename, "w"); if (fp == NULL) { printf(" Can not Open file %s! NO FILE WRITTEN\n", filename); EG_free(verts); EG_free(triang); continue; } printf("\nWriting Cart3D component file %s\n", filename); /* header */ fprintf(fp, "%d %d\n", nvert, ntriang); /* ...vertList */ for(j = 0; j < nvert; j++) fprintf(fp, " %f %f %f\n", verts[3*j ], verts[3*j+1], verts[3*j+2]); /* ...Connectivity */ for (j = 0; j < ntriang; j++) fprintf(fp, "%6d %6d %6d\n",triang[3*j], triang[3*j+1], triang[3*j+2]); /* ...Component list*/ for (j = 0; j < ntriang; j++) fprintf(fp, "%6d\n", i); fclose(fp); printf(" # verts = %d, # tris = %d\n\n", nvert, ntriang); EG_free(verts); EG_free(triang); } status = EG_deleteObject(model); if (status != EGADS_SUCCESS) printf(" EG_deleteObject = %d\n", status); EG_close(context); return 0; }
int main(int argc, char *argv[]) { int i, j, k, m, n, ibody, stat, oclass, mtype, len, ntri, sum; int nloops, nseg, nledges, *segs, *lsenses, *senses, *esenses; int nh, *heads; const int *tris, *tric, *ptype, *pindex; float arg, color[3], *lsegs; double box[6], size; const double *xyzs, *uvs, *ts; char gpname[33], *startapp; ego context, model, geom, *bodies, *dum, *ledges, *loops; wvData items[5]; float eye[3] = {0.0, 0.0, 7.0}; float center[3] = {0.0, 0.0, 0.0}; float up[3] = {0.0, 1.0, 0.0}; /* get our starting application line * * for example on a Mac: * setenv wvStart "open -a /Applications/Firefox.app ../client/wv.html" */ startapp = getenv("wvStart"); if ((argc != 2) && (argc != 5)) { printf("\n Usage: vTess filename [angle maxlen sag]\n\n"); return 1; } /* look at EGADS revision */ EG_revision(&i, &j); printf("\n Using EGADS %2d.%02d\n\n", i, j); /* initialize */ printf(" EG_open = %d\n", EG_open(&context)); printf(" EG_loadModel = %d\n", EG_loadModel(context, 0, argv[1], &model)); printf(" EG_getBoundingBox = %d\n", EG_getBoundingBox(model, box)); printf(" BoundingBox = %lf %lf %lf\n", box[0], box[1], box[2]); printf(" %lf %lf %lf\n", box[3], box[4], box[5]); printf(" \n"); size = box[3]-box[0]; if (size < box[4]-box[1]) size = box[4]-box[1]; if (size < box[5]-box[2]) size = box[5]-box[2]; focus[0] = 0.5*(box[0]+box[3]); focus[1] = 0.5*(box[1]+box[4]); focus[2] = 0.5*(box[2]+box[5]); focus[3] = size; /* get all bodies */ stat = EG_getTopology(model, &geom, &oclass, &mtype, NULL, &nbody, &bodies, &senses); if (stat != EGADS_SUCCESS) { printf(" EG_getTopology = %d\n", stat); return 1; } printf(" EG_getTopology: nBodies = %d\n", nbody); bodydata = (bodyData *) malloc(nbody*sizeof(bodyData)); if (bodydata == NULL) { printf(" MALLOC Error on Body storage!\n"); return 1; } EG_setOutLevel(context, 2); /* get some Debug output */ params[0] = 0.025*size; params[1] = 0.001*size; params[2] = 15.0; if (argc == 5) { sscanf(argv[2], "%f", &arg); params[2] = arg; sscanf(argv[3], "%f", &arg); params[0] = arg; sscanf(argv[4], "%f", &arg); params[1] = arg; printf(" Using angle = %lf, relSide = %lf, relSag = %lf\n", params[2], params[0], params[1]); params[0] *= size; params[1] *= size; } /* fill our structure a body at at time */ for (ibody = 0; ibody < nbody; ibody++) { mtype = 0; EG_getTopology(bodies[ibody], &geom, &oclass, &mtype, NULL, &j, &dum, &senses); bodydata[ibody].body = bodies[ibody]; bodydata[ibody].mtype = mtype; if (mtype == WIREBODY) { printf(" Body %d: Type = WireBody\n", ibody+1); } else if (mtype == FACEBODY) { printf(" Body %d: Type = FaceBody\n", ibody+1); } else if (mtype == SHEETBODY) { printf(" Body %d: Type = SheetBody\n", ibody+1); } else { printf(" Body %d: Type = SolidBody\n", ibody+1); } stat = EG_getBodyTopos(bodies[ibody], NULL, FACE, &bodydata[ibody].nfaces, &bodydata[ibody].faces); i = EG_getBodyTopos(bodies[ibody], NULL, EDGE, &bodydata[ibody].nedges, &bodydata[ibody].edges); if ((stat != EGADS_SUCCESS) || (i != EGADS_SUCCESS)) { printf(" EG_getBodyTopos Face = %d\n", stat); printf(" EG_getBodyTopos Edge = %d\n", i); return 1; } stat = EG_makeTessBody(bodies[ibody], params, &bodydata[ibody].tess); if (stat != EGADS_SUCCESS) { printf(" EG_makeTessBody %d = %d\n", ibody, stat); continue; } } printf(" \n"); /* create the WebViewer context */ cntxt = wv_createContext(1, 30.0, 1.0, 10.0, eye, center, up); if (cntxt == NULL) printf(" failed to create wvContext!\n"); /* make the scene */ for (sum = stat = ibody = 0; ibody < nbody; ibody++) { /* get faces */ for (i = 0; i < bodydata[ibody].nfaces; i++) { stat = EG_getTessFace(bodydata[ibody].tess, i+1, &len, &xyzs, &uvs, &ptype, &pindex, &ntri, &tris, &tric); if (stat != EGADS_SUCCESS) continue; sprintf(gpname, "Body %d Face %d", ibody+1, i+1); stat = wv_setData(WV_REAL64, len, (void *) xyzs, WV_VERTICES, &items[0]); if (stat < 0) printf(" wv_setData = %d for %s/item 0!\n", i, gpname); wv_adjustVerts(&items[0], focus); stat = wv_setData(WV_INT32, 3*ntri, (void *) tris, WV_INDICES, &items[1]); if (stat < 0) printf(" wv_setData = %d for %s/item 1!\n", i, gpname); color[0] = 1.0; color[1] = ibody; color[1] /= nbody; color[2] = 0.0; stat = wv_setData(WV_REAL32, 1, (void *) color, WV_COLORS, &items[2]); if (stat < 0) printf(" wv_setData = %d for %s/item 2!\n", i, gpname); for (nseg = j = 0; j < ntri; j++) for (k = 0; k < 3; k++) if (tric[3*j+k] < j+1) nseg++; segs = (int *) malloc(2*nseg*sizeof(int)); if (segs == NULL) { printf(" Can not allocate %d Sides!\n", nseg); continue; } for (nseg = j = 0; j < ntri; j++) for (k = 0; k < 3; k++) if (tric[3*j+k] < j+1) { segs[2*nseg ] = tris[3*j+sides[k][0]]; segs[2*nseg+1] = tris[3*j+sides[k][1]]; nseg++; } stat = wv_setData(WV_INT32, 2*nseg, (void *) segs, WV_LINDICES, &items[3]); if (stat < 0) printf(" wv_setData = %d for %s/item 3!\n", i, gpname); free(segs); /* color[0] = color[1] = color[2] = 0.8; */ color[0] = color[1] = color[2] = 0.0; stat = wv_setData(WV_REAL32, 1, (void *) color, WV_LCOLOR, &items[4]); if (stat < 0) printf(" wv_setData = %d for %s/item 4!\n", i, gpname); stat = wv_addGPrim(cntxt, gpname, WV_TRIANGLE, WV_ON|WV_ORIENTATION, 5, items); if (stat < 0) { printf(" wv_addGPrim = %d for %s!\n", stat, gpname); } else { if (cntxt != NULL) if (cntxt->gPrims != NULL) cntxt->gPrims[stat].lWidth = 1.0; } sum += ntri; } /* get loops */ color[0] = color[1] = 0.0; color[2] = 1.0; for (i = 0; i < bodydata[ibody].nfaces; i++) { stat = EG_getTopology(bodydata[ibody].faces[i], &geom, &oclass, &mtype, NULL, &nloops, &loops, &lsenses); if (stat != EGADS_SUCCESS) continue; for (nh = j = 0; j < nloops; j++) { stat = EG_getTopology(loops[j], &geom, &oclass, &mtype, NULL, &nledges, &ledges, &esenses); if (stat != EGADS_SUCCESS) continue; /* count */ for (ntri = nseg = k = 0; k < nledges; k++) { m = 0; while (ledges[k] != bodydata[ibody].edges[m]) { m++; if (m == bodydata[ibody].nedges) break; } /* assume that the edge is degenerate and removed */ if (m == bodydata[ibody].nedges) continue; stat = EG_getTessEdge(bodydata[ibody].tess, m+1, &len, &xyzs, &ts); if (stat != EGADS_SUCCESS) { printf(" EG_getTessEdge %d = %d!\n", m+1, stat); nseg = 0; break; } if (len == 2) if ((xyzs[0] == xyzs[3]) && (xyzs[1] == xyzs[4]) && (xyzs[2] == xyzs[5])) continue; nh++; #ifdef NONINDEXED nseg += 2*(len-1); #else nseg += len; ntri += 2*(len-1); #endif } if (nseg == 0) continue; lsegs = (float *) malloc(3*nseg*sizeof(float)); if (lsegs == NULL) { printf(" Can not allocate %d Segments!\n", nseg); continue; } #ifndef NONINDEXED segs = (int *) malloc(ntri*sizeof(int)); if (segs == NULL) { printf(" Can not allocate %d Line Segments!\n", ntri); free(lsegs); continue; } #endif heads = (int *) malloc(nh*sizeof(int)); if (heads == NULL) { printf(" Can not allocate %d Heads!\n", nh); #ifndef NONINDEXED free(segs); #endif free(lsegs); continue; } /* fill */ for (nh = ntri = nseg = k = 0; k < nledges; k++) { m = 0; while (ledges[k] != bodydata[ibody].edges[m]) { m++; if (m == bodydata[ibody].nedges) break; } /* assume that the edge is degenerate and removed */ if (m == bodydata[ibody].nedges) continue; EG_getTessEdge(bodydata[ibody].tess, m+1, &len, &xyzs, &ts); if (len == 2) if ((xyzs[0] == xyzs[3]) && (xyzs[1] == xyzs[4]) && (xyzs[2] == xyzs[5])) continue; #ifdef NONINDEXED if (esenses[k] == -1) heads[nh] = -nseg/2 - 1; for (n = 0; n < len-1; n++) { lsegs[3*nseg ] = xyzs[3*n ]; lsegs[3*nseg+1] = xyzs[3*n+1]; lsegs[3*nseg+2] = xyzs[3*n+2]; nseg++; lsegs[3*nseg ] = xyzs[3*n+3]; lsegs[3*nseg+1] = xyzs[3*n+4]; lsegs[3*nseg+2] = xyzs[3*n+5]; nseg++; } if (esenses[k] == 1) heads[nh] = nseg/2; #else if (esenses[k] == -1) heads[nh] = -ntri/2 - 1; for (n = 0; n < len-1; n++) { segs[ntri] = n+nseg+1; ntri++; segs[ntri] = n+nseg+2; ntri++; } if (esenses[k] == 1) heads[nh] = ntri/2; for (n = 0; n < len; n++) { lsegs[3*nseg ] = xyzs[3*n ]; lsegs[3*nseg+1] = xyzs[3*n+1]; lsegs[3*nseg+2] = xyzs[3*n+2]; nseg++; } #endif nh++; } sprintf(gpname, "Body %d Loop %d/%d", ibody+1, i+1, j+1); stat = wv_setData(WV_REAL32, nseg, (void *) lsegs, WV_VERTICES, &items[0]); if (stat < 0) printf(" wv_setData = %d for %s/item 0!\n", i, gpname); wv_adjustVerts(&items[0], focus); free(lsegs); stat = wv_setData(WV_REAL32, 1, (void *) color, WV_COLORS, &items[1]); if (stat < 0) printf(" wv_setData = %d for %s/item 1!\n", i, gpname); #ifdef NONINDEXED stat = wv_addGPrim(cntxt, gpname, WV_LINE, WV_ON, 2, items); #else stat = wv_setData(WV_INT32, ntri, (void *) segs, WV_INDICES, &items[2]); if (stat < 0) printf(" wv_setData = %d for %s/item 2!\n", i, gpname); free(segs); stat = wv_addGPrim(cntxt, gpname, WV_LINE, WV_ON, 3, items); #endif if (stat < 0) { printf(" wv_addGPrim = %d for %s!\n", stat, gpname); } else { if (cntxt != NULL) if (cntxt->gPrims != NULL) { cntxt->gPrims[stat].lWidth = 1.0; n = wv_addArrowHeads(cntxt, stat, 0.05, nh, heads); if (n != 0) printf(" wv_addArrowHeads = %d\n", n); } } free(heads); /* wv_printGPrim(cntxt, stat); */ } } } printf(" ** %d gPrims with %d triangles **\n", stat+1, sum); /* start the server code */ stat = 0; if (wv_startServer(7681, NULL, NULL, NULL, 0, cntxt) == 0) { /* we have a single valid server -- stay alive a long as we have a client */ while (wv_statusServer(0)) { usleep(500000); if (stat == 0) { if (startapp != NULL) system(startapp); stat++; } /* wv_broadcastText("I'm here!"); */ } } wv_cleanupServers(); /* finish up */ for (ibody = 0; ibody < nbody; ibody++) { EG_deleteObject(bodydata[ibody].tess); EG_free(bodydata[ibody].edges); EG_free(bodydata[ibody].faces); } free(bodydata); printf(" EG_deleteObject = %d\n", EG_deleteObject(model)); printf(" EG_close = %d\n", EG_close(context)); return 0; }
int main(int argc, char *argv[]) { int i, j, mtype, oclass, nbody, nedge, *senses; double size, box[6]; ego context, model, newModel, geom, body, *bodies, *edges, *fedge; if (argc < 3) { printf("\n Usage: fillet filename relSize [edge# ... edge#]\n\n"); return 1; } sscanf(argv[2], "%lf", &size); printf("\n fillet: Using Relative Size = %lf\n", size); /* initialize */ printf(" EG_open = %d\n", EG_open(&context)); printf(" EG_loadModel = %d\n", EG_loadModel(context, 0, argv[1], &model)); if (model == NULL) return 1; /* get all bodies */ printf(" EG_getTopology = %d\n", EG_getTopology(model, &geom, &oclass, &mtype, NULL, &nbody, &bodies, &senses)); /* get all edges in body */ printf(" EG_getBodyTopos = %d\n", EG_getBodyTopos(bodies[0], NULL, EDGE, &nedge, &edges)); printf(" EG_getBoundingBox = %d\n", EG_getBoundingBox(bodies[0], box)); printf(" BoundingBox = %lf %lf %lf\n", box[0], box[1], box[2]); printf(" %lf %lf %lf\n", box[3], box[4], box[5]); size *= sqrt((box[0]-box[3])*(box[0]-box[3]) + (box[1]-box[4])*(box[1]-box[4]) + (box[2]-box[5])*(box[2]-box[5])); if (argc == 3) { /* fillet all of them */ printf(" \n"); printf(" EG_fillet = %d\n", EG_filletBody(bodies[0], nedge, edges, size, &body)); } else { fedge = (ego *) malloc((argc-3)*sizeof(ego)); if (fedge == NULL) { printf(" MALLOC ERROR!\n"); EG_free(edges); printf(" EG_deleteObject = %d\n", EG_deleteObject(model)); printf(" EG_close = %d\n", EG_close(context)); return 1; } printf("\n fillet: Using Edges = "); for (i = 0; i < argc-3; i++) { sscanf(argv[i+3], "%d", &j); if ((j < 0) || (j > nedge)) { printf(" ERROR: Argument %d is %d [1-%d]!\n", i+3, j, nedge); free(fedge); EG_free(edges); printf(" EG_deleteObject = %d\n", EG_deleteObject(model)); printf(" EG_close = %d\n", EG_close(context)); return 1; } fedge[i] = edges[j-1]; printf(" %d", j); } printf("\n\n"); /* fillet each of them */ printf(" EG_fillet = %d\n", EG_filletBody(bodies[0], argc-3, fedge, size, &body)); free(fedge); } /* make a model and write it out */ if (body != NULL) { printf(" EG_makeTopology = %d\n", EG_makeTopology(context, NULL, MODEL, 0, NULL, 1, &body, NULL, &newModel)); printf(" EG_saveModel = %d\n", EG_saveModel(newModel, "fillet.egads")); printf("\n"); printf(" EG_deleteObject = %d\n", EG_deleteObject(newModel)); } EG_free(edges); printf(" EG_deleteObject = %d\n", EG_deleteObject(model)); printf(" EG_close = %d\n", EG_close(context)); return 0; }
int gem_diamondBody(ego object, /*@null@*/ char *bID, gemBRep *brep) { int i, j, k, m, n, len, stat, oclass, mtype, nobjs, *senses; int nshell, nface, nloop, nedge, nnode, atype, alen; const int *ints; double limits[4]; const double *reals; char buffer[1025]; const char *string; ego geom, *objs; ego *shells, *faces, *loops, *edges, *nodes; gemID gid; gemBody *body; stat = EG_getTopology(object, &geom, &oclass, &mtype, limits, &nobjs, &objs, &senses); if (stat != EGADS_SUCCESS) return stat; if (oclass != BODY) return EGADS_NOTBODY; gid.index = 0; gid.ident.ptr = object; body = (gemBody *) gem_allocate(sizeof(gemBody)); if (body == NULL) return GEM_ALLOC; body->handle = gid; body->nnode = 0; body->nodes = NULL; body->nedge = 0; body->edges = NULL; body->nloop = 0; body->loops = NULL; body->nface = 0; body->faces = NULL; body->nshell = 0; body->shells = NULL; body->attr = NULL; body->type = GEM_SOLID; if ((mtype == SHEETBODY) || (mtype == FACEBODY)) body->type = GEM_SHEET; if (mtype == WIREBODY) body->type = GEM_WIRE; brep->body = body; gem_matIdent(brep->xform); gem_matIdent(brep->invXform); stat = EG_getBoundingBox(object, body->box); if (stat != EGADS_SUCCESS) return stat; nodes = NULL; edges = NULL; loops = NULL; faces = NULL; shells = NULL; stat = EG_getBodyTopos(object, NULL, NODE, &nnode, &nodes); if (stat != EGADS_SUCCESS) goto ret; stat = EG_getBodyTopos(object, NULL, EDGE, &nedge, &edges); if (stat != EGADS_SUCCESS) goto ret; stat = EG_getBodyTopos(object, NULL, LOOP, &nloop, &loops); if (stat != EGADS_SUCCESS) goto ret; stat = EG_getBodyTopos(object, NULL, FACE, &nface, &faces); if (stat != EGADS_SUCCESS) goto ret; stat = EG_getBodyTopos(object, NULL, SHELL, &nshell, &shells); if (stat != EGADS_SUCCESS) goto ret; /* make the nodes */ if ((nnode != 0) && (nodes != NULL)) { stat = GEM_ALLOC; body->nodes = (gemNode *) gem_allocate(nnode*sizeof(gemNode)); if (body->nodes == NULL) goto ret; for (i = 0; i < nnode; i++) body->nodes[i].attr = NULL; body->nnode = nnode; for (i = 0; i < nnode; i++) { stat = EG_getTopology(nodes[i], &geom, &oclass, &mtype, limits, &nobjs, &objs, &senses); if (stat != EGADS_SUCCESS) goto ret; gid.ident.ptr = nodes[i]; body->nodes[i].handle = gid; body->nodes[i].xyz[0] = limits[0]; body->nodes[i].xyz[1] = limits[1]; body->nodes[i].xyz[2] = limits[2]; gem_fillAttrs(nodes[i], &body->nodes[i].attr); } } /* make the edges */ if ((nedge != 0) && (edges != NULL)) { stat = GEM_ALLOC; body->edges = (gemEdge *) gem_allocate(nedge*sizeof(gemEdge)); if (body->edges == NULL) goto ret; for (i = 0; i < nedge; i++) { body->edges[i].faces[0] = body->edges[i].faces[1] = 0; body->edges[i].attr = NULL; } body->nedge = nedge; for (n = i = 0; i < nedge; i++) { stat = EG_getTopology(edges[i], &geom, &oclass, &mtype, limits, &nobjs, &objs, &senses); if (stat != EGADS_SUCCESS) goto ret; if (mtype == DEGENERATE) { edges[i] = NULL; continue; } gid.ident.ptr = edges[i]; body->edges[n].handle = gid; body->edges[n].tlimit[0] = limits[0]; body->edges[n].tlimit[1] = limits[1]; body->edges[n].nodes[0] = gem_lookup(objs[0], nnode, nodes); if (nobjs == 1) { body->edges[n].nodes[1] = body->edges[n].nodes[0]; } else { body->edges[n].nodes[1] = gem_lookup(objs[1], nnode, nodes); } gem_fillAttrs(edges[i], &body->edges[n].attr); n++; } body->nedge = n; } /* make the loops */ if ((nloop != 0) && (loops != NULL)) { stat = GEM_ALLOC; body->loops = (gemLoop *) gem_allocate(nloop*sizeof(gemLoop)); if (body->loops == NULL) goto ret; for (i = 0; i < nloop; i++) { body->loops[i].edges = NULL; body->loops[i].attr = NULL; } body->nloop = nloop; for (i = 0; i < nloop; i++) { stat = EG_getTopology(loops[i], &geom, &oclass, &mtype, limits, &nobjs, &objs, &senses); if (stat != EGADS_SUCCESS) goto ret; gid.ident.ptr = loops[i]; body->loops[i].handle = gid; body->loops[i].type = 0; body->loops[i].face = 0; body->loops[i].edges = (int *) gem_allocate(nobjs*sizeof(int)); stat = GEM_ALLOC; if (body->loops[i].edges == NULL) goto ret; for (n = j = 0; j < nobjs; j++) { k = gem_lookup(objs[j], nedge, edges); if (k == 0) continue; body->loops[i].edges[n] = senses[j]*k; n++; } body->loops[i].nedges = n; gem_fillAttrs(loops[i], &body->loops[i].attr); } } /* make the faces */ if ((nface != 0) && (faces != NULL)) { len = 0; if (bID != NULL) len = strlen(bID); stat = GEM_ALLOC; body->faces = (gemFace *) gem_allocate(nface*sizeof(gemFace)); if (body->faces == NULL) goto ret; for (i = 0; i < nface; i++) { body->faces[i].loops = NULL; body->faces[i].ID = NULL; body->faces[i].attr = NULL; } body->nface = nface; for (i = 0; i < nface; i++) { stat = EG_getTopology(faces[i], &geom, &oclass, &mtype, limits, &nobjs, &objs, &senses); if (stat != EGADS_SUCCESS) goto ret; gid.ident.ptr = faces[i]; body->faces[i].handle = gid; body->faces[i].uvbox[0] = limits[0]; body->faces[i].uvbox[1] = limits[1]; body->faces[i].uvbox[2] = limits[2]; body->faces[i].uvbox[3] = limits[3]; body->faces[i].norm = mtype; body->faces[i].loops = (int *) gem_allocate(nobjs*sizeof(int)); stat = GEM_ALLOC; if (body->faces[i].loops == NULL) goto ret; body->faces[i].nloops = nobjs; for (j = 0; j < nobjs; j++) { k = gem_lookup(objs[j], nloop, loops); body->faces[i].loops[j] = k; if (k == 0) continue; if (body->loops == NULL) continue; body->loops[k-1].face = i+1; if (senses[j] == -1) body->loops[k-1].type = 1; /* set face markers in edge struct */ if (body->edges == NULL) continue; for (n = 0; n < body->loops[k-1].nedges; n++) { m = body->loops[k-1].edges[n]; if (m < 0) { if (body->edges[-m-1].faces[0] != 0) printf(" Diamond Internal: -Face for Edge %d = %d %d\n", -m, body->edges[-m-1].faces[0], i+1); body->edges[-m-1].faces[0] = i+1; } else { if (body->edges[m-1].faces[1] != 0) printf(" Diamond Internal: +Face for Edge %d = %d %d\n", m, body->edges[m-1].faces[1], i+1); body->edges[m-1].faces[1] = i+1; } } } if (bID == NULL) { stat = EG_attributeRet(faces[i], "body", &atype, &alen, &ints, &reals, &string); if ((stat != EGADS_SUCCESS) || (atype != ATTRINT)) { printf(" Diamond Internal: OpenCSM FaceID for %d = %d, atype = %d\n", i+1, stat, atype); } else { snprintf(buffer, 1024, "%d:%d", ints[0], ints[1]); for (j = 2; j < alen; j+=2) { m = strlen(buffer); if (m >= 1024) break; snprintf(&buffer[m], 1024-m, "::%d:%d", ints[j], ints[j+1]); } buffer[1024] = 0; body->faces[i].ID = gem_strdup(buffer); } } else { body->faces[i].ID = (char *) gem_allocate((len+10)*sizeof(char)); if (body->faces[i].ID == NULL) goto ret; snprintf(body->faces[i].ID, len+10, "%s:%d", bID, i+1); } gem_fillAttrs(faces[i], &body->faces[i].attr); } } /* make the shells */ if ((nshell != 0) && (shells != NULL)) { stat = GEM_ALLOC; body->shells = (gemShell *) gem_allocate(nshell*sizeof(gemShell)); if (body->shells == NULL) goto ret; for (i = 0; i < nshell; i++) { body->shells[i].faces = NULL; body->shells[i].attr = NULL; } body->nshell = nshell; for (i = 0; i < nshell; i++) { stat = EG_getTopology(shells[i], &geom, &oclass, &mtype, limits, &nobjs, &objs, &senses); if (stat != EGADS_SUCCESS) goto ret; gid.ident.ptr = shells[i]; body->shells[i].handle = gid; body->shells[i].type = 0; body->shells[i].faces = (int *) gem_allocate(nobjs*sizeof(int)); stat = GEM_ALLOC; if (body->shells[i].faces == NULL) goto ret; body->shells[i].nfaces = nobjs; for (j = 0; j < nobjs; j++) body->shells[i].faces[j] = gem_lookup(objs[j], nface, faces); gem_fillAttrs(shells[i], &body->shells[i].attr); } /* set the type for solids */ if ((body->type == GEM_SOLID) && (nshell > 1)) { EG_getTopology(object, &geom, &oclass, &mtype, limits, &nobjs, &objs, &senses); for (j = 0; j < nobjs; j++) { if (senses[j] == 1) continue; k = gem_lookup(objs[j], nshell, shells); if (k == 0) continue; body->shells[k-1].type = 1; } } } gem_fillAttrs(object, &body->attr); stat = EGADS_SUCCESS; ret: if (shells != NULL) EG_free(shells); if (faces != NULL) EG_free(faces); if (loops != NULL) EG_free(loops); if (edges != NULL) EG_free(edges); if (nodes != NULL) EG_free(nodes); return stat; }