À 160319 : Erreur lors de l'arrêt d'une session d'édition avec enregistrement des modifications — ArcGIS Pro | Documentation une aide est demandée à toute personne rencontrant cette erreur.
En enquêtant sur les réseaux linéaires LRS, je suis tombé sur une procédure qui conduit à cette erreur à chaque fois qu'elle est exécutée une seconde fois dans une session ArcGIS Pro 3.0.0.
Le code est ci-dessous et la façon dont je l'exécute est en tant qu'outil script Python sans paramètres.
Si l'outil est exécuté une fois, il fonctionne. Si on le lance de nouveau, il affiche :
arcgisscripting.ExecuteError : ERREUR 160319 : Erreur lors de l'arrêt d'une session d'édition avec enregistrement des modifications
Erreur lors de l'arrêt d'une session d'édition avec enregistrement des modifications [TestLRSNetwork]
Échec de l'exécution (AppendRoutes).
# Ce script a pour but de créer un jeu de données LRS vide et de charger
# les géométries d'une classe d'entités polylignes test avec des IDs de route (TEXT),
# Noms de route (TEXT) et mesures from/to (DOUBLE) dedans afin qu'un
# réseau linéaire LRS avec ces routes puisse être créé
import arcpy,uuid
def print_message(msg):
print(msg)
arcpy.AddMessage(msg)
arcpy.env.overwriteOutput = True
# Définir le système de coordonnées et la géodatabase à utiliser
srWGS84 = arcpy.SpatialReference("GCS_WGS_1984")
workingFolder = r"C:\temp"
gdbName = "test"
gdb = r"{0}\{1}.gdb".format(workingFolder,gdbName)
lrsName = "TestLRS"
lrsFD = r"{0}\{1}".format(gdb,lrsName)
testFCName = "testFC"
testFC = r"{0}\{1}".format(lrsFD,testFCName)
testStatsTableName = "testStats"
testStatsTable = r"{0}\{1}".format(gdb,testStatsTableName)
testDissolvedFC = r"{0}{1}".format(testFC,"_Dissolve")
calibrationFC = r"{0}\{1}".format(lrsFD,"Calibration_Point")
centerlineFC = r"{0}\{1}".format(lrsFD,"Centerline")
lrsNetworkName = "testLRSNetwork"
lrsNetworkFC = r"{0}\{1}".format(lrsFD,lrsNetworkName)
redlineFC = r"{0}\{1}".format(lrsFD,"Redline")
centerlineSequenceTable = r"{0}\{1}".format(gdb,"Centerline_Sequence")
newCalibrationPointsFCName = "NewCalibrationPoints"
newCalibrationPointsFC = r"{0}\{1}".format(lrsFD,newCalibrationPointsFCName)
newCalibrationPointsFCTempName = newCalibrationPointsFCName+"Temp"
newCalibrationPointsFCtemp = r"{0}\{1}".format(lrsFD,newCalibrationPointsFCTempName)
uniqueCalibrationPointsFCName = "UniqueCalibrationPoints"
uniqueCalibrationPointsFC = r"{0}\{1}".format(lrsFD,uniqueCalibrationPointsFCName)
# Créer une géodatabase vide pour les tests
arcpy.management.CreateFileGDB(workingFolder,gdbName)
# Créer un jeu de données TestLRS vide avec noms par défaut pour trois classes d'entités
# (Calibration_Point, Centerline, Redline) et une hiérarchie LRS (TestLRS)
# à l'intérieur, ainsi que trois tables (Centerline_Sequence, Lrs_Edit_Log, Lrs_Locks)
print_message("Création du jeu de données LRS nommé {0} dans {1}".format(lrsName,gdb))
arcpy.locref.CreateLRS(gdb,lrsName,"Centerline","Calibration_Point",
"Redline","Centerline_Sequence",srWGS84)
# Préparer la classe d'entités à partir de laquelle les routes seront ajoutées au réseau LRS plus tard
# Créer une classe d'entités vide et son schéma
print_message('Création de la classe d'entités polylignes "prête pour les routes" ({0}) dans le jeu de données LRS ({1})'.format(testFC,lrsFD))
arcpy.management.CreateFeatureclass(lrsFD,"testFC","POLYLINE")
arcpy.management.AddField(testFC,"RouteID","TEXT", None, None, 10)
arcpy.management.AddField(testFC,"RouteName","TEXT", None, None, 10)
arcpy.management.AddField(testFC,"FromMeasure","DOUBLE")
arcpy.management.AddField(testFC,"ToMeasure","DOUBLE")
arcpy.management.AddField(testFC,"FromDate","DATE")
arcpy.management.AddField(testFC,"ToDate","DATE")
# Écrire trois polylignes et leurs attributs de route dans la classe d'entités
cursor = arcpy.da.InsertCursor(testFC,["SHAPE@","RouteID","RouteName","FromMeasure","ToMeasure"])
array = arcpy.Array([arcpy.Point(0.0,0.0),
arcpy.Point(0.0,1.0)])
polyline = arcpy.Polyline(array,srWGS84)
cursor.insertRow([polyline,"Route1","Route 1",0.0,750.0])
array = arcpy.Array([arcpy.Point(0.0,1.0),
arcpy.Point(1.0,1.0)])
polyline = arcpy.Polyline(array,srWGS84)
cursor.insertRow([polyline,"Route1","Route 1",750.0,2000.0])
array = arcpy.Array([arcpy.Point(1.0,1.0),
arcpy.Point(1.0,0.0)])
polyline = arcpy.Polyline(array,srWGS84)
cursor.insertRow([polyline,"Route2","Route 2",0.0,999.0])
del cursor
arcpy.management.CalculateField(testFC, "FromDate", "datetime.datetime.now()", "PYTHON3", '', "TEXT", "NO_ENFORCE_DOMAINS")
print_message('Écriture des statistiques depuis la classe d'entités polylignes ({0}) dans la table ({1})'.format(testFC,testStatsTable))
arcpy.analysis.Statistics(testFC,testStatsTable,"FromMeasure MIN;ToMeasure MAX","RouteID")
# Dissoudre testFC pour n'avoir qu'une seule polyligne par route
print_message("Dissolution de {0} principalement sur RouteID pour créer {1}".format(testFC,testDissolvedFC))
arcpy.management.Dissolve(testFC,testDissolvedFC,
"RouteID;RouteName;FromDate;ToDate",
None, "SINGLE_PART", "UNSPLIT_LINES")
# Ajouter et remplir les champs pour supporter les lignes dans le réseau LRS
print_message("Ajout et remplissage des champs pour supporter les lignes sur les polylignes 'prêtes pour les routes' dans {1}".format(testFC,testDissolvedFC))
arcpy.management.AddField(testDissolvedFC,"Line_GUID","Text",None,None,255)
arcpy.management.AddField(testDissolvedFC,"LineName","Text",None,None,10)
arcpy.management.AddField(testDissolvedFC,"LineOrder","LONG")
# Une seule ligne dans ce test
lineGUID = "{0}".format('{'+str(uuid.uuid4())+'}')
lineOrder = 100
with arcpy.da.UpdateCursor(testDissolvedFC,["Line_GUID","LineName","LineOrder"]) as cursor:
for row in cursor:
cursor.updateRow([lineGUID,"Ligne 1",lineOrder])
lineOrder+=100
arcpy.management.JoinField(testDissolvedFC,"RouteID",testStatsTable,"RouteID","MIN_FromMeasure;MAX_ToMeasure")
# Créer un réseau TestLRSNetwork vide dans le jeu de données TestLRS
print_message("Création du réseau LRS ({0}) dans le jeu de données LRS ({1})".format("TestLRSNetwork","TestLRS"))
arcpy.locref.CreateLRSNetwork(gdb, "TestLRS", "TestLRSNetwork",
"RouteID", "RouteName", "FromDate", "ToDate", "DO_NOT_DERIVE", '',
"INCLUDE", "LineId", "LineName", "LineOrder", "METERS")
# "DO_NOT_INCLUDE", "LineId", "LineName", "LineOrder", "METERS")
lrsNetworkFC = r"{0}\{1}".format(lrsFD,"TestLRSNetwork")
# Ajouter les routes depuis testFC dans TestLRSNetwork ce qui devrait aussi les ajouter dans la classe d'entités Centerline en même temps
print_message("Ajout des routes depuis {1} dans le réseau LRS ({1}) dans le jeu de données LRS ({2})".format(testFC,"TestLRSNetwork","TestLRS"))
arcpy.locref.AppendRoutes(testDissolvedFC,lrsNetworkFC, "RouteID", "RouteName", "FromDate", "ToDate",
"Line_GUID","LineName","LineOrder", None, "ADD")
# Génération des points de calibration et calibration des routes en utilisant ceux-ci
arcpy.locref.GenerateCalibrationPoints(testDissolvedFC,"RouteID","FromDate","ToDate",calibrationFC,
lrsNetworkName, "DIGITIZED_DIRECTION","ATTRIBUTE_FIELDS","MIN_FromMeasure","MAX_ToMeasure")
# lrsNetworkName, "MEASURE_DIRECTION", "GEOMETRY_LENGTH")
arcpy.locref.GenerateRoutes(lrsNetworkFC, "NO_RECORD_CALIBRATION_CHANGES")
Si je ferme ArcGIS Pro et relance l'outil, cela fonctionne ; mais si j'essaie de le lancer une seconde fois alors l'erreur réapparaît.