If you can stand one more update, and the inevitable code bloat that comes with feature creep, here is another version that also includes the ability to write grid files: ' ***************************************************************************** ' Copyright (c) 2000, MAPINFO CORPORATION ' All rights reserved. ' ' $Workfile: GridInfo.mb $ ' $Revision: 2.0 $ ' $Author: DRESSEL $ ' $Date: June 7 2000 16:14:56 $ ' ' Module Description: ' ' MapBasic program to retrieve grid info and create new grid files. ' ' Revision History: ' ' Rev 1.0 May 22 2000 16:14:56 DRESSEL ' Rev 1.1 June 6 2000 13:30:00 DRESSEL ' Check for minimum version of MapInfo Professional (5.5) ' Add support for Northwood's NWGRD30.GHL grid handler ' Fix bug with button help message ' Fix typo refering to 'rotatesymbols' ' Rev 2.0 June 7 2000 13:30:00 DRESSEL ' Add ability to create grids ' ***************************************************************************** Include "MapBasic.def" Include "Menu.def" Include "Icons.def" ' ******************************************************************************** 'Define constants ' ******************************************************************************** Define AppVersion 2.0 Define ID_EDIT_TEXT_FILENAME 601 Define ID_EDIT_TEXT_ROWS 602 Define ID_EDIT_TEXT_COLS 603 Define ID_EDIT_TEXT_MIN 604 Define ID_EDIT_TEXT_MAX 605 Define _MAX_PATH 260 ' max. length of full pathname (from stdlib.h) Define GE_GRIDINFO_MAGIC_NUMBER 13124 '0x3344 (from gridtypes.h) Define GE_GRIDINFO_INVALID 43690 '0xaaaa Define GE_GRIDTYPE_CONTINUOUS 1 Define GE_GRIDTYPE_CLASSIFIED 2 Define GE_MAX_INFLECTIONS 255 Define GE_COLOR Integer 'convert to MapBasic Define GE_HGRID Integer ' ******************************************************************************** 'Define variable types (structures) ' ******************************************************************************** Type GE_COLORINFLECTIONS '(from gridtypes.h) sNumInflections As SmallInt alignmentfiller(3) As SmallInt 'meet 8-byte alignment for following floats adValue(GE_MAX_INFLECTIONS) As FLoat ' because GE_GRIDTYPE_CONTINUOUS aColor(GE_MAX_INFLECTIONS) As GE_COLOR End Type Type GE_GRID_INFO '(from gridtypes.h) lMagic As Integer ' to check validity lWidth As Integer ' number of columns in grid lLength As Integer ' number of rows in grid ptchCoordSys As String ' coordsys description dMinXVal As Float ' min X coord dMaxXVal As Float ' max X coord dMinYVal As Float ' min Y coord dMaxYVal As Float ' max Y coord End Type ' ******************************************************************************** 'Declare external functions (all in MIGrid.DLL) 'Note: All MapBasic funtion variables are passed by reference unless ' explicitly defined to be passed directly with the 'ByVal' key word. ' ******************************************************************************** Declare Function GE_GetDefaultWriteHandler Lib "Migrid.dll" ( ByVal sGridType As SmallInt, ptchHandlerName As String) As Logical Declare Function GE_CreateContinuousGrid Lib "Migrid.dll" ( ptchHandlerName As String, ptchFilename As String, pInflections As GE_COLORINFLECTIONS, ByVal uchIsNullTransparent As SmallInt, clrNull As GE_COLOR, pGridInfo As GE_GRID_INFO, ByVal dMinVal As Float, ByVal dMaxVal As FLoat, phGrid As GE_HGRID) As Logical Declare Function GE_WriteContinuousValue Lib "Migrid.dll" ( ByVal hGrid As GE_HGRID, ByVal lCol As Integer, ByVal lRow As Integer, ByVal dValue As Float) As Logical Declare Function GE_CloseContinuousGrid Lib "Migrid.dll" ( phGrid As GE_HGRID) As Logical Declare Function GE_OpenGrid Lib "Migrid.dll" ( lpszFilename As String, ByVal lCacheSize As Integer, hGrid As Integer) As Logical Declare Function GE_GetCoordSysInfo Lib "Migrid.dll" ( ByVal hGrid As Integer, ptchCoordSys As String, pdMinXVal As Float, pdMinYVal As Float, pdMaxXVal As Float, pdMaxYVal As Float) As Logical Declare Function GE_GetContinuousMinMax Lib "Migrid.dll" ( ByVal hGrid As Integer, pdMinZVal As Float, pdMaxZVal As Float) As Logical Declare Function GE_GetDimensions Lib "Migrid.dll" ( ByVal hGrid As Integer, plWidth As Integer, plHeight As Integer) As Logical Declare Function GE_StartRead Lib "Migrid.dll" ( ByVal hGrid As Integer) As Logical Declare Function GE_GetContinuousValue Lib "Migrid.dll" ( ByVal hGrid As Integer, ByVal lCol As Integer, ByVal lRow As Integer, pdValue As Float, puchIsNull As SmallInt) As Logical Declare Function GE_EndRead Lib "Migrid.dll" ( ByVal hGrid As Integer) As Logical Declare Function GE_CloseGrid Lib "Migrid.dll" ( hGrid As Integer) As Logical ' ******************************************************************************** 'Declare Local Functions ' ******************************************************************************** Declare Sub Main Declare Sub GridInfoToolHandler Declare Sub CreateGrid Declare Function CreateGridDialog() As Logical Declare Sub BrowseButtonHandler Declare Sub OKButtonHandler Declare Sub About Declare Sub GoodBye ' ******************************************************************************** 'Global Variables ' ******************************************************************************** Global gsPath, szGridFilename As String Global lOpenAndMap, lRunSilent As Logical Global iRows, iCols As Integer Global fMin, fMax As Float ' ******************************************************************************** ' ******************************************************************************** 'Sub Main ' ******************************************************************************** ' ******************************************************************************** Sub Main OnError Goto HandleError If SystemInfo(SYS_INFO_MIVERSION) < 550 Then Note "This utility depends on the Grid Engine API of " + "MapInfo Professional version 5.5 or higher to run." Exit Sub End If Create Menu "&Grid Info" As "&Create Grid..." Calling CreateGrid, "&About Grid Info..." Calling About, "E&xit Grid Info" Calling Goodbye Alter Menu "Tools" Add "&Grid Info" As "&Grid Info" Alter ButtonPad "Tools" Add Separator ToolButton Calling GridInfoToolHandler Icon MI_ICON_INFO Cursor MI_CURSOR_CROSSHAIR DrawMode DM_CUSTOM_POINT HelpMsg "Retrieve value from grid cell.\nRetrieve grid value" Show lOpenAndMap = TRUE lRunSilent = FALSE iRows = 10 iCols = 10 fMax = 10.0 fMin = 0.0 Exit Sub HandleError: Note "Main: " + Error$() Resume Next End Sub ' ******************************************************************************** ' ******************************************************************************** ' Sub GridInfoToolHandler ' ******************************************************************************** ' ******************************************************************************** Sub GridInfoToolHandler OnError Goto HandleError Dim sCmd As String Dim i As SmallInt Dim lVerbose As Logical Dim x, y As Float Dim MapWindowID As Integer Dim lReturn As Logical Dim hGrid As Integer Dim sPath As String Dim ptchCoordSys As String Dim pdMinXVal, pdMinYVal, pdMaxXVal, pdMaxYVal As Float Dim pdMinZVal, pdMaxZVal As Float Dim plWidth, plHeight As Integer Dim lCol, lRow As Integer Dim pdValue As Float Dim puchIsNull As SmallInt ' ******************************************************************************** 'Get map window and layer ' ******************************************************************************** MapWindowID = FrontWindow() If WindowInfo( MapWindowID, WIN_INFO_TYPE) <> WIN_MAPPER Then Note "Click in a map window." Exit Sub End If For i = 1 To MapperInfo(MapWindowID, MAPPER_INFO_LAYERS) If LayerInfo(MapWindowID, i, LAYER_INFO_TYPE) = LAYER_INFO_TYPE_GRID Then sPath = LayerInfo(MapWindowID, i, LAYER_INFO_PATH) Exit For End If Next ' ******************************************************************************** 'Get Grid file name ' ******************************************************************************** sPath = Left$(sPath, Len(sPath)-3) + "MIG" If Not FileExists(sPath) Then If FileExists(ProgramDirectory$() + "Nwgrd30.ghl") Then sPath = Left$(sPath, Len(sPath)-3) + "GRD" End If End If If Not FileExists(sPath) Then Note "Cannot find grid file " + sPath Exit Sub End If If sPath <> gsPath Then gsPath = sPath lVerbose = TRUE Else lVerbose = FALSE End If ' ******************************************************************************** 'set MapBasic coordinate system to match map window coordinate system ' ******************************************************************************** sCmd = "Set " + MapperInfo(MapWindowID, MAPPER_INFO_COORDSYS_CLAUSE_WITH_BOUNDS) Run Command sCmd ' ******************************************************************************** 'Get coordinates of cursor location ' ******************************************************************************** x = CommandInfo(CMD_INFO_X) y = CommandInfo(CMD_INFO_Y) Print "X = " + x + ", Y = " + y ' ******************************************************************************** 'Open grid file ' ******************************************************************************** lReturn = GE_OpenGrid(sPath, 1024, hGrid) If Not lReturn Then Note "Open " + sPath + " failed" Exit Sub End If If hGrid = 0 Then Note "Open " + sPath + " failed: grid handle = 0" Exit Sub End If If lVerbose Then Print " Opened " + sPath + " with handle " + hGrid End If ' ******************************************************************************** 'Get grid coordinate system information (especially min and max coordinates) ' ******************************************************************************** ptchCoordSys = Space$(255) 'Initialize to allocate actually memory. lReturn = GE_GetCoordSysInfo(hGrid, ptchCoordSys, pdMinXVal, pdMinYVal, pdMaxXVal, pdMaxYVal) If lVerbose Then Print " " + ptchCoordSys Print " MinXVal = " + pdMinXVal + ", MinYVal = " + pdMinYVal + ", MaxXVal = " + pdMaxXVal + ", MaxYVal = " + pdMaxYVal End If ' ******************************************************************************** 'Get minimum and maximum grid values ' ******************************************************************************** lReturn = GE_GetContinuousMinMax(hGrid, pdMinZVal, pdMaxZVal) If lVerbose Then Print " MinZVal = " + pdMinZVal + ", MaxZVal = " + pdMaxZVal End If ' ******************************************************************************** 'Get grid dimensions (rows and columns) ' ******************************************************************************** lReturn = GE_GetDimensions(hGrid, plWidth, plHeight) If lVerbose Then Print " Width = " + plWidth + ", Height = " + plHeight End If ' ******************************************************************************** 'Prepare to read grid ' ******************************************************************************** lReturn = GE_StartRead(hGrid) If lReturn Then ' ******************************************************************************** 'Calculate row and column of cursor location ' ******************************************************************************** lCol = (plWidth * (x - pdMinXVal) / (pdMaxXVal - pdMinXVal)) - .5 lRow = (plHeight - plHeight * (y - pdMinYVal) / (pdMaxYVal - pdMinYVal)) - .5 ' ******************************************************************************** 'Retrieve and display grid value ' ******************************************************************************** lReturn = GE_GetContinuousValue(hGrid, lCol, lRow, pdValue, puchIsNull) If lCol < 0 Or lRow < 0 Or lCol >= plWidth Or lRow >= plHeight Then If pdValue = 0 Then Print " Value at col: " + (lCol+1) + ", row: " + (lRow+1) + " is undefined." Else Print " Value at col: " + (lCol+1) + ", row: " + (lRow+1) + " = " + pdValue + ", but should be undefined." End If Else If puchIsNull Then Print " Value at col: " + (lCol+1) + ", row: " + (lRow+1) + " is NULL." Else Print " Value at col: " + (lCol+1) + ", row: " + (lRow+1) + " = " + pdValue End If End If lReturn = GE_EndRead(hGrid) Else Print " StartRead(" + hGrid + ") failed" End If lReturn = GE_CloseGrid(hGrid) Exit Sub HandleError: Note "GridInfoToolHandler: " + Error$() Resume Next End Sub ' ******************************************************************************** ' ******************************************************************************** 'Sub CreateGrid ' ******************************************************************************** ' ******************************************************************************** Sub CreateGrid OnError Goto HandleError Dim lReturn As Logical Dim atchHandlerName As String Dim hGrid As GE_HGRID Dim Inflections As GE_COLORINFLECTIONS Dim GridInfo As GE_GRID_INFO Dim clrNull As GE_COLOR Dim uchIsNullTransparent As SmallInt Dim r, c, i As Integer Dim dValue As Float ' ******************************************************************************** 'Get default grid handler ' ******************************************************************************** atchHandlerName = Space$(_MAX_PATH) lReturn = GE_GetDefaultWriteHandler(GE_GRIDTYPE_CONTINUOUS, atchHandlerName) print "GetDafulatWriteHandler returned with " + atchHandlerName If Not CreateGridDialog() Then Exit Sub End If ' ******************************************************************************** ' setup the information need for the GE_CreateContinuousGrid() call ' this is a simple color inflection ramping from blue to red ' ******************************************************************************** Inflections.sNumInflections = 2 Inflections.adValue(1) = fMin Inflections.aColor(1) = RGB(0,0,255) Inflections.adValue(2) = fMax Inflections.aColor(2) = RGB(255,0,0) ' ******************************************************************************** ' setup the grid info ' ******************************************************************************** GridInfo.lMagic = GE_GRIDINFO_MAGIC_NUMBER GridInfo.lWidth = iRows GridInfo.lLength = iCols GridInfo.ptchCoordSys = "CoordSys Earth Projection 1, 62" GridInfo.dMinXVal = 1 GridInfo.dMaxXVal = 2 GridInfo.dMinYVal = 1 GridInfo.dMaxYVal = 2 ' ******************************************************************************** ' setup the null cell color/transparency ' ******************************************************************************** clrNull = RGB(0,0,0) uchIsNullTransparent = 1 ' 0=opaque, 1=transparent ' ******************************************************************************** ' create the grid file ' ******************************************************************************** lReturn = GE_CreateContinuousGrid(atchHandlerName, szGridFilename, Inflections, uchIsNullTransparent, clrNull, GridInfo, Inflections.adValue(1), Inflections.adValue(2), hGrid) print " Created Continuous Grid " + szGridFilename ' ******************************************************************************** ' write the grid cells ' ******************************************************************************** For r=0 To GridInfo.lLength-1 For c=0 To GridInfo.lWidth-1 dValue = Inflections.adValue(1) + (Inflections.adValue(2)-Inflections.adValue(1)) * ((r*GridInfo.lWidth+c) / (GridInfo.lLength * GridInfo.lWidth)) If Not lRunSilent Then Print " Row:"+r+" Col:"+c+" Val="+dValue End If lReturn = GE_WriteContinuousValue(hGrid, c, r, dValue) Next Next ' ******************************************************************************** ' close grid file ' ******************************************************************************** lReturn = GE_CloseContinuousGrid(hGrid) print "Continuous Grid Closed" ' ******************************************************************************** ' open grid as table ' ******************************************************************************** If lOpenAndMap Then Register Table TrueFileName$(szGridFileName) Type "GRID" Open Table Left$(szGridFileName, Len(szGridFileName)-4) Map From TableInfo(0, TAB_INFO_NAME) End If Exit Sub HandleError: Note "CreateGrid: " + Error$() Resume Next End Sub ' ******************************************************************************** ' ******************************************************************************** 'Function CreateGridDialog ' ******************************************************************************** ' ******************************************************************************** Function CreateGridDialog() As Logical OnError Goto HandleError Dim sRows, sCols, sMin, sMax As String sRows = Str$(iRows) sCols = Str$(iCols) sMin = Str$(fMin) sMax = Str$(fMax) Dialog Title "Create a new grid file" Control StaticText Title "Grid File Name:" Position 10, 12 Control EditText Value szGridFilename Into szGridFilename ID ID_EDIT_TEXT_FILENAME Position 60, 10 Width 200 Control Button Title "&Browse..." Calling BrowseButtonHandler Position 270, 10 Control StaticText Title "Rows:" Position 10, 32 Control EditText Value sRows Into sRows ID ID_EDIT_TEXT_ROWS Position 40, 30 Control StaticText Title "Columns:" Position 10, 47 Control EditText Value sCols Into sCols ID ID_EDIT_TEXT_COLS Position 40, 45 Control StaticText Title "Minimum value:" Position 143, 32 Control EditText Value sMin Into sMin ID ID_EDIT_TEXT_MIN Position 195, 30 Control StaticText Title "Maximum value:" Position 143, 47 Control EditText Value sMax Into sMax ID ID_EDIT_TEXT_MAX Position 195, 45 Control CheckBox Title "Open and &map new grid" Value lOpenAndMap Into lOpenAndMap Position 10, 65 Control CheckBox Title "Run &silent" Value lRunSilent Into lRunSilent Position 150, 65 Control OKButton Title "&OK" Position 100, 90 Calling OKButtonHandler Control CancelButton Title "&Cancel" Position 150, 90 If CommandInfo(CMD_INFO_DLG_OK) Then iRows = Val(sRows) iCols = Val(sCols) fMin = Val(sMin) fMax = Val(sMax) CreateGridDialog = TRUE Else CreateGridDialog = FALSE End If Exit Function HandleError: Note "CreateGridDialog: " + Error$() Resume Next End Function ' ******************************************************************************** ' ******************************************************************************** ' Sub BrowseButtonHandler ' ******************************************************************************** ' ******************************************************************************** Sub BrowseButtonHandler OnError Goto HandleError szGridFilename = FileSaveAsDlg(PathToDirectory$(TempFileName$("")), "", "MIG", "Specify grid file name") If szGridFileName <> "" Then Alter Control ID_EDIT_TEXT Value szGridFileName End If Exit Sub HandleError: Note "BrowseButtonHandler: " + Error$() Resume Next End Sub ' ******************************************************************************** ' ******************************************************************************** ' Sub OKButtonHandler ' ******************************************************************************** ' ******************************************************************************** Sub OKButtonHandler OnError Goto HandleError Dim sRows, sCols As String Dim i As Integer szGridFilename = ReadControlValue(ID_EDIT_TEXT_FILENAME) If szGridFilename <> "" Then If Right$(UCase$(szGridFilename),4) <> ".MIG" Then i = InStr(1, szGridFilename, ".") If i > 0 Then szGridFilename = Left$(szGridFilename, i-1) End If szGridFilename = szGridFilename + ".MIG" OnError GoTo HandleFileError Open File szGridFilename For Output As #1 Close File #1 OnError Goto HandleError Alter Control ID_EDIT_TEXT_FILENAME Value szGridFilename End If Else Note "Invalid blank grid file name" Dialog Preserve End If sRows = ReadControlValue(ID_EDIT_TEXT_ROWS) sCols = ReadControlValue(ID_EDIT_TEXT_COLS) iRows = Val(sRows) iCols = Val(sCols) If iRows < 1 Or iCols < 1 Then Note "Rows and Columns need to be greater than 0" Dialog Preserve End If Exit Sub HandleFileError: Note "Invalid file name or path: " + szGridFileName Dialog Preserve Exit Sub HandleError: Note "OKButtonHandler: " + Error$() Resume Next End Sub ' ******************************************************************************** ' ******************************************************************************** ' Sub About ' ******************************************************************************** ' ******************************************************************************** Sub About OnError Goto HandleError Dialog Title "About Grid Info (Version " + Str$(AppVersion) + ")" Width 170 Control StaticText Title "To open grid and retrieve value at mouse click," Position 10, 10 Control StaticText Title "select 'i' tool from 'Tools' button pad and" Position 10, 18 Control StaticText Title "click on grid in a map window." Position 10, 26 Control StaticText Title "To create new grid, select 'Create Grid...' menu" Position 10, 42 Control StaticText Title "option from 'Grid Info' menu." Position 10, 50 Control OKButton Title "&OK" Position 70, 75 Exit Sub HandleError: Note "About: " + Error$() Resume Next End Sub ' ******************************************************************************** ' ******************************************************************************** ' Sub GoodBye ' ******************************************************************************** ' ******************************************************************************** Sub GoodBye OnError Goto HandleError End Program Exit Sub HandleError: Note "GoodBye: " + Error$() Resume Next End Sub ' End of File ---------------------------------------------------------------------- To unsubscribe from this list, send e-mail to [EMAIL PROTECTED] and put "unsubscribe MAPINFO-L" in the message body, or contact [EMAIL PROTECTED]