Appearance
SelectionService
Manages object selection, hover, and multi-selection. Visual highlighting is delegated to a pluggable IHighlightStrategy (default: material swap).
Access
Registered under the name "selection". Depends on rendering, material, mesh.
ts
import { SelectionService } from "@optellix/xviewr-sdk";
await viewer.ready();
const selection = viewer.getService<SelectionService>("selection");Public API
Lifecycle
activate(): voiddeactivate(): voidupdateConfig(config: Partial<SelectionConfig>): void
Selection
selectObject(object: THREE.Object3D, addToSelection?: boolean): booleandeselectObject(object: THREE.Object3D): booleantoggleSelection(object: THREE.Object3D): booleanselectAll(): THREE.Object3D[]invertSelection(): THREE.Object3D[]clearSelection(): voidgetSelectedObjects(): THREE.Object3D[]isSelected(object: THREE.Object3D): booleanselectByBoundingBox(box: THREE.Box3): THREE.Object3D[]
Neighbour selection (requires MeshService)
selectNeighbourByContact(depth?: number): THREE.Object3D[]selectNeighbourByRadius(radius: number, options?: MeshRadiusNeighbourOptions): THREE.Object3D[]
Hover
setHoverObject(object: THREE.Object3D | null): voidclearHover(): voidgetHoveredObject(): THREE.Object3D | null
Raycasting
raycastAt(x: number, y: number): THREE.Object3D | null— canvas-relative coords. Respects active cross-section clipping planes.
Highlight strategy
setHighlightStrategy(strategy: IHighlightStrategy): Promise<void>— disposes the previous strategy and reapplies highlights with the new one.
Events
| Event | Payload |
|---|---|
selection:activated | null |
selection:deactivated | null |
selection:config-updated | { config, previousConfig } |
selection:object-selected | { object, selectedObjects } |
selection:object-deselected | { object, selectedObjects } |
selection:all-selected | { previousSelected, selectedObjects } |
selection:inverted | { previousSelected, selectedObjects } |
selection:neighbour-selected | { method, sourceObjects, neighbours, selectedObjects, ... } |
selection:cleared | { clearedObjects } |
selection:changed | { selected, previous } |
selection:hover-changed | { object } |
Example
ts
const selection = viewer.getService<SelectionService>("selection");
selection.updateConfig({
multiSelect: true,
highlightColor: "#1c66bc",
hoverEnabled: true,
});
viewer.eventBus.on("selection:object-selected", ({ object }) => {
console.log("selected:", object.name);
});Configuration
ts
interface SelectionConfig {
enabled: boolean;
multiSelect: boolean;
hoverEnabled: boolean;
selectableOnly: boolean; // requires userData.isSelectable
highlightColor: string;
hoverColor: string;
highlightIntensity: number;
outlineWidth: number;
}Custom highlight strategies
Implement IHighlightStrategy to override the visual treatment.
ts
interface IHighlightStrategy {
init(context: HighlightContext, config: HighlightStyleConfig): Promise<void>;
apply(object: THREE.Object3D, type: "selected" | "hovered"): void;
remove(object: THREE.Object3D): void;
updateStyle(config: HighlightStyleConfig): void;
dispose(): void;
}
interface HighlightContext {
scene: THREE.Scene;
camera: THREE.Camera;
renderer: THREE.WebGLRenderer;
materialService?: MaterialService | null;
}
interface HighlightStyleConfig {
selectedColor: string;
hoverColor: string;
intensity: number;
outlineWidth: number;
}