int gem_kernelClose() { int stat; stat = EG_close(dia_context); dia_context = NULL; return stat; }
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; }