# Annotation API
# State
The state provide a way to manage a set of annotation objects.
interface Annotation {
  readonly id: number;
  // Coordinates
  x: number;
  y: number; 
  z: number;
  // Settings
  draggable: boolean;
  grabberSelector?: string;
  // Vue component used to render annotation on viewer
  component: any;
  // Optional props to pass to the annotation component
  props?: any;
}
Annotation related fields and methods accessible from the state:
| Name | Description | 
|---|---|
| annotations | The list of all annotations (read only) | 
| addAnnotation(annotation, options) | Add an annotation to the state | 
| removeAnnotation(annotation, options) | Remove the given annotation from state | 
| clearAnnotations() | Remove all annotations from state | 
Annotation related events emitted on the state:
| Name | Payload | Description | 
|---|---|---|
| annotation-added | { annotation: Annotation, options?: any } | An annotation has been added | 
| annotation-updated | { annotation: Annotation, options?: any } | An annotation has been updated/moved | 
| annotation-removed | { annotation: Annotation, options?: any } | An annotation has been removed | 
# Viewers plugins
The viewers common interface includes the following fields and methods to handle annotations:
| Name | Description | 
|---|---|
| annotationMode | Whether annotation mode is enabled or not | 
| startAnnotationMode(callback) | Start (enable) annotation mode with the given annotation callback | 
| stopAnnotationMode() | Stop (disable) annotation mode | 
The annotation callback  passed to thestartAnnotationMode() method as the following signature:
type AnnotationCallback = ({
  // Annotation coordinates
  x: number,
  y: number,
  z: number,
  // Additional data
  models: StateModel[], // currently loaded models
  storey?: StateStorey, // current storey
  pdfPages?: any[], // list of PDF pages (only relevant for multipage PDF models)
  pdfPageIndex?: number, // current PDF page index (only relevant for multipage PDF models)
  object?: StateObject, // annotated IFC element (only relevant for IFC models)
}) => void;
# Usage
The annotation API is designed to help developers create/update/delete custom annotations that are synchronized between viewer windows. Below are some explanations on the basic usage of the API, you can have a look at the examples to get a more concrete integration example.
# 1. Add annotations
Given any viewer window we can use the localContext API to register an annotation callback
that we will allow us to get annotation coordinates on click.
The coordinates are used to add a new annotation to the state:
const { state, localContext } = $viewer;
localContext.startAnnotationMode(({ x, y, z }) => {
  const annotation = state.addAnnotation({
    component: MyAnnotationComponent
    x,
    y,
    z,
  });
  console.log("new annotation: ", annotation);
});
When we are done adding annotations we can use stopAnnotationMode() to unregister annotation callback:
localContext.stopAnnotationMode();
The annotation component (MyAnnotationComponent here) can be any valid Vue component, it will be used
to render the annotation on the viewer.
For convenience, an annotation prop, that hold the associated annotation object from the state, is passed to the component.
It is also possible to provide some custom props to the component via the props field of annotation object.
# 2. Update/Drag annotation
Each annotation as a draggable property (which is true by default) that control whether the annotation can be moved
by dragging it on the canvas.
Setting draggable to false will prevent the annotation to be moved.
This can be used to implement some kind of annotation lock/unlock mechanism.
Note: The state will emit an "annotation-updated" event on every annotation move.
# 3. Remove annotation
Annotations can be removed from the state using the removeAnnotation() method:
$viewer.state.removeAnnotation(annotation);
Annotations can also be removed all at once with clearAnnotations():
$viewer.state.clearAnnotations();