Tambahkan layer untuk membuka mxd menggunakan ArcObjects dari luar dokumen peta crash ArcMap

8

Saya memiliki database Access (MS Access 2010) yang memungkinkan pengguna untuk memasukkan berbagai informasi pengolahan lahan termasuk titik terkait, garis, atau poligon yang dapat dipilih pengguna dan database kemudian akan dimuat sebagai bagian dari proyek, ke master geodatabase, dan memungkinkan pengguna untuk melihat fitur-fitur dalam ArcMap. Di Arc 9.3 ini semua dilakukan dengan VBA dan bekerja dengan baik. Karena peningkatan ke Arc 10, VBA tidak lagi menjadi pilihan dan saya telah belajar cara memprogram dalam python dan memanggil perintah melalui Access menggunakan fitur Shell. Saya hampir menyelesaikan semuanya kecuali untuk memungkinkan pengguna untuk menambahkan fitur mereka ke dokumen ArcMap saat ini. Berikut langkah-langkah yang harus dilakukan.

1) Pengguna mengklik tombol dalam program Access yang mengidentifikasi fitur yang diminati.

2) Akses menentukan apakah mxd yang benar terbuka dan jika tidak membukanya (dokumen biasanya terbuka sehingga langkah ini sering tidak perlu)

3) Skrip Python terbuka menggunakan perintah Python shell, mengidentifikasi mxd yang benar dan terbuka, dan menambahkan fitur ke dokumen ArcMap terbuka

Saya telah mencoba keduanya arcpy dan ArcObjects. Saya dapat menjalankan arcpy di peta terbuka tetapi membuka file Python melalui VBA di MS Access tidak memanipulasi mxd terbuka. Forum ESRI menyarankan agar saya bekerja dengan ArcObjects. Saya telah menemukan dan menggunakan kode untuk mengidentifikasi dan memanipulasi lapisan yang sudah dimuat dalam dokumen ArcMap yang menarik tetapi saya benar-benar terjebak pada bagaimana mengidentifikasi dan menambahkan lapisan baru. Berikut adalah kode sejauh ini, saya pikir ini akan berfungsi jika saya dapat dengan benar mengidentifikasi file layer di bagian terakhir dari kode. Setidaknya semuanya berjalan tanpa pMap.AddLayer (FC) di dekat bagian bawah kode, tapi saya seorang ahli ekologi dan bukan programmer dengan pelatihan sehingga mungkin ada hal lain yang saya lewatkan. Bantuan apa pun akan dihargai.

Pembaruan: Saya sekarang sangat dekat. Saya dapat mengidentifikasi fitur dalam geodatabase tetapi sekarang ArcMap lumpuh ketika mencoba menambahkan data ke peta dan saya menghasilkan kesalahan: COMError: (-2147467259, 'Kesalahan tidak ditentukan', (Tidak Ada, Tidak Ada, Tidak ada, 0, Tidak Ada) . Namun, output saya muncul untuk mengidentifikasi fitur yang benar. Saya tidak yakin mengapa ArcMap mogok. Tolong bantu, saya sangat dekat.

import arcpy
from arcpy import env
import os
import sys
import comtypes.gen.esriArcMapUI as esriArcMapUI
import comtypes.gen.esriCarto as esriCarto
import comtypes.gen.esriGeoDatabase as esriGeoDatabase
import comtypes.gen.esriFramework as esriFramework
import comtypes.gen.esriSystem as esriSystem
import comtypes.gen.esriDataSourcesFile as DataSourcesFile

#Eventaully these will be the arguments that call the feature
#test = sys.argv[0]
#Name = sys.argv[1]
#Alias = sys.argv[2]

def NewObj(MyClass, MyInterface):
    from comtypes.client import CreateObject
    try:
        ptr = CreateObject(MyClass, interface=MyInterface)
        return ptr
    except:
        return None

def CType(obj, interface):
    try:
        newobj = obj.QueryInterface(interface)
        return newobj
    except:
        return None

def GetApp():
    """Get a hook into the current session of ArcMap""" 
    #from comtypes.gen import esriFramework
    pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
    if pAppROT is not None:
        iCount = pAppROT.Count 
        if iCount == 0: 
            print 'No ArcGIS application currently running.  Terminating ...' 
            return None 
        for i in range(iCount): 
            pApp = pAppROT.Item(i)  #returns IApplication on AppRef
            print pApp.Name
            if pApp.Name == 'ArcMap': 
                print "ArcMap found"
                pDoc = pApp.Document
                print pDoc.Title
                if pDoc.Title == "CreateShapefile10x.mxd" or pDoc.Title == "CreateShapefile10x":
                    return pApp 
    print 'No ArcMap session is running at this time.' 
print "No AppROT found"
print "Failed"
return None

pApp = GetApp()

try:
    pDoc = pApp.Document
    pMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
    pMap = pMxDoc.FocusMap
    if pMap.Name == "LTDL Layers":

        ###New Code###

        sPath = r"Y:\LTDL_Data\LTDL_Files\Abate_Seeding_1965\Abate_Seeding_1965.gdb"
        sPath1 = r"Abate_Seeding_1965"
        pWSF = NewObj(esriDataSourcesGDB.FileGDBWorkspaceFactory, esriGeoDatabase.IWorkspaceFactory)
        print pWSF
        pWS = pWSF.OpenFromFile(sPath, 0)
        pDS = CType(pWS, esriGeoDatabase.IDataset)

        print "Workspace name: " + pDS.BrowseName
        print "Workspace category: " + pDS.Category

        FWSS = CType(pWS, esriGeoDatabase.IFeatureWorkspace)
        FL = NewObj(esriCarto.FeatureLayer, esriCarto.IFeatureLayer)
        FL.FeatureClass = FWSS.OpenFeatureClass(sPath1)
        print FL
        print FL.FeatureClass.AliasName
        LAN = CType(FL, esriCarto.ILayer)
        LAN.Name = FL.FeatureClass.AliasName + ": Project Boundary"
        print LAN.Name

        ###New Code###

        pMap.AddLayer(FC)
        pLayout = pMxDoc.PageLayout
        pActiveView = CType(pLayout, esriCarto.IActiveView)
        pActiveView.Refresh()
        pMxDoc.UpdateContents
    print "Done"
except:
    print "Failed"
pengguna6287
sumber
1
Coba gunakan IObjectFactory untuk membuat singleton pabrik ruang kerja dalam proses yang benar seperti dalam pertanyaan ini: ArcMap / ArcObjects - Menggambar grafik di layar: Penjelasan atau tutorial untuk metode Draw / Refresh / PartialRefresh?
blah238
Mencoba menambahkan elemen atext seperti yang dijelaskan dan masih menimbulkan kesalahan. pFact = CType (pApp, esriFramework.IObjectFactory) graphicsContainer = pMxDoc.ActiveView.GraphicsContainer textElement = CType (pFact.Create ("esriCarto.TextElement"), esriCarto.ITextElement) graphicsContainer.AddPelipatanTuliskanDalamAtap, PerkuatanDalamIlibatTuliskan (Perkuatan) Perkuatan esriCarto.esriViewGraphics, Tidak Ada, Tidak Ada). Selanjutnya saya menambahkan lapisan kosong tanpa sumber data dan menggunakan mapAdmin2.FireChangeFeatureClass (OFL, NFC) untuk menetapkan sumber data. ArcMap dimulai dan kemudian jatuh dan ditutup seperti sebelumnya.
user6287
1
Pertanyaan ini mungkin harus ditutup karena tampaknya penulis telah kehilangan minat.
blah238

Jawaban:

2

Anda menambahkan layer "FC" ke peta Anda yang seharusnya "FL" atau "LAN". Baik layer fitur atau layer seharusnya berfungsi.

Perlu diketahui bahwa peta mungkin dalam tampilan data, bukan tampilan tata letak dalam hal ini pMxDoc.PageLayout salah ... Saya tidak bisa mengatakan apa itu pLayout karena tidak ditentukan dalam blok kode.

Akan lebih aman menggunakan IMXDocument.FocusMap karena ini bisa berupa tata letak tipe atau tampilan data.

dengan asumsi pApp adalah IApplication:

IMxDocument pDoc = (IMxDocument) pApp.Document;
IMap pMap = pDoc.FocusMap;
pMap.AddLayer(LAN);

OR

(pApp.Document as IMxDocument).FocusMap.AddLayer(LAN);

Saya biasanya melakukannya pada tiga baris sehingga tidak membingungkan bagi pembaca.

  • Ups! itu C #, salahku! VB tidak terlalu sulit untuk dikerjakan dari sini karena Anda sudah mencapai pMap = pMxDoc.FocusMap.

ps Saya pribadi lebih suka meredupkan objek, membuatnya lebih mudah untuk mengetahui apa yang terjadi:

dim pMxDoc as IMxDocument = ctype(pApp.Document, IMxDocument)
dim pMap as IMap = pMxDoc.FocusMap

Dengan begitu pembaca mengetahui dengan pasti apa masing-masing objek itu.

Michael Stimson
sumber
Selain pertanyaan ini berusia lebih dari satu setengah tahun, pertanyaan ini menggunakan tipe Python + comtypes, bukan C # atau VB.NET. Dan saya pikir hal FC mungkin hanya kesalahan ketik dalam pertanyaan daripada kode yang sebenarnya, karena akan ada NameErrorsaja.
blah238
3
Saya tidak melihat berapa umur utas itu, itu tidak penting bagi pembaca berikutnya yang menemukan cara di sini dari google seperti saya sudah berkali-kali ... berkali-kali saya merasa harus bergabung. Sebuah pertanyaan adalah pertanyaan dan demi pembaca berikutnya saya merasa saya harus menunjukkan kesalahan yang jelas.
Michael Stimson