I have Python code that uses a Model Builder Feature Set as an input to prompt the user to manually create a line inside the data view of the active data frame. Then Python code calculates the grid north azimuth and the true north azimuth of the line and prints those values to the geoprocessing results window. The feature set (and code) create in_memory data using CreateFeatureclass_management....That all works fine but what I want to do is add the in_memory data to the active data frame.
I can get the name of the data frame using mxd.activeDataFrame.name but adding the layer is not working. See my code around line 72 - 74.
Any help is appreciated.
try:
import sys, traceback
import arcpy
import time, math
arcpy.AddMessage("\nGet the Azimuth From A User Defined Line.")
arcpy.AddMessage("Created by Gerry Gabrisch GISP, GIS Manager Lummi Indian Business Council, geraldg@lummi-nsn.gov\n")
arcpy.env.overwriteOutput = True
inFC = arcpy.GetParameterAsText(0)
outFL = "outFL"
outlayer = "outlayer"
arcpy.MakeFeatureLayer_management(inFC, outFL)
arcpy.SaveToLayerFile_management(outFL, outlayer)
def cart2pol(x, y):
rho = math.sqrt(x**2 + y**2)
phi = math.atan2(y, x)
return(rho, phi)
def UnitCircleDegreesToTrueNorthAzimuth(theta):
'''Converts Arithmatic Degrees (East = 0 then counter clockwise)
to Geographic Degrees (North = 0 then clockwise).'''
import math
#theta = math.degrees(theta)
theta = theta - 90.0
if theta < 0:
theta = theta + 360.0
theta = -1*(theta * 2 * math.pi / 360.0)
return 360.0 + math.degrees(theta)
for row in arcpy.da.SearchCursor(inFC, ["OID@", "SHAPE@"]):
#Set start point
startpt = row[1].firstPoint
startX = startpt.X
startY = startpt.Y
endpt = row[1].lastPoint
endX = endpt.X
endY = endpt.Y
arcpy.AddMessage("Normalizing coordinates...")
x = endX - startX
y = endY - startY
arcpy.AddMessage("Radians, degrees, and grid convergence, oh my!\n")
pol = cart2pol(x, y)
degs = math.degrees(pol[1])
azi = UnitCircleDegreesToTrueNorthAzimuth(degs)
mxd = arcpy.mapping.MapDocument("CURRENT")
spacRef = mxd.activeDataFrame.spatialReference
tempFC = arcpy.CreateFeatureclass_management("in_memory", "tempFC", geometry_type = "POINT", spatial_reference = spacRef )
arcpy.AddField_management(tempFC, "angle", "DOUBLE")
cursor = arcpy.da.InsertCursor(tempFC, ["SHAPE@XY"])
xy = (startX, startY)
cursor.insertRow([xy])
arcpy.CalculateGridConvergenceAngle_cartography(tempFC, "angle")
for row in arcpy.da.SearchCursor(tempFC, ["angle"]):
convergence = row[0]
arcpy.AddMessage("Line azimuth from grid north in degrees = " + str(azi))
azi = str(azi + convergence)
arcpy.AddMessage("Line azimuth from true north in degrees= " + azi)
arcpy.mapping.AddLayer(mxd.activeDataFrame.name, tempFC, "TOP")
arcpy.RefreshActiveView()
arcpy.RefreshTOC()
time.sleep(10)
arcpy.AddMessage("\nClosing")
except arcpy.ExecuteError:
msgs = arcpy.GetMessages(2)
arcpy.AddError(msgs)
arcpy.AddMessage(msgs)
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
print pymsg