Revision: 65253
http://sourceforge.net/p/brlcad/code/65253
Author: starseeker
Date: 2015-06-10 20:00:18 +0000 (Wed, 10 Jun 2015)
Log Message:
-----------
Convert libged tire generation routine to using bu_opt.
Modified Paths:
--------------
brlcad/trunk/src/libged/tire.c
Modified: brlcad/trunk/src/libged/tire.c
===================================================================
--- brlcad/trunk/src/libged/tire.c 2015-06-10 18:56:03 UTC (rev 65252)
+++ brlcad/trunk/src/libged/tire.c 2015-06-10 20:00:18 UTC (rev 65253)
@@ -32,6 +32,7 @@
#include <math.h>
#include "bu/getopt.h"
+#include "bu/opt.h"
#include "bu/units.h"
#include "vmath.h"
#include "bn.h"
@@ -45,54 +46,8 @@
#define ROWS 5
#define COLS 5
-static char *options="an:c:d:W:R:D:g:j:p:s:t:u:w:h?";
/**
- * Help message printed when -h option is supplied
- */
-static void
-show_help(struct ged *gedp, const char *name)
-{
- struct bu_vls str = BU_VLS_INIT_ZERO;
- const char *cp = options;
-
- while (cp && *cp != '\0') {
- if (*cp == ':' || *cp == 'h' || *cp == '?') {
- cp++;
- continue;
- }
- bu_vls_strncat(&str, cp, 1);
- cp++;
- }
-
- bu_vls_printf(gedp->ged_result_str, "Usage: %s [-%s] [tire_name]\n", name,
bu_vls_addr(&str));
- bu_vls_printf(gedp->ged_result_str, "options:\n");
- bu_vls_printf(gedp->ged_result_str, "\t-a\n\t\tAuto-generate top-level
object name using\n");
- bu_vls_printf(gedp->ged_result_str, "\t\ttire-<width>-<aspect>R<rim
diameter>\n");
- bu_vls_printf(gedp->ged_result_str, "\t\t(\"tire\" overridden by -n
argument, and ultimately by tire_name , if that is supplied)\n");
- bu_vls_printf(gedp->ged_result_str, "\t\t(rest of name is derived from the
ISO Metric system)\n");
- bu_vls_printf(gedp->ged_result_str, "\t-n <name>\n\t\tSpecify custom
top-level object name\n");
- bu_vls_printf(gedp->ged_result_str, "\t\t(overridden by tire_name , if
that is supplied)\n");
- bu_vls_printf(gedp->ged_result_str, "\t-c <count>\n\t\tSpecify number of
tread patterns around tire\n");
- bu_vls_printf(gedp->ged_result_str, "\t-d <width>/<aspect>R<rim
diameter>\n\t\tSpecify tire dimensions\n");
- bu_vls_printf(gedp->ged_result_str, "\t\t(U.S. customary units in the ISO
metric system; integer values only)\n");
- bu_vls_printf(gedp->ged_result_str, "\t-W <width>\n\t\tSpecify tire width
in inches (overrides -d)\n");
- bu_vls_printf(gedp->ged_result_str, "\t-R <aspect>\n\t\tSpecify tire
aspect ratio (#/100) (overrides -d)\n");
- bu_vls_printf(gedp->ged_result_str, "\t-D <rim diameter>\n\t\tSpecify rim
diameter in inches (overrides -d)\n");
- bu_vls_printf(gedp->ged_result_str, "\t-g <depth>\n\t\tSpecify tread depth
in 32nds of an inch\n");
- bu_vls_printf(gedp->ged_result_str, "\t-j <width>\n\t\tSpecify rim width
in inches\n");
- bu_vls_printf(gedp->ged_result_str, "\t-p <type>\n\t\tGenerate tread with
tread pattern as specified\n");
- bu_vls_printf(gedp->ged_result_str, "\t-s <radius>\n\t\tSpecify radius of
the maximum sidewall width, in mm\n");
- bu_vls_printf(gedp->ged_result_str, "\t-t <type>\n\t\tGenerate tread with
tread type as specified\n");
- bu_vls_printf(gedp->ged_result_str, "\t-u <thickness>\n\t\tSpecify tire
thickness in mm\n");
- bu_vls_printf(gedp->ged_result_str, "\t-w <0|1>\n\t\tWhether to include
the wheel or not (default is 1, yes)\n");
-
- bu_vls_free(&str);
- return;
-}
-
-
-/**
* Return matrix needed to rotate an object around the y axis by theta
* degrees
*/
@@ -1827,187 +1782,121 @@
bu_vls_free(&str);
}
-
-/* Process command line arguments */
-static int
-ReadArgs(struct ged *gedp,
- int argc,
- const char *argv[],
- fastf_t *isoarray,
- fastf_t *overridearray,
- struct bu_vls *name,
- struct bu_vls *dimens,
- int *gen_name,
- int *treadtype,
- int *number_of_tread_patterns,
- fastf_t *tread_depth,
- fastf_t *tire_thickness,
- fastf_t *hub_width,
- int *pattern_type,
- fastf_t *zside1,
- int *usewheel)
+HIDDEN int
+_opt_tire_iso(struct bu_vls *msg, int argc, const char **argv, void *set_var)
{
- int c = 0;
int d1, d2, d3;
- int count;
- int tdtype, ptype, usewheelc;
- float hwidth, treadep, tthickness, zsideh;
- float fd1, fd2, fd3;
- char spacer1, tiretype;
- int have_name = 0;
+ char s1, s2;
+ int sret = 0;
+ fastf_t *isoarray = (fastf_t *)set_var;
+ if (!argv || !argv[0] || strlen(argv[0]) == 0 || argc == 0) return 0;
- /* skip command name */
- bu_optind = 1;
+ sret = bu_sscanf(argv[0], "%d%c%d%c%d", &d1, &s1, &d2, &s2, &d3);
- bu_opterr = 1;
-
- while ((c=bu_getopt(argc, (char * const *)argv, options)) != -1) {
- if (bu_optopt == '?')
- c='h';
- switch (c) {
- case 'a' :
- *gen_name = 1;
- have_name = 1;
- break;
- case 'n':
- have_name = 1;
- bu_vls_sprintf(name, "%s", bu_optarg);
- break;
- case 'c' :
- sscanf(bu_optarg, "%d", &count);
- *number_of_tread_patterns = count;
- break;
- case 'd' :
- sscanf(bu_optarg, "%d%c%d%c%d", &d1, &spacer1, &d2, &tiretype,
&d3);
- bu_vls_printf(gedp->ged_result_str, "Dimensions: Width=%2.0dmm,
Ratio=%2.0d, Wheel Diameter=%2.0din\n", d1, d2, d3);
- bu_vls_printf(dimens, "%d-%dR%d", d1, d2, d3);
- isoarray[0] = d1;
- isoarray[1] = d2;
- isoarray[2] = d3;
- break;
- case 'W':
- sscanf(bu_optarg, "%f", &fd1);
- overridearray[0] = fd1;
- break;
- case 'R':
- sscanf(bu_optarg, "%f", &fd2);
- overridearray[1] = fd2;
- break;
- case 'D':
- sscanf(bu_optarg, "%f", &fd3);
- overridearray[2] = fd3;
- break;
- case 'g':
- sscanf(bu_optarg, "%f", &treadep);
- *tread_depth = treadep;
- break;
- case 's':
- sscanf(bu_optarg, "%f", &zsideh);
- *zside1 = zsideh;
- break;
- case 'j':
- sscanf(bu_optarg, "%f", &hwidth);
- *hub_width = hwidth;
- break;
- case 'p':
- sscanf(bu_optarg, "%d", &ptype);
- *pattern_type = ptype;
- break;
- case 't':
- sscanf(bu_optarg, "%d", &tdtype);
- *treadtype = tdtype;
- break;
- case 'u':
- sscanf(bu_optarg, "%f", &tthickness);
- *tire_thickness = tthickness;
- break;
- case 'w':
- sscanf(bu_optarg, "%d", &usewheelc);
- *usewheel = usewheelc;
- break;
- default:
- show_help(gedp, argv[0]);
- if (c=='h')
- return GED_HELP;
- return GED_ERROR;
- }
+ if (sret != 5) {
+ if (msg) bu_vls_printf(msg, "Invalid ISO specification string: %s\n",
argv[0]);
+ return -1;
}
- if ((argc - bu_optind) == 1) {
- have_name = 1;
- bu_vls_sprintf(name, "%s", argv[bu_optind]);
+ if (isoarray) {
+ isoarray[0] = d1;
+ isoarray[1] = d2;
+ isoarray[2] = d3;
}
+ return 1;
+}
- if (!have_name) {
- bu_vls_printf(gedp->ged_result_str, "%s: need top-level object name\n",
argv[0]);
- show_help(gedp, argv[0]);
- return GED_ERROR;
+#define ISO_TIRE_FMT "<width>/<aspect>R<rim diameter>"
+
+/* Help message printed when -h option is supplied */
+HIDDEN void
+_tire_show_help(struct ged *gedp, const char *cmd, struct bu_opt_desc *d)
+{
+ struct bu_vls str = BU_VLS_INIT_ZERO;
+ const char *option_help = bu_opt_describe(d, NULL);
+ bu_vls_sprintf(&str, "Usage: %s [options] [obj_name]\n", cmd);
+ if (option_help) {
+ bu_vls_printf(&str, "Options:\n%s\n", option_help);
+ bu_free((char *)option_help, "help str");
}
+ bu_vls_printf(&str, "\nStandard ISO formatting for tire dimensions is of
the form %s, where <width> is in mm, <aspect> is a ratio, and <rim diameter> is
in inches.\n");
- return GED_OK;
+ bu_vls_printf(gedp->ged_result_str, "%s", bu_vls_addr(&str));
+ bu_vls_free(&str);
+ return;
}
-
int
ged_tire(struct ged *gedp, int argc, const char *argv[])
{
fastf_t dytred, dztred, dyside1, ztire, dyhub, zhub, d1;
- fastf_t width, ratio, wheeldiam;
+ fastf_t ratio, wheeldiam;
int bolts;
fastf_t bolt_diam, bolt_circ_diam, spigot_diam, fixing_offset,
bead_height, bead_width, rim_thickness;
struct wmember wheel_and_tire;
- fastf_t isoarray[3];
- fastf_t overridearray[3];
+ fastf_t isoarray[3] = { 215.0, 55.0, 17.0 };
+ fastf_t width = 0.0;
+ fastf_t aspect = 0.0;
+ fastf_t rim_diam = 0.0;
struct bu_vls name = BU_VLS_INIT_ZERO;
struct bu_vls dimen = BU_VLS_INIT_ZERO;
struct bu_vls str = BU_VLS_INIT_ZERO;
- int gen_name = 0;
int tread_type = 0;
int usewheel = 1;
- int number_of_tread_patterns = 30;
+ int num_tread_ptns = 30;
fastf_t tread_depth = 11;
fastf_t tire_thickness = 0;
fastf_t hub_width = 0;
int pattern_type = 0;
fastf_t zside1 = 0;
fastf_t tread_depth_float = tread_depth/32.0;
- int ret;
+ int print_help = 0;
+ int ret_ac = 0;
+ const char **unknown;
+ struct bu_opt_desc d[17];
+ BU_OPT(d[0], "h", "help", 0, 0, NULL, (void
*)&print_help, "", "Print help and exit");
+ BU_OPT(d[1], "?", "", 0, 0, NULL, (void
*)&print_help, "", "");
+ BU_OPT(d[2], "n", "obj-name", 1, 1, &bu_opt_vls, (void
*)&name, "name", "Set top-level object name");
+ BU_OPT(d[3], "w", "wheel", 1, 1, &bu_opt_bool, (void
*)&usewheel, "bool", "Enable/disable wheel (default is enabled).");
+ BU_OPT(d[4], "d", "dimensions", 1, 1, &_opt_tire_iso, (void
*)isoarray, ISO_TIRE_FMT, "Specify tire dimensions using ISO style
inputs");
+ BU_OPT(d[5], "", "ISO", 1, 1, &_opt_tire_iso, (void
*)isoarray, ISO_TIRE_FMT, "");
+ BU_OPT(d[6], "W", "width", 1, 1, &bu_opt_fastf_t, (void
*)&width, "#", "Tire width (mm). Overrides -d");
+ BU_OPT(d[7], "R", "aspect-ratio", 1, 1, &bu_opt_fastf_t, (void
*)&aspect, "#", "Aspect ratio (#/100). Overrides -d.");
+ BU_OPT(d[8], "D", "rim-diameter", 1, 1, &bu_opt_fastf_t, (void
*)&rim_diam, "#", "Rim diameter (inches). Overrides -d.");
+ BU_OPT(d[9], "g", "tread-depth", 1, 1, &bu_opt_fastf_t, (void
*)&tread_depth, "#", "Tread depth (1/32 inch)");
+ BU_OPT(d[10], "j", "hub-width", 1, 1, &bu_opt_fastf_t, (void
*)&hub_width, "#", "Rim width (inches)");
+ BU_OPT(d[11], "s", "max-sidewall-radius", 1, 1, &bu_opt_fastf_t, (void
*)&zside1, "#", "Maximum sidewall radius (mm)");
+ BU_OPT(d[12], "u", "tire-thickness", 1, 1, &bu_opt_fastf_t, (void
*)&tire_thickness, "#", "Tire thickness (mm)");
+ BU_OPT(d[13], "p", "tread-pattern", 1, 1, &bu_opt_int, (void
*)&pattern_type, "#", "Tread pattern (integer id, range 1 - 2)");
+ BU_OPT(d[14], "c", "tread-pattern-cnt", 1, 1, &bu_opt_int, (void
*)&num_tread_ptns, "#", "Number of tread patterns around tire");
+ BU_OPT(d[15], "t", "tread-shape", 1, 1, &bu_opt_int, (void
*)&tread_type, "#", "Tread shape profile (integer id, range 1 -
2)");
+ BU_OPT_NULL(d[16]);
+
GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
GED_CHECK_READ_ONLY(gedp, GED_ERROR);
- /* initialize result */
- bu_vls_trunc(gedp->ged_result_str, 0);
-
- /* Set Default Parameters - 215/55R17 */
- isoarray[0] = 215;
- isoarray[1] = 55;
- isoarray[2] = 17;
-
- /* No overriding of the iso array by default */
- overridearray[0] = 0;
- overridearray[1] = 0;
- overridearray[2] = 0;
-
- /* Process arguments */
- ret = ReadArgs(gedp, argc, argv,
- isoarray, overridearray,
- &name, &dimen, &gen_name,
- &tread_type, &number_of_tread_patterns,
- &tread_depth, &tire_thickness, &hub_width,
- &pattern_type, &zside1, &usewheel);
-
- if (overridearray[0] > 0) isoarray[0] = overridearray[0];
- if (overridearray[1] > 0) isoarray[1] = overridearray[1];
- if (overridearray[2] > 0) isoarray[2] = overridearray[2];
-
- if (ret != GED_OK) {
+ unknown = (const char **)bu_calloc(argc, sizeof(char *), "non-option argv
array");
+ ret_ac = bu_opt_parse(&unknown, argc, &str, argc-1, argv+1, d);
+ if (ret_ac < 0) {
+ bu_vls_printf(gedp->ged_result_str, "%s\n", bu_vls_addr(&str));
bu_vls_free(&name);
- bu_vls_free(&dimen);
- return ret;
+ bu_vls_free(&str);
+ bu_free((char *)unknown, "free unknown args array");
+ return GED_ERROR;
}
+ if (print_help) {
+ _tire_show_help(gedp, argv[0], d);
+ bu_vls_free(&name);
+ bu_vls_free(&str);
+ bu_free((char *)unknown, "free unknown args array");
+ return GED_ERROR;
+ }
- GED_CHECK_EXISTS(gedp, bu_vls_addr(&name), LOOKUP_QUIET, GED_ERROR);
+ /* Perform overrides, if we got them */
+ if (width > 0) isoarray[0] = width;
+ if (aspect > 0) isoarray[1] = aspect;
+ if (rim_diam > 0) isoarray[2] = rim_diam;
/* Calculate floating point value for tread depth */
tread_depth_float = tread_depth/32.0;
@@ -2015,21 +1904,35 @@
/* Based on arguments, assign name for toplevel object; default of
* "tire" is used unless overridden by user supplied options.
* If -a option was not used, toplevel object keeps its entire name from
-n argument (which is
- * overridden by the last argument on command line).
- */
- if (gen_name == 1) {
- if (bu_vls_strlen(&name) == 0)
- bu_vls_printf(&name,"tire-%d-%dR%d", (int)isoarray[0],
(int)isoarray[1], (int)isoarray[2]);
- else
- bu_vls_printf(&name, "-%d-%dR%d", (int)isoarray[0],
(int)isoarray[1], (int)isoarray[2]);
+ * overridden by the last argument on command line*/
+ if (bu_vls_strlen(&name) == 0) {
+ if (ret_ac > 0) {
+ bu_vls_printf(&name, "%s", unknown[0]);
+ ret_ac--;
+ } else {
+ bu_vls_printf(&name,"tire-%d-%dR%d", (int)isoarray[0],
(int)isoarray[1], (int)isoarray[2]);
+ }
}
- /* Use default dimensional info to create a suffix for names, if
- * not supplied in args.
- */
- if (bu_vls_strlen(&dimen) == 0)
- bu_vls_printf(&dimen, "-%d-%dR%d", (int)isoarray[0], (int)isoarray[1],
(int)isoarray[2]);
+ if (ret_ac > 0) {
+ bu_vls_sprintf(gedp->ged_result_str, "unknown args supplied.\n");
+ bu_vls_free(&name);
+ bu_vls_free(&str);
+ bu_free((char *)unknown, "free unknown args array");
+ return GED_ERROR;
+ }
+ if (db_lookup(gedp->ged_wdbp->dbip, bu_vls_addr(&name), LOOKUP_QUIET) !=
RT_DIR_NULL) {
+ bu_vls_sprintf(gedp->ged_result_str, "%s already exists.\n",
bu_vls_addr(&name));
+ bu_vls_free(&name);
+ bu_vls_free(&str);
+ bu_free((char *)unknown, "free unknown args array");
+ return GED_ERROR;
+ }
+
+ /* Use name to create a suffix for other object names. */
+ bu_vls_sprintf(&dimen, "-%s", bu_vls_addr(&name));
+
mk_id(gedp->ged_wdbp, "Tire");
bu_vls_printf(gedp->ged_result_str, "width = %f\n", isoarray[0]);
@@ -2071,7 +1974,7 @@
/* Make the tire region */
MakeTire(gedp->ged_wdbp, bu_vls_addr(&dimen), dytred, dztred,
d1, dyside1, zside1, ztire, dyhub, zhub, tire_thickness,
- tread_type, number_of_tread_patterns, tread_depth_float,
pattern_type);
+ tread_type, num_tread_ptns, tread_depth_float, pattern_type);
bolts = 5;
@@ -2107,7 +2010,8 @@
bu_vls_free(&str);
bu_vls_free(&name);
bu_vls_free(&dimen);
-
+ bu_free((char *)unknown, "free unknown args array");
+
return GED_OK;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits