Changeset 1306


Ignore:
Timestamp:
Mar 10, 2009 2:12:28 PM (15 years ago)
Author:
vrinside
Message:

Implemented a vector field loader without using Rappture interploration

Location:
trunk/packages/vizservers/nanovis
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/nanovis/Command.cpp

    r1299 r1306  
    105105            double nzero_min);
    106106extern void load_vector_stream(int index, std::istream& fin);
     107extern void load_vector_stream2(int index, std::istream& fin);
    107108
    108109// Tcl interpreter for incoming messages
     
    17361737    std::stringstream fdata;
    17371738    fdata.write(buf.bytes(),buf.size());
    1738     load_vector_stream(n, fdata);
     1739    //load_vector_stream(n, fdata);
     1740    load_vector_stream2(n, fdata);
    17391741    Volume *volPtr = NanoVis::volume[n];
    17401742
  • trunk/packages/vizservers/nanovis/dxReader.cpp

    r1301 r1306  
    4747 * Load a 3D vector field from a dx-format file
    4848 */
     49void
     50load_vector_stream2(int volindex, std::istream& fin)
     51{
     52    int dummy, nx, ny, nz, npts;
     53    double x0, y0, z0, dx, dy, dz, ddx, ddy, ddz;
     54    char line[128], type[128], *start;
     55
     56    dx = dy = dz = 0.0;         // Suppress compiler warning.
     57    x0 = y0 = z0 = 0.0;         // May not have an origin line.
     58    while (!fin.eof()) {
     59        fin.getline(line, sizeof(line) - 1);
     60        if (fin.fail()) {
     61            //return result.error("error in data stream");
     62            return;
     63        }
     64        for (start=&line[0]; *start == ' ' || *start == '\t'; start++)
     65            ;  // skip leading blanks
     66
     67        if (*start != '#') {  // skip comment lines
     68            if (sscanf(start, "object %d class gridpositions counts %d %d %d", &dummy, &nx, &ny, &nz) == 4) {
     69                printf("w:%d h:%d d:%d\n", nx, ny, nz);
     70                // found grid size
     71            } else if (sscanf(start, "origin %lg %lg %lg", &x0, &y0, &z0) == 3) {
     72                // found origin
     73            } else if (sscanf(start, "delta %lg %lg %lg", &ddx, &ddy, &ddz) == 3) {
     74                // found one of the delta lines
     75                if (ddx != 0.0) {
     76                    dx = ddx;
     77                } else if (ddy != 0.0) {
     78                    dy = ddy;
     79                } else if (ddz != 0.0) {
     80                    dz = ddz;
     81                }
     82            } else if (sscanf(start, "object %d class array type %s shape 3 rank 1 items %d data follows", &dummy, type, &npts) == 3) {
     83                printf("point %d\n", npts);
     84                if (npts != nx*ny*nz) {
     85                    std::cerr << "inconsistent data: expected " << nx*ny*nz << " points but found " << npts << " points" << std::endl;
     86                    return;
     87                }
     88                break;
     89            } else if (sscanf(start, "object %d class array type %s rank 0 times %d data follows", &dummy, type, &npts) == 3) {
     90                if (npts != nx*ny*nz) {
     91                    std::cerr << "inconsistent data: expected " << nx*ny*nz << " points but found " << npts << " points" << std::endl;
     92                    return;
     93                }
     94                break;
     95            }
     96        }
     97    }
     98
     99    // read data points
     100    float* srcdata = new float[nx * ny * nz * 3];
     101    if (!fin.eof()) {
     102        double vx, vy, vz, vm;
     103        double max_x = -1e21, min_x = 1e21;
     104        double max_y = -1e21, min_y = 1e21;
     105        double max_z = -1e21, min_z = 1e21;
     106        double max_mag = -1e21, min_mag = 1e21;
     107        int nread = 0;
     108        for (int ix=0; ix < nx; ix++) {
     109            for (int iy=0; iy < ny; iy++) {
     110                for (int iz=0; iz < nz; iz++) {
     111                    if (fin.eof() || nread > npts) {
     112                        break;
     113                    }
     114                    fin.getline(line,sizeof(line)-1);
     115                    if (sscanf(line, "%lg %lg %lg", &vx, &vy, &vz) == 3) {
     116                        int nindex = (iz*nx*ny + iy*nx + ix) * 3;
     117                        srcdata[nindex] = vx;
     118                        //if (srcdata[nindex] > max_x) max_x = srcdata[nindex];
     119                        //if (srcdata[nindex] < min_x) min_x = srcdata[nindex];
     120                        ++nindex;
     121
     122                        srcdata[nindex] = vy;
     123                        //if (srcdata[nindex] > max_y) max_y = srcdata[nindex];
     124                        //if (srcdata[nindex] < min_y) min_y = srcdata[nindex];
     125                        ++nindex;
     126
     127                        srcdata[nindex] = vz;
     128                        //if (srcdata[nindex] > max_z) max_z = srcdata[nindex];
     129                        //if (srcdata[nindex] < min_z) min_z = srcdata[nindex];
     130                   
     131                        vm = sqrt(vx*vx + vy*vy + vz*vz);
     132                        if (vm > max_mag) max_mag = vm;
     133                        if (vm < min_mag) min_mag = vm;
     134       
     135                        ++nread;
     136                    }
     137                }
     138            }
     139        }
     140
     141        // make sure that we read all of the expected points
     142        if (nread != nx*ny*nz) {
     143            std::cerr << "inconsistent data: expected " << nx*ny*nz << " points but found " << nread << " points" << std::endl;
     144            return;
     145        }
     146
     147        float *data = new float[4*nx*ny*nz];
     148        memset(data, 0, sizeof(float) * 4 * nx * ny * nz);
     149
     150        std::cout << "generating " << nx << "x" << ny << "x" << nz << " = " << nx*ny*nz << " points" << std::endl;
     151
     152        // generate the uniformly sampled data that we need for a volume
     153        double nzero_min = 0.0;
     154        int ngen = 0;
     155        int nindex = 0;
     156        for (int iz=0; iz < nz; iz++) {
     157            for (int iy=0; iy < ny; iy++) {
     158                for (int ix=0; ix < nx; ix++) {
     159
     160                    vx = srcdata[nindex++];
     161                    vy = srcdata[nindex++];
     162                    vz = srcdata[nindex++];
     163                       
     164                    double vm;
     165                    vm = sqrt(vx*vx + vy*vy + vz*vz);
     166
     167                    data[ngen] = vm / max_mag; ++ngen;
     168                    data[ngen] = vx /(2.0*max_mag) + 0.5; ++ngen;
     169                    data[ngen] = vy /(2.0*max_mag) + 0.5; ++ngen;
     170                    data[ngen] = vz /(2.0*max_mag) + 0.5; ++ngen;
     171                }
     172            }
     173        }
     174
     175        Volume *volPtr;
     176        volPtr = NanoVis::load_volume(volindex, nx, ny, nz, 4, data, min_mag, max_mag,
     177                    0);
     178
     179        volPtr->xAxis.SetRange(x0, x0 + nx);
     180        volPtr->yAxis.SetRange(y0, y0 + ny);
     181        volPtr->zAxis.SetRange(z0, z0 + nz);
     182        volPtr->wAxis.SetRange(min_mag, max_mag);
     183        volPtr->update_pending = true;
     184        delete [] data;
     185    } else {
     186        std::cerr << "WARNING: data not found in stream" << std::endl;
     187    }
     188}
    49189void
    50190load_vector_stream(int index, std::istream& fin)
Note: See TracChangeset for help on using the changeset viewer.