Пример #1
0
static std::array<double, 3> get_point(ego vert) {
  ego ref;
  int oclass;
  int mtype;
  std::array<double, 3> data;
  int nchild;
  ego* children;
  int* senses;
  CALL(EG_getTopology(
      vert, &ref, &oclass, &mtype, data.data(), &nchild, &children, &senses));
  return data;
}
Пример #2
0
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));
}
Пример #3
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;
}
Пример #4
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;
}
Пример #5
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;
}
Пример #6
0
void browserMessage(/*@unused@*/ void *wsi, char *text, /*@unused@*/ int lena)
{
  int          i, j, k, m, n, ibody, stat, sum, len, ntri, index, oclass, mtype;
  int          nloops, nseg, nledges, *segs, *lsenses, *esenses;
  int          nh, *heads;
  const int    *tris, *tric, *ptype, *pindex;
  char         gpname[33];
  float        *lsegs;
  const double *xyzs, *uvs, *ts;
  ego          geom, *ledges, *loops;
  wvData       items[3];
  
  printf(" RX: %s\n", text);
  /* ping it back
  wv_sendText(wsi, text); */
  
  if ((strcmp(text,"finer") != 0) && (strcmp(text,"coarser") != 0)) return;
  if  (strcmp(text,"finer") != 0) {
    params[0] *= 2.0;
  } else {
    params[0] *= 0.5;
  }

  printf(" Using angle = %lf,  relSide = %lf,  relSag = %lf\n",
         params[2], params[0], params[1]);
         
  for (ibody = 0; ibody < nbody; ibody++) {
    EG_deleteObject(bodydata[ibody].tess);
    bodydata[ibody].tess = NULL;
    stat = EG_makeTessBody(bodydata[ibody].body, params, &bodydata[ibody].tess);
    if (stat != EGADS_SUCCESS)
      printf(" EG_makeTessBody %d = %d\n", ibody, stat);
  }

  /* 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);
      index = wv_indexGPrim(cntxt, gpname);
      if (index < 0) {
        printf(" wv_indexGPrim = %d for %s (%d)!\n", i, gpname, index);
        continue;
      }
      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);
      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[2]);
      if (stat < 0) printf(" wv_setData = %d for %s/item 2!\n", i, gpname);
      free(segs);
      stat = wv_modGPrim(cntxt, index, 3, items);
      if (stat < 0)
        printf(" wv_modGPrim = %d for %s (%d)!\n", stat, gpname, index);
      sum += ntri;
    }
    
    /* get loops */
    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);
        index = wv_indexGPrim(cntxt, gpname);
        if (index < 0) {
          printf(" wv_indexGPrim = %d for %s (%d)!\n", i, gpname, index);
          continue;
        }
        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);
#ifdef NONINDEXED
        stat = wv_modGPrim(cntxt, index, 1, items);
#else
        stat = wv_setData(WV_INT32, ntri, (void *) segs, WV_INDICES, &items[1]);
        if (stat < 0) printf(" wv_setData = %d for %s/item 1!\n", i, gpname);
        free(segs);
        stat = wv_modGPrim(cntxt, index, 2, items);
#endif
        if (stat < 0) {
          printf(" wv_modGPrim = %d for %s!\n", stat, gpname);
        } else {
          n = wv_addArrowHeads(cntxt, index, 0.05, nh, heads);
          if (n != 0) printf(" wv_addArrowHeads = %d\n", n);          
        }
        free(heads);
      }
    }
  }
  printf(" **  now with %d triangles **\n\n", sum);

}
Пример #7
0
int
EG_deleteObject(egObject *object)
{
  int      outLevel, total, cnt, nref, stat, oclass, mtype, nbody;
  int      i, *senses;
  egObject *context, *obj, *next, *pobj, **bodies;
  egCntxt  *cntx;

  if (object == NULL)               return EGADS_NULLOBJ;
  if (object->magicnumber != MAGIC) return EGADS_NOTOBJ;
  if (object->oclass == EMPTY)      return EGADS_EMPTY;
  if (object->oclass == REFERENCE)  return EGADS_REFERCE;
  if (object->oclass != CONTXT) {
    /* normal dereference */
    context = EG_context(object);
    if (context == NULL)            return EGADS_NOTCNTX;
    outLevel = EG_outLevel(object);
    
    /* special check for body references in models */
    if (object->oclass == MODEL) {
      stat = EG_getTopology(object, &next, &oclass, &mtype, NULL, 
                            &nbody, &bodies, &senses);
      if (stat != EGADS_SUCCESS) return stat;
      for (cnt = i = 0; i < nbody; i++) {
        if (bodies[i]->tref == NULL) continue;
        next = bodies[i]->tref;
        pobj = NULL;
        while (next != NULL) {
          obj = (egObject *) next->attrs;
          if (obj != object) cnt++;
          pobj = next;
          next = (egObject *) pobj->blind;      /* next reference */
        }
      }
      if (cnt > 0) {
        if (outLevel > 0)
          printf(" EGADS Info: Model delete w/ %d active Body Refs!\n", 
                 cnt); 
        return cnt;
      }
    }
  
    return EG_dereferenceObject(object, context);
  }
  
  /* delete all non-body attached topology and geometry */
 
  context  = object; 
  cntx     = (egCntxt *) context->blind;
  if (cntx == NULL) return EGADS_NODATA;
  outLevel = cntx->outLevel;
  
  nref = 0;
  obj  = context->next;
  while (obj != NULL) {
    next = obj->next;
    if (obj->oclass == REFERENCE) nref++;
    obj  = next;
  }

  cntx->outLevel = total = 0;
  do {
    cnt = 0;
    obj = context->next;
    while (obj != NULL) {
      next = obj->next;
      if ((obj->oclass >= PCURVE) && (obj->oclass <= SHELL) &&
          (obj->topObj == context)) {
        stat = EG_dereferenceObject(obj, context);
        if (stat == EGADS_SUCCESS) {
          cnt++;
          break;
        }
      }
      obj = next;
    }
    total += cnt;
  } while (cnt != 0);
  cntx->outLevel = outLevel;
  
  cnt = 0;
  obj = context->next;
  while (obj != NULL) {
    next = obj->next;
    if (obj->oclass == REFERENCE) cnt++;
    obj  = next;
  }
  
  if ((outLevel > 0) && (total != 0))
    printf(" EGADS Info: %d unattached Objects (%d References) removed!\n",
           total, nref-cnt);

  return EGADS_SUCCESS;
}
Пример #8
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;
}
Пример #9
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;
}
Пример #10
0
int
gem_fillModelE(ego object, char *name, int ext, 
               int *nBRep, gemBRep ***BReps)
{
  int     i, j, stat, beg, len, oclass, mtype, nobjs, *senses;
  double  limits[4];
  char    *bID;
  ego     geom, *objs;
  gemID   handle;
  gemBRep **breps;
  
  *nBRep = 0;
  *BReps = NULL;
  stat   = EG_getTopology(object, &geom, &oclass, &mtype, limits, &nobjs,
                          &objs, &senses);
  if (stat   != EGADS_SUCCESS) return stat;
  if (oclass != MODEL) return EGADS_NOTMODEL;
  if (nobjs == 0) return EGADS_NODATA;

  *nBRep = nobjs;
  *BReps = breps = (gemBRep **) gem_allocate(nobjs*sizeof(gemBRep *));
  if (breps == NULL) return GEM_ALLOC;

  handle.index     = 0;
  handle.ident.ptr = object;
  for (i = 0; i < nobjs; i++) {
    breps[i] = (gemBRep *) gem_allocate(sizeof(gemBRep));
    if (breps[i] == NULL) {
      for (j = 0; j < i; j++) gem_free(breps[j]);
      gem_free(*BReps);
      return GEM_ALLOC;
    }
    breps[i]->magic   = GEM_MBREP;
    breps[i]->omodel  = NULL;
    breps[i]->phandle = handle;
    breps[i]->ibranch = 0;
    breps[i]->inumber = 0;
    breps[i]->body    = NULL;
  }
  /* find root name */
  for (beg = ext-1; beg >= 0; beg--)
    if ((name[beg] == '/') || (name[beg] == '\\') ||
        (name[beg] == ':')) break;
  beg++;
  len = ext - beg + 10;
  bID = (char *) gem_allocate(len*sizeof(char));
  if (bID == NULL) {
    for (j = 0; j < nobjs; j++)
      gem_releaseBRep(breps[j]);
    gem_free(*BReps);
    return GEM_ALLOC;
  }
  
  for (i = 0; i < nobjs; i++) {
    snprintf(bID, len, "%s:%d", &name[beg], i+1);
    stat = gem_diamondBody(objs[i], bID, breps[i]);
    if (stat != EGADS_SUCCESS) {
      for (j = 0; j < nobjs; j++)
        gem_releaseBRep(breps[j]);
      gem_free(*BReps);
      gem_free(bID);
      return GEM_ALLOC;
    }
  }
  
  gem_free(bID);
  return GEM_SUCCESS;
}