GCV Plugin Tutorial
Introduction
This tutorial will demonstrate the process of integrating conversion plugins into the Geometry Conversion Library (GCV).
Build Integration
In order to associate the plugin with a file format, an associated MIME type must be present in enum mime_model_t
, located within include/bu/mime.h
. This enum is generated from misc/mime_cad.types
, so we will add an entry there:
model/foomodel foo
Now we will create a source file for our plugin. For now, it will be an empty file:
mkdir src/libgcv/conv/foomodel touch src/libgcv/conv/foomodel/foomodel_write.c
Next, add this file path to LIBGCV_CONVERTER_SOURCES
within src/libgcv/CMakeLists.txt
.
Now we will register the converter. Add the following line to gcv_get_converters()
within src/libgcv/plugin.c
. We will define the named symbol later.
CONVERTER(gcv_conv_foomodel_write);
Plugin Implementation
We are now ready to implement the plugin. Below is potential code for for foomodel_write.c
.
#include "common.h" #include "../plugin.h" struct gcv_foomodel_options_data { int max_objects; int starting_id; }; HIDDEN int gcv_foomodel_write(const char *dest_path, struct db_i *UNUSED(source_dbip), const struct gcv_opts *UNUSED(gcv_options), const void *options_data) { const struct gcv_foomodel_options_data *options = (struct gcv_foomodel_options_data *)options_data; bu_log("writing foomodel to '%s'\n", dest_path); bu_log("max_objects = %d\n", options->max_objects); bu_log("starting_id = %d\n", options->starting_id); if (max_objects < 0 || starting_id < 0) { bu_log("invalid value\n"); return 0; } /* success */ return 1; } HIDDEN void gcv_foomodel_create_opts(struct bu_opt_desc **options_desc, void **dest_options_data) { struct gcv_foomodel_options_data *options_data = (struct gcv_foomodel_options_data *) bu_malloc(sizeof(struct gcv_foomodel_options_data), "options_data"); *dest_options_data = options_data; *options_desc = (struct bu_opt_desc *) bu_malloc(3 * sizeof(struct bu_opt_desc), "options_desc"); BU_OPT((*options_desc)[0], "m", "max-objects", NULL, bu_opt_int, &options_data->max_objects, "max number of objects to create"); BU_OPT((*options_desc)[1], "i", "starting-id", "id", bu_opt_int, &options_data->starting_id, "starting object ID"); BU_OPT_NULL((*options_desc)[2]); /* initialize defaults */ options_data->max_objects = 0; options_data->starting_id = 0; } HIDDEN void gcv_foomodel_free_opts(void *options_data) { bu_free(options_data, "options_data"); } /* plugin information */ const struct gcv_converter gcv_conv_foomodel_write = { MIME_MODEL_FOOMODEL, GCV_CONVERSION_WRITE, gcv_foomodel_create_opts, gcv_foomodel_free_opts, gcv_foomodel_write };