Zum Hauptinhalt springen

Info Filter auf Layer

Ein Beispiel für eine Funktion, die über ein Ribbon bereitgestellt wird.

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.

Beispiel:

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.

Hierfür 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, dass 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.

Die folgenden Parameter müssten angepasst werden:

  • 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 welchem die Funktion aufgerufen werden kann.

Ribbon - Button Skript hinzufügen