예제 #1
0
파일: fillet.c 프로젝트: haimes/EGADS
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;
}
예제 #2
0
파일: intersect.c 프로젝트: OpenMDAO/EGADS
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;
}
예제 #3
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;
}