Changeset 1306
- Timestamp:
- Mar 10, 2009 2:12:28 PM (15 years ago)
- Location:
- trunk/packages/vizservers/nanovis
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/vizservers/nanovis/Command.cpp
r1299 r1306 105 105 double nzero_min); 106 106 extern void load_vector_stream(int index, std::istream& fin); 107 extern void load_vector_stream2(int index, std::istream& fin); 107 108 108 109 // Tcl interpreter for incoming messages … … 1736 1737 std::stringstream fdata; 1737 1738 fdata.write(buf.bytes(),buf.size()); 1738 load_vector_stream(n, fdata); 1739 //load_vector_stream(n, fdata); 1740 load_vector_stream2(n, fdata); 1739 1741 Volume *volPtr = NanoVis::volume[n]; 1740 1742 -
trunk/packages/vizservers/nanovis/dxReader.cpp
r1301 r1306 47 47 * Load a 3D vector field from a dx-format file 48 48 */ 49 void 50 load_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 } 49 189 void 50 190 load_vector_stream(int index, std::istream& fin)
Note: See TracChangeset
for help on using the changeset viewer.