Wykrywanie Dołącz programowo za pomocą ArcPy?

10

Mam trochę kodu Python, który jest uruchamiany z projektu ArcMap. Wszelkie sprzężenia, które użytkownik mógł utworzyć w projekcie, muszą zostać usunięte, aby mój kod działał. Niestety kod, który usuwa złączenie… arcpy.RemoveJoin_management („layer1”, „layer2”)… również łamie niektóre właściwości warstwy, które są krytyczne dla mojej aplikacji (podświetlone pola, pola tylko do odczytu itp.).

Jeśli łączenia są usuwane poprzez kliknięcie warstwy prawym przyciskiem myszy w ArcMap i wybranie „Usuń połączenia”, właściwości warstwy pozostają nienaruszone.

Jeśli mogę wykryć, że istnieje sprzężenie z mojego kodu, po prostu wyjdę z kodu i wyświetli komunikat, że użytkownik musi ręcznie usunąć swoje sprzężenia przed próbą uruchomienia kodu. Więc… Czy sprzężenie można wykryć programowo?

Brian Peasley
źródło
Jestem trochę zagubiony w tym, jak usuwanie RemoveJoin za pomocą arcpy powoduje problemy. Jak to idzie o zrujnowanie pola tylko do odczytu? Czy użycie narzędzia Usuń dołączenie w ArcMap powoduje te same problemy?
Nathanus
Może innym sposobem na rozwiązanie tego problemu byłoby uczynienie kodu python niewrażliwym na złączenia?
Dan S.
@ Nathanus - Instrukcja Usuń Dołącz w ArcMap nie psuje moich właściwości warstwy, narzędzie GP. Oto odpowiedni cytat z Pomocy ESRI: „Ponieważ te narzędzia wykonują rzeczywiste przetwarzanie łączenia za kulisami nieco inaczej niż okno dialogowe Dołącz dane, użyj narzędzi, jeśli napotkasz nieoczekiwane problemy z funkcją łączenia w tym oknie dialogowym. „
BrianPeasley
@ Dan S. - Używam kursorów wstawiania i tym podobnych w moim kodzie. Nie mam pojęcia, jak bym zrobił, aby mój kod był niewrażliwy na łączenia.
BrianPeasley
1
warto było zapytać. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 wydaje się sugerować, że możesz być w stanie zaktualizować wartości w połączonej tabeli, poprzedzając nazwy kolumn przed nazwą tabeli; może to też działałoby na wkładce?
Dan S.

Odpowiedzi:

8

Szkoda, że ​​nie ma właściwości hasJoin w klasie arcpy.Layer . Myślę, że możesz przetestować złączenie, patrząc na nazwy pól. Oto prosty dowód koncepcji danych w geobazie pliku:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName
Derek Swingley
źródło
To wygląda obiecująco! Nie rozumiem tego, co robi: „if f.name.find (lyr.datasetName)> -1:”, ale spróbuję za kilka dni i zdam raport (zaraz padnie śnieg) w i stracić moc!) ... Dzięki!
BrianPeasley
Miło, że mogłem pomóc. Sprawdź wbudowaną metodę znajdowania ciągów python: docs.python.org/library/string.html, a także dokument dotyczący obiektów pól arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Pole /… Powiedziałbym, że daj temu kodowi szansę na sprawdzenie swoich danych i sprawdź, czy działa.
Derek Swingley,
2
Skończyło się na użyciu funkcji bardzo podobnej do tej i działa świetnie ... Dla każdej warstwy w dokumencie przeglądam listę pól i używam Pythona, aby ustalić, czy w nazwie pola znajduje się „kropka”.
BrianPeasley
„Kropka” w podejściu do nazwy pola jest wyborem w module arcpy.mp (pro), ponieważ dla warstwy nie ma dostępnej właściwości datasetName
Aamir Suleman
1

Myślę, że przekonasz się, że nie ma kuloodpornego sposobu na zrobienie tego z obiektami GP, będziesz musiał użyć ArcObjects i comtypes. Oto dyskusja z forów ESRI na temat trudności w sprawdzaniu połączeń za pomocą standardowych narzędzi / obiektów GP: https://geonet.esri.com/thread/20317

blah238
źródło
ArcObjects i typy nie będą rozwiązaniem dla tego projektu, są dla mnie obce, a ten projekt ma się odbyć wczoraj. Dziękujemy za wskazanie mi tego wątku na forum! Spróbuję przedstawionego tam pomysłu: „... sprawdź, czy którakolwiek z pseudonimów.split („.)
Dałaby