void RGISEditGridStatsCBK (Widget widget, RGISWorkspace *workspace,XmAnyCallbackStruct *callData) { DBDataset *dataset = UIDataset (); DBObjData *dbData = dataset->Data (); DBGridIF *gridIF = new DBGridIF (dbData); UITable *tableCLS = (UITable *) dbData->Display (UITableName (dbData,dbData->Table (DBrNItems))); if (dbData->Type () == DBTypeGridContinuous) gridIF->RecalcStats (); else gridIF->DiscreteStats (); if (tableCLS != (UITable *) NULL) tableCLS->Draw (); }
DBInt DBPointToGrid(DBObjData *pntData, DBObjData *grdData, DBFloat factor) { DBInt startID, pnt0ID, pntID, id, itemNum; double dist, minDist, box, box0, bWidth, bHeight; DBPosition pos; DBCoordinate gCoord, *pCoord; DBObjRecord *grdRec, *pntRec, *symRec; DBObjTable *itemTable, *symTable; DBObjTableField *valField, *symField; DBVPointIF *pntIF; DBGridIF *gridIF; DBMathDistanceFunction distFunc = DBMathGetDistanceFunction(pntData); if (distFunc != DBMathGetDistanceFunction(grdData)) { CMmsgPrint(CMmsgAppError, "Incompatible projections in: %s %d", __FILE__, __LINE__); return (DBFault); } pntIF = new DBVPointIF(pntData); itemNum = pntIF->ItemNum(); if ((pCoord = (DBCoordinate *) calloc(itemNum, sizeof(DBCoordinate))) == (DBCoordinate *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation Error in: %s %d", __FILE__, __LINE__); return (DBFault); } gridIF = new DBGridIF(grdData); for (pntID = 0; pntID < itemNum; ++pntID) pCoord[pntID] = pntIF->Coordinate(pntIF->Item(pntID)); if (grdData->Type() == DBTypeGridContinuous) gridIF->RenameLayer(gridIF->Layer((DBInt) 0), (char *) "Distance to Station"); else { gridIF->RenameLayer(gridIF->Layer((DBInt) 0), (char *) "Station grid"); itemTable = grdData->Table(DBrNItems); symTable = grdData->Table(DBrNSymbols); valField = itemTable->Field(DBrNGridValue); symField = itemTable->Field(DBrNSymbol); if ((symRec = symTable->Item(0)) == (DBObjRecord *) NULL) CMmsgPrint(CMmsgAppError, "Total Metal Gebasz in: %s %d", __FILE__, __LINE__); for (pntID = 0; pntID < itemNum; ++pntID) { pntRec = pntIF->Item(pntID); grdRec = itemTable->Add(pntRec->Name()); valField->Int(grdRec, pntID + 1); symField->Record(grdRec, symRec); } } startID = 0; for (pos.Row = 0; pos.Row < gridIF->RowNum(); ++pos.Row) { DBPause(pos.Row * 100 / gridIF->RowNum()); for (pos.Col = 0; pos.Col < gridIF->ColNum(); ++pos.Col) { gridIF->Pos2Coord(pos, gCoord); minDist = box0 = DBHugeVal; pnt0ID = pntID = startID; id = DBFault; do { bWidth = fabs(gCoord.X - pCoord[pntID].X); bHeight = fabs(gCoord.Y - pCoord[pntID].Y); box = bWidth > bHeight ? bWidth : bHeight; if ((box < box0) && ((dist = DBMathCoordinateDistance(distFunc, gCoord, pCoord[pntID])) < minDist)) { minDist = dist; id = startID = pntID; box *= factor; if (box0 > box) box0 = box; } pntID = pntID + 1 < itemNum ? pntID + 1 : 0; } while (pntID != pnt0ID); if (grdData->Type() == DBTypeGridContinuous) gridIF->Value(pos, minDist); else gridIF->Value(pos, id); } } if (grdData->Type() == DBTypeGridContinuous) gridIF->RecalcStats(); else gridIF->DiscreteStats(); delete gridIF; free(pCoord); return (DBSuccess); }
DBInt DBPointToGrid(DBObjData *pntData, DBObjData *netData, DBObjData *grdData) { DBInt i; DBPosition pos; DBObjTable *pntTable = pntData->Table(DBrNItems); DBObjTable *grdTable = grdData->Table(DBrNItems); DBObjTable *symTable = grdData->Table(DBrNSymbols); DBObjectLIST<DBObjTableField> *pntFields = pntTable->Fields(); DBObjTableField *pntFLD; DBObjTableField *grdAttribFLD; DBObjTableField *grdFLD = grdTable->Field(DBrNGridValue); DBObjTableField *symFLD = grdTable->Field(DBrNSymbol); DBObjRecord *cellRec, *toCell, *pntRec, *itemRec; DBObjRecord *symRec = symTable->First(); DBVPointIF *pntIF; DBNetworkIF *netIF; DBGridIF *grdIF; pntIF = new DBVPointIF(pntData); netIF = new DBNetworkIF(netData); grdIF = new DBGridIF(grdData); grdIF->RenameLayer(grdIF->Layer((DBInt) 0), (char *) "Subbasins"); for (pos.Row = 0; pos.Row < grdIF->RowNum(); ++pos.Row) for (pos.Col = 0; pos.Col < grdIF->ColNum(); ++pos.Col) grdIF->Value(pos, DBFault); for (pntFLD = pntFields->First(); pntFLD != (DBObjTableField *) NULL; pntFLD = pntFields->Next()) if (DBTableFieldIsVisible(pntFLD)) grdTable->AddField(new DBObjTableField(*pntFLD)); for (i = 0; i < pntIF->ItemNum(); ++i) { DBPause(i * 100 / pntIF->ItemNum()); pntRec = pntIF->Item(i); if ((pntRec->Flags() & DBObjectFlagIdle) == DBObjectFlagIdle) continue; if ((cellRec = netIF->Cell(pntIF->Coordinate(pntRec))) == (DBObjRecord *) NULL) continue; itemRec = grdTable->Add(pntRec->Name()); grdFLD->Int(itemRec, pntRec->RowID() + 1); symFLD->Record(itemRec, symRec); for (pntFLD = pntFields->First(); pntFLD != (DBObjTableField *) NULL; pntFLD = pntFields->Next()) if ((grdAttribFLD = grdTable->Field(pntFLD->Name())) != (DBObjTableField *) NULL) switch (pntFLD->Type()) { case DBTableFieldString: grdAttribFLD->String(itemRec, pntFLD->String(pntRec)); break; case DBTableFieldInt: grdAttribFLD->Int(itemRec, pntFLD->Int(pntRec)); break; case DBTableFieldFloat: grdAttribFLD->Float(itemRec, pntFLD->Float(pntRec)); break; case DBTableFieldDate: grdAttribFLD->Date(itemRec, pntFLD->Date(pntRec)); break; } grdIF->Value(netIF->CellPosition(cellRec), itemRec->RowID()); } for (i = 0; i < netIF->CellNum(); ++i) { if ((cellRec = netIF->Cell(i)) == (DBObjRecord *) NULL) continue; if ((itemRec = grdIF->GridItem(netIF->CellPosition(cellRec))) != (DBObjRecord *) NULL) continue; if ((toCell = netIF->ToCell(cellRec)) == (DBObjRecord *) NULL) continue; if ((itemRec = grdIF->GridItem(netIF->CellPosition(toCell))) != (DBObjRecord *) NULL) grdIF->Value(netIF->CellPosition(cellRec), itemRec->RowID()); } grdIF->DiscreteStats(); delete pntIF; delete netIF; delete grdIF; return (DBSuccess); }
DBInt Read (FILE *file,DBObjData *data) { DBInt i, layer, swap, valueType, valueSize, docLength; DMLayerHeader dmLayerHeader; DBObjRecord *layerRec, *dataRec; DBObjTable *layerTable = data->Table (DBrNLayers); DBObjTable *itemTable = data->Table (DBrNItems); DBObjTableField *rowNumFLD = layerTable->Field (DBrNRowNum); DBObjTableField *colNumFLD = layerTable->Field (DBrNColNum); DBObjTableField *cellWidthFLD = layerTable->Field (DBrNCellWidth); DBObjTableField *cellHeightFLD = layerTable->Field (DBrNCellHeight); DBObjTableField *valueTypeFLD = layerTable->Field (DBrNValueType); DBObjTableField *valueSizeFLD = layerTable->Field (DBrNValueSize); DBObjTableField *layerFLD = layerTable->Field (DBrNLayer); DBGridIF *gridIF; if ((swap = DMFileHeader::Read (file)) == DBFault) return (DBFault); data->Extent (Extent ()); data->Projection (DBMathGuessProjection (data->Extent ())); data->Precision (DBMathGuessPrecision (data->Extent ())); if (FileType () != DMMatrix) { CMmsgPrint (CMmsgAppError, "Wrong File Type in: %s %d",__FILE__,__LINE__); return (DBFault); } switch (DataType ()) { case DMFloat: valueType = DBTableFieldFloat; valueSize = sizeof (DBFloat4);break; case DMInt: valueType = DBTableFieldInt; valueSize = sizeof (DBInt); break; case DMByte: valueType = DBTableFieldInt; valueSize = sizeof (DBByte); break; default: CMmsgPrint (CMmsgAppError, "Wrong Data Value Type in: %s %d",__FILE__,__LINE__); return (DBFault); } for (layer = 0;layer < LayerNum ();++layer) { if (dmLayerHeader.Read (file,swap) == DBFault) return (DBFault); if (strlen (dmLayerHeader.Description ()) > 0) layerName = dmLayerHeader.Description (); else { sprintf (layerNameSTR,"GHAASLayer%4d",layer + 1); layerName = layerNameSTR; } layerTable->Add (layerName); if ((layerRec = layerTable->Item ()) == (DBObjRecord *) NULL) return (DBFault); rowNumFLD->Int (layerRec,RowNum ()); colNumFLD->Int (layerRec,ColNum ()); cellWidthFLD->Float (layerRec,CellWidth ()); cellHeightFLD->Float (layerRec,CellHeight ()); valueTypeFLD->Int (layerRec,((DBInt) DBTypeGridDiscrete) == data->Type () ? DBTableFieldInt : valueType); valueSizeFLD->Int (layerRec,valueSize); if ((dataRec = new DBObjRecord (layerName,((size_t) ColNum ()) * RowNum () * valueSize,valueSize)) == (DBObjRecord *) NULL) return (DBFault); (data->Arrays ())->Add (dataRec); layerFLD->Record (layerRec,dataRec); } if (fread (&docLength,sizeof (int),1,file) != 1) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap) DBByteOrderSwapWord (&docLength); if (docLength > 0) { char *docString; if ((docString = (char *) calloc (docLength,sizeof (char))) == (char *) NULL) { CMmsgPrint (CMmsgSysError, "Memory Allocation Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (fread (docString,docLength,1,file) != 1) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } data->Document (DBDocComment,docString); free (docString); } for (dataRec = (data->Arrays ())->First ();dataRec != (DBObjRecord *) NULL;dataRec = (data->Arrays ())->Next ()) if (fread (dataRec->Data (),ColNum () * valueSize * RowNum (),1,file) != 1) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap && valueSize > 1) { int i; void (*swapFunc) (void *); switch (valueSize) { case 2: swapFunc = DBByteOrderSwapHalfWord; break; case 4: swapFunc = DBByteOrderSwapWord; break; case 8: swapFunc = DBByteOrderSwapLongWord; break; default: CMmsgPrint (CMmsgAppError, "Wrong Data Value Size in: %s %d",__FILE__,__LINE__); return (DBFault); } for (dataRec = (data->Arrays ())->First ();dataRec != (DBObjRecord *) NULL;dataRec = (data->Arrays ())->Next ()) for (i = 0;i < ColNum () * RowNum ();++i) (*swapFunc) ((char *) dataRec->Data () + i * valueSize); } switch (data->Type ()) { case DBTypeGridDiscrete: { DBInt value; char nameStr [DBStringLength]; DBObjRecord *symRec = (data->Table (DBrNSymbols))->Add ("Default Symbol"); DBObjRecord *itemRec; DBObjTableField *gridValueFLD = itemTable->Field (DBrNGridValue); DBObjTableField *gridSymbolFLD = itemTable->Field (DBrNSymbol); DBObjTableField *symbolIDFLD = (data->Table (DBrNSymbols))->Field (DBrNSymbolID); DBObjTableField *foregroundFLD = (data->Table (DBrNSymbols))->Field (DBrNForeground); DBObjTableField *backgroundFLD = (data->Table (DBrNSymbols))->Field (DBrNBackground); DBObjTableField *styleFLD = (data->Table (DBrNSymbols))->Field (DBrNStyle); symbolIDFLD->Int (symRec,0); foregroundFLD->Int (symRec,1); backgroundFLD->Int (symRec,0); styleFLD->Int (symRec,0); for (dataRec = (data->Arrays ())->First ();dataRec != (DBObjRecord *) NULL;dataRec = (data->Arrays ())->Next ()) { for (i = 0;i < ColNum () * RowNum ();++i) { switch (valueType) { case DBTableFieldFloat: value = (DBInt) rint (*((float *) ((char *) dataRec->Data () + i * valueSize))); break; case DBTableFieldInt: switch (valueSize) { case sizeof (DBByte): value = (DBInt) (*((DBByte *) ((char *) dataRec->Data () + i * valueSize))); break; case sizeof (DBShort): value = (DBInt) (*((DBShort *) ((char *) dataRec->Data () + i * valueSize))); break; case sizeof (DBInt): value = (DBInt) (*((DBInt *) ((char *) dataRec->Data () + i * valueSize))); break; default: CMmsgPrint (CMmsgAppError, "Wrong Data Size in: %s %d",__FILE__,__LINE__); return (DBFault); } break; default: CMmsgPrint (CMmsgAppError, "Wrong Data Type in: %s %d",__FILE__,__LINE__); return (DBFault); } sprintf (nameStr,"Category%04d",value); if ((itemRec = itemTable->Item (nameStr)) == (DBObjRecord *) NULL) { if ((itemRec = itemTable->Add (nameStr)) == (DBObjRecord *) NULL) { CMmsgPrint (CMmsgAppError, "Item Object Creation Error in: %s %d",__FILE__,__LINE__); return (DBFault); } gridValueFLD->Int (itemRec,value); gridSymbolFLD->Record (itemRec,symRec); } value = itemRec->RowID (); switch (valueSize) { case sizeof (DBByte): *((DBByte *) ((char *) dataRec->Data () + i * valueSize)) = value; break; case sizeof (DBShort): *((DBShort *) ((char *) dataRec->Data () + i * valueSize)) = value; break; case sizeof (DBInt): *((DBInt *) ((char *) dataRec->Data () + i * valueSize)) = value; break; default: CMmsgPrint (CMmsgAppError, "Wrong Data Size in: %s %d",__FILE__,__LINE__); return (DBFault); } } } itemTable->ListSort (gridValueFLD); for (dataRec = (data->Arrays ())->First ();dataRec != (DBObjRecord *) NULL;dataRec = (data->Arrays ())->Next ()) { for (i = 0;i < ColNum () * RowNum ();++i) { switch (valueSize) { case sizeof (DBByte): value = (DBInt) (*((DBByte *) ((char *) dataRec->Data () + i * valueSize))); break; case sizeof (DBShort): value = (DBInt) (*((DBShort *) ((char *) dataRec->Data () + i * valueSize))); break; case sizeof (DBInt): value = (DBInt) (*((DBInt *) ((char *) dataRec->Data () + i * valueSize))); break; default: CMmsgPrint (CMmsgAppError, "Wrong Data Size in: %s %d",__FILE__,__LINE__); return (DBFault); } itemRec = itemTable->Item (value); value = itemRec->ListPos (); switch (valueSize) { case sizeof (DBByte): *((DBByte *) ((char *) dataRec->Data () + i * valueSize)) = value; break; case sizeof (DBShort): *((DBShort *) ((char *) dataRec->Data () + i * valueSize)) = value; break; case sizeof (DBInt): *((DBInt *) ((char *) dataRec->Data () + i * valueSize)) = value; break; default: CMmsgPrint (CMmsgAppError, "Wrong Data Size in: %s %d",__FILE__,__LINE__); return (DBFault); } } } itemTable->ItemSort (); gridIF = new DBGridIF (data); gridIF->DiscreteStats (); delete gridIF; } break; case DBTypeGridContinuous: { DBObjTableField *missingValueFLD = itemTable->Field (DBrNMissingValue); for (dataRec = (data->Arrays ())->First ();dataRec != (DBObjRecord *) NULL;dataRec = (data->Arrays ())->Next ()) { itemTable->Add (dataRec->Name ()); missingValueFLD->Float (itemTable->Item (),MissingValue ()); } gridIF = new DBGridIF (data); gridIF->RecalcStats (); delete gridIF; data->Flags (DBDataFlagDispModeContBlueRed,DBSet); break; } default: break; } return (DBSuccess); }