1. Home
  2. MapEdit Desktop
  3. MapEdit Desktop API
  4. API Skript Info Filter auf Layer

API Skript Info Filter auf Layer

Das Beispiel wurde mit MapEdit Desktop Version 8.3.43 und 9.1.301 getestet. In der Regel können diese Beispiele auch mit neueren Versionen verwendet werden, wir übernehmen aber keine Garantie hierfür und keinen Support.

Ausgangssituation

Wenn man in MapEdit die Info Funktion ausführt wird unabhängig von den eingestellten Layern/Karten in der Datenbank räumlich nach den Objekten in einer Objektklasse oder View gesucht.

In der Kartenverwaltung kann man für eine Objektklasse / View unterschiedliche Karten einfügen. Hier kann auch ein Kartenfilter angegeben werden, der ist aber nicht dynamisch.

Eine Tabelle / Objektklasse in der Datenbank mit der Geometrie der Räumen. Diese Tabelle enthält alle Räume eines Gebäudes u.a. mit der Information auf welchem Stockwerk diese liegen.

Mehrere Karten, jeweils eine pro Stockwerk / Etage mit allen Räumen werden angezeigt.

Der Anwender kann in der MapEdit Kartenverwaltung die Stockwerke einschalten welche er sehen möchte. Über diese Funktion wird ihm dann der in der Karte gewählte Raum des Stockwerks / Etage angezeigt.

Dazu muss ein API Skript erstellt werden. Hier ein Beispielcode:

public partial class ClientPlugIn

        Public Sub EtagenInfo(parameter As String)

            Dim layerFilterList As New Dictionary(Of String, String)
            Dim Item as KeyValuePair(Of String, String) 
            Dim connectionName As String
            Dim tableName As String
            Dim cn As Connection
            Dim schema As DbSchemaDefinition
            Dim table As DbTableDefinition
            Dim foundFilter As String

            connectionName = "FACILITY" 
            tableName = "RAUM" 

            layerFilterList.Add("Facility\1.UG", "ID_NUMMER=3")
            layerFilterList.Add("Facility\EG", "ID_NUMMER=4")
            layerFilterList.Add("Facility\1. OG", "ID_NUMMER=5")
            layerFilterList.Add("Facility\2. OG", "ID_NUMMER=6")
           
            foundFilter = "" 
            For Each item In layerFilterList
                If Me.Project.Map.IsLayerVisible(item.Key.Split("\")) Then
                    foundFilter = item.Value
                    Exit For
                End If
            Next

   foundFilter = "FID in  (select FID from RAUM where " &foundFilter &")"
XMsgBox.ShowDialog(foundFilter)

            If foundFilter.Length = 0 Then
                XMsgBox.ShowDialog("Kein Etagen Layer an")
            Else
                cn = Me.Project.DataConnections.GetConnectionByName(connectionName)
                schema = ConnectionUtils.GetSchema(cn)
                table = schema.Tables("RAUM")
                Me.Project.Map.SelectFeatures(cn, table, Me.Project.Map.SelectionMode, foundFilter, AddressOf Me.SelectionCompleted)
            End If

        End Sub

        Public Sub SelectionCompleted(args As Mum.Geo.Map.SelectFeaturesResultArgs)

            If args.Succeeded Then
                If args.SelectFeatureInfos.Count > 0 Then
                    Dim info = args.SelectFeatureInfos(0)
                    Me.Project.Forms.ShowFormAsync(info.Connection.Name + "." + info.Table.Name, info.Filter)
                    Return
                End If
            End If

            XMsgBox.ShowDialog("Kein Feature gefunden")

        End Sub

End Class

Das Skript dient nur als Beispiel und muss für die Verwendung angepasst werden. Wir empfehlen das sie hierzu Ihren Mensch und Maschine Berater kontaktieren sofern sie dies das erste mal machen, oder keine Erfahrung mit der API / Skripting Umgebung von MapEdit haben.

Dies hier anpassen:

  • connectionName = „FACILITY“ (Datenbankverbindungsnamen)
  • tableName = „RAUM“ (Tabellennamen)
  • layerFilterList.Add(„Facility\EG„, „ID_NUMMER=4“)

Bei layerFilterList.Add steht muss je Layer/Karte eine Zeile rein. Der Layername und der Filter für diesen Layer bzw. auf die Tabelle.

Wenn der Layername nicht genau so geschrieben wird wie es im Baum angezeigt wird funktioniert es nicht. Bitte die Gross/Kleinschreibung beachten und Leerzeichen genau so wie im Baum. Alle Gruppen in der Kartenverwaltung mit „\“ trennen.

Der Code prüft alle Layer die in layerFilterList.Add aufgelistet sind durch. Sobald er den ersten Layer findet der eingeschaltet ist dann nimmt er den Filter der dem Layer zugeordnet ist.

Es muss dann noch für API / Skripting im Register „Options“ noch folgendes eingetragen werden:

Imports System
Imports System.Collections.Generic
API Skripting Options

Nicht vergessen dann alles zu kompilieren und zu speichern.

In der Ribbon Verwaltung muss dann noch ein Button eingefügt werden mit dem die Funktion aufgerufen werden kann.

Ribbon – Button Skript hinzufügen
Updated on Dezember 19, 2019