Option Explicit 'Requires user to declare all of your variables 'Below, the user will have to declare two constant values 'Const path As String = "E:/School/Semester3/GIS4309/my_id_tags_92.txt" 'path of the text file being written to 'Const layerName As String = "TestPoints" 'Name of the Layer to be tracked Private m_pEditor As IEditor 'Declare an IEditor variable to be available at the module level Private WithEvents EditEvents As Editor 'use the WithEvents keyword and provide appropriate functions to handle the events. 'Declare variables available to the whole module Dim pMap As IMap Dim prevData As String Dim IdTag As String Dim pMxDoc As IMxDocument Dim pFeatureLayer As IFeatureLayer Dim pFeature As IFeature Dim pLayer As ILayer Dim pEnumLayer As IEnumLayer Dim fileNum As Integer Dim fileNum2 As Integer Dim pEditLayers As IEditLayers Dim pID As New UID Dim targetLayer As IFeatureLayer Public path As String Public layerName As String 'will run the StartListeningToEditEvents subroutine when the button is clicked 'It will also prompt the user to enter the path to the text file for storing the info and the Layer to listen to Public Sub TagListener_Click() 'path = "E:/School/Semester3/GIS4309/my_id_tags_92.txt" 'path of the text file being written to layerName = "TestPoints" 'Name of the Layer to be tracked vaFiles = Application.GetOpenFilename(FileFilter:="Excel Filer (*.txt),*.txt", Title:="Open File", MultiSelect:=False) 'This section will prompt the user to enter the path to the text file for storing the info Dim newpath As String newpath = InputBox("Please enter the path to your Tag Tracking File (ie: E:/School/Semester3/GIS4309/my_id_tags_92.txt)", "Path Required", path) If StrPtr(newpath) = 0 Or newpath = "" Then 'Handles the Cancel button or if the user enters nothing Exit Sub End If 'This section will prompt the user to enter the name of the Layer in the map document to listen to Dim newlayername As String newlayername = InputBox("Please enter the layer name you are tracking (ie: MyPoints)", "Layer Name Required", "TestPoints") If StrPtr(newlayername) = 0 Or newlayername = "" Then 'Handles the Cancel button or if the user enters nothing Exit Sub End If 'These two staements will pass the user input into these variables for use later on in the code path = newpath layerName = newlayername StartTagListener 'call to this subroutine End Sub 'This sub will be the macro that the button on the toolbar runs Public Sub StartTagListener() Set EditEvents = Application.FindExtensionByName("ESRI Object Editor") 'Listen for events in the editor environment End Sub 'This sub will listen for any features that are being deleted 'it will then write the OBJECTID Tag of the object to the external text file 'only if the feature being deleted is a a point feature 'when listening for the delete event, the sub will note the object being deleted Private Sub EditEvents_OnDeleteFeature(ByVal obj As IObject) Set pMxDoc = ThisDocument 'Sets the pMxDoc to the current document using the ThisDocument keyword 'This next section set up access to the ESRI Editor Library 'this library implements ArcMap's object editor including the 'editing of feature geometry and attributes as well as 'topological display and editing pID = "esriEditor.Editor" 'Sets the pID variable to the UID with this name Set m_pEditor = Application.FindExtensionByCLSID(pID) 'creates the access to the ESRIEditor Library 'Declare Variables for use in this section of the code Dim pFeature As IFeature Dim pGeometry As IGeometry 'This next line will set the current object being deleted to the feature variable 'This line is important as it will allow the GeometryType property to act on the IObject Set pFeature = obj If pFeature.Shape.GeometryType = esriGeometryPoint Then 'Will run the code if the Feature's geometry type is a point type IdTag = obj.OID 'Sets the IdTag variable to the OID of the object being deleted fileNum = FreeFile 'Obtain next free file handle number. Open path For Input As #fileNum 'Opens the file for reading 'This loop will store all the text from the beginning to the End of the File (EOF) Do While Not EOF(fileNum) Input #fileNum, prevData 'stores string data in the prevData variable Loop Close #fileNum 'must always close the file fileNum2 = FreeFile 'Obtain next free file handle number. Open path For Output As #fileNum2 'Opens file for writing 'the next line appends a string of content to the top of the text file 'including the deleted tag ID in brackets, The current date and time, 'and a TAG DELETED Marker Write #fileNum2, vbCrLf & "(" & IdTag & ")" & vbTab & vbTab & Format(Now, "dd-mmm-yyyy hh:mm:ss AM/PM") & vbTab & "*TAG DELETED*" & vbCrLf & prevData Close #fileNum2 'must always close the file 'MsgBox "Point Deleted: " & obj.OID 'Displays a message box when a feature is deleted --> for testing only Exit Sub Else 'MsgBox "Line Deleted: " & obj.OID 'Displays a message box when a feature is deleted --> for testing only Exit Sub 'will exit the sub if the layer names do not match and write nothing to the file End If End Sub 'This sub will listen for any features that are being created 'it will then write the OBJECTID Tag of the object to the external text file 'only if the target layer selected is that of the layer we wish to 'record the ID's of ie: TestPoints Layer 'when listening for the create event, the sub will note the object being deleted Private Sub EditEvents_OnCreateFeature(ByVal obj As IObject) Set pMxDoc = ThisDocument 'Sets the pMxDoc to the current document using the ThisDocument keyword 'This next section set up access to the ESRI Editor Library 'this library implements ArcMap's object editor including the 'editing of feature geometry and attributes as well as 'topological display and editing pID = "esriEditor.Editor" 'Sets the pID variable to the UID with this name Set m_pEditor = Application.FindExtensionByCLSID(pID) 'creates the access to the ESRIEditor Library Set pEditLayers = m_pEditor 'QI 'sets the tagetLayer variable to the layer currently selected in the editor's taget drop-down list Set targetLayer = pEditLayers.CurrentLayer ' Get all the layers in the Map Set pEnumLayer = pMxDoc.FocusMap.Layers Set pLayer = pEnumLayer.Next 'Sets pLayer to the first layer in the table of contents window ' Loop through all the layers until the desired layer name is found Do Until pLayer Is Nothing If pLayer.Name = layerName Then Exit Do End If Set pLayer = pEnumLayer.Next 'If the layer name was not found, go to next layer Loop Set pFeatureLayer = pLayer 'QI If pFeatureLayer.Name = targetLayer.Name Then 'Will run the code if the FeatureLayer and targetLayer have the same name IdTag = obj.OID 'Sets the IdTag variable to the OID of the object being deleted fileNum = FreeFile 'Obtain next free file handle number. Open path For Input As #fileNum 'Opens the file for reading 'This loop will store all the text from the beginning to the End of the File (EOF) Do While Not EOF(fileNum) Input #fileNum, prevData 'stores string data in the prevData variable Loop Close #fileNum 'must always close the file fileNum2 = FreeFile 'Obtain next free file handle number. Open path For Output As #fileNum2 'Opens file for writing 'the next line appends a string of content to the top of the text file 'including the deleted tag ID in brackets, and the current date and time Write #fileNum2, vbCrLf & IdTag & vbTab & vbTab & Format(Now, "dd-mmm-yyyy hh:mm:ss AM/PM") & vbCrLf & prevData Close #fileNum2 'must always close the file Else Exit Sub 'will exit the sub if the layer names do not match and write nothing to the file End If 'MsgBox "EditEvents_OnCreateFeature : " & obj.OID 'Displays a message box when a feature is deleted --> for testing only End Sub 'This function will add a Tool Tip to the UI button 'When the user hovers over the button it will provide info on what it does Private Function TagListener_ToolTip() As String TagListener_ToolTip = "Click this button to start listening for tage creation/deletion events" 'Tool Tip statement End Function
Los miembros registrados pueden publicar, seguir actualizaciones y más. ¿Nuevo aquí? Regístrate gratis.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.