2

I have a windows forms application (Z application), is it possible to start Arcmap, and start the Editor or any other command I desire from the application (Z appliction) ?

So far I was able to initialize and bind the license, so now I am able to access feature classes using Arcobjects without starting arcmap, but I want to start Arcmap, add featurelayers, start editing, and then save those edits. The only missing part is the part where I am able to run arcmap and access the application to get the document.

here is the flow

 RuntimeManager.BindLicense(ProductCode.EngineOrDesktop); 
 IAoInitialize s = new AoInitializeClass();
 s.Initialize(esriLicenseProtCode.esriLicenseProductCodeAdvanced);

next step would be to start arcmap

 `Process.Start("arcmapDirectory")

Arcmap starts, then this is where I am stuck, I want to access the arcmap application, so I can get mxdocument, and commands.

PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked Mar 23, 2017 at 10:40
0

1 Answer 1

3

This is VB.net rather than C# but you can probably get the process First import the libraries you need :e.g.

Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.ArcMapUI
Imports ESRI.ArcGIS.Carto

etc.

Then create an application :

Private m_App As ESRI.ArcGIS.Framework.IApplication

Instantiate and create a document with some data sources :

Public Sub StartArcMap()
 If m_pDoc Is Nothing Then
 System.Windows.Forms.Cursor.Current = Cursors.WaitCursor
 'Start arcmap
 'm_pDoc = New MxDocumentClass
 Dim FrameDoc As ESRI.ArcGIS.Framework.IDocument = New 
 ESRI.ArcGIS.ArcMapUI.MxDocumentClass()
 m_App = FrameDoc.Parent
 m_App.Visible = True
 Dim pDoc As IDocument = m_App.Document()
 Dim pMxDoc As IMxDocument = CType(pDoc, IMxDocument)
 'Show arcmap
 m_App.Visible = True
 'Disable and enable buttons
 cmdStartArcMap.Enabled = False
 cmdAddData.Enabled = True
 cmdQuitArcMap.Enabled = True
 System.Windows.Forms.Cursor.Current = Cursors.Default
 Dim pActiveView As IActiveView
 pActiveView = pMxDoc.ActiveView
 Dim pFLayer As IFeatureLayer
 pFLayer = New FeatureLayer
 'Dim pFClass As IFeatureClass
 Dim pShpWSF As GxShapefileFactory
 pShpWSF = New GxShapefileFactory
 Dim DataPath As String
 DataPath = **"C:\DATA STUFF"**
 'DataPath = **"SOME WHERE"**
 'AddShapeFile(DataPath, m_pApp, pMxDoc, pActiveView)
 AddData(m_App, DataPath)
 End If
End Sub

Finally create the MXd and add the data :

Public Sub AddData(ByRef m_Application, Datapath)
 Dim objFactory As IObjectFactory = TryCast(m_Application, 
 IObjectFactory)
 'Use reflection to get ClsID of ShapefileWorkspaceFactory.
 Dim shpWkspFactType As Type = GetType(ShapefileWorkspaceFactoryClass)
 Dim typeClsID As String = shpWkspFactType.GUID.ToString("B")
 Dim workspaceFactory As IWorkspaceFactory = 
 DirectCast(objFactory.Create(typeClsID), IWorkspaceFactory)
 Dim featureWorkspace As IFeatureWorkspace = 
 DirectCast(workspaceFactory.OpenFromFile(Datapath, 0), 
 IFeatureWorkspace)
 Dim MxDType As Type = GetType(IMxDocument)
 Dim MxDClsID As String = MxDType.GUID.ToString("B")
 'Dim pMxDoc As IMxDocument = DirectCast(objFactory.Create(MxDClsID), 
 IMxDocument)
 Dim pMxDoc As IMxDocument = CType(m_App.Document, IMxDocument)
 Dim featureLayer As IFeatureLayer = 
 DirectCast(objFactory.Create("esriCarto.FeatureLayer"), IFeatureLayer)
 featureLayer.FeatureClass = featureWorkspace.OpenFeatureClass("wPoints")
 featureLayer.Name = featureLayer.FeatureClass.AliasName
 'Add the layer to the document.
 Dim document As IBasicDocument = DirectCast(m_Application.Document, 
 IBasicDocument)
 document.AddLayer(featureLayer)
 document.UpdateContents()
 Dim pFClass As IFeatureClass
 pFClass = featureWorkspace.OpenFeatureClass("wPoints")
 'pFClass = featureLayer.FeatureClass
 Dim pFeature As IFeature = pFClass.GetFeature(20)

That should be enough to see how one gets a handle on the Application, the Mxd, data and objects there in?

answered Mar 23, 2017 at 12:22
4
  • Thank you, but doesn't creating an MxDocumentClass object automatically start arcmap and creates a document ? if so, how can I make it where I use the arcmap that is already started by the process ? I am trying to run arcmap in the background as I do the editing. Commented Mar 23, 2017 at 13:01
  • You need to get the window handle of the process from the OS and use that to create the application. Its a long time since I did that, I have the code somewhere but it might take afew days before I could track it down. I should warn you however that I tried something similar the otherway around (opening MS Access repeatedly from ArcGIS) I never did figure out a way to Kill it properly afterward. Commented Mar 23, 2017 at 14:17
  • I'll keep that in mind, thank you for your help. I'll just start Arcmap from the document and hide it instead of using Process.Start, if you get to track the code you have please share :). Commented Mar 23, 2017 at 14:34
  • 1
    m_app.Visible = False; resources.arcgis.com/en/help/arcobjects-net/componenthelp/… will start ArcMap and allow you to do all your usual tasks but does not show the application (except in task manager).. when you're done setting up then set the m_app.Visible to True and the ArcMap session will appear. A MxDocument does not need to be persisted to a file, if you want to keep the document you will need to save m_app.SaveDocument(pSavePath); resources.arcgis.com/en/help/arcobjects-net/componenthelp/… Commented Mar 23, 2017 at 23:30

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.