Programming for
Geographical Information Analysis:
Advanced Skills
Lecture 2: ArcObjects Framework
Dr Andy Evans
AddIn Architecture
ArcObjects Framework
Java
Direct access to ArcObjects Framework inside and outside Arc.
Ability to add components to the GUI.
Ability to communicate with external applications.
AddIns
Button : Icon on toolbar.
Tool : Changes mouse operations.
Combo box : Dropdown list and editable box.
Toolbar : For grouping AddIns.
Menu : Dropdown and right-click.
Tool palette : Floating container for other AddIns.
Dockable window : Floating window that can be locked into
the GUI.
Application extension : Additional functionality within, e.g. Arc
extensions.
Form
jar zip file, with a .esriaddin extension
Contains:
config.xml : metadata describing the addin
Java class files
Other resources needed : e.g. data, images
Installing
File is just dropped into
%USERPROFILE%\
My Documents\ArcGIS\AddIns\Desktop10.2
or
%USERPROFILE%\
Documents\ArcGIS\AddIns\Desktop10.2
There are easy install options for users (double clicking on the
addin will bring up a wizard to walk through installing it)
Installing a sent AddIn
AddIn Manger
Installing a sent AddIn
Choose “Add from file” and
navigate to the file.
Should then see it under the
commands list in whatever
Category you’ve created for it
in the XML file.
Drag and drop from here,
onto the interface.
Managing AddIns
Admin Registry Keys (regedit.exe)
HKEY_LOCAL_MACHINE\SOFTWARE\ESRI\Desktop10.2 \ Settings
BlockAddIns
0 - Load all.
1 - Load signed only.
2 - Load ESRI only.
3 - Load from administrator folders only.
4 - Do not Load any Add-Ins.
AddInFolders
AdminAddInLock - stop tampering with these.
Digital signing
See:
http://help.arcgis.com/en/sdk/10.0/Java_AO_ADF/concept
ualhelp/engine/index.html#/Digitally_signed_add_ins/0001
000004zq000000/
Making an AddIn
Rather than writing the config.xml ourselves, and zipping it
up manually with the java files, there’s an Eclipse IDE
plugin.
This does all the basic class generation for us, and prepares
the file.
Details for installing the IDE and plugin on the website.
Eclipse
Eclipse
Project area
Editor area,
currently showing
config.xml, but
shown as a form,
not text.
Show
xml text
source
Config.xml
Eclipse
Should check code as you write.
Will compile when you save the file.
Errors reported in problems panel:
Note that the javadoc panel displays the javadocs of known
classes.
Eclipse
Will autocomplete as you type. Will also suggest
potential quick fixes if you click on hover over an
issue.
Debugging
No System.out.println();
Best bet is:
JOptionPane.showMessageDialog(null, String);
E.g.
JOptionPane.showMessageDialog(null, "Hello World");
Or for exception checking…
catch (Exception e){
JOptionPane.showMessageDialog(null,
e.getStackTrace());
}
Help coding
Course Code Cookbook
There’s no point in you struggling to find key bits of
code on ESRI’s site.
So, there are many useful code examples, stripped
down to be a simple as possible, on the course website.
The quid pro quo:
Send us useful code you get working.
Read and try and understand the code, don’t just cutand-paste it. Ask questions!
Help coding
Intro to Eclipse:
Help -> Welcome -> Overview / Tutorials
Arc Programming pages:
http://resources.arcgis.com/en/help/arcobjectsjava/concepts/engine/
Java ArcObjects Developer Guide ->
Developing extensions ->
ArcGIS Desktop customizations using add-ins
Help coding
API:
http://resources.arcgis.com/en/help/arcobjectsjava/api/arcobjects/index.html
Note that the API docs are a re-write of the VB pages, and still
contain some VB code:
If it says “This parameter is optional”, it usually isn’t.
If it says “If you don’t want this parameter, just pass in zero”
or “Nothing”, then pass in null.
If it gives Variant as a return type, it returns
java.lang.Object.
Select the AddIn
If you are developing, you need to reboot Arc to get
changes to appear, but you don’t need to re-add the
addIn.
Extensions
Classes that extend Arc functionality
Custom feature renderers
Custom geoprocessing tools : can be added to
ArcToolbox and ModelBuilder
Class extensions : Change form of data
Plug-in data sources
Utility objects : Combine other tools
Installing
Jar file placed in
<ArcGIS Install Dir>/java/lib/ext
Programming ArcGIS
AddIn Architecture
ArcObjects Framework
Code
The code that goes in the addIn is then code to work with
the ArcObjects framework.
The running version of Arc is
accessed via gatekeeper objects.
You then request objects from
these, and subsequent objects
from the objects you get back.
Ask App for Document
Ask Document for Maps
Ask Maps for a Map
Ask Map for Layers
Ask Layers for Layer etc.
init(IApplication app)
Most addIns come with a init method that can be overridden.
This is sent the application as an entry point for the running
framework.
import com.esri.arcgis.framework.*;
private IApplication app;
@Override
public void init(IApplication app){
this.app = app;
}
Document
You can use this to get hold of the current document. This is
the current data and GUI.
import com.esri.arcgis.arcmapui.*;
IMxDocument mxDoc =
(IMxDocument)app.getDocument();
API
It is then just a matter of finding how to do stuff in the API
docs:
http://resources.arcgis.com/en/help/arcobjectsjava/api/arcobjects/index.html
N.B.
The code utilises Java Annotations.
@name
Used as a marker for software intending to process the
code.
@Override
N.B.II
Arc returns objects that implement multiple interfaces.
You generally cast the object to a specific interface when using
it.
IMxDocument mxDoc =
(IMxDocument)app.getDocument();
There is nothing to stop you recasting it to another interface to
use different methods in it:
IDocument iDoc = (IDocument) mxDoc;
Infact, it is very common.
The COM
In Microsoft languages, this reassignment of interface labels is
key.
It allows chunks of code to use other chunks of code without
knowing anything other than the interface names.
It is used to hold together a great deal of the Component Object
Model (COM) at the heart of Microsoft software.
ArcGIS is built around the COM, so this is a common thing to
see.
Interfaces
This requires some care.
You might think that redefining everything as the right
object would be sensible:
public void init(IApplication app){
Application a = (Application)app;
You could then use all the methods.
However, while objects Arc gives you will match the
interfaces, they may not do anything sensible.
Interfaces
For example, this works in ArcMap:
public void init(IApplication app){
Application a = (Application)app;
IGxSelection selec = a.getSelection();
JOptionPane.showMessageDialog
(null, selec.toString());
}
But doesn’t give you anything sensible, as IGxSelection is an
ArcCatalog class, and here the Application object is the
ArcMap Application object, not the ArcCatalog one.
Interfaces
In general, better to get the interface right and keep the
object defined by its interfaces.
As well as explicitly casting, just attaching the right label
works if you are going to a less specific class:
IMxDocument mxDoc = app.getDocument();
But generally in the examples you’ll see an explicit cast
because it saves looking up the relationship.
In the API Docs, in general go for the interface list at the top
of the class.
Interfaces generally start “I”
Then “Mx” for ArcMap, “Gx” for ArcCatalog.
ArcMap IApplication methods
newDocument(boolean userPickTemplate?, String path)
openDocument(String optionalPath)
refreshWindow()
saveDocument(String optionalPath)
If the paths are null,
the usual “new”,
“open”, and “save”
processes occur.
ArcMap IMXDocument methods
Used for getting data:
getActiveView()
i.e. layout view or data view data.
getFocusMap()
i.e. currently selected/shown map.
getMaps()
i.e. all maps.
getSelectedItem() i.e. that the user has picked.
getSelectedLayer() i.e. that the user has picked.
Documents also implement IDocument, the main use of which
is programmatically controlling toolbars.
Next Lecture
Getting, sorting, and searching data.
Practical
Hello World!
Utilising tools in Arc Addins.