/************************************************************************* * *N get_selected_features * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function gets the selection set for a given theme of the * specified view, either by querying the table, or by reading a * previously saved selection set file. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * view <input>==(view_type *) view structure. * themenum <input>==(int) theme number. * library <input>==(library-type) VPF library structure. * return <output>==(set_type) set of selected features. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *************************************************************************/ set_type get_selected_features( view_type *view, int themenum, library_type library ) { set_type selset; vpf_table_type ft; register int i; /* Read a selection set, if present */ if (strcmp(view->name,"") != 0) { selset = read_selected_features( view, themenum ); if (selset.size > 0) return selset; } /* No selection set... */ /* Find the feature class for the theme */ for (i=0;i<library.nfc;i++) if (strcasecmp(library.fc[i].name,view->theme[themenum].fc)==0) break; if (i>=library.nfc) { display_message("Invalid theme in view"); return selset; } /* Query the feature table */ ft = vpf_open_table( library.fc[i].table, disk, "rb", NULL ); selset = query_table( view->theme[themenum].expression, ft ); vpf_close_table( &ft ); /* Save the selection set so we don't have to query again */ if (strcmp(view->name,"") != 0) { save_selected_features( view, themenum, selset ); } return selset; }
/************************************************************************** * *N fcs_relate_list * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Read the feature class schema table and create the list of * tables to chain through. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * fcname <input> == (char *) feature class name. * start_table <input> == (char *) table to start from. * end_table <input> == (char *) table to end with. * fcs <input> == (vpf_table_type) feature class schema table. * fcs_relate_list <output> == (linked_list_type) list of tables to * chain through. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels DOS Turbo C *E *************************************************************************/ linked_list_type fcs_relate_list( char *fcname, char *start_table, char *end_table, vpf_table_type fcs ) { linked_list_type rlist; vpf_relate_struct rstruct; set_type fcset, set1, set2; char tablename[255], *buf, expr[255]; row_type row; long int rownum,n; int TABLE1_, KEY1_, TABLE2_, KEY2_; rlist = ll_init(); sprintf(expr,"FEATURE_CLASS = %s",fcname); fcset = query_table(expr,fcs); if (set_empty(fcset)) { set_nuke(&fcset); return rlist; } TABLE1_ = table_pos("TABLE1",fcs); KEY1_ = table_pos("FOREIGN_KEY",fcs); if (KEY1_ < 0) KEY1_ = table_pos("TABLE1_KEY",fcs); TABLE2_ = table_pos("TABLE2",fcs); KEY2_ = table_pos("PRIMARY_KEY",fcs); if (KEY2_ < 0) KEY2_ = table_pos("TABLE2_KEY",fcs); strcpy( tablename, start_table ); while (1) { sprintf(expr,"TABLE1 = %s",tablename); set1 = query_table(expr,fcs); set2 = set_intersection(set1,fcset); set_nuke(&set1); if (set_empty(set2)) { set_nuke(&fcset); set_nuke(&set2); return rlist; } rownum = set_min(set2); set_nuke(&set2); row = get_row(rownum,fcs); buf = (char *)get_table_element(TABLE1_,row,fcs,NULL,&n); strcpy(rstruct.table1,buf); rightjust(rstruct.table1); free(buf); buf = (char *)get_table_element(KEY1_,row,fcs,NULL,&n); strcpy(rstruct.key1,buf); rightjust(rstruct.key1); free(buf); buf = (char *)get_table_element(TABLE2_,row,fcs,NULL,&n); strcpy(rstruct.table2,buf); rightjust(rstruct.table2); free(buf); buf = (char *)get_table_element(KEY2_,row,fcs,NULL,&n); strcpy(rstruct.key2,buf); rightjust(rstruct.key2); free(buf); rstruct.degree = R_ONE; /* Default */ free_row( row, fcs ); if (table_in_list(rstruct.table1, rlist)) break; ll_insert( &rstruct, sizeof(rstruct), ll_last(rlist) ); strcpy( tablename, rstruct.table2 ); if (ossim_strcasecmp(tablename,end_table)==0) break; } set_nuke(&fcset); return rlist; }