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 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 udpExecute(ego context, ego *ebody, int *nMesh, char **string) { int status = EGADS_SUCCESS; int inode, jnode, nnode, iseg, jseg, jedge, jface, senses[4]; int *ibeg=NULL, *iend=NULL; int ia, ib, ic, id, MAXSIZE=1000; double *X=NULL, *Y=NULL; double xyz[20], data[6], xyz_out[20], D, s, t, xx, yy; double EPS06 = 1.0e-6; ego *enodes=NULL, *eedges=NULL, *efaces=NULL, ecurve, echild[4], eloop, eshell; /* default return values */ *ebody = NULL; *nMesh = 0; *string = NULL; /* increment number of UDPs */ numUdp++; /* increase the arrays to make room for the new UDP */ ebodys = (ego *) EG_reall(ebodys, (numUdp+1)*sizeof(ego )); Depth = (double *) EG_reall(Depth, (numUdp+1)*sizeof(double )); Nseg = (int *) EG_reall(Nseg, (numUdp+1)*sizeof(int )); Segments = (double**) EG_reall(Segments, (numUdp+1)*sizeof(double*)); if (ebodys == NULL || Depth == NULL || Nseg == NULL || Segments == NULL) { return EGADS_MALLOC; } ebodys[ numUdp] = NULL; Segments[numUdp] = (double*) EG_alloc(4*Nseg[0]*sizeof(double)); if (Segments[numUdp] == NULL) { status = EGADS_MALLOC; goto cleanup; } /* copy in the data */ Depth[numUdp] = Depth[0]; Nseg[ numUdp] = Nseg[ 0]; for (iseg = 0; iseg < Nseg[0]; iseg++) { Segments[numUdp][4*iseg ] = Segments[0][4*iseg ]; Segments[numUdp][4*iseg+1] = Segments[0][4*iseg+1]; Segments[numUdp][4*iseg+2] = Segments[0][4*iseg+2]; Segments[numUdp][4*iseg+3] = Segments[0][4*iseg+3]; } /* make an indexed table of the segments */ X = (double *) EG_alloc(MAXSIZE*sizeof(double)); // probably too big Y = (double *) EG_alloc(MAXSIZE*sizeof(double)); ibeg = (int *) EG_alloc(MAXSIZE*sizeof(int )); iend = (int *) EG_alloc(MAXSIZE*sizeof(int )); if (X == NULL || Y == NULL || ibeg == NULL || iend == NULL) { status = EGADS_MALLOC; goto cleanup; } nnode = 0; for (iseg = 0; iseg < Nseg[0]; iseg++) { ibeg[iseg] = -1; for (jnode = 0; jnode < nnode; jnode++) { if (fabs(Segments[0][4*iseg ]-X[jnode]) < EPS06 && fabs(Segments[0][4*iseg+1]-Y[jnode]) < EPS06 ) { ibeg[iseg] = jnode; break; } } if (ibeg[iseg] < 0) { ibeg[iseg] = nnode; X[nnode] = Segments[0][4*iseg ]; Y[nnode] = Segments[0][4*iseg+1]; nnode++; } iend[iseg] = -1; for (jnode = 0; jnode < nnode; jnode++) { if (fabs(Segments[0][4*iseg+2]-X[jnode]) < EPS06 && fabs(Segments[0][4*iseg+3]-Y[jnode]) < EPS06 ) { iend[iseg] = jnode; break; } } if (iend[iseg] < 0) { iend[iseg] = nnode; X[nnode] = Segments[0][4*iseg+2]; Y[nnode] = Segments[0][4*iseg+3]; nnode++; } } /* check for intersections */ for (jseg = 0; jseg < Nseg[0]; jseg++) { for (iseg = jseg+1; iseg < Nseg[0]; iseg++) { ia = ibeg[iseg]; ib = iend[iseg]; ic = ibeg[jseg]; id = iend[jseg]; D = (X[ib] - X[ia]) * (Y[ic] - Y[id]) - (X[ic] - X[id]) * (Y[ib] - Y[ia]); if (fabs(D) > EPS06) { s = ((X[ic] - X[ia]) * (Y[ic] - Y[id]) - (X[ic] - X[id]) * (Y[ic] - Y[ia])) / D; t = ((X[ib] - X[ia]) * (Y[ic] - Y[ia]) - (X[ic] - X[ia]) * (Y[ib] - Y[ia])) / D; if (s > -EPS06 && s < 1+EPS06 && t > -EPS06 && t < 1+EPS06 ) { xx = (1 - s) * X[ia] + s * X[ib]; yy = (1 - s) * Y[ia] + s * Y[ib]; inode = -1; for (jnode = 0; jnode < nnode; jnode++) { if (fabs(xx-X[jnode]) < EPS06 && fabs(yy-Y[jnode]) < EPS06 ) { inode = jnode; break; } } if (inode < 0) { inode = nnode; X[nnode] = xx; Y[nnode] = yy; nnode++; } if (ia != inode && ib != inode) { ibeg[Nseg[0]] = inode; iend[Nseg[0]] = ib; Nseg[0]++; iend[iseg] = inode; } if (ic != inode && id != inode) { ibeg[Nseg[0]] = inode; iend[Nseg[0]] = id; Nseg[0]++; iend[jseg] = inode; } } } } } /* check for degenerate segments */ for (jseg = 0; jseg < Nseg[0]; jseg++) { if (ibeg[jseg] == iend[jseg]) { printf(" udpExecute: segment %d is degenerate\n", iseg); status = EGADS_DEGEN; goto cleanup; } } /* allocate space for the egos */ enodes = (ego *) EG_alloc((2*nnode )*sizeof(ego)); eedges = (ego *) EG_alloc(( nnode+2*Nseg[0])*sizeof(ego)); efaces = (ego *) EG_alloc(( Nseg[0])*sizeof(ego)); if (enodes == NULL || eedges == NULL || efaces == NULL) { status = EGADS_MALLOC; goto cleanup; } /* set up enodes at Z=0 and at Z=Depth */ jnode = 0; for (inode = 0; inode < nnode; inode++) { xyz[0] = X[inode]; xyz[1] = Y[inode]; xyz[2] = 0; status = EG_makeTopology(context, NULL, NODE, 0, xyz, 0, NULL, NULL, &(enodes[jnode])); if (status != EGADS_SUCCESS) goto cleanup; jnode++; } for (inode = 0; inode < nnode; inode++) { xyz[0] = X[inode]; xyz[1] = Y[inode]; xyz[2] = Depth[0]; status = EG_makeTopology(context, NULL, NODE, 0, xyz, 0, NULL, NULL, &(enodes[jnode])); if (status != EGADS_SUCCESS) goto cleanup; jnode++; } /* set up the edges on the z=0 plane */ jedge = 0; for (iseg = 0; iseg < Nseg[0]; iseg++) { xyz[0] = X[ibeg[iseg]]; xyz[1] = Y[ibeg[iseg]]; xyz[2] = 0; xyz[3] = X[iend[iseg]] - X[ibeg[iseg]]; xyz[4] = Y[iend[iseg]] - Y[ibeg[iseg]]; xyz[5] = 0; status = EG_makeGeometry(context, CURVE, LINE, NULL, NULL, xyz, &ecurve); if (status != EGADS_SUCCESS) goto cleanup; echild[0] = enodes[ibeg[iseg]]; echild[1] = enodes[iend[iseg]]; status = EG_invEvaluate(ecurve, xyz, &(data[0]), xyz_out); if (status != EGADS_SUCCESS) goto cleanup; xyz[0] = X[iend[iseg]]; xyz[1] = Y[iend[iseg]]; xyz[2] = 0; status = EG_invEvaluate(ecurve, xyz, &(data[1]), xyz_out); if (status != EGADS_SUCCESS) goto cleanup; status = EG_makeTopology(context, ecurve, EDGE, TWONODE, data, 2, echild, NULL, &(eedges[jedge])); if (status != EGADS_SUCCESS) goto cleanup; jedge++; } /* set up the edges on the z=Depth plane */ for (iseg = 0; iseg < Nseg[0]; iseg++) { xyz[0] = X[ibeg[iseg]]; xyz[1] = Y[ibeg[iseg]]; xyz[2] = Depth[0]; xyz[3] = X[iend[iseg]] - X[ibeg[iseg]]; xyz[4] = Y[iend[iseg]] - Y[ibeg[iseg]]; xyz[5] = 0; status = EG_makeGeometry(context, CURVE, LINE, NULL, NULL, xyz, &ecurve); if (status != EGADS_SUCCESS) goto cleanup; echild[0] = enodes[ibeg[iseg]+nnode]; echild[1] = enodes[iend[iseg]+nnode]; status = EG_invEvaluate(ecurve, xyz, &(data[0]), xyz_out); if (status != EGADS_SUCCESS) goto cleanup; xyz[0] = X[iend[iseg]]; xyz[1] = Y[iend[iseg]]; xyz[2] = Depth[0]; status = EG_invEvaluate(ecurve, xyz, &(data[1]), xyz_out); if (status != EGADS_SUCCESS) goto cleanup; status = EG_makeTopology(context, ecurve, EDGE, TWONODE, data, 2, echild, NULL, &(eedges[jedge])); if (status != EGADS_SUCCESS) goto cleanup; jedge++; } /* set up the edges between z=0 and Depth */ for (inode = 0; inode < nnode; inode++) { xyz[0] = X[inode]; xyz[1] = Y[inode]; xyz[2] = 0; xyz[3] = 0; xyz[4] = 0; xyz[5] = 1; status = EG_makeGeometry(context, CURVE, LINE, NULL, NULL, xyz, &ecurve); if (status != EGADS_SUCCESS) goto cleanup; echild[0] = enodes[inode ]; echild[1] = enodes[inode+nnode]; status = EG_invEvaluate(ecurve, xyz, &(data[0]), xyz_out); if (status != EGADS_SUCCESS) goto cleanup; xyz[0] = X[inode]; xyz[1] = Y[inode]; xyz[2] = Depth[0]; status = EG_invEvaluate(ecurve, xyz, &(data[1]), xyz_out); if (status != EGADS_SUCCESS) goto cleanup; status = EG_makeTopology(context, ecurve, EDGE, TWONODE, data, 2, echild, NULL, &(eedges[jedge])); if (status != EGADS_SUCCESS) goto cleanup; jedge++; } /* set up the faces */ jface = 0; for (iseg = 0; iseg < Nseg[0]; iseg++) { echild[0] = eedges[iseg]; echild[1] = eedges[2*Nseg[0]+iend[iseg]]; echild[2] = eedges[ Nseg[0]+ iseg ]; echild[3] = eedges[2*Nseg[0]+ibeg[iseg]]; senses[0] = SFORWARD; senses[1] = SFORWARD; senses[2] = SREVERSE; senses[3] = SREVERSE; status = EG_makeTopology(context, NULL, LOOP, CLOSED, NULL, 4, echild, senses, &eloop); if (status != EGADS_SUCCESS) goto cleanup; status = EG_makeFace(eloop, SFORWARD, NULL, &(efaces[jface])); if (status != EGADS_SUCCESS) goto cleanup; jseg = iseg + 1; status = EG_attributeAdd(efaces[jface], "segment", ATTRINT, 1, &jseg, NULL, NULL); if (status != EGADS_SUCCESS) goto cleanup; jface++; } /* make the sheet body */ status = EG_makeTopology(context, NULL, SHELL, OPEN, NULL, jface, efaces, NULL, &eshell); if (status != EGADS_SUCCESS) goto cleanup; status = EG_makeTopology(context, NULL, BODY, SHEETBODY, NULL, 1, &eshell, NULL, ebody); if (status != EGADS_SUCCESS) goto cleanup; /* remember this model (body) */ ebodys[numUdp] = *ebody; cleanup: if (efaces != NULL) EG_free(efaces); if (eedges != NULL) EG_free(eedges); if (enodes != NULL) EG_free(enodes); if (X != NULL) EG_free(X ); if (Y != NULL) EG_free(Y ); if (ibeg != NULL) EG_free(ibeg ); if (iend != NULL) EG_free(iend ); if (status != EGADS_SUCCESS) { *string = udpErrorStr(status); } return status; }