Changeset 3865 for trunk/gui


Ignore:
Timestamp:
Aug 15, 2013 2:05:00 PM (11 years ago)
Author:
ldelgass
Message:

In DX to VTK converter, generate structured grid output if DX grid is not axis-
aligned or skewed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gui/src/RpDxToVtk.c

    r3756 r3865  
    109109
    110110static int
     111GetStructuredGridFieldValues(Tcl_Interp *interp, int nPoints, char **stringPtr,
     112                             const char *endPtr, Tcl_Obj *objPtr)
     113{
     114    int i;
     115    const char *p;
     116    char mesg[2000];
     117    double *array, scale, vmin, vmax;
     118
     119    p = *stringPtr;
     120    array = malloc(sizeof(double) * nPoints);
     121    if (array == NULL) {
     122        return TCL_ERROR;
     123    }
     124    vmin = DBL_MAX, vmax = -DBL_MAX;
     125    for (i = 0; i < nPoints; i++) {
     126        double value;
     127        char *nextPtr;
     128
     129        if (p >= endPtr) {
     130            Tcl_AppendResult(interp, "unexpected EOF in reading points",
     131                             (char *)NULL);
     132            return TCL_ERROR;
     133        }
     134        value = strtod(p, &nextPtr);
     135        if (nextPtr == p) {
     136            Tcl_AppendResult(interp, "bad value found in reading points",
     137                             (char *)NULL);
     138            return TCL_ERROR;
     139        }
     140        p = nextPtr;
     141        array[i] = value;
     142        if (value < vmin) {
     143            vmin = value;
     144        }
     145        if (value > vmax) {
     146            vmax = value;
     147        }
     148    }
     149    scale = 1.0 / (vmax - vmin);
     150    for (i = 0; i < nPoints; i++) {
     151#ifdef notdef
     152        sprintf(mesg, "%g\n", (array[i] - vmin) * scale);
     153#endif
     154        sprintf(mesg, "%g\n", array[i]);
     155        Tcl_AppendToObj(objPtr, mesg, -1);
     156    }
     157    free(array);
     158    *stringPtr = (char *)p;
     159    return TCL_OK;
     160}
     161
     162static int
    111163GetCloudFieldValues(Tcl_Interp *interp, int nXYPoints, int nZPoints, char **stringPtr,
    112164                    const char *endPtr, Tcl_Obj *objPtr)
     
    244296    char *string;
    245297    char mesg[2000];
     298    double dv0[3], dv1[3], dv2[3];
    246299    double dx, dy, dz;
    247300    double origin[3];
     
    250303    char *name;
    251304    int isUniform;
    252     int i, iz;
     305    int isStructuredGrid;
     306    int i, ix, iy, iz;
    253307
    254308    name = "myScalars";
     309    points = NULL;
    255310    nAxes = nPoints = nXYPoints = 0;
    256311    dx = dy = dz = 0.0; /* Suppress compiler warning. */
    257312    origin[0] = origin[1] = origin[2] = 0.0; /* May not have an origin line. */
     313    dv0[0] = dv0[1] = dv0[2] = 0.0;
     314    dv1[0] = dv1[1] = dv1[2] = 0.0;
     315    dv2[0] = dv2[1] = dv2[2] = 0.0;
    258316    count[0] = count[1] = count[2] = 0; /* Suppress compiler warning. */
    259317    isUniform = 1; /* Default to expecting uniform grid */
    260    
     318    isStructuredGrid = 0;
     319
    261320    if (objc != 2) {
    262321        Tcl_AppendResult(interp, "wrong # arguments: should be \"",
     
    308367                return TCL_ERROR;
    309368            }
     369            switch (nAxes) {
     370            case 0:
     371                dv0[0] = ddx;
     372                dv0[1] = ddy;
     373                dv0[2] = ddz;
     374                break;
     375            case 1:
     376                dv1[0] = ddx;
     377                dv1[1] = ddy;
     378                dv1[2] = ddz;
     379                break;
     380            case 2:
     381                dv2[0] = ddx;
     382                dv2[1] = ddy;
     383                dv2[2] = ddz;
     384                break;
     385            default:
     386                break;
     387            }
     388
    310389            if (ddx != 0.0) {
    311390                if (ddy != 0.0 || ddz != 0.0) {
    312                     Tcl_AppendResult(interp, "invalid delta statement",
    313                                      (char *)NULL);
    314                     return TCL_ERROR;
     391                    /* Not axis aligned or skewed grid */
     392                    isUniform = 0;
     393                    isStructuredGrid = 1;
    315394                }
    316395                dx = ddx;
    317396            } else if (ddy != 0.0) {
    318397                if (ddx != 0.0 || ddz != 0.0) {
    319                     Tcl_AppendResult(interp, "invalid delta statement",
    320                                      (char *)NULL);
    321                     return TCL_ERROR;
     398                    /* Not axis aligned or skewed grid */
     399                    isUniform = 0;
     400                    isStructuredGrid = 1;
    322401                }
    323402                dy = ddy;
    324403            } else if (ddz != 0.0) {
    325404                if (ddx != 0.0 || ddy != 0.0) {
    326                     Tcl_AppendResult(interp, "invalid delta statement",
    327                                      (char *)NULL);
    328                     return TCL_ERROR;
     405                    /* Not axis aligned or skewed grid */
     406                    isUniform = 0;
     407                    isStructuredGrid = 1;
    329408                }
    330409                dz = ddz;
     
    360439                nPoints);
    361440#endif
    362             if (isUniform && nPoints != count[0]*count[1]*count[2]) {
     441            if ((isUniform || isStructuredGrid) &&
     442                nPoints != count[0]*count[1]*count[2]) {
    363443                sprintf(mesg, "inconsistent data: expected %d points"
    364444                        " but found %d points", count[0]*count[1]*count[2],
     
    366446                Tcl_AppendResult(interp, mesg, (char *)NULL);
    367447                return TCL_ERROR;
    368             } else if (!isUniform && nPoints != nXYPoints * count[2]) {
     448            } else if (!(isUniform || isStructuredGrid) &&
     449                       nPoints != nXYPoints * count[2]) {
    369450                sprintf(mesg, "inconsistent data: expected %d points"
    370451                        " but found %d points", nXYPoints * count[2],
     
    375456            if (isUniform) {
    376457                if (GetUniformFieldValues(interp, nPoints, count, &p, pend, fieldObjPtr)
     458                    != TCL_OK) {
     459                    return TCL_ERROR;
     460                }
     461            } else if (isStructuredGrid) {
     462                if (GetStructuredGridFieldValues(interp, nPoints, &p, pend, fieldObjPtr)
    377463                    != TCL_OK) {
    378464                    return TCL_ERROR;
     
    402488        sprintf(mesg, "SPACING %g %g %g\n", dx, dy, dz);
    403489        Tcl_AppendToObj(objPtr, mesg, -1);
     490        sprintf(mesg, "POINT_DATA %d\n", nPoints);
     491        Tcl_AppendToObj(objPtr, mesg, -1);
     492        sprintf(mesg, "SCALARS %s double 1\n", name);
     493        Tcl_AppendToObj(objPtr, mesg, -1);
     494        sprintf(mesg, "LOOKUP_TABLE default\n");
     495        Tcl_AppendToObj(objPtr, mesg, -1);
     496        Tcl_AppendObjToObj(objPtr, fieldObjPtr);
     497    } else if (isStructuredGrid) {
     498#ifdef notdef
     499        fprintf(stderr, "dv0 %g %g %g\n", dv0[0], dv0[1], dv0[2]);
     500        fprintf(stderr, "dv1 %g %g %g\n", dv1[0], dv1[1], dv1[2]);
     501        fprintf(stderr, "dv2 %g %g %g\n", dv2[0], dv2[1], dv2[2]);
     502#endif
     503        objPtr = Tcl_NewStringObj("# vtk DataFile Version 2.0\n", -1);
     504        Tcl_AppendToObj(objPtr, "Converted from DX file\n", -1);
     505        Tcl_AppendToObj(objPtr, "ASCII\n", -1);
     506        Tcl_AppendToObj(objPtr, "DATASET STRUCTURED_GRID\n", -1);
     507        sprintf(mesg, "DIMENSIONS %d %d %d\n", count[0], count[1], count[2]);
     508        Tcl_AppendToObj(objPtr, mesg, -1);
     509        for (ix = 0; ix < count[0]; ix++) {
     510            for (iy = 0; iy < count[1]; iy++) {
     511                for (iz = 0; iz < count[2]; iz++) {
     512                    double x, y, z;
     513                    x = origin[0] + dv2[0] * iz + dv1[0] * iy + dv0[0] * ix;
     514                    y = origin[1] + dv2[1] * iz + dv1[1] * iy + dv0[1] * ix;
     515                    z = origin[2] + dv2[2] * iz + dv1[2] * iy + dv0[2] * ix;
     516                    sprintf(mesg, "%g %g %g\n", x, y, z);
     517                    Tcl_AppendToObj(pointsObjPtr, mesg, -1);
     518                }
     519            }
     520        }
     521        sprintf(mesg, "POINTS %d double\n", nPoints);
     522        Tcl_AppendToObj(objPtr, mesg, -1);
     523        Tcl_AppendObjToObj(objPtr, pointsObjPtr);
    404524        sprintf(mesg, "POINT_DATA %d\n", nPoints);
    405525        Tcl_AppendToObj(objPtr, mesg, -1);
Note: See TracChangeset for help on using the changeset viewer.