123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957 |
- /***************************************************************************
- *
- * MODULE: v.out.vtk
- * AUTHOR(S): Soeren Gebbert
- *
- * PURPOSE: v.out.vtk: writes ASCII VTK file
- * this module is based on v.out.ascii
- * COPYRIGHT: (C) 2000 by the GRASS Development Team
- *
- * This program is free software under the GNU General Public
- * License (>=v2). Read the file COPYING that comes with GRASS
- * for details.
- *
- ****************************************************************************/
- #include <stdlib.h>
- #include <grass/vector.h>
- #include <grass/dbmi.h>
- #include <grass/gis.h>
- #include <grass/glocale.h>
- #include "writeVTK.h"
- #include "local_proto.h"
- /*Prototype */
- /*Formated coordinates output */
- static void write_point_coordinates(struct line_pnts *Points, int dp,
- double scale, FILE * ascii);
- /* ************************************************************************* */
- /* This function writes the vtk points and coordinates ********************* */
- /* ************************************************************************* */
- int write_vtk_points(FILE * ascii, struct Map_info *Map, VTKInfo * info,
- int *types, int typenum, int dp, double scale)
- {
- int type, cur, i, k, centroid;
- int pointoffset = 0;
- int lineoffset = 0;
- int polygonoffset = 0;
- static struct line_pnts *Points;
- struct line_cats *Cats;
- Points = Vect_new_line_struct(); /* init line_pnts struct */
- Cats = Vect_new_cats_struct();
- G_message("Writing coordinates ...");
- /*For every available vector type */
- for (k = 0; k < typenum; k++) {
- /*POINT KERNEL CENTROID */
- if (types[k] == GV_POINT || types[k] == GV_KERNEL ||
- types[k] == GV_CENTROID) {
- /*Get the number of the points to generate */
- info->typeinfo[types[k]]->pointoffset = pointoffset;
- /*count the number of line_nodes and lines */
- Vect_rewind(Map);
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- info->typeinfo[types[k]]->numpoints++;
- }
- }
- pointoffset += info->typeinfo[types[k]]->numpoints;
- info->typeinfo[types[k]]->numvertices =
- info->typeinfo[types[k]]->numpoints;
- info->maxnumvertices += info->typeinfo[types[k]]->numpoints;
- info->maxnumpoints += info->typeinfo[types[k]]->numpoints;
- /*
- * printf("Points Type %i Number %i offset %i\n", types[k],
- * info->typeinfo[types[k]]->numpoints,
- * info->typeinfo[types[k]]->pointoffset);
- */
- }
- }
- for (k = 0; k < typenum; k++) {
- /*LINE BOUNDARY */
- if (types[k] == GV_LINE || types[k] == GV_BOUNDARY) {
- info->typeinfo[types[k]]->pointoffset = pointoffset;
- info->typeinfo[types[k]]->lineoffset = lineoffset;
- /*count the number of line_nodes and lines */
- Vect_rewind(Map);
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- info->typeinfo[types[k]]->numpoints += Points->n_points;
- info->typeinfo[types[k]]->numlines++;
- }
- }
- pointoffset += info->typeinfo[types[k]]->numpoints;
- lineoffset += info->typeinfo[types[k]]->lineoffset;
- info->maxnumpoints += info->typeinfo[types[k]]->numpoints;
- info->maxnumlinepoints += info->typeinfo[types[k]]->numpoints;
- info->maxnumlines += info->typeinfo[types[k]]->numlines;
- /*
- * printf("Lines Type %i Number %i offset %i\n", types[k],
- * info->typeinfo[types[k]]->numlines,
- * info->typeinfo[types[k]]->lineoffset);
- */
- }
- }
- for (k = 0; k < typenum; k++) {
- /*FACE */
- if (types[k] == GV_FACE) {
- info->typeinfo[types[k]]->pointoffset = pointoffset;
- info->typeinfo[types[k]]->polygonoffset = polygonoffset;
- /*count the number of line_nodes and lines */
- Vect_rewind(Map);
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- info->typeinfo[types[k]]->numpoints += Points->n_points;
- info->typeinfo[types[k]]->numpolygons++;
- }
- }
- pointoffset += info->typeinfo[types[k]]->numpoints;
- polygonoffset += info->typeinfo[types[k]]->numpolygons;
- info->maxnumpoints += info->typeinfo[types[k]]->numpoints;
- info->maxnumpolygonpoints += info->typeinfo[types[k]]->numpoints;
- info->maxnumpolygons += info->typeinfo[types[k]]->numpolygons;
- /*
- * printf("Polygons Type %i Number %i offset %i\n", types[k],
- * info->typeinfo[types[k]]->numpolygons,
- * info->typeinfo[types[k]]->polygonoffset);
- */
- }
- }
- for (k = 0; k < typenum; k++) {
- /*AREA */
- if (types[k] == GV_AREA) {
- info->typeinfo[types[k]]->numpolygons = Vect_get_num_areas(Map);
- info->typeinfo[types[k]]->pointoffset = pointoffset;
- info->typeinfo[types[k]]->polygonoffset = polygonoffset;
- /*Count the coordinate points */
- Vect_rewind(Map);
- for (i = 1; i <= info->typeinfo[types[k]]->numpolygons; i++) {
- centroid = Vect_get_area_centroid(Map, i);
- if (centroid > 0) {
- Vect_read_line(Map, NULL, Cats, centroid);
- }
- Vect_get_area_points(Map, i, Points);
- info->typeinfo[types[k]]->numpoints += Points->n_points;
- }
- pointoffset += info->typeinfo[types[k]]->numpoints;
- polygonoffset += info->typeinfo[types[k]]->numpolygons;
- info->maxnumpoints += info->typeinfo[types[k]]->numpoints;
- info->maxnumpolygonpoints += info->typeinfo[types[k]]->numpoints;
- info->maxnumpolygons += info->typeinfo[types[k]]->numpolygons;
- /*
- * printf("Polygons Type %i Number %i offset %i\n", types[k],
- * info->typeinfo[types[k]]->numpolygons,
- * info->typeinfo[types[k]]->polygonoffset);
- */
- }
- }
- /*
- * printf("Maxnum points %i \n", info->maxnumpoints);
- * printf("Maxnum vertices %i \n", info->maxnumvertices);
- * printf("Maxnum lines %i \n", info->maxnumlines);
- * printf("Maxnum line points %i \n", info->maxnumlinepoints);
- * printf("Maxnum polygons %i \n", info->maxnumpolygons);
- * printf("Maxnum polygon points %i \n", info->maxnumpolygonpoints);
- */
- /*break if nothing to generate */
- if (info->maxnumpoints == 0)
- G_fatal_error(_("No coordinates to generate the output! Maybe an empty vector type chosen?"));
- /************************************************/
- /*Write the coordinates into the vtk ascii file */
- /************************************************/
- fprintf(ascii, "POINTS %i float\n", info->maxnumpoints);
- /*For every available vector type */
- for (k = 0; k < typenum; k++) {
- /*POINT KERNEL CENTROID */
- if (types[k] == GV_POINT || types[k] == GV_KERNEL ||
- types[k] == GV_CENTROID) {
- Vect_rewind(Map);
- /*Write the coordinates */
- cur = 0;
- while (1) {
- if (cur <= info->typeinfo[types[k]]->numpoints)
- G_percent(cur, info->typeinfo[types[k]]->numpoints, 2);
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- write_point_coordinates(Points, dp, scale, ascii);
- if (Cats->n_cats == 0)
- info->typeinfo[types[k]]->generatedata = 0; /*No data generation */
- }
- cur++;
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*LINE BOUNDARY */
- if (types[k] == GV_LINE || types[k] == GV_BOUNDARY) {
- Vect_rewind(Map);
- cur = 0;
- while (1) {
- if (cur <= info->typeinfo[types[k]]->numlines)
- G_percent(cur, info->typeinfo[types[k]]->numlines, 2);
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- write_point_coordinates(Points, dp, scale, ascii);
- }
- cur++;
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /* FACE */
- if (types[k] == GV_FACE) {
- Vect_rewind(Map);
- cur = 0;
- while (1) {
- if (cur <= info->typeinfo[types[k]]->numpolygons)
- G_percent(cur, info->typeinfo[types[k]]->numpolygons, 2);
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- write_point_coordinates(Points, dp, scale, ascii);
- }
- cur++;
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /* AREA */
- if (types[k] == GV_AREA) {
- Vect_rewind(Map);
- for (i = 1; i <= info->typeinfo[types[k]]->numpolygons; i++) {
- centroid = Vect_get_area_centroid(Map, i);
- if (centroid > 0) {
- Vect_read_line(Map, NULL, Cats, centroid);
- }
- Vect_get_area_points(Map, i, Points);
- write_point_coordinates(Points, dp, scale, ascii);
- }
- }
- }
- return 1;
- }
- /* ************************************************************************* */
- /* This function writes the vtk cells ************************************** */
- /* ************************************************************************* */
- int write_vtk_cells(FILE * ascii, struct Map_info *Map, VTKInfo * info,
- int *types, int typenum)
- {
- int type, i, j, k, centroid;
- static struct line_pnts *Points;
- struct line_cats *Cats;
- /*The keywords may only be written once! */
- int vertkeyword = 1;
- int linekeyword = 1;
- int polykeyword = 1;
- G_message("Writing vtk cells ...");
- Points = Vect_new_line_struct(); /* init line_pnts struct */
- Cats = Vect_new_cats_struct();
- /*For every available vector type */
- for (k = 0; k < typenum; k++) {
- /*POINT KERNEL CENTROID */
- if (types[k] == GV_POINT || types[k] == GV_KERNEL ||
- types[k] == GV_CENTROID) {
- Vect_rewind(Map);
- /*Write the vertices */
- if (info->typeinfo[types[k]]->numpoints > 0) {
- if (vertkeyword) {
- fprintf(ascii, "VERTICES %i %i\n", info->maxnumvertices,
- info->maxnumvertices * 2);
- vertkeyword = 0;
- }
- for (i = 0; i < info->typeinfo[types[k]]->numpoints; i++) {
- fprintf(ascii, "1 %i\n",
- i + info->typeinfo[types[k]]->pointoffset);
- }
- fprintf(ascii, "\n");
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*LINE BOUNDARY */
- if (types[k] == GV_LINE || types[k] == GV_BOUNDARY) {
- Vect_rewind(Map);
- if (info->maxnumlines > 0) {
- if (linekeyword) {
- fprintf(ascii, "LINES %i %i\n", info->maxnumlines,
- info->maxnumlinepoints + info->maxnumlines);
- linekeyword = 0;
- }
- Vect_rewind(Map);
- i = 0;
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- /*Check for data generation */
- if (Cats->n_cats == 0)
- info->typeinfo[types[k]]->generatedata = 0; /*No data generation */
- fprintf(ascii, "%i", Points->n_points);
- while (Points->n_points--) {
- fprintf(ascii, " %i",
- i +
- info->typeinfo[types[k]]->pointoffset);
- i++;
- }
- fprintf(ascii, "\n");
- }
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*LINE BOUNDARY FACE */
- if (types[k] == GV_FACE) {
- Vect_rewind(Map);
- if (info->maxnumpolygons > 0) {
- if (polykeyword) {
- fprintf(ascii, "POLYGONS %i %i\n",
- info->maxnumpolygons,
- info->maxnumpolygonpoints + info->maxnumpolygons);
- polykeyword = 0;
- }
- Vect_rewind(Map);
- i = 0;
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- /*Check for data generation */
- if (Cats->n_cats == 0)
- info->typeinfo[types[k]]->generatedata = 0; /*No data generation */
- fprintf(ascii, "%i", Points->n_points);
- while (Points->n_points--) {
- fprintf(ascii, " %i",
- i +
- info->typeinfo[types[k]]->pointoffset);
- i++;
- }
- fprintf(ascii, "\n");
- }
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*AREA */
- if (types[k] == GV_AREA) {
- Vect_rewind(Map);
- if (info->maxnumpolygons > 0) {
- if (polykeyword) {
- fprintf(ascii, "POLYGONS %i %i\n",
- info->maxnumpolygons,
- info->maxnumpolygonpoints + info->maxnumpolygons);
- polykeyword = 0;
- }
- j = 0;
- for (i = 1; i <= info->typeinfo[types[k]]->numpolygons; i++) {
- centroid = Vect_get_area_centroid(Map, i);
- if (centroid > 0) {
- Vect_read_line(Map, NULL, Cats, centroid);
- }
- Vect_get_area_points(Map, i, Points);
- /*Check for data generation */
- if (Cats->n_cats == 0)
- info->typeinfo[types[k]]->generatedata = 0; /*No data generation */
- fprintf(ascii, "%i", Points->n_points);
- while (Points->n_points--) {
- fprintf(ascii, " %i",
- j + info->typeinfo[types[k]]->pointoffset);
- j++;
- }
- fprintf(ascii, "\n");
- }
- }
- }
- }
- return 1;
- }
- /* ************************************************************************* */
- /* This function writes the categories as vtk cell data ******************** */
- /* ************************************************************************* */
- int write_vtk_cat_data(FILE * ascii, struct Map_info *Map, VTKInfo * info,
- int layer, int *types, int typenum, int dp)
- {
- int type, cat, i, k, centroid;
- static struct line_pnts *Points;
- struct line_cats *Cats;
- /*The keywords may only be written once! */
- int numcelldata =
- info->maxnumvertices + info->maxnumlines + info->maxnumpolygons;
- Points = Vect_new_line_struct(); /* init line_pnts struct */
- Cats = Vect_new_cats_struct();
- G_message("Writing category cell data ...");
- if (numcelldata > 0) {
- /*Write the pointdata */
- fprintf(ascii, "CELL_DATA %i\n", numcelldata);
- fprintf(ascii, "SCALARS cat_%s int 1\n", Map->name);
- fprintf(ascii, "LOOKUP_TABLE default\n");
- /*For every available vector type */
- for (k = 0; k < typenum; k++) {
- /*POINT KERNEL CENTROID */
- if (types[k] == GV_POINT || types[k] == GV_KERNEL ||
- types[k] == GV_CENTROID) {
- Vect_rewind(Map);
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- Vect_cat_get(Cats, layer, &cat);
- fprintf(ascii, " %d", cat);
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*LINE BOUNDARY */
- if (types[k] == GV_LINE || types[k] == GV_BOUNDARY) {
- Vect_rewind(Map);
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- Vect_cat_get(Cats, layer, &cat);
- fprintf(ascii, " %d", cat);
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*FACE */
- if (types[k] == GV_FACE) {
- Vect_rewind(Map);
- while (1) {
- if (-1 == (type = Vect_read_next_line(Map, Points, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- Vect_cat_get(Cats, layer, &cat);
- fprintf(ascii, " %d", cat);
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*AREA */
- if (types[k] == GV_AREA) {
- Vect_rewind(Map);
- for (i = 1; i <= info->typeinfo[types[k]]->numpolygons; i++) {
- centroid = Vect_get_area_centroid(Map, i);
- if (centroid > 0) {
- Vect_read_line(Map, NULL, Cats, centroid);
- }
- Vect_cat_get(Cats, layer, &cat);
- fprintf(ascii, " %d", cat);
- }
- }
- }
- fprintf(ascii, "\n");
- }
- return 1;
- }
- /*
- Reads the attribute field "name" for current cat and returns the value as a string
- or NULL on error
- Memory for the result string is allocated by this function and must be free'd by
- the caller.
- */
- char *get_att(char *name, int cat, struct field_info *Fi, dbDriver * Driver,
- int ncol)
- {
- char buf[2000];
- int more;
- dbTable *Table;
- static dbString dbstring;
- dbColumn *Column;
- dbCursor cursor;
- char *retval;
- static int first = 1;
- if (first) {
- db_init_string(&dbstring);
- first = 0;
- }
- sprintf(buf, "SELECT %s FROM %s WHERE %s = %d", name, Fi->table, Fi->key, cat);
- db_set_string(&dbstring, buf);
- if (db_open_select_cursor(Driver, &dbstring, &cursor, DB_SEQUENTIAL) !=
- DB_OK) {
- G_fatal_error(_("Cannot select attributes for cat = %d"), cat);
- }
- if (db_fetch(&cursor, DB_NEXT, &more) != DB_OK)
- G_fatal_error(_("Unable to fetch data from table"));
- Table = db_get_cursor_table(&cursor);
- Column = db_get_table_column(Table, 0);
- if (!strcmp(name, db_get_column_name(Column))) {
- db_convert_column_value_to_string(Column, &dbstring);
- retval =
- G_malloc(sizeof(char) *
- (strlen(db_get_string(&dbstring)) + 1));
- retval = G_store(db_get_string(&dbstring));
- db_close_cursor(&cursor);
- return (retval);
- }
- db_close_cursor(&cursor);
- return (NULL);
- }
- /* ************************************************************************* */
- /* This function writes numerical attribute table fields as VTK scalars **** */
- /* ************************************************************************* */
- int write_vtk_db_data(FILE * ascii, struct Map_info *Map, VTKInfo * info,
- int layer, int *types, int typenum, int dp)
- {
- int type, cat, i, k, centroid;
- struct line_cats *Cats;
- /*The keywords may only be written once! */
- int numcelldata =
- info->maxnumvertices + info->maxnumlines + info->maxnumpolygons;
- /* attribute table info */
- int ncol = 0, colsqltype, colctype, num_atts, cur_att, progress;
- struct field_info *Fi = NULL;
- dbDriver *Driver = NULL;
- dbHandle handle;
- dbTable *Table;
- dbString dbstring;
- dbColumn *Column;
- char *valbuf;
- if (layer < 1) {
- G_warning(_("Cannot export attribute table fields for layer < 1. Skipping export"));
- return 1;
- }
- /* attempt to open attribute table for selected layer */
- db_init_string(&dbstring);
- Fi = Vect_get_field(Map, layer);
- if (Fi == NULL) {
- G_fatal_error(_("No attribute table found"));
- }
- Driver = db_start_driver(Fi->driver);
- if (Driver == NULL)
- G_fatal_error(_("Unable to start driver <%s>"), Fi->driver);
- db_init_handle(&handle);
- db_set_handle(&handle, Fi->database, NULL);
- if (db_open_database(Driver, &handle) != DB_OK)
- G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
- Fi->database, Fi->driver);
- db_set_string(&dbstring, Fi->table);
- if (db_describe_table(Driver, &dbstring, &Table) != DB_OK)
- G_fatal_error(_("Unable to describe table <%s>"), Fi->table);
- /* analyse field structure */
- ncol = db_get_table_number_of_columns(Table);
- num_atts = 0;
- for (i = 0; i < ncol; i++) {
- Column = db_get_table_column(Table, i);
- colsqltype = db_get_column_sqltype(Column);
- colctype = db_sqltype_to_Ctype(colsqltype);
- if ((colctype == DB_C_TYPE_INT) || (colctype == DB_C_TYPE_DOUBLE)) {
- /* we don't want to export the category field twice */
- if (strcmp(db_get_column_name(Column), "cat")) {
- num_atts++;
- /* fprintf ( stderr, "%i: %s\n", num_atts, db_get_column_name(Column) ); */
- }
- }
- }
- if (num_atts < 1) {
- G_warning(_("No numerical attributes found. Skipping export"));
- db_close_database(Driver);
- db_shutdown_driver(Driver);
- return 1;
- }
- Cats = Vect_new_cats_struct();
- G_message("Writing %i scalar variables as cell data ...", num_atts);
- progress = 0;
- for (cur_att = 0; cur_att < ncol; cur_att++) {
- if (numcelldata > 0) {
- /*Write the pointdata */
- Column = db_get_table_column(Table, cur_att);
- colsqltype = db_get_column_sqltype(Column);
- colctype = db_sqltype_to_Ctype(colsqltype);
- if ((strcmp("cat", db_get_column_name(Column))) &&
- ((colctype == DB_C_TYPE_INT) ||
- (colctype == DB_C_TYPE_DOUBLE))) {
- if (colctype == DB_C_TYPE_INT) {
- /* G_message(" Writing integer scalar %s", db_get_column_name(Column) ); */
- fprintf(ascii, "SCALARS %s int 1\n",
- db_get_column_name(Column));
- }
- if (colctype == DB_C_TYPE_DOUBLE) {
- /* *G_message(" Writing double scalar %s", db_get_column_name(Column) ); */
- fprintf(ascii, "SCALARS %s double 1\n",
- db_get_column_name(Column));
- }
- fprintf(ascii, "LOOKUP_TABLE default\n");
- progress++;
- /*For every available vector type */
- for (k = 0; k < typenum; k++) {
- /*POINT KERNEL CENTROID */
- if (types[k] == GV_POINT || types[k] == GV_KERNEL ||
- types[k] == GV_CENTROID) {
- Vect_rewind(Map);
- while (1) {
- if (-1 ==
- (type =
- Vect_read_next_line(Map, NULL, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- Vect_cat_get(Cats, layer, &cat);
- valbuf =
- get_att((char *)
- db_get_column_name(Column), cat,
- Fi, Driver, ncol);
- if (valbuf == NULL) {
- db_close_database(Driver);
- db_shutdown_driver(Driver);
- G_fatal_error(_("Error reading value of attribute '%s'"),
- db_get_column_name(Column));
- }
- /* DEBUG
- fprintf ( stderr, "%s (%i) = %s\n", db_get_column_name(Column), cat, valbuf );
- */
- fprintf(ascii, " %s", valbuf);
- G_free(valbuf);
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*LINE BOUNDARY */
- if (types[k] == GV_LINE || types[k] == GV_BOUNDARY) {
- Vect_rewind(Map);
- while (1) {
- if (-1 ==
- (type =
- Vect_read_next_line(Map, NULL, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- Vect_cat_get(Cats, layer, &cat);
- valbuf =
- get_att((char *)
- db_get_column_name(Column), cat,
- Fi, Driver, ncol);
- if (valbuf == NULL) {
- db_close_database(Driver);
- db_shutdown_driver(Driver);
- G_fatal_error(_("Error reading value of attribute '%s'"),
- db_get_column_name(Column));
- }
- /* DEBUG
- fprintf ( stderr, "%s (%i) = %s\n", db_get_column_name(Column), cat, valbuf );
- */
- fprintf(ascii, " %s", valbuf);
- G_free(valbuf);
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*FACE */
- if (types[k] == GV_FACE) {
- Vect_rewind(Map);
- while (1) {
- if (-1 ==
- (type =
- Vect_read_next_line(Map, NULL, Cats)))
- break;
- if (type == -2) /* EOF */
- break;
- if (type == types[k]) {
- Vect_cat_get(Cats, layer, &cat);
- valbuf =
- get_att((char *)
- db_get_column_name(Column), cat,
- Fi, Driver, ncol);
- if (valbuf == NULL) {
- db_close_database(Driver);
- db_shutdown_driver(Driver);
- G_fatal_error(_("Error reading value of attribute '%s'"),
- db_get_column_name(Column));
- }
- /* DEBUG
- fprintf ( stderr, "%s (%i) = %s\n", db_get_column_name(Column), cat, valbuf );
- */
- fprintf(ascii, " %s", valbuf);
- G_free(valbuf);
- }
- }
- }
- }
- for (k = 0; k < typenum; k++) {
- /*AREA */
- if (types[k] == GV_AREA) {
- Vect_rewind(Map);
- for (i = 1;
- i <= info->typeinfo[types[k]]->numpolygons;
- i++) {
- centroid = Vect_get_area_centroid(Map, i);
- if (centroid > 0) {
- Vect_read_line(Map, NULL, Cats, centroid);
- }
- Vect_cat_get(Cats, layer, &cat);
- valbuf =
- get_att((char *)db_get_column_name(Column),
- cat, Fi, Driver, ncol);
- if (valbuf == NULL) {
- db_close_database(Driver);
- db_shutdown_driver(Driver);
- G_fatal_error(_("Error reading value of attribute '%s'"),
- db_get_column_name(Column));
- }
- /* DEBUG
- fprintf ( stderr, "%s (%i) = %s\n", db_get_column_name(Column), cat, valbuf );
- */
- fprintf(ascii, " %s", valbuf);
- G_free(valbuf);
- }
- }
- }
- fprintf(ascii, "\n");
- } /* END (do for all scalars != cat */
- }
- } /* END (step through all numerical attributes) */
- fprintf(stdout, "\n");
- fflush(stdout);
- db_close_database(Driver);
- db_shutdown_driver(Driver);
- return 1;
- }
- /* ************************************************************************* */
- /* This function writes attribute table fields as VTK labels **** */
- /* ************************************************************************* */
- int write_vtk_db_labels(FILE * ascii, struct Map_info *Map, VTKInfo * info,
- int layer, int *types, int typenum, int dp)
- {
- return 1;
- }
- /* ************************************************************************* */
- /* This function writes the point coordinates and the geometric feature **** */
- /* ************************************************************************* */
- int write_vtk(FILE * ascii, struct Map_info *Map, int layer, int *types,
- int typenum, int dp, double scale, int numatts, int labels)
- {
- VTKInfo *info;
- VTKTypeInfo **typeinfo;
- int i;
- int infonum =
- GV_POINT + GV_KERNEL + GV_CENTROID + GV_LINE + GV_BOUNDARY + GV_FACE +
- GV_AREA;
- /*Initiate the typeinfo structure for every supported type */
- typeinfo = (VTKTypeInfo **) calloc(infonum, sizeof(VTKTypeInfo *));
- for (i = 0; i < infonum; i++) {
- typeinfo[i] = (VTKTypeInfo *) calloc(1, sizeof(VTKTypeInfo));
- typeinfo[i]->numpoints = 0;
- typeinfo[i]->pointoffset = 0;
- typeinfo[i]->numvertices = 0;
- typeinfo[i]->verticesoffset = 0;
- typeinfo[i]->numlines = 0;
- typeinfo[i]->lineoffset = 0;
- typeinfo[i]->numpolygons = 0;
- typeinfo[i]->polygonoffset = 0;
- typeinfo[i]->generatedata = 1;
- }
- /*Initiate the info structure */
- info = (VTKInfo *) calloc(infonum, sizeof(VTKInfo));
- info->maxnumpoints = 0;
- info->maxnumvertices = 0;
- info->maxnumlines = 0;
- info->maxnumlinepoints = 0;
- info->maxnumpolygons = 0;
- info->maxnumpolygonpoints = 0;
- info->typeinfo = typeinfo;
- /*1. write the points */
- write_vtk_points(ascii, Map, info, types, typenum, dp, scale);
- /*2. write the cells */
- write_vtk_cells(ascii, Map, info, types, typenum);
- /*3. write the cat data */
- write_vtk_cat_data(ascii, Map, info, layer, types, typenum, dp);
- /*4. write the DB data: numerical attributes */
- if (numatts) {
- write_vtk_db_data(ascii, Map, info, layer, types, typenum, dp);
- }
- /*5. Write labels (not yet supported)
- if ( labels ) {
- write_vtk_db_labels(ascii, Map, info, layer, types, typenum, dp);
- }
- */
- /*Release the memory */
- for (i = 0; i < infonum; i++) {
- free(typeinfo[i]);
- }
- free(typeinfo);
- free(info);
- return 1;
- }
- /* ************************************************************************* */
- /* This function writes the point coordinates ****************************** */
- /* ************************************************************************* */
- void write_point_coordinates(struct line_pnts *Points, int dp, double scale,
- FILE * ascii)
- {
- char *xstring = NULL, *ystring = NULL, *zstring = NULL;
- double *xptr, *yptr, *zptr;
- xptr = Points->x;
- yptr = Points->y;
- zptr = Points->z;
- while (Points->n_points--) {
- G_asprintf(&xstring, "%.*f", dp, *xptr++ - x_extent);
- G_trim_decimal(xstring);
- G_asprintf(&ystring, "%.*f", dp, *yptr++ - y_extent);
- G_trim_decimal(ystring);
- G_asprintf(&zstring, "%.*f", dp, scale * (*zptr++));
- G_trim_decimal(zstring);
- fprintf(ascii, "%s %s %s \n", xstring, ystring, zstring);
- }
- return;
- }
|