123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575 |
- /*!
- \file GP2.c
- \brief OGSF library - loading and manipulating point sets (higher level functions)
- GRASS OpenGL gsurf OGSF Library
- (C) 1999-2008 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.
- \author Bill Brown USACERL (January 1994)
- \author Doxygenized by Martin landa <landa.martin gmail.com> (May 2008)
- */
- #include <stdlib.h>
- #include <string.h>
- #include <grass/gis.h>
- #include <grass/gstypes.h>
- #include "gsget.h"
- static int Site_ID[MAX_SITES];
- static int Next_site = 0;
- /*!
- \brief Check if point set exists
- \param id point set id
- \return 1 found
- \return 0 not found
- */
- int GP_site_exists(int id)
- {
- int i, found = 0;
- G_debug(4, "GP_site_exists(%d)", id);
- if (NULL == gp_get_site(id)) {
- return (0);
- }
- for (i = 0; i < Next_site && !found; i++) {
- if (Site_ID[i] == id) {
- found = 1;
- }
- }
- G_debug(3, "GP_site_exists(): found=%d", found);
- return (found);
- }
- /*!
- \brief Create new point set
- \return point set id
- \return -1 on error (number of point sets exceeded)
- */
- int GP_new_site(void)
- {
- geosite *np;
- if (Next_site < MAX_SITES) {
- np = gp_get_new_site();
- gp_set_defaults(np);
- Site_ID[Next_site] = np->gsite_id;
- ++Next_site;
- G_debug(3, "GP_new_site() id=%d", np->gsite_id);
- return (np->gsite_id);
- }
- return (-1);
- }
- /*!
- \brief Get number of loaded point sets
- \return number of point sets
- */
- int GP_num_sites(void)
- {
- return (gp_num_sites());
- }
- /*!
- \brief Get list of point sets
- Must freed when no longer needed!
- \param numsites number of point sets
- \return pointer to list of points sets
- \return NULL on error
- */
- int *GP_get_site_list(int *numsites)
- {
- int i, *ret;
- *numsites = Next_site;
- if (Next_site) {
- ret = (int *)G_malloc(Next_site * sizeof(int)); /* G_fatal_error */
- if (!ret) {
- return (NULL);
- }
- for (i = 0; i < Next_site; i++) {
- ret[i] = Site_ID[i];
- }
- return (ret);
- }
- return (NULL);
- }
- /*!
- \brief Delete registrated point set
- \param id point set id
- \return 1 on success
- \return -1 on error (point sets not available)
- */
- int GP_delete_site(int id)
- {
- int i, j, found = 0;
- G_debug(4, "GP_delete_site(%d)", id);
- if (GP_site_exists(id)) {
- gp_delete_site(id);
- for (i = 0; i < Next_site && !found; i++) {
- if (Site_ID[i] == id) {
- found = 1;
- for (j = i; j < Next_site; j++) {
- Site_ID[j] = Site_ID[j + 1];
- }
- }
- }
- if (found) {
- --Next_site;
- return (1);
- }
- }
- return (-1);
- }
- /*!
- \brief Load point set from file
- Check to see if handle already loaded, if so - free before loading new
- for now, always load to memory
- \todo load file handle & ready for reading instead of using
- memory
- \param id point set id
- \param filename point set filename
- \return -1 on error
- \return 1 on success
- */
- int GP_load_site(int id, const char *filename)
- {
- geosite *gp;
- G_debug(3, "GP_load_site(%d, %s)", id, filename);
- if (NULL == (gp = gp_get_site(id))) {
- return (-1);
- }
- if (gp->points) {
- gp_free_sitemem(gp);
- }
- gp->filename = G_store(filename);
- gp->points = Gp_load_sites(filename, &(gp->n_sites), &(gp->has_z));
- if (gp->points) {
- return (1);
- }
- return (-1);
- }
- /*!
- \brief Get point set filename
- Note: char array is allocated by G_store()
- \param id point set id
- \param[out] &filename point set filename
- \return -1 on error (point set not found)
- \return 1 on success
- */
- int GP_get_sitename(int id, char **filename)
- {
- geosite *gp;
- G_debug(4, "GP_get_sitename(%d)", id);
- if (NULL == (gp = gp_get_site(id))) {
- return (-1);
- }
- *filename = G_store(gp->filename);
- return (1);
- }
- /*!
- \brief Get point set style
- \param id point set id
- \return -1 on error (point set not found)
- */
- int GP_get_style(int id, int *color, int *width, float *size, int *symbol)
- {
- geosite *gp;
- G_debug(4, "GP_get_style(%d)", id);
- if (NULL == (gp = gp_get_site(id))) {
- return (-1);
- }
- *color = gp->style->color;
- *width = gp->style->width;
- *symbol = gp->style->symbol;
- *size = gp->style->size;
- return (1);
- }
- /*!
- \brief Set point set style
- \param id point set id
- \param color icon color
- \param width icon line width
- \param size icon size
- \param symbol icon symbol
- \return -1 on error (point set not found)
- */
- int GP_set_style(int id, int color, int width, float size, int symbol)
- {
- geosite *gp;
- G_debug(4, "GP_set_style(%d, %d, %d, %f, %d)", id, color, width, size,
- symbol);
- if (NULL == (gp = gp_get_site(id))) {
- return (-1);
- }
- gp->style->color = color;
- gp->style->symbol = symbol;
- gp->style->size = size;
- gp->style->width = width;
- return (1);
- }
- /*!
- \brief Set z-mode
- \param id poin set id
- \param use_z use z ?
- \return 1 on success
- \return 0 no z
- \return -1 on error (invalid point set id)
- */
- /* I don't see who is using it? Why it's required? */
- int GP_set_zmode(int id, int use_z)
- {
- geosite *gp;
- G_debug(3, "GP_set_zmode(%d,%d)", id, use_z);
- if (NULL == (gp = gp_get_site(id))) {
- return (-1);
- }
- if (use_z) {
- if (gp->has_z) {
- gp->use_z = 1;
- return (1);
- }
- return (0);
- }
- gp->use_z = 0;
- return (1);
- }
- /*!
- \brief Get z-mode
- \param id point set id
- \param[out] use_z use z
- \return -1 on error (invalid point set id)
- \return 1 on success
- */
- /* Who's using this? */
- int GP_get_zmode(int id, int *use_z)
- {
- geosite *gp;
- G_debug(4, "GP_get_zmode(%d)", id);
- if (NULL == (gp = gp_get_site(id))) {
- return (-1);
- }
- *use_z = gp->use_z;
- return (1);
- }
- /*!
- \brief Set trans ?
- \param id point set id
- \param xtrans,ytrans,ztrans x/y/z trans values
- */
- void GP_set_trans(int id, float xtrans, float ytrans, float ztrans)
- {
- geosite *gp;
- G_debug(3, "GP_set_trans(): id=%d trans=%f,%f,%f",
- id, xtrans, ytrans, ztrans);
- gp = gp_get_site(id);
- if (gp) {
- gp->x_trans = xtrans;
- gp->y_trans = ytrans;
- gp->z_trans = ztrans;
- }
- return;
- }
- /*!
- \brief Get trans
- \param id point set id
- \param xtrans,ytrans,ztrans x/y/z trans values
- */
- void GP_get_trans(int id, float *xtrans, float *ytrans, float *ztrans)
- {
- geosite *gp;
- gp = gp_get_site(id);
- if (gp) {
- *xtrans = gp->x_trans;
- *ytrans = gp->y_trans;
- *ztrans = gp->z_trans;
- }
- G_debug(3, "GP_get_trans(): id=%d, trans=%f,%f,%f",
- id, *xtrans, *ytrans, *ztrans);
- return;
- }
- /*!
- \brief Select surface
- \param hp point set id
- \param hs surface id
- \return 1 surface selected
- \return -1 on error
- */
- int GP_select_surf(int hp, int hs)
- {
- geosite *gp;
- G_debug(3, "GP_select_surf(%d,%d)", hp, hs);
- if (GP_surf_is_selected(hp, hs)) {
- return (1);
- }
- gp = gp_get_site(hp);
- if (gp && GS_surf_exists(hs)) {
- gp->drape_surf_id[gp->n_surfs] = hs;
- gp->n_surfs += 1;
- return (1);
- }
- return (-1);
- }
- /*!
- \brief Unselect surface
- \param hp point set id
- \param hs surface id
- \return 1 surface unselected
- \return -1 on error
- */
- int GP_unselect_surf(int hp, int hs)
- {
- geosite *gp;
- int i, j;
- G_debug(3, "GP_unselect_surf(%d,%d)", hp, hs);
- if (!GP_surf_is_selected(hp, hs)) {
- return (1);
- }
- gp = gp_get_site(hp);
- if (gp) {
- for (i = 0; i < gp->n_surfs; i++) {
- if (gp->drape_surf_id[i] == hs) {
- for (j = i; j < gp->n_surfs - 1; j++) {
- gp->drape_surf_id[j] = gp->drape_surf_id[j + 1];
- }
- gp->n_surfs -= 1;
- return (1);
- }
- }
- }
- return (-1);
- }
- /*!
- \brief Check if surface is selected
- \param hp point set id
- \param hs surface id
- \return 1 selected
- \return 0 not selected
- */
- int GP_surf_is_selected(int hp, int hs)
- {
- int i;
- geosite *gp;
- G_debug(3, "GP_surf_is_selected(%d,%d)", hp, hs);
- gp = gp_get_site(hp);
- if (gp) {
- for (i = 0; i < gp->n_surfs; i++) {
- if (hs == gp->drape_surf_id[i]) {
- return (1);
- }
- }
- }
- return (0);
- }
- /*!
- \brief Draw point set
- \param id point set id
- */
- void GP_draw_site(int id)
- {
- geosurf *gs;
- geosite *gp;
- int i;
- float n, yo, xo, e;
- gp = gp_get_site(id);
- GS_get_region(&n, &yo, &xo, &e);
- /* kind of sloppy - maybe site files should have an origin, too */
- if (gp) {
- if (gp->use_z && gp->has_z) {
- gpd_3dsite(gp, xo, yo, 0);
- }
- else {
- for (i = 0; i < gp->n_surfs; i++) {
- gs = gs_get_surf(gp->drape_surf_id[i]);
- if (gs) {
- gpd_2dsite(gp, gs, 0);
- G_debug(5, "Drawing site %d on Surf %d", id,
- gp->drape_surf_id[i]);
- }
- }
- }
- }
- return;
- }
- /*!
- \brief Draw all available point sets
- */
- void GP_alldraw_site(void)
- {
- int id;
- for (id = 0; id < Next_site; id++) {
- GP_draw_site(Site_ID[id]);
- }
- return;
- }
- /*!
- \brief Set client data
- \param id point set id
- \param clientd client data
- \return 1 on success
- \return -1 on error (invalid point set id)
- */
- int GP_Set_ClientData(int id, void *clientd)
- {
- geosite *gp;
- gp = gp_get_site(id);
- if (gp) {
- gp->clientdata = clientd;
- return (1);
- }
- return (-1);
- }
- /*!
- \brief Get client data
- \param id point set id
- \return pointer to client data
- \return NULL on error
- */
- void *GP_Get_ClientData(int id)
- {
- geosite *gp;
- gp = gp_get_site(id);
- if (gp) {
- return (gp->clientdata);
- }
- return (NULL);
- }
|