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
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.
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

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.
