Ich habe eine Python-Add-In-Schaltfläche erstellt, die den Workflow meiner Mitarbeiter beschleunigt, indem ein Feature-Class-Attribut in ein anderes kopiert wird. Es verwendet die Funktion arcpy.UpdateCursor, um eine Zeile in der Ziel-Feature-Class zu aktualisieren. Wie es jetzt existiert, kann dieses Schaltflächenskript unabhängig vom Bearbeitungsmodus ausgeführt werden. Natürlich kann der Benutzer beim Ausführen in einer Bearbeitungssitzung die Bearbeitung beenden und keine Änderungen speichern. Dies ist jedoch nicht der Fall, wenn das Skript außerhalb einer Bearbeitungssitzung ausgeführt wird.
Wie kann ich dem Skript eine Prüfung hinzufügen, die die Ausführung des Skripts verhindert, wenn sich ArcMap derzeit nicht in einer Bearbeitungssitzung befindet?
Dies betrifft ArcMap 10 und 10.1
Ich möchte auch mit anderen ArcMap-Benutzern überprüfen, ob Aktualisierungen von Tabellen normalerweise nicht zulässig sind, ohne sich in einer Bearbeitungssitzung zu befinden.
Wie läuft dieses Skript außerhalb einer Bearbeitungssitzung?
Dieses Skript wirft auch eine andere Frage zu der scheinbar zufälligen Auswahlreihenfolge auf, die ArcMap ausführt und die zufällig für mich funktioniert, wenn ich die Tabelle der zweiten Feature-Class aus einer Liste aktualisiere, aber das ist für einen anderen Tag.
Hier ist das Skript, wie es jetzt funktioniert (ohne Implementierung eines 10.1-Editors):
Wie füge ich eine Prüfung hinzu, um sicherzustellen, dass sich der Benutzer in einer Bearbeitungssitzung befindet?
def onClick(self):
#Reference mxd
mxd = arcpy.mapping.MapDocument("CURRENT")
#Reference the main Data frame
mm = arcpy.mapping.ListDataFrames(mxd, "MainMap")[0]
#Reference the Water System Valve feature class
waterValves = arcpy.mapping.ListLayers(mxd, "Water System Valve", mm)[0]
#Reference the fire hydrant feature class
fireHydrants = arcpy.mapping.ListLayers(mxd, "Water Hydrant", mm)[0]
#Use the extent of the main DF to select all valves in the current view
dfAsFeature = arcpy.Polygon(arcpy.Array([mm.extent.lowerLeft, mm.extent.lowerRight, mm.extent.upperRight, mm.extent.upperLeft]), mm.spatialReference)
arcpy.SelectLayerByLocation_management(waterValves, "WITHIN", dfAsFeature,"", "NEW_SELECTION")
arcpy.SelectLayerByAttribute_management(waterValves, "SUBSET_SELECTION", "LOCATIONID IS NULL")
fields = ["LOCATIONID"]
row, rows = None, None
rows = arcpy.UpdateCursor(waterValves,fields)
row = rows.next()
valveList = []
append = valveList.append
#Loop through the valves table to update LocationID
while row:
builder = str(row.QSNO)+"-"+ str(row.VALVESEQNO)
row.setValue("LOCATIONID", builder)
append(builder)
rows.updateRow(row)
row = rows.next()
del row, rows
#New selection for fire hydrants
arcpy.SelectLayerByLocation_management(fireHydrants, "WITHIN", dfAsFeature,"", "NEW_SELECTION")
arcpy.SelectLayerByAttribute_management(fireHydrants, "SUBSET_SELECTION", "LOCATIONID IS NULL")
row, rows = None, None
rows = arcpy.UpdateCursor(fireHydrants,fields)
row = rows.next()
#Loop through fire hydrant table to update LocationID
while row:
for locID in valveList:
construct = str(locID) + "-FH"
#print construct
row.setValue("LOCATIONID", construct)
rows.updateRow(row)
row = rows.next()
del row, rows, valveList, mxd
Antworten:
Hier ist eine generische Funktion, die auf diesem Beitrag basiert.
Vielleicht ist dies etwas klobiger als die ArcObjects-Lösung, aber es scheint sicher viel weniger stressig zu sein! Einfach ist besser als komplex. Außer wenn es nicht ist.
Anwendungsbeispiel:
Code:
quelle
Meine Lösung für dieses Problem bestand darin, die für die Arcpy Addin-Symbolleiste verfügbaren Erweiterungen zu verwenden. Ich habe eine Erweiterung hinzugefügt, die darauf wartet, dass eine Bearbeitungssitzung beginnt oder endet. Ich habe alle meine Schaltflächen in der Leiste auf "self.enable = False" gesetzt und diese Schaltflächen werden dann entweder aktiviert oder deaktiviert, indem eine Bearbeitungssitzung gestartet oder gestoppt wird.
quelle
Ich poste eine weitere Antwort, weil ich eine neue Methode zum Überprüfen des Status des Editors in ArcMap mithilfe von ArcObjects und Python zusammen gelernt habe. Meine Antwort basiert stark auf der Arbeit von Mark Cederholm, auf die in diesem Beitrag verwiesen wird: Wie greife ich von Python aus auf ArcObjects zu? und Codebeispiele von Matt Wilkie in seiner Datei "Snippits.py". Sie müssen den Anweisungen in der ersten Antwort folgen, um comtypes herunterzuladen und zu installieren und dann eine Kopie des Skripts Snippets.py zu erhalten. Ich poste eine Kopie der wesentlichen Funktionen aus diesem Skript unten.
Wenn die Funktion ArcMap_GetEditSessionStatus () aufgerufen wird, überprüft sie den aktuellen Status des Editors in ArcMap und gibt true oder false zurück. Auf diese Weise kann ich überprüfen, ob ein Benutzer bereit ist, mein Tool zu verwenden, oder ob er aufgefordert werden muss, eine Bearbeitungssitzung zu starten. Der Nachteil dieser Methode ist die Anforderung, comtypes zu installieren, bevor ArcObjects in Python verwendet werden kann. Daher ist die Freigabe eines Tools, für das dieses Paket erforderlich ist, in einer Büroumgebung für mehrere Benutzer möglicherweise nicht möglich. Aufgrund meiner begrenzten Erfahrung bin ich mir nicht sicher, wie ich alles zusammenfassen soll, um es einfach als Esri Python-Tool-Add-In zu teilen. Vorschläge, wie dies zu tun ist, wären willkommen.
quelle
Desktop.pth
Datei so ändert , dass sie den vollständigen Pfad zur Netzwerkfreigabe enthält, sodass jeder automatisch alles importieren kann.Wie wäre es mit dem Datenzugriffsmodul ? Es sieht so aus, als könnten Sie mit diesem Modul eine Bearbeitungssitzung starten.
Ein paar Einschränkungen:
with
Anweisung. Dies ist ein großartiges Paradigma, da es potenzielle Ausnahmen gut handhabt.try / except
Anweisung zu starten .quelle
Auf diese Weise habe ich mein Problem behoben, dass ich nicht steuern konnte, ob sich jemand, der mein Tool verwendet, in einer Bearbeitungssitzung befand oder nicht:
Das Skript funktioniert, weil es versucht, einen UpdateCursor auf einer Ebene zu erstellen, die später im Skript einen anderen UpdateCursor enthält. Dies verletzt das Verhalten des Datenzugriffsmoduls. Laut der ESRI-Ressourcenseite auf arcpy.da.UpdateCursor:
"Das Öffnen von gleichzeitigen Einfüge- und / oder Aktualisierungsvorgängen im selben Arbeitsbereich mit unterschiedlichen Cursorn erfordert den Start einer Bearbeitungssitzung."
Ich bin mit dieser Lösung nicht zufrieden, weil sie eher ein Hack ist als das, was ich mir als richtiges Arcpy-Scripting vorstelle. Bessere Ideen jemand?
quelle