int main(int argc, char *argv[]) { int option, ok = 1, usage = 0, dim = 2, section = 0, timer = 0; double yaw = 0.0, pitch = 0.0, roll = 0.0, dist = 0.0, scale = 1.0; WlzPixelV bgdV; WlzGreyType gType; WlzDVertex3 up, fixed; WlzInterpolationType interp = WLZ_INTERPOLATION_NEAREST; WlzThreeDViewMode mode = WLZ_UP_IS_UP_MODE; WlzErrorNum errNum = WLZ_ERR_NONE; FILE *fP = NULL; WlzObject *inObj = NULL, *tlObj = NULL; char *inFileStr, *outFileStr, *secFileStr; struct timeval times[3]; const char *errMsg; const size_t tlSz = 4096; static char optList[] = "hsto:S:", inFileStrDef[] = "-"; opterr = 0; outFileStr = NULL; inFileStr = inFileStrDef; secFileStr = inFileStrDef; gType = WLZ_GREY_UBYTE; bgdV.type = WLZ_GREY_UBYTE; bgdV.v.ubv = 0; up.vtX = up.vtY = 0.0; up.vtZ = -1.0; fixed.vtX = fixed.vtY = fixed.vtZ = 0.0; while(ok && ((option = getopt(argc, argv, optList)) != -1)) { switch(option) { case 'o': outFileStr = optarg; break; case 's': section = 1; break; case 'S': secFileStr = optarg; break; case 't': timer = 1; break; case 'h': /* FALLTHROUGH */ default: usage = 1; break; } } if((usage == 0) && (optind < argc)) { if((optind + 1) != argc) { usage = 1; } else { inFileStr = *(argv + optind); } } ok = !usage; if(ok) { fP = NULL; errNum = WLZ_ERR_READ_EOF; if(((fP = (strcmp(inFileStr, "-")? fopen(inFileStr, "r"): stdin)) == NULL) || ((inObj= WlzAssignObject(WlzReadObj(fP, &errNum), NULL)) == NULL)) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: Failed to read object from file %s (%s).\n", *argv, inFileStr, errMsg); } if(fP && strcmp(inFileStr, "-")) { (void )fclose(fP); } } if(ok) { if(inObj == NULL) { errNum = WLZ_ERR_OBJECT_NULL; } else if(inObj->domain.core == NULL) { errNum = WLZ_ERR_DOMAIN_NULL; } else { switch(inObj->type) { case WLZ_2D_DOMAINOBJ: dim = 2; break; case WLZ_3D_DOMAINOBJ: dim = 3; break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } if(errNum != WLZ_ERR_NONE) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: invalid object read from file %s (%s).\n", *argv, inFileStr, errMsg); } } if(ok) { if(timer) { gettimeofday(times + 0, NULL); } tlObj = WlzMakeTiledValuesFromObj(inObj, tlSz, 1, gType, bgdV, &errNum); if(timer) { gettimeofday(times + 1, NULL); timersub(times + 1, times + 0, times + 2); (void )fprintf(stderr, "%s: Elapsed time for WlzMakeTiledValuesFromObj() %gs\n", *argv, times[2].tv_sec + (0.000001 * times[2].tv_usec)); } if(errNum != WLZ_ERR_NONE) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: Failed to create object with tiled values (%s).\n", *argv, errMsg); } } if(ok && (outFileStr != NULL)) { if(((fP = (strcmp(outFileStr, "-")? fopen(outFileStr, "w"): stdout)) == NULL) || ((errNum = WlzWriteObj(fP, tlObj)) != WLZ_ERR_NONE)) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: Failed to write tiled object to file %s (%s).\n", *argv, outFileStr, errMsg); } } if(ok && section && (dim == 3)) { WlzObject *secObj = NULL; WlzThreeDViewStruct *view = NULL; view = WlzMake3DViewStruct(WLZ_3D_VIEW_STRUCT, &errNum); if(errNum == WLZ_ERR_NONE) { view->theta = yaw * WLZ_M_PI / 180.0; view->phi = pitch * WLZ_M_PI / 180.0; view->zeta = roll * WLZ_M_PI / 180.0; view->dist = dist; view->fixed = fixed; view->up = up; view->view_mode = mode; view->scale = scale; errNum = WlzInit3DViewStruct(view, tlObj); } if(errNum == WLZ_ERR_NONE) { if(timer) { gettimeofday(times + 0, NULL); } secObj = WlzGetSubSectionFromObject(tlObj, NULL, view, interp, NULL, &errNum); if(timer) { gettimeofday(times + 1, NULL); timersub(times + 1, times + 0, times + 2); (void )fprintf(stderr, "%s: Elapsed time for WlzGetSubSectionFromObject() %gs\n", *argv, times[2].tv_sec + (0.000001 * times[2].tv_usec)); } fP = NULL; errNum = WLZ_ERR_WRITE_EOF; if(((fP = (strcmp(secFileStr, "-")? fopen(secFileStr, "w"): stdout)) == NULL) || ((errNum = WlzWriteObj(fP, secObj)) != WLZ_ERR_NONE)) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: Failed to write section object to file %s (%s).\n", *argv, secFileStr, errMsg); } if(fP && strcmp(secFileStr, "-")) { (void )fclose(fP); } } (void )WlzFree3DViewStruct(view); (void )WlzFreeObj(secObj); } (void )WlzFreeObj(tlObj); (void )WlzFreeObj(inObj); if(usage) { (void )fprintf(stderr, "Usage: %s%s", *argv, " [-o<output object>] [-h] [-o <file>] [-s] [-S <file>] [-t]\n" " [<input object>]\n" "Copied the input object to an object with tiled values.\n" "Options:\n" " -h Prints this usage information.\n" " -o Output tiled object.\n" " -s Cut section from tiled object.\n" " -S Output file for section object.\n" " -t Output timing information.\n"); } return(!ok); }
int main(int argc, char *argv[]) { int option, copy = 0, ok = 1, usage = 0, voxSzSet = 0; WlzGreyType gType = WLZ_GREY_UBYTE; WlzFVertex3 voxSz; WlzPixelV bgdV; WlzErrorNum errNum = WLZ_ERR_NONE; FILE *fP = NULL; WlzObject *inObj = NULL, *outObj = NULL; char *inFileStr, *outFileStr; int iBuf[4]; const char *errMsg; const size_t tlSz = WLZ_TILEDVALUES_TILE_SIZE; static char optList[] = "chb:g:o:s:", inFileStrDef[] = "-", outFileStrDef[] = "-"; opterr = 0; inFileStr = inFileStrDef; outFileStr = outFileStrDef; bgdV.v.dbv = 0.0; bgdV.type = WLZ_GREY_DOUBLE; voxSz.vtX = voxSz.vtY = voxSz.vtZ = 1.0f; while(ok && ((option = getopt(argc, argv, optList)) != -1)) { switch(option) { case 'c': copy = 1; break; case 'b': bgdV.type = gType; switch(gType) { case WLZ_GREY_LONG: if(sscanf(optarg, "%lld", &(bgdV.v.lnv)) != 1) { usage = 1; } break; case WLZ_GREY_INT: if(sscanf(optarg, "%d", &(bgdV.v.inv)) != 1) { usage = 1; } break; case WLZ_GREY_SHORT: if((sscanf(optarg, "%d", iBuf) != 1) || (iBuf[0] < SHRT_MIN) || (iBuf[0] > SHRT_MAX)) { usage = 1; } else { bgdV.v.shv = iBuf[0]; } break; case WLZ_GREY_UBYTE: if((sscanf(optarg, "%d", iBuf) != 1) || (iBuf[0] < 0) || (iBuf[0] > 255)) { usage = 1; } else { bgdV.v.ubv = iBuf[0]; } break; case WLZ_GREY_FLOAT: if(sscanf(optarg, "%g", &(bgdV.v.flv)) != 1) { usage = 1; } break; case WLZ_GREY_DOUBLE: if(sscanf(optarg, "%lg", &(bgdV.v.dbv)) != 1) { usage = 1; } break; case WLZ_GREY_RGBA: iBuf[0] = iBuf[1] = iBuf[2] = iBuf[3] = 0; if((sscanf(optarg, "%d,%d,%d,%d", iBuf + 0, iBuf + 1, iBuf + 2, iBuf + 3) < 3) || (iBuf[0] < 0) || (iBuf[0] > 255) || (iBuf[1] < 0) || (iBuf[1] > 255) || (iBuf[2] < 0) || (iBuf[2] > 255) || (iBuf[3] < 0) || (iBuf[3] > 255)) { usage = 1; } else { WLZ_RGBA_RGBA_SET(bgdV.v.rgbv, iBuf[0], iBuf[1], iBuf[2], iBuf[3]); } break; default: usage = 1; break; } break; case 'g': switch(*optarg) { case 'l': gType = WLZ_GREY_LONG; break; case 'i': gType = WLZ_GREY_INT; break; case 's': gType = WLZ_GREY_SHORT; break; case 'u': gType = WLZ_GREY_UBYTE; break; case 'f': gType = WLZ_GREY_FLOAT; break; case 'd': gType = WLZ_GREY_DOUBLE; break; case 'r': gType = WLZ_GREY_RGBA; break; default: usage = 1; break; } break; case 'o': outFileStr = optarg; break; case 's': voxSzSet = 1; if(sscanf(optarg, "%g,%g,%g", &(voxSz.vtX), &(voxSz.vtY), &(voxSz.vtZ)) != 3) { usage = 1; } break; case 'h': /* FALLTHROUGH */ default: usage = 1; break; } } if((usage == 0) && (optind < argc)) { if((optind + 1) != argc) { usage = 1; } else { inFileStr = *(argv + optind); } } ok = !usage; if(ok) { fP = NULL; errNum = WLZ_ERR_READ_EOF; if(((fP = (strcmp(inFileStr, "-")? fopen(inFileStr, "r"): stdin)) == NULL) || ((inObj= WlzAssignObject(WlzReadObj(fP, &errNum), NULL)) == NULL)) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: Failed to read object from file %s (%s).\n", *argv, inFileStr, errMsg); } if(fP && strcmp(inFileStr, "-")) { (void )fclose(fP); } } if(ok) { if(inObj == NULL) { errNum = WLZ_ERR_OBJECT_NULL; } else if(inObj->domain.core == NULL) { errNum = WLZ_ERR_DOMAIN_NULL; } else { switch(inObj->type) { case WLZ_2D_DOMAINOBJ: /* FALLTHROUGH */ case WLZ_3D_DOMAINOBJ: break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } if(errNum != WLZ_ERR_NONE) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: invalid object read from file %s (%s).\n", *argv, inFileStr, errMsg); } } if(ok) { WlzObject *domObj = NULL; WlzValues nullVal; nullVal.core = NULL; domObj = WlzMakeMain(inObj->type, inObj->domain, (copy == 0)? nullVal: inObj->values, NULL, NULL, &errNum); if(errNum == WLZ_ERR_NONE) { if((voxSzSet != 0) && (domObj->type == WLZ_3D_DOMAINOBJ)) { domObj->domain.p->voxel_size[0] = voxSz.vtX; domObj->domain.p->voxel_size[1] = voxSz.vtY; domObj->domain.p->voxel_size[2] = voxSz.vtZ; } outObj = WlzMakeTiledValuesFromObj(domObj, tlSz, copy, gType, 0, NULL, bgdV, &errNum); } if(errNum != WLZ_ERR_NONE) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: Failed to create object with tiled values (%s).\n", *argv, errMsg); } (void )WlzFreeObj(domObj); } if(ok && (outFileStr != NULL)) { if(((fP = (strcmp(outFileStr, "-")? fopen(outFileStr, "w"): stdout)) == NULL) || ((errNum = WlzWriteObj(fP, outObj)) != WLZ_ERR_NONE)) { ok = 0; (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: Failed to write tiled object to file %s (%s).\n", *argv, outFileStr, errMsg); } if(fP!= NULL) { (void )fclose(fP); } } (void )WlzFreeObj(outObj); (void )WlzFreeObj(inObj); if(usage) { (void )fprintf(stderr, "Usage: %s%s%s%s", *argv, " [-o<output object>] [-h] [-b #] [-g #] [-s #,#,#]\n" " [<input object>]\n" "Creates an object with a tiled value table from an object with a\n" "valid spatial domain.\n" "Version: ", WlzVersion(), "\n" "Options:\n" " -b Background value. If the grey type is RGBA then the channel\n" " background values should be comma seperated and in the order\n" " RGBA.\n" " -c Copy the values from the given object to the tiled object.\n" " -g Grey type specified using one of the characters:\n" " l, i, s, u, f, d, r for long, intm shortm unsigned byte,\n" " float, double or RGBA.\n" " -h Prints this usage information.\n" " -s Voxel size (x,y,z).\n" " -o Output tiled object.\n"); } return(!ok); }