Knowledge Base - Technical Articles
HowTo: Limit the classes displayed in a legend to features shown in the view
| Article ID: | 20968 |
|---|---|
| Software: | ArcView GIS 3.0, 3.0a, 3.0b, 3.1, 3.2, 3.2a |
| Platforms: | N/A |
Summary
You can use the following Avenue script to limit the classes displayed in a legend to only those that correspond to features within the current extent of the view.
Procedure
- Open a new script window.
-show me- A. Activate the Project window.
B. Click the Scripts icon.
C. Click New. - Copy the following code into the new window:
'-- This script temporarily limits each theme to just the records
'-- in the display's extent and uses the built-in capability of a
'-- legend to return class counts to determine which classes
'-- it can dispense with. It is a general approach that
'-- does not need to worry about the details of each legend.
'-- Obtain the view's extent. It will be used to select the
'-- features for classification.
theView=av.GetActiveDoc
if (theView.Is(View).Not) then return NIL end
theExtent=theView.GetDisplay.ReturnExtent '-- Will select in the visible extents
'-- Process each active theme, if any.
sLog = "" ' Records what happens
for each theTheme in theView.GetActiveThemes
if (theTheme.Is(FTheme) and theTheme.CanSelect and
theTheme.CanReturnClassCounts) then
theFTab=theTheme.GetFtab
'
'-- Select visible features.
theFTab.RememberSelection
theTheme.SelectbyRect(theExtent,#VTAB_SELTYPE_NEW)
'
'-- Limit the theme to the selected features.
theFTab.SetDefBitmap(theFTab.GetSelection.Clone)
theFTab.UpdateDefBitmap
'
'-- Remove unused classes from the legend.
lstCounts = theTheme.ReturnClassCounts
lstClassifications = theTheme.GetLegend.GetClassifications
lstSymbols = theTheme.GetLegend.GetSymbols
n = 0 ' Counts the number of classes removed.
for each i in lstClassifications.Count-2..0 by -1 ' Skip the NoData class
if (lstCounts.Get(i) = 0) then
lstClassifications.Remove(i)
lstSymbols.Remove(i)
n = n+1
end
end
theTheme.UpdateLegend ' Cause the legend to redraw in the TOC
'
'-- Log the changes.
if (n = 1) then sClass = "class" else sClass = "classes" end
sLog = sLog + NL + "[" + theTheme.GetName + "]: " +
n.AsString ++ sClass ++ "removed."
'
'-- Restore the original definition and selection.
theFTab.SetDefinition(theFTab.GetDefinition)
theFTab.UpdateDefBitmap
theFTab.SetSelection(theFTab.GetLastSelection)
else '-- This is an image or grid theme, most likely.
sLog = sLog + NL + "[" + theTheme.GetName + "] could not be modified."
end
end
'-- Summarize results.
if (sLog <> "") then
MsgBox.Report("Summary of changes made to legends:" + NL + sLog, Script.The.GetName)
end
'-- End of Script
- Attach the script to a button on the View GUI.
-show me- A. Compile the script.
B. Switch to the Project window.
C. Select Customize from the Project menu.
D. On the Customize dialog box, click the Type dropdown arrow and click View.
E. Select Buttons under Category.
F. Click the New button.
G. Double-click the Click property in the Customize dialog box.
H. Type the name of the script in the Script Manager and click Select.
I. Close the Customize dialog box.
For more information, see "Customize dialog box" in ArcView Help. - Make the theme active. This is the theme for which you wish to alter the legend classes.
- Zoom to a location within the theme extent.
- Click the new button to run the script.
Created: 11/16/2001
Last Modified: 2/10/2009