Select to view content in your preferred language

Create points with Mouse click

3229
15
Jump to solution
02-05-2013 09:06 AM
TonyAlmeida
MVP Regular Contributor
I have a VBA button that allows me to click on my layer and generate a point by a MouseDown event. It populates a certain filed with the distance between the first temp point and the second temp point divided by 5.28 + InputBox. The point is also created from the second temp point. Since VBA will no longer be supported i thought i would look into python. I know you can capture coordinates with the onMouseDownMap function. maybe use point = arcpy.Point and ptGeometry = arcpy.PointGeometry(point) to get the distance between the two points,then cursor = arcpy.UpdateCursor to update the field, then feature store?

any ideas, thoughts? i would gratefully appreciate it.

Here is my vba code
Dim pFeature1 As IFeature Dim tmpPoint1 As IPoint  Private Sub UIToolControl1_MouseDown(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long)  'Adds a point to a shapefile     Dim pMap As IMap     Dim pMxDoc As IMxDocument     Set pMxDoc = ThisDocument     Set pMap = pMxDoc.FocusMap     Dim pDataset As IDataset     Dim pFeature1 As IFeature     'Dim tmpPoint1 As IPoint      'Get the first layer in the map     Dim pFeatLyr As IGeoFeatureLayer     Set pFeatLyr = pMap.Layer(0)             'Create a point from the mouse down click     Dim tmpPoint As IPoint     Set tmpPoint = New Point     Set tmpPoint = pMxDoc.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y)      'Get the feature class     Dim pFClass As IFeatureClass     Set pFClass = pFeatLyr.FeatureClass  'QI from IFeatureclass to IDataset  'Dim pDataset As IDataset Set pDataset = pFClass  'Get the Workspace from the IDataset Dim pWorkspace As IWorkspace Set pWorkspace = pDataset.Workspace  'QI from IWorkspace to IWorkspaceEdit Dim pWorkspaceEdit As IWorkspaceEdit Set pWorkspaceEdit = pWorkspace  'Start editing if needed If Not pWorkspaceEdit.IsBeingEdited Then pWorkspaceEdit.StartEditing (True) End If  'Start an edit operation pWorkspaceEdit.StartEditOperation      'Create the new point feature     Dim pFeature As IFeature     Dim dblDist As Double     If button = 2 Then         Set pFeature1 = Nothing         Set tmpPoint1 = Nothing         Exit Sub     End If     If pFeature1 Is Nothing Then         If tmpPoint1 Is Nothing Then             Set tmpPoint1 = tmpPoint         Else             Set pFeature = pFClass.CreateFeature             Set pFeature.Shape = tmpPoint             If Not tmpPoint1 Is Nothing Then                 dblDist = 0                 dblDist = GetDistance1(pFeature)                 pFeature.Value(pFeature.Class.Fields.FindField("Distance_")) = dblDist                 pFeature.Value(pFeature.Class.Fields.FindField("SiteNum")) = (dblDist / 5.28) + InputBox("Enter Address Range") & ""                 pFeature.Store             End If             Set pFeature1 = pFeature         End If     Else         Set pFeature = pFClass.CreateFeature         Set pFeature.Shape = tmpPoint         If Not pFeature1 Is Nothing Then             dblDist = 0             dblDist = GetDistance(pFeature1, pFeature)             pFeature.Value(pFeature.Class.Fields.FindField("Distance_")) = dblDist             pFeature.Value(pFeature.Class.Fields.FindField("SiteNum")) = (dblDist / 5.28) + InputBox("Enter Address Range") & ""              pFeature.Store                      End If         Set pFeature1 = pFeature     End If 'Complete the edit operation     'pWorkspaceEdit.StopEditOperation     pMxDoc.ActiveView.Refresh     pMxDoc.UpdateContents End Sub Function GetDistance1(pFeature1 As IFeature) As Double     Dim pGeom1 As IGeometry     Dim pGeom2 As IGeometry     Dim pProx As IProximityOperator     Dim dblDist As Double     Set pGeom1 = tmpPoint1     Set pGeom2 = pFeature1.Shape     Set pProx = pGeom2     dblDist = pProx.ReturnDistance(pGeom1)     'MsgBox dblDist     GetDistance1 = dblDist End Function Function GetDistance(pFeature1 As IFeature, pFeature2 As IFeature) As Double     Dim pGeom1 As IGeometry     Dim pGeom2 As IGeometry     Dim pProx As IProximityOperator     Dim dblDist As Double     Set pGeom1 = pFeature1.Shape     Set pGeom2 = pFeature2.Shape     Set pProx = pGeom2     dblDist = pProx.ReturnDistance(pGeom1)     'MsgBox dblDist     GetDistance = dblDist  End Function 
Tags (2)
0 Kudos
15 Replies
TonyAlmeida
MVP Regular Contributor
JSkinn3 Thank you so much for all your responses and time.

I would like to divide the length by 5.28 + user inputbox like in the vba see below.

pFeature.Value(pFeature.Class.Fields.FindField("SiteNum")) = (dblDist / 5.28) + InputBox("Enter Address Range") & ""

Here is the code i have so far and it works excellent so far but i need to add the calculations i mention.


import arcpy
from arcpy import env
import pythonaddins
import os

class PointTool(object):
    """Implementation for Point_addin.PointTool (Tool)"""
    def __init__(self):
        self.enabled = True
        self.cursor=3
        self.shape = "Line"
    def onLine(self, line_geometry):
        fc = "C:\Temp\Test_points.shp"
        workspace = os.path.dirname(fc)
        arcpy.env.overwriteOutput = True
                
        # Start an edit session. Must provide the worksapce.
        edit = arcpy.da.Editor(workspace)

        # Edit session is started without an undo/redo stack for versioned data
        #  (for second argument, use False for unversioned data)
        edit.startEditing(False, True)

        # Start an edit operation
        edit.startOperation()
        
        arcpy.CopyFeatures_management(line_geometry, "line_test")
        rows = arcpy.SearchCursor("line_test")
        for row in rows:
            length = row.Shape_Length
            print length
        del row, rows

        arcpy.FeatureVerticesToPoints_management("line_test", "point", "END")
        arcpy.AddField_management("point", "Length", "DOUBLE")

        rows = arcpy.SearchCursor("line_test")
        for row in rows:
            geom = row.shape
            X = geom.lastPoint.X
            Y = geom.lastPoint.Y
            length = row.Shape_Length
        del row, rows

        row_value = (length, (X, Y))

        rowss = arcpy.SearchCursor(fc, "", "", "Distance_")
        
        cursor = arcpy.da.InsertCursor(r"C:\temp\Test_points.shp", ("Distance_", "SHAPE@XY"))
        cursor.insertRow(row_value)

        arcpy.Delete_management("line_test")

        # Stop the edit operation.
        edit.stopOperation()

        # Stop the edit session and save the changes
        edit.stopEditing(True)

        arcpy.RefreshActiveView()

0 Kudos
TonyAlmeida
MVP Regular Contributor
I am having a hard time trying to figure out how to do the calculation.

I receive the following error on line
cursor.insertRow(row_value)

line 70, in <module>
    cursor.insertRow(row_value)
TypeError: argument must be sequence of values

Failed to execute

import arcpy
from arcpy import env
import pythonaddins
import os

fc = "C:\Temp\Test_points.shp"
workspace = os.path.dirname(fc)
arcpy.env.overwriteOutput = True
# Start an edit session. Must provide the worksapce.
edit = arcpy.da.Editor(workspace)

# Edit session is started without an undo/redo stack for versioned data
#  (for second argument, use False for unversioned data)
edit.startEditing(False, True)

# Start an edit operation
edit.startOperation()

input = arcpy.GetParameterAsText(0)
Range = float(arcpy.GetParameterAsText(1))
# Create empty Point and Array objects
point = arcpy.Point()
array = arcpy.Array()

# A list that will hold each the Polyline object
featureList = []

rows = arcpy.SearchCursor(input)
for row in rows:
    geom = row.Shape
    point.X = geom.centroid.X
    point.Y = geom.centroid.Y
    # Add each point to the array
    array.add(point)    

# Create the polyline
polyline = arcpy.Polyline(array)
# Clear the array for future use
array.removeAll()
featureList.append(polyline)

del row, rows

# Copy the polyline to file geodatabase to create a Shape_Length field
arcpy.CopyFeatures_management(featureList, "line_test")
rows = arcpy.SearchCursor("line_test")
for row in rows:
    # Create a variable to store the length
    length = row.Shape_Length
    arcpy.AddMessage(length)
del row, rows

# Convert the line's end point to a point
arcpy.FeatureVerticesToPoints_management("line_test", "point_test", "END")
# Add a field to store the length from the point1 to point2
arcpy.AddField_management("point_test", "Length", "DOUBLE")

rows = arcpy.UpdateCursor("point_test")
for row in rows:
    row.Length = length
    rows.updateRow(row)

del row, rows

row_value = float(length / 5.28 + Range)

rowss = arcpy.SearchCursor(fc, "", "", "Distance_")
        
cursor = arcpy.da.InsertCursor(r"C:\temp\Test_points.shp", ("Distance_", "SHAPE@XY"))
cursor.insertRow(row_value)

arcpy.Delete_management("line_test")

# Stop the edit operation.
edit.stopOperation()

# Stop the edit session and save the changes
edit.stopEditing(True)

arcpy.RefreshActiveView()


0 Kudos
JakeSkinner
Esri Esteemed Contributor
Try calculating the length within the search cursor.  Ex:

rows = arcpy.SearchCursor("line_test")
for row in rows:
    # Create a variable to store the length
    length = row.Shape_Length
    length = (length / 5.28) + Range
    arcpy.AddMessage(length)
del row, rows
0 Kudos
TonyAlmeida
MVP Regular Contributor
JSkinn3 i ended up with this... and it works.
Again thank you so much for your input!

arcpy.CopyFeatures_management(featureList, "line_test")
rows = arcpy.SearchCursor("line_test")
for row in rows:
        geom = row.shape
        X = geom.lastPoint.X
        Y = geom.lastPoint.Y
        length = row.Shape_Length / 5.28 + Range
del row, rows
row_value = (length, (X, Y))
0 Kudos
TonyAlmeida
MVP Regular Contributor
JSkinn3, or anyone else

Sorry to bring this back up but was trying to understand the script a little better so i wrote a different one but i am having trouble with the Point_test "Length" field being updated with the Line_test Length field data.

I receive the following error.

Traceback (most recent call last):
  File "C:\GIS\Python Scripts\Point_addin_tool2.py", line 51, in <module>
    cursor.insertRow([row_value])
RuntimeError: The field is not nullable. [Distance_]


Here is the code.

import arcpy
from arcpy import env
import pythonaddins
import os

env.workspace = r"C:\temp\python\test.gdb"

arcpy.env.overwriteOutput = True

input = arcpy.GetParameterAsText(0)
Range = float(arcpy.GetParameterAsText(1))
# Create empty Point and Array objects
point = arcpy.Point()
array = arcpy.Array()

# A list that will hold each the Polyline object
featureList = []

rows = arcpy.SearchCursor(input)
for row in rows:
    geom = row.Shape
    point.X = geom.centroid.X
    point.Y = geom.centroid.Y
    # Add each point to the array
    array.add(point)    

# Create the polyline
polyline = arcpy.Polyline(array)
# Clear the array for future use
array.removeAll()
featureList.append(polyline)

del row, rows

# Copy the polyline to file geodatabase to create a Shape_Length field
arcpy.CopyFeatures_management(featureList, "line_test")
rows = arcpy.SearchCursor("line_test")
for row in rows:
    length = row.Shape_Length / 5.28 + Range
del row, rows

rows = arcpy.UpdateCursor("point_test")
for row in rows:
    length = row.Length
    rows.updateRow(row)
del row, rows

row_value = (length)
        
cursor = arcpy.da.InsertCursor(r"C:\temp\Test_points.shp", "Distance_")
cursor.insertRow([row_value])

arcpy.Delete_management("line_test")

arcpy.RefreshActiveView()

0 Kudos
TonyAlmeida
MVP Regular Contributor
Yes i was able to.

Here is the code

import arcpy
from arcpy import env
import pythonaddins
import os

fc = "Tony_Two_way.DBO.CCAP"
workspace = r"Database Servers\******"
arcpy.env.overwriteOutput = True
# Start an edit session. Must provide the worksapce.
edit = arcpy.da.Editor(workspace)

# Edit session is started without an undo/redo stack for versioned data
#  (for second argument, use False for unversioned data)
edit.startEditing(True)

# Start an edit operation
edit.startOperation()

input = arcpy.GetParameterAsText(0)
Range = float(arcpy.GetParameterAsText(1))
# Create empty Point and Array objects
point = arcpy.Point()
array = arcpy.Array()

# A list that will hold each the Polyline object
featureList = []

rows = arcpy.SearchCursor(input)
for row in rows:
    geom = row.Shape
    point.X = geom.centroid.X
    point.Y = geom.centroid.Y
    # Add each point to the array
    array.add(point)    

# Create the polyline
polyline = arcpy.Polyline(array)
# Clear the array for future use
array.removeAll()
featureList.append(polyline)

del row, rows

# Copy the polyline to file geodatabase to create a Shape_Length field
arcpy.CopyFeatures_management(featureList, "line_test")
rows = arcpy.SearchCursor("line_test")
for row in rows:
        geom = row.shape
        X = geom.lastPoint.X
        Y = geom.lastPoint.Y
        length = row.Shape_Length / 5.28 + Range
del row, rows
row_value = (length, (X, Y))
        
cursor = arcpy.da.InsertCursor(fc, ("SiteNum", "SHAPE@XY"))
cursor.insertRow(row_value)

arcpy.Delete_management("line_test")

# Stop the edit operation.
edit.stopOperation()

# Stop the edit session and save the changes
edit.stopEditing(True)

arcpy.RefreshActiveView()

0 Kudos