Appearance
Extension SDK Beta
The Extension SDK enables you to create custom logic that can be run inside Editor or headless Worker. It provides easy to use but powerful methods to query, mutate, draw, interact, compute or export a layout.
WARNING
The Extension SDK is currently in beta. Breaking changes may occur.
Editor extensions can provide their own UI, rely on dialogs or run as headless scripts.
Worker extensions are accessible via API.
POST
/v2/floor/:floorId/extensions/:extensionId
Check the Setup guide on how to work locally and deploy your first extension.
Host API
Every extension exports a run function which is executed by the host in a sandbox. The HostApi instance is provided as an argument which is the main interface for extensions allowing you to run commands that are executed by the host.
While editor extensions can subscribe to events and provide their own UI which is loaded in an iframe, worker extensions need to return something in the run function for the endpoint to capture it.
js
export async function run({ hostApi }) {
const meetingRooms = await hostApi.getSpaces({
where: { program: { eq: 'meet' }, seatCapacity: { gte: 4, lte: 6 } }
})
}ts
import type { HostApi } from '@archilogic/extension-sdk'
export async function run({ hostApi }: { hostApi: HostApi }) {
const meetingRooms = await hostApi.getSpaces({
where: { program: { eq: 'meet' }, seatCapacity: { gte: 4, lte: 6 } }
})
}Events
Hosts Editor
You can register event handlers for various events at run time
ts
hostApi.on('layout-change', ({ operations }) => {})
hostApi.on('selection-change', ({ selectedNodes }) => {})
hostApi.on('canvas-click', ({ position, nodeId }) => {})Queries
Hosts EditorCloud Worker
Query methods have powerful filter options similar to the GraphQL API.
Get elements
Query elements with the getElements method by various properties and optionally select the shape of the returned objects.
ts
const largeWindows = await hostApi.getElements({
where: { type: 'element:window', dimensions: { length: { gte: 3 } } }
})Get element by id
Retrieve specific properties from an element with getElementById
ts
const { dimensions, boundingBox } = await hostApi.getElementById({
id: '<asset-id>',
select: { boundingBox: true, dimensions: true }
})Get spaces
Query spaces with the getSpaces method by various properties and optionally select the shape of the returned objects.
ts
const spaces = await hostApi.getSpaces({
where: { seatCapacity: { gte: 5 } }
})Get space by id
Retrieve specific properties from a space with getSpaceById
ts
const { labelPoint, polygons, elements } = await hostApi.getSpaceById({
id: '<space-id>',
select: { labelPoint: true, polygons: true, elements: true }
})Get products
Query products with the getProducts method by various properties and optionally select the shape of the returned objects.
ts
const chairCounts = await hostApi.getProducts({
select: { id: true, count: true },
where: { subCategory: 'taskChair' }
})Operations
Hosts Editor
Make changes to the layout, like adjusting space meta data or placing assets inside a space. This interface mirrors the operations endpoint.
Create
Create elements in the layout.
ts
await hostApi.runOperations({
operations: [
{
type: 'operation:elementCreate',
value: {
type: 'element:asset',
position: [-2, 0, 3],
rotation: 45,
product: '<product-id>'
}
}
]
})Update
Update the layout by changing node's properties or creating/removing nodes.
Like the custom attributes of a space.
ts
await hostApi.runOperations({
operations: [
{
type: 'operation:spaceUpdate',
id: '<space-id>',
value: { customAttributes: { isBooked: true } }
}
]
})Delete
Remove elements from the layout.
ts
await hostApi.runOperations({
operations: [
{
type: 'operation:elementRemove',
id: '<element-id>'
}
]
})Drawing
Hosts Editor
Add plan layer
ts
const layerRef = await hostApi.addPlanLayer({ id: 'my-layer' })Add plan graphics
ts
const layerRef = await hostApi.addPlanGraphic({
shapes: [
{
type: 'curve:circle',
radius: 1,
position: [1, 0]
}
],
layerId: 'my-layer'
})Set plan config
ts
await hostApi.setPlanConfig({
theme: {
byFilter: [
{
where: { customAttributes: { isBooked: { eq: true } } },
fill: '#FF8800'
},
{
where: { customAttributes: { isBooked: { eq: false } } },
fill: '#00FF88'
}
]
}
})Interact
Hosts Editor
Zoom to node
ts
await hostApi.zoomToNode({ nodeId: '<space-id>' })Zoom extents
ts
await hostApi.zoomExtents({ margin: 2, animate: true })Select nodes
ts
await hostApi.selectNodes({ nodeIds: ['<space-1>'] })Dialogs Coming soon
Hosts Editor
Confirm
ts
const isConfirmed = await hostApi.confirm({
title: 'Remove all assets',
confirmLabel: 'Yes',
cancelLabel: 'No'
})Prompt
ts
const { format } = await hostApi.prompt({
title: 'Export format',
parameters: {
format: {
label: 'Format',
type: 'Select',
options: ['JPG', 'PNG'],
default: 'JPG'
}
}
})Compute Coming soon
Hosts EditorCloud Worker
Run complex tasks like way finding.
Get path
Compute the fastest path from A to B by avoiding 'Hub' spaces
ts
const path = await hostApi.getPath({
start: [3, 4.5],
target: [25, 123.5],
excludeSpaces: {
where: { subCategory: { in: ['hub'] } }
}
})Find closest space
Find the closest space with seat capacity greater than 4 that is bookable
ts
const path = await hostApi.findClosestSpace({
start: [3, 4.5],
where: {
seatCapacity: { gte: 4 },
customAttributes: { isBooked: { eq: false } }
}
})Exports Coming soon
Hosts EditorCloud Worker
Export the layout including the custom graphics and style to various formats
PDF
ts
const path = await hostApi.exportPdf({
orientation: 'landscape',
format: 'A4',
units: 'mm'
})DXF
ts
const path = await hostApi.exportDxf()SVG
ts
const path = await hostApi.exportSvg()GeoJSON
ts
const path = await hostApi.exportGeoJson()IMDF
ts
const path = await hostApi.exportImdf()IFC
ts
const path = await hostApi.exportIfc()GLTF
ts
const path = await hostApi.exportGltf()
