This guide uses the APP-6A symbology to describe the military symbology functionality. The functionality available for MIL-STD 2525b is exactly the same. You just need to substitute In addition, the LuciadLightspeed support for APP-6B, APP-6C, APP-6D, MIL-STD 2525c and MIL-STD 2525d standards relies on the same APIs as its support for the APP-6A and MIL-STD 2525b standards. This means that you can use the APP-6A API in the same way for APP-6B, APP-6C and APP-6D symbology, and that you can use the MIL-STD 2525b API for MIL-STD 2525c and MIL-STD 2525d symbology. |
This guide focuses on the use of military symbols in a Lightspeed view.
To visualize an ILcdModel
containing MIL-STD 2525b or APP-6A objects in a view, you must create a layer.
Visualizing military symbols in a Lightspeed view explains how to create such a layer for a Lightspeed view.
Styling military symbols in a Lightspeed view explains how to configure a default rendering style for a Lightspeed layer.
Creating and editing symbols in a Lightspeed view describes how to interact with a symbology layer, and create and edit symbols in a Lightspeed view
Visualizing military symbols in a Lightspeed view
To visualize an ILcdModel
in a Lightspeed view, you must create a layer of type ILspLayer
for your model.
The API provides a layer builder that automatically creates such a layer with the appropriate painters and editors:
see TLspAPP6ALayerBuilder
and
TLspMS2525bLayerBuilder
.
The following snippet shows how to use a layer builder.
//Use the layer builder to create a layer for the model
ILspLayer layer = TLspAPP6ALayerBuilder.newBuilder()
.model(app6Model)
.build();
Styling military symbols in a Lightspeed view
You can define a style object and use it to configure the rendering of military symbols on the map.
If you are working with APP-6A symbols, for example, you can associate the style object with one or more military symbols
by defining an implementation of ILcdAPP6AStyled
in the domain object.
Additionally, you can configure it as default style on the TLspAPP6ALayerBuilder
class mentioned in Visualizing military symbols in a Lightspeed view. This default style will then be used for all symbols that do not have an associated style.
Configuring a style on a military symbol or layer is optional. If styles have not been defined explicitly, the implementation uses default style settings based on the military symbology standards. |
Creating and editing symbols in a Lightspeed view
To allow application users to modify and create domain object properties by interacting with the GUI, an ILspLayer
needs to have one or more ILspEditor
instances.
The military symbology layer builders TLspAPP6ALayerBuilder
and TLspMS2525bLayerBuilder
take care of setting up the correct editor for each symbol type.
To support the creation of new symbols by application users, connect a TLspCreateController
to an implementation of ALspCreateControllerModel
.
The controller model only needs to provide the relevant layer and an uninitialized military symbol.
The samples provide a convenience controller model that adds the given symbol to the topmost compatible layer, and an action
that sets up and enables a TLspCreateController
.
The action could be connected to a toolbar button or search field.
Program: Connecting a search widget to an action that creates a new military symbol shows an example of the latter: a search widget is configured
to create and trigger the action whenever the user selects a symbol.
The symbology samples also show a favorites toolbar (refer to the FavoritesToolbar
class) to rapidly create an often-used symbol. This widget is configured similarly.
samples/symbology/lightspeed/LspSymbologyCreationBar
)
/**
* Lets the user create and insert a military symbol by typing in a search field
* or by clicking on a button that opens a symbol hierarchy tree.
*/
public class LspSymbologyCreationBar extends SymbolSelectionBar {
/**
* Called when the user selects a symbol from the symbol hierarchy.
* @param aSIDC the hierarchy code of the symbol
*/
@Override
protected void symbolSelected(String aSIDC) {
new LspCreateAction(
LspMilitarySymbolCreateControllerModel.newInstanceForHierarchy(aSIDC),
fViews,
fUndoManager
).actionPerformed(null);
}
Customizing symbols through styling
TLspAPP6ALayerBuilder
and TLspMS2525bLayerBuilder
leverage the API for styling in Lightspeed views to allow you to customize
symbology layers in various ways. This section explains symbology customization for MIL-STD 2525 symbols, but APP-6 equivalents
exist for everything that
is discussed here.
A MIL-STD 2525 symbol is typically defined as an ILcdMS2525bShape
, which is an
extension of ILcdMS2525bCoded
, and optionally as an ILcdMS2525bStyle
. If your domain objects implement these interfaces, the
MIL-STD 2525 layer builder will pick them up automatically and display the correct symbols.
The link between a domain object and the corresponding MIL-STD 2525 symbol is actually made by the stylers assigned to your
layer. By default, this is a TLspMS2525bSymbolStyler
. This class will check if incoming domain objects implement the
aforementioned interfaces. If that is the case, the styler will produce a TLspMS2525bSymbolStyle
, which is itself a combination of an
ILcdMS2525bCoded
and an ILcdMS2525bStyle
.
The bodyStyler()
and labelStyler()
methods of the layer builders allow you to assign a custom styler to your layer. Such a custom styler can extend or replace
the default implementation.
The use of a custom styler opens up a number of possibilities for customization of your symbology layer, the most important
of which are
described in the following sections. All these concepts are also demonstrated in the How to use military symbology styling for custom domain objects on a Lightspeed view article.
Defining custom domain objects
As mentioned above, the standard TLspMS2525bSymbolStyler
will only recognize your domain objects if they implement
ILcdMS2525bShape
. A custom styler, however, allows you to map any domain object onto a TLspMS2525bSymbolStyle
.
You must be able to provide appropriate geometry for the symbol, like a polyline or a buffer. You can do this by using an
ALspStyleTargetProvider
, or by letting your domain objects implement the required ILcdShape
descendant. For more information about using style target providers, see the LuciadLightspeed developer’s guide.
Furthermore, your styler must output a TLspMS2525bSymbolStyle
that contains the symbol code you wish to assign to your
domain object. Optionally, the TLspMS2525bSymbolStyle
can also contain an ILcdMS2525bStyle
that will be used to
paint the symbol.
The How to use military symbology styling for custom domain objects on a Lightspeed view article contains an example illustratingthis.
Adding decorations to symbols
LuciadLightspeed allows you to decorate symbols by adapting symbol colors, or adding icons and labels to the symbols.
TLspMS2525bLayerBuilder
acts as a facade for TLspShapeLayerBuilder
. In addition to TLspMS2525bSymbolStyle
objects,
it is therefore also valid to output standard line, fill, icon or label styles from a styler used on a symbology layer. In
the custom
symbology sample, the FIPS country code is extracted from the SIDC code and used to add a country flag icon as a label to
each shape.
This is done by submitting a TLspIconStyle
in addition to the TLspMS2525bSymbolStyle
. Note that the symbology
standard can define both line, fill and icon styles for the visualization of a particular code. So for example combining a
TLspMS2525bSymbolStyle
with a line style can result in 2 outlines.
Overriding the visualization of symbols
If you want to change some aspect of how symbols are visualized, you can intercept the affected symbols in your styler and treat them as a special styling case. In the custom symbology sample, symbols are replaced by a dot in the symbol’s affiliation color when you zoom out, to reduce clutter on the map.
The symbols are changed to a dot at a certain scale level by listening to changes in the view’s scale, and firing a style
change event when the scale
threshold is crossed. When the style()
method is invoked, it checks whether the view is above or below the scale threshold, and
outputs either the full symbol geometry with a TLspMS2525bSymbolStyle
or the symbol’s focus point with a TLspIconStyle
.
Defining new symbols
You can also use a custom styler to extend the standard symbol set with new symbols. After
determining whether an incoming domain object is a standard or a custom symbol, you can either submit a TLspMS2525bSymbolStyle
or
use standard line, fill and icon styles to describe your custom symbol. The custom symbology sample contains an example of
a custom
symbol in the styleCustomSymbol()
method of SymbolBodyStyler
.
In Figure 1, “Custom domain objects decorated with country flags”, this symbol is the buffer-shaped symbol at the bottom.