Plugin Basics
About 2 min
Plugin Basics
WebCAD provides a complete plugin system that supports extending commands, UI, and features.
Online Examples
| Example | Description | Link |
|---|---|---|
| Basic Plugin | Example plugin structure | Online Demo{target="_blank"} |
| Validation Plugin | Data validation example | Online Demo{target="_blank"} |
| Standard Plugin | Standard PluginManager usage | Online Demo{target="_blank"} |
Plugin Interface
import type { Plugin, PluginManifest, PluginContext } from 'vjcad';
// Plugin manifest
const manifest: PluginManifest = {
id: 'my-plugin', // Unique identifier
name: 'My Plugin', // Display name
version: '1.0.0', // Version
author: 'Author Name',
description: 'Plugin description',
keywords: ['tool', 'CAD'],
dependencies: [], // Other plugin dependencies
minEngineVersion: '1.0.0' // Minimum engine version
};
// Plugin definition
const myPlugin: Plugin = {
manifest,
// Called when plugin is loaded (initialize, but do not activate features)
async onLoad(context: PluginContext): Promise<void> {
console.log('Plugin loaded');
},
// Called when plugin is activated (register commands, menus, etc.)
async onActivate(context: PluginContext): Promise<void> {
console.log('Plugin activated');
},
// Called when plugin is deactivated (clean up resources)
async onDeactivate(context: PluginContext): Promise<void> {
console.log('Plugin deactivated');
},
// Called when plugin is unloaded (final cleanup)
async onUnload(context: PluginContext): Promise<void> {
console.log('Plugin unloaded');
}
};
export default myPlugin;PluginManifest
The plugin manifest describes the plugin's basic information:
| Property | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique identifier |
name | string | Yes | Display name |
version | string | Yes | Version |
author | string | No | Author |
description | string | No | Description |
keywords | string[] | No | Keywords |
dependencies | string[] | No | Dependency plugin IDs |
minEngineVersion | string | No | Minimum engine version |
homepage | string | No | Homepage URL |
icon | string | No | Icon |
PluginState
enum PluginState {
Unloaded = 'unloaded', // Not loaded
Loading = 'loading', // Loading
Loaded = 'loaded', // Loaded but not activated
Activating = 'activating', // Activating
Active = 'active', // Activated
Deactivating = 'deactivating',// Deactivating
Unloading = 'unloading', // Unloading
Error = 'error' // Error
}Lifecycle
Lifecycle Hooks
| Hook | When Called | Purpose |
|---|---|---|
onLoad | When plugin is loaded | Initialize, check dependencies, register resources |
onActivate | When plugin is activated | Register commands, add UI, start features |
onDeactivate | When plugin is deactivated | Unregister commands, remove UI, pause features |
onUnload | When plugin is unloaded | Final cleanup, release resources, disconnect |
Lifecycle Events
The plugin manager triggers corresponding events on each state transition:
| Event | Trigger Time |
|---|---|
PluginLoading | Before plugin loading starts |
PluginLoaded | After plugin loading completes |
PluginActivating | Before activation starts |
PluginActivated | After activation completes |
PluginDeactivating | Before deactivation starts |
PluginDeactivated | After deactivation completes |
PluginUnloading | Before unload starts |
PluginUnloaded | After unload completes |
PluginError | When a plugin error occurs |
import { Engine, CadEvents } from 'vjcad';
// Listen for plugin load event
Engine.eventManager.on(CadEvents.PluginLoaded, (args) => {
console.log('Plugin loaded:', args.pluginId);
});
// Listen for plugin unload event
Engine.eventManager.on(CadEvents.PluginUnloaded, (args) => {
console.log('Plugin unloaded:', args.pluginId);
});
// Listen for plugin errors
Engine.eventManager.on(CadEvents.PluginError, (args) => {
console.error('Plugin error:', args.pluginId, args.error);
});Next Steps
- Plugin Context -
PluginContextAPI - Plugin Examples - complete plugin examples