El siguiente script utiliza la siguiente convención de nomenclatura de capas en la tabla de contenido:
- "Objetivo" - capa de características con geometrías que deben sustituirse
- "chuletas" - capa de características con geometrías correctas
Funciona por selección, es decir, 1 característica seleccionada en cada capa.
import arcpy, traceback, os, sys
try:
def showPyMessage():
arcpy.AddMessage(str(time.ctime()) + " - " + message)
def CheckBothLayers(infc,infc2):
d=arcpy.Describe(infc); theType1=d.shapeType
d=arcpy.Describe(infc2); theType2=d.shapeType
if theType1!=theType2:
arcpy.AddWarning("\nTool designed to work with same geometries!")
raise NameError, "Wrong input\n"
return d
mxd = arcpy.mapping.MapDocument("CURRENT")
layers = arcpy.mapping.ListLayers(mxd)
destLR, sourceLR="chops","target"
destLR = arcpy.mapping.ListLayers(mxd,destLR)[0]
sourceLR = arcpy.mapping.ListLayers(mxd,sourceLR)[0]
a = CheckBothLayers(destLR,sourceLR)
g=arcpy.Geometry()
geometryList=arcpy.CopyFeatures_management(destLR,g)
nLines=len(geometryList)
if nLines!=1:
arcpy.AddWarning("\nSelect only 1 feature!")
raise NameError, "Wrong input\n"
line=geometryList[0]
tbl=arcpy.da.TableToNumPyArray(sourceLR,"OID@")
if len(tbl)!=1:
arcpy.AddWarning("\nSelect only 1 feature!")
raise NameError, "Wrong input\n"
with arcpy.da.UpdateCursor(sourceLR, ("SHAPE@")) as rows:
for row in rows:
row[0]=line
rows.updateRow(row)
arcpy.SelectLayerByAttribute_management(destLR, "CLEAR_SELECTION")
arcpy.SelectLayerByAttribute_management(sourceLR, "CLEAR_SELECTION")
arcpy.RefreshActiveView()
except NameError, theMessage:
arcpy.AddMessage (theMessage)
except:
message = "\n*** PYTHON ERRORS *** "; showPyMessage()
message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
message = "Python Error Info: " + str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()
La mejor manera de utilizarlo - adjuntar a un botón en la barra de herramientas del Editor:
No olvides guardar las ediciones