UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) • 1.56 kB
import{Box as f,isBox as x}from"@expofp/geometry";import{isLayerDef as p,isLineDef as m,isShapeDef as y}from"@expofp/renderer";const g="areamap";export function getSceneVenueRect(r){const n=r?.rootLayer?.children;if(!n?.length)return null;let i=1/0,o=1/0,a=-1/0,c=-1/0;const u=(e,t)=>{!Number.isFinite(e)||!Number.isFinite(t)||(e<i&&(i=e),t<o&&(o=t),e>a&&(a=e),t>c&&(c=t))},s=e=>{u(e.min.x,e.min.y),u(e.max.x,e.max.y)},l=e=>{if(p(e)){e.children.forEach(l);return}if(y(e)){s(x(e.shape)?e.shape:e.shape.bounds);return}if(m(e)){u(e.points.p0.x,e.points.p0.y),u(e.points.p1.x,e.points.p1.y);return}s(e.bounds.bounds)};for(const e of n){const t=e.name;typeof t=="string"&&t.toLowerCase()===g||l(e)}return i>a||o>c?null:f.fromMinMax({x:i,y:o},{x:a,y:c})}export function getVenueFitMarginPercent(r,n){return!r||!n||n.area<=0||r.area/n.area>.1?.15:.25}export function expandRectByPercent(r,n){return n?r.expand({x:r.size.width*n,y:r.size.height*n}):r}export function getVenueFitRect(r,n){const i=getSceneVenueRect(r);return i?expandRectByPercent(i,getVenueFitMarginPercent(i,n)):null}export function fitRectIsFraming(r){return r==="layer-viewbox"||r==="explicit-viewbox"||r==="scene-derived"}export function resolveVenueFitRect(r){if(r.layerViewbox)return{rect:r.layerViewbox,source:"layer-viewbox"};if(r.explicitArea)return{rect:r.explicitArea,source:"explicit-viewbox"};if(r.layerRectangle)return{rect:r.layerRectangle,source:"layer-rectangle"};const n=getVenueFitRect(r.sceneDef,r.svgArea);return n?{rect:n,source:"scene-derived"}:{rect:r.svgArea,source:"svg-area"}}