# Local Context

The localContext shares a Context interface with the globalContext. Here is the full LocalContext interface:

interface Context {
  readonly hub: EventHandler;

  registerShortcut(shortcut: Shortcut, context: GlobalContext | LocalContext): boolean;
  unregisterShortcut(name: string, context: GlobalContext | LocalContext): boolean;

  readonly loading: boolean;
  loadingProcessStart(): void;
  loadingProcessEnd(): void;
  spinner: { component: Object, props: Object }; // a custom spinner replacing the default BIMDataSpinner

  modals: {
    pushModal(component: any, props?: any, options?: any): void;
    clearModal(): void;
  };

  el: HTMLElement;
}
interface LocalContext extends Context {
  id: number;
  readonly x: number;
  readonly y: number;
  readonly width: number;
  readonly height: number;
  resolution: number;

  close(): void;

  // Local state
  readonly multiModel: boolean;
  readonly modelTypes?: string[];
  readonly loadedModels: StateModel[];
  readonly loadedModelIds: number[];
  readonly loadingModelIds: number[];
  readonly selectedStorey: StateStorey | null;
  loadModels(ids: number[]): Promise<boolean>;
  unloadModels(ids: number[]): boolean;
  selectStorey(storey: StateStorey): void;
  showPlan(plan: StatePlan): void;
  hidePlan(plan: StatePlan): void;

  // Viewer Interface
  readonly viewer: ModelViewerInstance | null;
  readonly annotationMode: boolean;
  getViewpoint: (options?: any) => any | Promise<any>;
  setViewpoint: (viewpoint: any, options?: any) => void | Promise<void>;
  startAnnotationMode: (callback: Function) => void;
  stopAnnotationMode: () => void;
  fitView: (options?: any) => void;
  showUI: (options?: any) => void;
  hideUI: (options?: { exceptions: string[] }) => Promise<void>;

  // Context Window
  readonly window: Window;
  loadWindow(windowName: string, windowState?: { modelIds: number, viewpoint: Object, storey: string }): void;
  unloadWindow(): void;

  // Plugins
  readonly pluginInstances: new Map<string, PluginInstance>;
  readonly plugins: Map<string, PluginComponentInstance>;
}

# Local State

The global state allows to manage a set of shared data that is not tied to a specific context.

To manage models, storeys and plans for a given context you can use the localContext object.

Name Description
properties
loadedModels List of currently loaded models
loadedModelIds List of currently loaded model ids
loadingModelIds List of model ids that are currently loading
selectedStorey Storey that is currently active
methods
loadModels(ids: number[]) Load the given models in this context
unloadModels(ids: number[]) Unload the given models from this context
selectStorey(storey: Storey) Set storey as the current storey
showPlan(plan: Plan) Show plan
hidePlan(plan: Plan) Hide plan

The properties described above are reactive and can be watched (opens new window) by Vue to trigger effects:

watch(
  () => $viewer.localContext.loadedModels
  models => {
    console.log("Currently loaded models: ", models);
  }
);

# Viewer Interface

For viewer windows the localContext provide an API to interact with the local model viewer. It is a set of methods that are independent on the type of viewer (IFC, DWG, Plan, ...). If the current context is not a viewer window, an error is thrown when these methods are called.

Name Description
properties
viewer Model viewer instance of this context, null if the context is not a viewer window
annotationMode true if annotation mode is enabled, false otherwise
methods
getSnapshot() (async) Get a snapshot of the current viewer: { snapshot_type: string, snapshot_data: string (Data URL) }
getViewpoint(options?: any) (async) Get a BCF viewpoint (opens new window) of the current viewer
setViewpoint(viewpoint: any, options?: any) (async) Set model viewer viewpoint
startAnnotationMode(callback: Function) Enable annotation mode (see annotation API)
stopAnnotationMode() Disable annotation mode
fitView(options?: any) Apply a "fit view" command to the model viewer
showUI(options?: any) (async) Makes all UI elements of the context visible (such as plugins and model selector)
hideUI(options?: { exceptions: string[] }) (async) Hide all UI elements of the context (some exceptions can be specified)

# Events

# Local Context specific events

Name Payload Description
alert { type: string, message: string } A plugin in this context raised an alert to be displayed
context-resize { width: number, height: number } The context window has been resized
models-loaded { models: Model[] } One or more models have been loaded in this context
models-unloaded { models: Model[] } One or more models have been unloaded from this context
models-loading { ids: number[] } One or more models are loading in this context
storey-selected { storey: Storey } The current active storey has changed
plan-shown { plan: Plan } A storey plan is now visible
plan-hidden { plan: Plan } A storey plan has been hidden
pdf-page-changed { model: Model, page: any } The current PDF page changed

# Events emitted on both Global & Local contexts

Name Payload Description
plugin-created { name: string, plugin: PluginInstance } A plugin has been added to this context
plugin-destroyed { name: string, plugin: PluginInstance } A plugin has been removed from this context
3d-model-loaded { model: Model, plugin: ViewerIfc3D } An IFC model has been loaded in an IFC 3D viewer
3d-model-unloaded { model: Model, plugin: ViewerIfc3D } An IFC model has been unloaded from an IFC 3D viewer
2d-model-loaded { model: Model, plugin: ViewerIfc2D } An IFC model has been loaded in an IFC 2D viewer
2d-model-unloaded { model: Model, plugin: ViewerIfc2D } An IFC model has been unloaded from an IFC 2D viewer
dwg-model-loaded { model: Model, plugin: ViewerDwg } A DWG model has been loaded
dwg-model-unloaded { model: Model, plugin: ViewerDwg } A DWG model has been unloaded
dxf-model-loaded { model: Model, plugin: ViewerDwg } A DXF model has been loaded
dxf-model-unloaded { model: Model, plugin: ViewerDwg } A DXF model has been unloaded
plan-model-loaded { model: Model, plugin: ViewerPlan } A Plan/Meta-Building model has been loaded
plan-model-unloaded { model: Model, plugin: ViewerPlan } A Plan/Meta-Building model has been unloaded
pointcloud-model-loaded { model: Model, plugin: ViewerPointCloud } A Point Cloud model has been loaded
pointcloud-model-unloaded { model: Model, plugin: ViewerPointCloud } A Point Cloud model has been unloaded