перенос из названия слоя в атрибутику

0 голосов
спросил 29 Март, 10 от Van_Geo (5,560 баллов) в категории Программные продукты Esri
Помогите внести в атрибут название слоя...
У меня около 600 shp-файлов из разных каталогов
По ссылке , которую нашел в теме с таким же названием:
http://forums.esri.com/Thread.asp?c=93&f=993&t=264205
скопировал код и попробовал запустить...
Если в ArcMap выделен один слой то срабатывает, если больше то пишет:
  Run-time error '91':
  Object variable or With block variable not set

Я пока в програмировании разбираюсь плохо, подскажите, что я делаю не так.

3 Ответы

0 голосов
ответил 29 Март, 10 от pooperec (10,820 баллов)
А Вы все слои добавляете с ArcMap, я правильно понял?
И используете код из поста номер 2?
0 голосов
ответил 29 Март, 10 от Van_Geo (5,560 баллов)
Код из поста 2.
Добавляю все 600 слоев в ArcMap
0 голосов
ответил 29 Март, 10 от Van_Geo (5,560 баллов)
Получилось, нашел как сделать цикл по ссылке:
http://resources.esri.com/help/9.3/ArcGISDesktop/ArcObjects/esriCarto/IMap_Layers.htm
Подправил код и заработало:
(к большому моему удивлению. Это первый скрипт который я запустил)

Implements ICalculatorCallback

Private Sub addfield_Click()
    'At this point, we need to NOT be editing
    Dim pMxDoc As IMxDocument
    Set pMxDoc = ThisDocument
   
    Dim pMap As IMap
    Set pMap = pMxDoc.FocusMap
   
    Dim pEnumLayer As IEnumLayer
    Dim pId As New UID
    Dim pLayer As ILayer
    Dim pFLayer As IFeatureLayer
    Dim pFeatClass As IFeatureClass
    Dim NewField As IFieldEdit

    pId = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}"
    Set pEnumLayer = pMap.Layers(pId, True)
    pEnumLayer.Reset
   
    Set pLayer = pEnumLayer.Next
    Do While Not pLayer Is Nothing
        'Set pLayer = pMxDoc.SelectedLayer
        Set pFLayer = pLayer
        Set pFeatClass = pFLayer.FeatureClass
        Set NewField = New Field
       
   
        'MsgBox "hello" & pLayer.Name
       
        With NewField
            .Type = esriFieldTypeString
            .Name = "Segments"
        End With
       
        pFeatClass.AddField NewField
       
        'Now we need to start editing
        Dim ws As IWorkspace
        Dim ds As IDataset
        Set ds = pFeatClass
        Set ws = ds.Workspace
        Dim ed As IEditor
        Set ed = Application.FindExtensionByName("ESRI OBJECT EDITOR")
        ed.StartEditing ws
        'ed.StartOperation
       
        Dim pcalc As ICalculator
        Dim pcursor As ICursor
       
       
        Set pcalc = New Calculator
       
        Set pcursor = pFeatClass.Update(Nothing, True)
        Set pcalc.Cursor = pcursor
        pcalc.Field = "Segments"
        pcalc.Expression = Chr(34) & pFLayer.Name & Chr(34)
        Set pcalc.Callback = Me
        pcalc.Calculate
       
        'ed.StopOperation "Calculate Segments"
        ed.StopEditing True
           
        Set pcursor = Nothing
   
       
    
       
       
        pMxDoc.UpdateContents
       
    Set pLayer = pEnumLayer.Next
    Loop
   
    Dim pActiveView As IActiveView
    Set pActiveView = pMxDoc.ActiveView
   
    pActiveView.Refresh
End Sub

Private Function ICalculatorCallback_CalculatorError(ByVal rowID As Long, ByVal bHasOID As Boolean, ByVal errorType As esriGeoDatabaseUI.esriCalculatorErrorType, ByVal bShowPrompt As Boolean, ByVal errorMsg As String) As Boolean

End Function

Private Sub ICalculatorCallback_CalculatorWarning(ByVal rowID As Long, ByVal bHasOID As Boolean, ByVal errorType As esriGeoDatabaseUI.esriCalculatorErrorType, ByVal errorMsg As String)

End Sub

Private Function ICalculatorCallback_Status(ByVal rowsWritten As Long, ByVal lastStatus As Boolean) As Boolean

End Function

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...