Ir para o conteúdo
PedroSoares

open dialog com erro

Mensagens Recomendadas

PedroSoares    0
PedroSoares

ola preciso de ajuda:

Tenho um botão para abrir uma janela que tem umas funções para calcular raster juntos (+-*\)

 Private mapWin As MapWindow.Interfaces.IMapWin
    Private Sub btnloadmapcalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnloadmapcalc.Click


        Dim MC As MapCalc = New MapCalc(mapWin)
        MC.ShowDialog()
    End Sub

acontece que ao utilizar este botão dá erro na seguinte linha:

For Each lay In mMap.Layers

esta linha está presente no codigo da tal janela para os calculos. esta janela tem uma listbox (listbox3) onde automaticamente deveria quando clico no tal botão a janela abre já com os raster que tenho presente no mapa... mas não acontece isso ;)

estou a utilizar mapwindowgis library

help

Cumprimentos

Pedro

este é o codigo da janela:

Imports System.IO
Imports System.Drawing.Design
Imports System.Windows.Forms.Design
Imports System.Windows.Forms
Imports MapWindow.Interfaces
Imports MapWinGIS

Public Class MapCalc
    'MAP CALCULATOR CODE
    Inherits System.Windows.Forms.Form
    Implements MapWinGIS.ICallback

    
    Public Sub New(ByRef AxMap1 As IMapWin)
        InitializeComponent()
        mMap = AxMap1


        updateGridList()
    End Sub
    Dim mMap As IMapWin

    Dim grdName As New List(Of String)
    Dim grdFileName As New List(Of String)
    Dim grdHn As New List(Of Integer)
    Dim usedGrdHn As New List(Of Integer)
    Dim grdIsFactor As New List(Of Boolean)
    Dim nUsedGrd As Integer
    Dim pre As String
    Dim formulaContainsGrids As Boolean = False


    Public Sub myError(ByVal KeyOfSender As String, ByVal ErrorMsg As String) Implements MapWinGIS.ICallback.Error
    End Sub

    Public Sub Progress(ByVal KeyOfSender As String, ByVal Percent As Integer, ByVal Message As String) Implements MapWinGIS.ICallback.Progress

        ToolStripProgressBar1.Value = Percent
        ToolStripStatus.Text = Message
    End Sub



    Private Sub updateGridList()

        formulaContainsGrids = False
        Me.ListBox3.Items.Clear()
        grdName.Clear()
        grdFileName.Clear()
        grdHn.Clear()
        usedGrdHn.Clear()

        Dim lay As Layer
        For Each lay In mMap.Layers
            If (lay.LayerType = eLayerType.Grid) Then
                grdName.Add(lay.Name)
                grdFileName.Add(lay.FileName)
                grdHn.Add(lay.Handle)
                usedGrdHn.Add(-1)
                'put layer name on mask
                Me.ListBox3.Items.Add(lay.Name)
            End If
        Next
    End Sub



    Private Sub addStringInFormula(ByVal s As String)
        Dim formulaTxt As String
        Dim beforeS As String = ""
        Dim afterS As String = ""
        formulaTxt = Me.TextBox3.Text

        If (Me.TextBox3.SelectionLength > 0) Then
            beforeS = formulaTxt.Substring(0, Me.TextBox3.SelectionStart)
            afterS = formulaTxt.Substring(Me.TextBox3.SelectionStart + Me.TextBox3.SelectionLength)
            formulaTxt = beforeS + s + afterS
        Else
            formulaTxt = formulaTxt + " " + s
        End If

        Me.TextBox3.Text = formulaTxt

    End Sub

    Private Function preParseFormula(ByVal formula As String) As String
        'this function replace the name of the grid layer with standard name whitout spaces
        Dim newFormula As String = formula
        Dim tName As String
        Dim flg As Boolean
        Dim i, j As Integer
        For Each tName In grdName
            flg = newFormula.Contains("[" + tName + "]")
            If (flg) Then
                usedGrdHn.Item(i) = j
                newFormula = newFormula.Replace("[" + tName + "]", pre & i)
                j = j + 1
                formulaContainsGrids = True
            End If
            i = i + 1
        Next

        'update number of used grids
        nUsedGrd = j

        Return newFormula
    End Function

    'Public Sub New(ByRef _mapwin As IMapWin)

    '    InitializeComponent()
    '    mMap = AxMap1


    '    updateGridList()

    'End Sub


    'add grid from list box
    Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim name As String = ListBox3.Text
        addStringInFormula("[" + name + "]")
    End Sub

    'add control from list
    Private Sub ListBox2_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim op As String = ListBox4.Text
        addStringInFormula(op)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim sfd As New SaveFileDialog
        Dim grd As New Grid
        sfd.Filter = grd.CdlgFilter
        sfd.ShowDialog()
        Me.TextBox4.Text = sfd.FileName
    End Sub


    Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        'get formula
        Dim formula As String = Me.TextBox3.Text

        If formula = "" Then Exit Sub

        formula = preParseFormula(formula)
        Dim fParser As New clsMathParser
        fParser.StoreExpression(formula)

        If formulaContainsGrids Then
            'get information about grid and compare header
            Dim g As Integer
            Dim isFirst As Boolean = True
            Dim firstG As New Grid
            Dim flg As Boolean
            For g = 0 To grdName.Count - 1
                If usedGrdHn.Item(g) > -1 Then
                    If isFirst Then
                        firstG = mMap.Layers(grdHn.Item(g)).GetGridObject
                        isFirst = False
                    End If
                    flg = compareHeader(firstG.Header, mMap.Layers(grdHn.Item(g)).GetGridObject.Header)
                    If (flg = False) Then
                        MapWinUtility.Logger.Msg("One or more grids used in the formula have different spatial references!", MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Error")
                        Exit Sub
                    End If

                End If
            Next

            'initialize 3D matrix
            Dim nrows, ncols As Integer
            nrows = firstG.Header.NumberRows
            ncols = firstG.Header.NumberCols
            Dim data As Single(,,)
            ReDim data(nUsedGrd - 1, nrows - 1, ncols - 1)
            Dim res As Single(,)
            ReDim res(nrows - 1, ncols - 1)
            Dim nodata As Single()
            ReDim nodata(nUsedGrd - 1)

            'load data from grid
            Dim x As Integer = 0
            For g = 0 To grdName.Count - 1
                If usedGrdHn.Item(g) > -1 Then
                    mMap.Layers(grdHn.Item(g)).GetGridObject.GetFloatWindow(0, nrows - 1, 0, ncols - 1, data(x, 0, 0))
                    nodata(x) = mMap.Layers(grdHn.Item(g)).GetGridObject.Header.NodataValue
                    x = x + 1
                End If
            Next
            'loop into the matrix and perfom calculation
            'list of element handle
            Dim hn As New List(Of Integer)
            Dim f As Integer
            For f = 1 To fParser.VarTop
                x = CType(fParser.VarName(f).Replace(pre, ""), Integer)
                hn.Add(usedGrdHn.Item(x))
            Next

            Dim r, c As Integer
            Dim val As Double
            Dim isND As Boolean
            For r = 0 To nrows - 1
                For c = 0 To ncols - 1
                    isND = False
                    For f = 0 To fParser.VarTop - 1
                        val = data(hn.Item(f), r, c)
                        If (val = nodata(hn.Item(f))) Then
                            isND = True
                            Exit For
                        Else
                            fParser.VarValue(f + 1) = val
                        End If

                    Next
                    If isND = False Then
                        res(r, c) = fParser.Eval()

                    Else
                        res(r, c) = firstG.Header.NodataValue
                    End If
                Next

            Next

            If fParser.ErrorDescription <> "" Then
                MapWinUtility.Logger.Msg(fParser.ErrorDescription, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Error")
                Exit Sub
            End If

            'create a new grid object and save it on the disk
            Dim resGrd As New Grid
            resGrd.CreateNew(Me.TextBox4.Text, firstG.Header, GridDataType.FloatDataType, firstG.Header.NodataValue)
            resGrd.PutFloatWindow(0, nrows - 1, 0, ncols - 1, res(0, 0))
            resGrd.Save(Me.TextBox4.Text, GridFileType.UseExtension, Me)
            resGrd.Close()

            'load new grid and update list
            If Me.CheckBox2.Checked Then mMap.Layers.Add(Me.TextBox2.Text)

        Else
            MapWinUtility.Logger.Msg("Result is: " + fParser.Eval().ToString, MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "GISAPP5 Calculator")
        End If



    End Sub

    Private Function compareHeader(ByRef first As GridHeader, ByRef second As GridHeader) As Boolean
        If first.NumberCols <> second.NumberCols Then Return False
        If first.NumberRows <> second.NumberRows Then Return False
        If first.Projection <> second.Projection Then Return False
        If first.XllCenter <> second.XllCenter Then Return False
        If first.YllCenter <> second.YllCenter Then Return False
        If first.dX <> second.dX Then Return False
        If first.dY <> second.dY Then Return False
        Return True
    End Function





End Class

EDIT: Geshi adicionado

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

Antes de eu sequer olhar para isso, edita o post e coloca-lhe as devidas tags nos códigos. Utiliza o GeSHi correctamente: [ code=vbnet ]

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

O erro é o seguinte:

Nullreferenceexception was unhandled

Object reference not set to an instance of an object.

já tentei de tudo ao meu alcance... mas admito que sou um beginner em programação daí que de certeza não tentei tudo...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

sim creio que sim (este creio è devido à inexperiencia)

algures nas minhas tentativas consegui ver que o valor era nothing.

de que forma consigo contornar a questão?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Caça    24
Caça

Essa variável tem de ir com valor, podes coloca antes por exemplo

If mapWin Is Nothing Then mapWin = New Nome_de_uma_classe_que_herde_de_IMapWin

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

lá está... não entendi bem o que devo fazer mas tentei o seguinte:

  Private mapWin As MapWindow.Interfaces.IMapWin
    Private Sub btnloadmapcalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnloadmapcalc.Click
       

        Dim MC As MapCalc = New MapCalc(mapWin)
        If mapWin Is Nothing Then mapWin = New AxMap
        MC.ShowDialog()
    End Sub

contudo dá o mesmo  erro na mesma linha

EDIT: Geshi adicionado

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Caça    24
Caça

Era na linha anterior, assim

  Private mapWin As MapWindow.Interfaces.IMapWin
    Private Sub btnloadmapcalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnloadmapcalc.Click
       
        If mapWin Is Nothing Then mapWin = New AxMap
        Dim MC As MapCalc = New MapCalc(mapWin)
        MC.ShowDialog()
    End Sub

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

tenho receio que não esteja a segui bem as tuas instruções.  :)

fiz como disseste e dá erro neste ponto:

If mapWin Is Nothing Then mapWin = New AxMap

esxactamente no axmap

invalidcastexception was unhandled

Unable to cast object of type 'AxMapWinGIS.AxMap' to type 'MapWindow.Interfaces.IMapWin'.

receio que o problema seja a class que tenho de criar herdada do IMapWin... não sei o que criar/fazer

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Caça    24
Caça

Não deves ter de criar classe nenhuma apenas deves indicar uma classe presente nessa API que implemente essa interface, procura ai no Object Browser(F2).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

cliquei o F2 , encontrei o imapwin, e aparece-me uma listagem de elementos numa listbox à direita... tenho de seleccionar algo daqui? se sim o que será?

desculpa mas é que não sei mesmo...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

tentei o que disseste mas mapwin não dá...

fiz um search no codigo neste form - por o imapwin e não encontrei nada,... mas nem sei se isto resolveria...

queria colocar um printscreen mas não sei daí que resolvi mostrar o codigo todo que está neste form (form 1) a window de calculo é o Form2. espero que esteja a fazer isto correctamente

Imports System.IO
Imports System.Drawing.Design
Imports System.Windows.Forms.Design
Imports System.Windows.Forms
Imports MapWindow.Interfaces
Imports MapWinGIS


Public Class Form1
    Inherits System.Windows.Forms.Form
    Implements MapWinGIS.ICallback

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Legend1.Map = AxMap1.GetOcx()
    End Sub

    Private Sub AxMap1_MouseDownEvent(ByVal sender As System.Object, ByVal e As AxMapWinGIS._DMapEvents_MouseDownEvent) Handles AxMap1.MouseDownEvent

    End Sub



    '---------------------------------------------------------------------------------------------------------
    'BUTTONS CODE


    Private Sub btnZoomout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZoomout.Click
        'Zoom out
        AxMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomOut
    End Sub

    Private Sub pan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pan.Click
        'Pan
        AxMap1.CursorMode = MapWinGIS.tkCursorMode.cmPan
    End Sub

    Private Sub btnZoomin_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZoomin.Click
        'Zoom in
        AxMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomIn
    End Sub

    Private Sub btnZoomextent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZoomextent.Click
        'Zoom to full extent
        AxMap1.ZoomToMaxExtents()
    End Sub



    Private Sub btnZoomtolayer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZoomtolayer.Click
        
        'Zoom to the selected layer 
        Dim hndl As Integer = AxMap1.NumLayers - 1
        ' get the shapefile object from the layer handle,
        AxMap1.ZoomToLayer(hndl)

        
    End Sub

    Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click
        Legend1.Refresh()
        AxMap1.Redraw()
    End Sub


    
    Private MapWin As MapWindow.Interfaces.IMapWin
    Private Sub btnloadmapcalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnloadmapcalc.Click
       
        If MapWin Is Nothing Then MapWin = New IMapWin
        Dim MC As MapCalc = New MapCalc(mapWin)

        MC.ShowDialog()
    End Sub





    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    'MAIN MENU CODE
  

    Private Sub OpenfileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenVectorToolStripMenuItem.Click
        Dim openFD As New OpenFileDialog
        Dim hndl As Integer
        Dim shapefile As New MapWinGIS.Shapefile

        'initialize dialog (Filters allow only shp files to show when Open window appears)
        If OpenFileDialogSHP.ShowDialog(Me) = DialogResult.OK Then

            If openFD.CheckFileExists Then

                'open the shapefile
                shapefile.Open(OpenFileDialogSHP.FileName)
                'add the layer to the map
                hndl = Legend1.Layers.Add(shapefile, True)
                'get filename to legend
                Legend1.Map.LayerName(hndl) = System.IO.Path.GetFileNameWithoutExtension(shapefile.Filename)

                ''set legend icon
                'Dim LayTy As LayerTypes

                'Select Case LayTy
                '    Case LayerTypes.LineLayer
                '        Legend1.Layers.ItemByHandle(hndl).Type = MapWindow.Interfaces.eLayerType.LineShapefile
                '    Case LayerTypes.PointLayer
                '        Legend1.Layers.ItemByHandle(hndl).Type = MapWindow.Interfaces.eLayerType.PointShapefile
                '    Case LayerTypes.PolygonLayer
                '        Legend1.Layers.ItemByHandle(hndl).Type = MapWindow.Interfaces.eLayerType.PolygonShapefile
                'End Select

            End If

        End If

    End Sub



    Private Sub RemoveLayerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveLayerToolStripMenuItem.Click
        Legend1.Layers.Remove(Legend1.SelectedLayer)
        Legend1.Refresh()
    End Sub



    Private Sub OpenRasterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenRasterToolStripMenuItem.Click

        Dim dresult As Windows.Forms.DialogResult
        Dim dlgOpen As New OpenFileDialog
        Dim Grid As New MapWinGIS.Grid
        Dim GridHeader As New MapWinGIS.GridHeader
        Dim hndl As Integer
        Dim GridFile As String

        'Filters allow only raster files to show when Open window appears
        dlgOpen.Filter = Grid.CdlgFilter
        dresult = dlgOpen.ShowDialog()

        If dresult = Windows.Forms.DialogResult.Cancel Then
            Exit Sub
        Else

            GridFile = dlgOpen.FileName
            Grid.Open(GridFile)

            Dim colorscheme As New MapWinGIS.GridColorScheme
            colorscheme.UsePredefined(Grid.Minimum, Grid.Maximum)
            Dim utl As New MapWinGIS.Utils
            Dim gridimage As MapWinGIS.Image = utl.GridToImage(Grid, colorscheme)

            'add the image to the legend and map 
            hndl = Legend1.Layers.Add(gridimage, True)
            If Legend1.Layers.IsValidHandle(hndl) Then

                'set the layer name 
                Legend1.Map.LayerName(hndl) = System.IO.Path.GetFileNameWithoutExtension(Grid.Filename)

                'set the legend layer type icon 
                Legend1.Layers.ItemByHandle(hndl).Type = MapWindow.Interfaces.eLayerType.Grid

                'set coloring scheme 
                AxMap1.SetImageLayerColorScheme(Legend1.SelectedLayer, colorscheme)
                Legend1.Layers.ItemByHandle(Legend1.SelectedLayer).Refresh()

            End If




        End If

    End Sub


    Private Sub TableToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TableToolStripMenuItem.Click
        Dim Shp As New MapWinGIS.Shapefile
        Dim hndl As Integer = AxMap1.NumLayers - 1 ' this is the handle of the layer you want to work with
        ' get the shapefile object from the layer handle,

        Shp = AxMap1.get_GetObject(hndl)

        Dim myTableForm As New Formtable(Shp)
        myTableForm.ShowDialog()
    End Sub



    Public Sub myError(ByVal KeyOfSender As String, ByVal ErrorMsg As String) Implements MapWinGIS.ICallback.Error
    End Sub

    Public Sub Progress(ByVal KeyOfSender As String, ByVal Percent As Integer, ByVal Message As String) Implements MapWinGIS.ICallback.Progress

        ToolStripProgressBar1.Value = Percent
        stbStatusBar.Text = Message
    End Sub



    '------------------------------------------------------------------------------------------------------------
    'LEGEND CODE & LAYER PROPERTIES



    Private Sub Legend1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Legend1.Load
    End Sub

    Private Sub Legend_LayerDoubleClick(ByVal Handle As Integer) Handles Legend1.LayerDoubleClick

        Dim frmProps As New frmProperties
        Dim LayerType As LayerTypes
        Dim hndRaster As Integer
        Dim hndPoly As Integer
        Dim hndline As Integer
        Dim hndpoint As Integer

        frmProps.mainform = Me
        'double click.  Open layer properties window to determine the type of layer based on which layer handle was returned from the legend. Then set up the properties form accordingly
        Select Case Handle
            Case hndPoly
                LayerType = LayerTypes.PolygonLayer
            Case hndline
                LayerType = LayerTypes.LineLayer
            Case hndpoint
                LayerType = LayerTypes.PointLayer
            Case hndRaster
                LayerType = LayerTypes.RasterLayer
        End Select
        If frmProps.SetUpForm(Handle, LayerType) = True Then
            frmProps.ShowDialog(Me)
        End If

    End Sub

    
End Class








Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

tentei isto:

Private Sub btnloadmapcalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnloadmapcalc.Click
       
        If MapWin Is Nothing Then MapWin = New MapWinGIS.Map
        Dim MC As MapCalc = New MapCalc(mapWin)

        MC.ShowDialog()
    End Sub

só dá erro no runtime neste parte do codigo - New MapWinGIS.Map

e o erro é seguinte:

invalidcastexception was unhandled

Unable to cast COM object of type 'MapWinGIS.MapClass' to interface type 'MapWindow.Interfaces.IMapWin'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{EFBB92A1-A50B-3093-967B-10FBAB136B6E}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

olá

estive fora.

procurei resolver isto... mas continuo sem nada adiantado. parece-me que o form precisa implementar MapWindow.Interfaces.IMapWin mas eu não sei fazer isso.

tou a desesperar

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PedroSoares    0
PedroSoares

ler a documentação fui o que eu fiz. até algumas das ferramentas que implementei tirei dos exemplos dados.

Mas este caso em particular eu não descobri a solução (sim sou novato estou a aprender e espero consegui-lo) daí que recorra também ao forum para me ajudarem a aprender. acredita que à dois meses atrás não sabia nada de programação e hoje tenho uma app criada com muitas funções (que até podem ser básicas para muitos mas para mim ao  nivel basico são bastante avançadas).

Só peço mesmo para me explicarem em detalhe o que se faz nesta situação.

cumprimentos

P

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade