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