About the Decluttering MOLE graphics using leadering and stacking Sample
[C#]
MainForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.DefenseSolutions;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
namespace MoleLeaderStack
{
public partial class MainForm : Form
{
private Random m_Random = new Random();
private IMoleGroupElement m_MoleGroup = null;
private IElement m_element;
private String[] m_sicArray = { "SFAPC----------", "SFAPCF---------", "SFAPFH---------", "SFAPCL---------", "SFAPM----------" };
public MainForm()
{
InitializeComponent();
LoadDefaultMapData();
}
// Adds multiple MOLE graphics using IGroupElement.
private void btnAddGraphics_Click( object sender, EventArgs e )
{
m_MoleGroup = new MoleGroupElementClass();
if (m_MoleGroup == null)
return;
IGroupElement ge = m_MoleGroup as IGroupElement;
if (ge != null)
{
IElement el = null;
for (int i = 0; i < m_sicArray.Length; ++i)
{
IPoint pPoint = CreateRandomPoint();
string sic = m_sicArray[ i ];
el = BuildElement( pPoint, sic );
ge.AddElement( el );
}
}
m_element = m_MoleGroup as IElement;
if (m_element != null)
Draw();
}
// Applies leadering on the graphics in the group element.
private void btnLeader_Click( object sender, EventArgs e )
{
if (m_MoleGroup != null)
{
// base options
m_MoleGroup.DeclutterOption = moleDeclutterOptionEnum.moleDeclutterLeader;
m_MoleGroup.EnableDeclutter = true;
// leadering option
(m_MoleGroup as IMoleLeaderElement).LeaderQuadrant = moleQuadrantEnum.moleQuadrantUR;
(m_MoleGroup as IMoleLeaderElement).Anchor = CreateRandomPoint();
(m_MoleGroup as IMoleLeaderElement).Base = CreateRandomPoint();
m_element = m_MoleGroup as IElement;
if (m_element != null)
Draw();
}
}
// Applies stacking on the graphics in the group element.
private void btnStack_Click(object sender, EventArgs e)
{
if (m_MoleGroup != null)
{
m_MoleGroup.DeclutterOption = moleDeclutterOptionEnum.moleDeclutterStack;
m_MoleGroup.EnableDeclutter = true;
// stacking option
(m_MoleGroup as IMoleStackElement).StackQuadrant = moleQuadrantEnum.moleQuadrantLR;
m_element = m_MoleGroup as IElement;
if (m_element != null)
Draw();
}
}
/// <summary>
/// Draws the IElement to the map.
/// </summary>
private void Draw()
{
this.axMapControl1.ActiveView.GraphicsContainer.AddElement( m_element, 0 );
// update the view
this.axMapControl1.ActiveView.PartialRefresh( esriViewDrawPhase.esriViewGraphics, null, null );
}
/// <summary>
/// Builds an IElement from an IPoint.
/// </summary>
/// <param name="loki">IPoint object</param>
/// <param name="sic">symbol ID code</param>
/// <returns>IElement object</returns>
private IElement BuildElement(IPoint loki, string sic)
{
IMoleSymbol ms = new MoleMarkerSymbolClass();
ms.SymbolID = sic;
// create the MarkerElement
IMarkerElement me = new MarkerElementClass();
me.Symbol = ms as IMarkerSymbol;
IElement m_element = me as IElement;
m_element.Geometry = loki as IGeometry;
return m_element;
}
/// <summary>
/// Generates a point with random coordinates.
/// </summary>
/// <returns>IPoint object</returns>
public IPoint CreateRandomPoint()
{
IPoint point = new PointClass();
point.PutCoords(m_Random.Next(-30, 30), m_Random.Next(-30, 30));
return point;
}
private string GetSdkDataPath()
{
//get the ArcGIS path from the registry
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ESRI\ArcGIS_SXS_SDK");
string path = Convert.ToString(key.GetValue("InstallDir"));
//set the of the logo
string str = System.IO.Path.Combine(path, @"Samples\data\");
if (!System.IO.Directory.Exists(str))
{
MessageBox.Show("Path :" + str + " does not exist!");
return string.Empty;
}
return str;
}
private void LoadDefaultMapData()
{
string dataPath = GetSdkDataPath() + @"MilitaryOverlayEditor\";
string defaultMxDoc = dataPath + "molebasemap.mxd";
object missing = System.Reflection.Missing.Value;
if (this.axMapControl1.CheckMxFile(defaultMxDoc))
this.axMapControl1.LoadMxFile(defaultMxDoc, missing, missing);
else
{
string errorMsg = "Could not load default map document - Application may not work!";
errorMsg += "\n" + defaultMxDoc;
System.Diagnostics.Trace.WriteLine(errorMsg);
MessageBox.Show(errorMsg);
}
}
// Clears all graphics from the map control.
private void btnClear_Click( object sender, EventArgs e )
{
axMapControl1.ActiveView.GraphicsContainer.DeleteAllElements();
axMapControl1.ActiveView.Refresh();
}
}
}
[Visual Basic .NET]
MainForm.vb
Public Class MoleLeaderStack
Dim m_Random As New Random
Dim checkStack As Boolean
Dim sicArray() As String = {"SFAPC----------", "SFAPCF---------", "SFAPFH---------", "SFAPCL---------", "SFAPM----------"}
Dim m_mge As ESRI.ArcGIS.DefenseSolutions.IMoleGroupElement
Dim m_element As ESRI.ArcGIS.Carto.IElement
#Region "class constructor"
Public Sub New()
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine)
InitializeComponent()
End Sub
#End Region
' Adds multiple MOLE graphics using IGroupElement.
Private Sub btnAddGraphics_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddGraphics.Click
m_mge = New ESRI.ArcGIS.DefenseSolutions.MoleGroupElementClass()
Dim groupElement As ESRI.ArcGIS.Carto.IGroupElement
groupElement = m_mge
If Not groupElement Is Nothing Then
Dim element As ESRI.ArcGIS.Carto.IElement
Dim i As String
For Each i In sicArray
Dim point As ESRI.ArcGIS.Geometry.Point
point = CreateRandomPoint()
element = BuildElement(point, i)
groupElement.AddElement(element)
Next i
End If
m_element = m_mge
Draw()
End Sub
' Generates a point with random coordinates
Private Function CreateRandomAnchorPoint() As ESRI.ArcGIS.Geometry.IPoint
'Create a new point and set its properties
Dim point As ESRI.ArcGIS.Geometry.IPoint
point = New ESRI.ArcGIS.Geometry.PointClass()
point.PutCoords(m_Random.Next(-10, 10), m_Random.Next(-10, 10))
Return point
End Function
Public Function CreateRandomPoint() As ESRI.ArcGIS.Geometry.IPoint
' Create a new point and set its properties
Dim point As ESRI.ArcGIS.Geometry.IPoint
point = New ESRI.ArcGIS.Geometry.PointClass()
point.PutCoords(m_Random.Next(-30, 30), m_Random.Next(-30, 30))
Return point
End Function
Private Function GetSdkDataPath() As String
'get the ArcGIS path from the registry
Dim key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\ESRI\ArcGIS_SXS_SDK")
Dim path As String = Convert.ToString(key.GetValue("InstallDir"))
'set the of the logo
Dim str As String = System.IO.Path.Combine(path, "Samples\data\")
If (Not System.IO.Directory.Exists(str)) Then
MessageBox.Show("Path :" & str & " does not exist!")
Return String.Empty
End If
Return str
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AxMapControl1.LoadMxFile(GetSdkDataPath() + "MilitaryOverlayEditor\molebasemap.mxd")
End Sub
' Clears the map of all graphics.
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
AxMapControl1.ActiveView.GraphicsContainer.DeleteAllElements()
AxMapControl1.ActiveView.Refresh()
End Sub
' Applies stacking on the graphics in the group element.
Private Sub btnAddStacked_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddStacked.Click
If Not m_mge Is Nothing Then
m_mge.DeclutterOption = ESRI.ArcGIS.DefenseSolutions.moleDeclutterOptionEnum.moleDeclutterStack
m_mge.EnableDeclutter = True
' stacking option
Dim stackElem As ESRI.ArcGIS.DefenseSolutions.IMoleStackElement
stackElem = m_mge
stackElem.StackQuadrant = ESRI.ArcGIS.DefenseSolutions.moleQuadrantEnum.moleQuadrantLR
m_element = stackElem
Draw()
End If
End Sub
' Applies leadering on the graphics in the group element.
Private Sub btnLeader_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLeader.Click
If Not m_mge Is Nothing Then
m_mge.DeclutterOption = ESRI.ArcGIS.DefenseSolutions.moleDeclutterOptionEnum.moleDeclutterLeader
m_mge.EnableDeclutter = True
Dim mle As ESRI.ArcGIS.DefenseSolutions.IMoleLeaderElement
mle = m_mge
mle.LeaderQuadrant = ESRI.ArcGIS.DefenseSolutions.moleQuadrantEnum.moleQuadrantUR
mle.Anchor = CreateRandomPoint()
mle.Base = CreateRandomPoint()
m_element = m_mge
Draw()
End If
End Sub
Private Function BuildElement(ByVal loki As ESRI.ArcGIS.Geometry.Point, ByVal sic As String) As ESRI.ArcGIS.Carto.IElement
Dim ms As ESRI.ArcGIS.DefenseSolutions.IMoleSymbol
ms = New ESRI.ArcGIS.DefenseSolutions.MoleMarkerSymbolClass()
ms.SymbolID = sic
' create the MarkerElement
Dim markerEl As ESRI.ArcGIS.Carto.IMarkerElement = New ESRI.ArcGIS.Carto.MarkerElementClass()
markerEl.Symbol = ms
Dim element As ESRI.ArcGIS.Carto.IElement
element = markerEl
element.Geometry = loki
Return element
End Function
Sub Draw()
AxMapControl1.ActiveView.GraphicsContainer.AddElement(m_element, 0)
'update the view
AxMapControl1.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, Nothing, Nothing)
End Sub
End Class