NimbusImage Tool Development
Tools are configured through JSON templates (public/config/templates.json) and implemented in Vue components. The system supports manual annotation, selection, AI-powered, worker-based, and custom interaction tools.
Template Structure
{
"name": "Tool Section Name",
"type": "toolType",
"shortName": "Optional short name",
"interface": [
{
"name": "Interface Element Name",
"id": "elementId",
"type": "elementType",
"isSubmenu": true,
"advanced": false,
"meta": {}
}
]
}
Interface Element Types
| Type | Component | Purpose |
|---|---|---|
annotation |
AnnotationConfiguration | Shape selection |
select |
v-select | Dropdown options |
checkbox |
v-checkbox | Boolean toggle |
radio |
v-radio-group | Single choice |
tags |
TagPicker | Tag selection |
dockerImage |
Worker selector | Docker worker tools |
restrictTagsAndLayer |
TagAndLayerRestriction | Filter annotations |
Submenu Interface
One interface element should have isSubmenu: true. This creates tool variants in the selection dialog. For select type submenus, each item in meta.items becomes a separate tool option.
Adding a New Tool
Step 1: Define Template
Add to templates.json:
{
"name": "My Tool Category",
"type": "myTool",
"interface": [
{
"name": "Tool Mode",
"id": "mode",
"type": "select",
"isSubmenu": true,
"meta": {
"items": [
{
"text": "Mode A",
"value": "mode_a",
"description": "Brief description of Mode A"
}
]
}
}
]
}
Step 2: Add Type Definition
In src/store/model.ts, add to TToolType:
export type TToolType =
| "annotation"
| "selection"
// ... existing types
| "myTool";
Step 3: Implement Logic
In src/components/AnnotationViewer.vue:
Set annotation mode in setNewAnnotationMode():
case "myTool":
this.interactionLayer.mode("point"); // or null for custom handling
break;
Handle annotations in handleAnnotationChange():
case "myTool":
// Process the annotation/interaction
break;
Tool Descriptions
{
"text": "Tool Name",
"value": "tool_value",
"description": "Brief action-oriented description"
}
Keep descriptions under 50 characters. Use action verbs: "Click to...", "Draw to...", "Select...".
Featured Tools
Configure public/config/featuredTools.json:
{
"featuredTools": ["Tool Name 1", "Tool Name 2"]
}
Names must match the text field exactly.
Docker Worker Tools
Worker-based tools use the dockerImage interface type. Workers are registered with labels:
interfaceName- Display nameinterfaceCategory- Category for groupingdescription- Tool descriptionisAnnotationWorker- Must be set for annotation workersannotationShape- Default output shape
Common Patterns
Direct Mouse Handling
For tools that don't create visible annotations during interaction:
case "myTool":
this.interactionLayer.mode(null);
this.annotationLayer.geoOn(geojs.event.mouseclick, this.handleMyToolClick);
break;
Hit Testing
Find annotations at a click location:
const fakeAnnotation = { coordinates: [clickCoords], shape: "point" };
const hits = this.getSelectedAnnotationsFromAnnotation(fakeAnnotation);
Updating Annotations
await annotationStore.updateAnnotationsPerId({
annotationsById: { [annotationId]: { tags: newTags } },
});
Category Colors
Tools are color-coded by category. To add a new category color, edit ToolTypeSelection.vue:
- Add SCSS variable:
$color-mycategory: #hexcolor; - Add to
categoryClassMap:"My Category": "category-mycategory" - Add class:
.category-mycategory { @include category-colors($color-mycategory); }
References
- For detailed GeoJS interaction patterns: read
references/tool-interaction-patterns.md - For a complete worked example (combine annotations tool): read
references/combine-annotations-example.md - For SAM tool architecture: read
codebaseDocumentation/SAM2_MIGRATION.md
Converted and distributed by TomeVault — claim your Tome and manage your conversions.