Skip to content

Extension SDK API reference

HostApi

ts
const hostApi = createHostConnection()

getElements

ts
getElements({
    select?: ElementSelect,
    where?: ElementFilter
}): Promise<QueryPick<ElementData, ElementSelect>[]>

Filter by ElementFilter and select the returned properties with ElementSelect which defaults to DefaultSelect`

Return type matches ElementSelect

getElementById

ts
getElementById({
    id: string,
    select?: ElementSelect
}): Promise<QueryPick<ElementData, ElementSelect>>

Return type matches ElementSelect

getSpaces

ts
getSpaces({
    select?: SpaceSelect,
    where?: SpaceFilter
}): Promise<QueryPick<SpaceData, SpaceSelect>[]>

Filter by SpaceFilter and select the returned properties with SpaceSelect which defaults to DefaultSelect

Return type matches SpaceSelect

getSpaceById

ts
getSpaceById({
    id: string,
    select?: SpaceSelect
}): Promise<QueryPick<SpaceData, SpaceSelect>>

Return type matches SpaceSelect

getLayout

ts
getLayout({
    select?: BaseSelect
}): Promise<QueryPick<BaseData, BaseSelect>>

Return type matches BaseSelect

getFloor

ts
getFloor({
    select?: FloorSelect
}): Promise<QueryPick<FloorData, FloorSelect>>

Returns metadata about the current floor. Defaults to FloorDefaultSelect.

addPlanGraphic

ts
addPlanGraphic({
    shapes: Shape[],
    interaction?: { click?: boolean; drag?: boolean },
    position?: Vector2,
    fixedScreenSize?: boolean,
    id?: string,
    layerId?: string,
    clearLayer?: boolean
}): Promise<{ id: string }>

getPath

Compute walking path between two points

ts
getPath({
    start: Vector2,
    end: Vector2
}): Promise<{ path: Vector2[], distance: number }>

findClosest

Find the closest entity by ElementFilter or SpaceFilter

ts
findClosest({
    start: Vector2,
    where: ElementFilter | SpaceFilter
}): Promise<{
  path: Vector2[],
  distance: number,
  target: { id: string } | null
}>

Types

DefaultSelect

ts
type DefaultSelect = { id: true; type: true }

BaseSelect

ts
interface BaseSelect {
  id?: boolean
  type?: boolean
  name?: boolean
  customId?: boolean
  customAttributes?: boolean | Record<string, boolean>
  dimensions?:
    | boolean
    | {
        width?: boolean
        length?: boolean
        height?: boolean
      }
  labelPoint?: boolean
  contour?: boolean
  boundingBox?: boolean
  boundingBoxContour?: boolean
}

BaseData

Properties shared by all queryable entities. boundingBox and dimensions are in meters, with y as the up axis.

ts
interface BaseData {
  id: string
  name: string
  type: string
  customId: string
  customAttributes: Record<string, string | number | boolean | null>
  /** dimensions in meters */
  dimensions: { width: number; length: number; height: number }
  /** axis aligned bounding box in root space */
  boundingBox: { min: Vector3; max: Vector3 }
  /** contour of the object aligned bounding box in root space */
  boundingBoxContour: Vector2[]
  labelPoint: Vector2
  contour: Vector2[][]
}

SpaceSelect

ts
export interface SpaceSelect extends BaseSelect {
  category?: boolean
  subCategory?: boolean
  isExternal?: boolean
  area?: boolean
  seatCapacity?: boolean
  elements?: ElementQuery
}

SpaceData

ts
interface SpaceData extends BaseData {
  type: 'space'
  isExternal: boolean
  category: string
  subCategory: string
  seatCapacity: number
  area: number
  elements: ElementData[]
  boundaries: {
    profile: Vector2[]
    segments: {
      points: [Vector2, Vector2]
      element: { id: string; type: string } | null
      adjacentSpaceId: string | null
    }[]
  }[]
}

ElementSelect

ts
export interface ElementSelect extends BaseSelect {
  product?: ProductSelect | boolean
  isExternal?: boolean
  transform?: boolean
  localTransform?: boolean
  localBoundingBox?: boolean
}

ElementData

ts
interface ElementData extends BaseData {
  type: string
  isExternal: boolean
  category: string
  subCategory: string
  product: ProductData
  /** transform in root space */
  transform: { position: Vector3; rotation: number }
  /** local transform for nested elements like openings, windows */
  localTransform: { position: Vector3; rotation: number }
  /** local object aligned bounding box */
  localBoundingBox: { min: Vector3; max: Vector3 }
  elements: ElementData[]
  parent: ElementData
}

ProductData

ts
interface ProductData extends BaseData {
  type: 'product'
  category: string
  subCategory: string
  seatCapacity: number
}

LayoutData

ts
interface LayoutData extends BaseData {
  type: 'layout'
}

FloorData

ts
type FloorData = {
  id: string
  name: string
  level: string
  area: number
  labels: { name: string; color: string }[]
  transform: { position: Vector3; rotation: number }
  location: {
    address: {
      line1?: string
      line2?: string
      city?: string
      state?: string
      postalCode?: string
      country?: string
    }
    coordinates: { lat: number; long: number; bearing: number }
  }
}

FloorDefaultSelect

ts
type FloorDefaultSelect = {
  id: true
  name: true
  area: true
  level: true
  labels: true
  transform: true
  location: true
}

FloorSelect

ts
interface FloorSelect {
  id?: boolean
  name?: boolean
  level?: boolean
  area?: boolean
  createdAt?: boolean
  updatedAt?: boolean
  isPrivate?: boolean
  isArchived?: boolean
  labels?: boolean | { name?: boolean; color?: boolean }
  transform?: boolean | { position?: boolean; rotation?: boolean }
  location?: boolean | { address?: boolean; coordinates?: boolean }
}

BaseFilter

ts
interface BaseFilter {
  id?: StringComparator
  type?: StringComparator
  name?: StringComparator
  customId?: StringComparator
  customAttributes?: Record<
    string,
    StringComparator | NumberComparator | BooleanComparator | NullComparator
  >
  dimensions?: {
    width?: NumberComparator
    length?: NumberComparator
    height?: NumberComparator
  }
}

ElementFilter

Type

ts
export interface ElementFilter extends BaseFilter {
  /** for assets inherited from product */
  category?: StringComparator
  /** for assets inherited from product */
  subCategory?: StringComparator
  /** find elements at specific location */
  at?: Vector2
  /** find elements within rectangle */
  within?: { min: Vector2; max: Vector2 }
  isExternal?: BooleanComparator
  product?: ProductFilter
}

Example

Using StringComparator

ts
{
  where: {
    subCategory: 'workstation'
  }
}

Using NullComparator

ts
// return all entities that have a value set for the custom attribute 'employee-id'
{
  where: { customAttributes: { 'employee-id': { null: false }} }
}

SpaceFilter

Type

ts
export interface SpaceFilter extends BaseFilter {
  category?: StringComparator
  subCategory?: StringComparator
  seatCapacity?: NumberComparator
  /** find spaces at specific location */
  at?: Vector2
  /** find spaces within rectangle */
  within?: { min: Vector2; max: Vector2 }
  isExternal?: BooleanComparator
  area?: NumberComparator
}

Example

Using NumberComparator

ts
{
  where: { area: { gte: 50 }, seatCapacity: { gte: 12 } }
}

Using BooleanComparator

ts
{
  where: {
    isExternal: true
  }
}

SpaceQuery

ts
export type SpaceQuery = {
  select?: SpaceSelect
  where?: SpaceFilter
}

StringComparator

ts
export type StringComparator =
  | string
  | { eq: string }
  | { neq: string }
  | { in: string[] }
  | { nin: string[] }
  /** case-insensitive partial match */
  | { contains: string }

NumberComparator

ts
export type NumberComparator =
  | number
  | { eq: number }
  | { neq: number }
  | { in: number[] }
  | { nin: number[] }
  | { gt: number }
  | { gte: number }
  | { lt: number }
  | { lte: number }

BooleanComparator

ts
export type BooleanComparator = boolean | { eq: boolean } | { neq: boolean }

NullComparator

Can be used to return entities depending on whether the field has a value or not

ts
export type NullComparator = { null: boolean }