@sidofc/fml
Version:
Typescript types for Floorplanner FML JSON
708 lines (605 loc) • 12.7 kB
TypeScript
export type UUID = `${string}-${string}-${string}-${string}-${string}` | string;
export type Color = `#${string}` | string | number;
export type ConnectionType = 'left' | 'right' | 'front' | 'front2' | 'back';
export enum ComponentLevel {
CEILING = -2,
WALL = -1,
FLOOR = 1,
STACKABLE = 2,
}
export type ComponentLevelObject = {
[K in keyof typeof ComponentLevel]: (typeof ComponentLevel)[K];
};
export interface Component {
id: string;
level: ComponentLevel;
}
export interface Material {
name: string;
role: string;
}
export interface MaterialMetadata {
id: `rs-${number}`;
name: string;
url2d: string;
thumb: {thumb2D: string; thumb3D: string};
}
export interface Variant {
readonly id: number;
}
export interface Point {
/**
* @unit centimeter
*/
x: number;
/**
* @unit centimeter
*/
y: number;
}
export interface Endpoint3D {
/**
* @unit centimeter
*/
z: number;
/**
* @unit centimeter
*/
h: number;
}
export interface Point3D extends Point {
/**
* @unit centimeter
*/
z: number;
}
export interface BezierPoint extends Point {
/**
* @unit centimeter
*/
cx: number;
/**
* @unit centimeter
*/
cy: number;
/**
* @unit centimeter
*/
cz?: number;
}
export interface GenericLine {
a: Point;
b: Point;
}
export interface Line extends GenericLine {
type: 'solid_line' | 'dashed_line' | 'dotted_line' | 'dashdotted_line';
color: Color;
groupMarker?: number;
/**
* @unit pixel
*/
thickness: number;
}
export interface Label extends Point {
text: string;
fontFamily: string;
fontColor: Color;
backgroundColor: Color;
align: 'left' | 'center' | 'right';
bold?: boolean;
italic?: boolean;
outline?: boolean;
underline?: boolean;
groupMarker?: number;
/**
* @unit pixel
*/
fontSize: number;
/**
* @unit pixel
*/
letterSpacing: number;
/**
* @unit degree
* @range -180.0, 180.0
*/
rotation: number;
/**
* @unit percentage
* @range 0.0, 100.0
*/
backgroundAlpha?: number;
/**
* @unit percentage
* @range 0.0, 100.0
*/
fontAlpha?: number;
}
export interface Item extends Point3D {
refid: Component['id'];
light?: {on: boolean; color: Color; watt: number};
materials?: {[material_name: Material['name']]: Variant['id']} | [];
features?: {[intiaro_material_role: string]: string};
configuration?: {type: 'intiaro'; id: UUID};
mirrored?: [x: 0 | 1, y: 0 | 1];
/**
* product group properties
*/
groupMarker?: number;
groupMarkerConfig?: {locked?: boolean; groupId?: number};
/**
* modular system configurator properties
*/
modularSystemConnector?: {
id: UUID;
root: boolean;
connections: Partial<Record<ConnectionType, UUID>>;
};
/**
* @unit centimeter
*/
width: number;
/**
* @unit centimeter
*/
height: number;
/**
* @unit centimeter
*/
z_height?: number;
/**
* @unit degree
* @range -180.0, 180.0
*/
rotation: number;
/**
* item tilt
*
* @unit degree
* @range -180.0, 180.0
*/
rotation_x?: number;
/**
* item roll
*
* @unit degree
* @range -180.0, 180.0
*/
rotation_y?: number;
}
export interface GenericOpening {
refid: Component['id'];
name?: string;
showLabel?: boolean;
frontDoor?: boolean;
internalDoor?: boolean;
frameColor?: Color;
materials?: {
[material_name: string]:
| {type: 'color'; value: Color}
| {type: 'asset'; value: Component['id']}
| {type: 'variant'; value: number};
};
/**
* @range 0.0, 1.0
*/
t: number;
/**
* @unit centimeter
*/
z: number;
/**
* @unit centimeter
*/
z_height: number;
/**
* @unit centimeter
*/
width: number;
/**
* @range 0.0, 1.0
*/
openState: number;
/**
* @unit pixel
*/
name_x?: number;
/**
* @unit pixel
*/
name_y?: number;
}
export interface Door extends GenericOpening {
type: 'door';
doorColor?: Color;
mirrored?: [x: 0 | 1, y: 0 | 1];
threshold?: {color: Color} | Partial<MaterialMetadata>;
}
export interface Window extends GenericOpening {
type: 'window';
}
export type Opening = Door | Window;
export type WallDecor =
| {color: Color}
| {refid: Component['id']}
| {
texture: {
src: string;
/**
* @unit centimeter
*/
tlx: number;
/**
* @unit centimeter
*/
tly: number;
/**
* @unit centimeter
*/
brx: number;
/**
* @unit centimeter
*/
bry: number;
fit:
| 'free'
| 'no-stretch'
| 'fill'
| 'contain'
| 'tile-horizontally'
| 'tile-vertically'
| 'tile-both';
};
};
export interface Wall extends GenericLine {
c?: Point;
az: Endpoint3D;
bz: Endpoint3D;
left: {a: Point; b: Point};
right: {a: Point; b: Point};
openings: Opening[];
decor?: {left?: WallDecor; right?: WallDecor};
groupMarker?: number;
/**
* @unit centimeter
*/
thickness: number;
/**
* @range 0.0, 1.0
*/
balance: number;
}
export interface TextureTransform {
/**
* @unit degree
* @range -180.0, 180.0
*/
rotation?: number;
/**
* @unit pixel
*/
tx?: number;
/**
* @unit pixel
*/
ty?: number;
/**
* @unit pixel
*/
sx?: number;
/**
* @unit pixel
*/
sy?: number;
}
export interface GenericArea extends TextureTransform {
poly: Point[];
name?: string;
role?: number;
refid?: Component['id'];
color?: Color;
customName?: string;
hideIn3D?: boolean;
showAreaLabel?: boolean;
showSurfaceArea?: boolean;
dottedOutline?: boolean;
dottedOutlineColor?: Color;
ceiling?: {
enabled: boolean;
color?: Color;
asset?: Partial<MaterialMetadata>;
};
room_type_id?: number;
roomstyle_id?: UUID;
styleboard_id?: number;
groupMarker?: number;
pattern?:
| 1
| 2
| 3
| 4
| 5
| 6
| 7
| 8
| 9
| 10
| 11
| 12
| 13
| 14
| 15
| 16
| 17
| 18
| 19
| 20
| 21
| 22;
/**
* @unit centimeter
*/
name_x?: number;
/**
* @unit centimeter
*/
name_y?: number;
/**
* @unit degree
* @range -180.0, 180.0
*/
patternRotation?: number;
/**
* @unit percentage
* @range 0.0, 100.0
*/
patternAlpha?: number;
/**
* @unit percentage
* @range 10.0, 400.0
*/
patternScale?: number;
}
export interface Area extends GenericArea {
poly: Point[];
ceiling?:
| {enabled: boolean; color: Color}
| {enabled: boolean; refid: Component['id']};
}
export interface Surface extends GenericArea {
/**
* poly is tricky due to variance in point shapes:
*
* | {x number, y: number, z: number}
* | {x number, y: number, cx: number, cy: number}
* | {x number, y: number, cx: number, cy: number, cz: number}
*
* this is the case due to BezierPoint extending from Point
* instead of Point3D.
*/
poly: (Point3D | BezierPoint)[];
isRoof?: boolean;
isCutout?: boolean;
/**
* @unit centimeter
*/
thickness?: number;
/**
* @unit percentage
* @range 0.0, 100.0
*/
transparency?: number;
}
export type CameraBackgroundImage =
| {type_name: 'plane'; url: string}
| {type_name: 'sphere'; url: string; sky_id: number};
export interface CameraLightSettings {
day: boolean;
dayTime:
| 'Sunrise'
| 'Morning'
| 'Midday'
| 'Afternoon'
| 'Sunset'
| 'Evening'
| 'Night';
scene: 'SKY' | 'Golfclub' | 'USK' | 'FP' | 'Mountns' | 'Studio';
profile: boolean;
clouds: 1 | 2 | 3;
altitude: number;
azimuth: number;
/**
* @unit percentage
* @range 0.0, 100.0
*/
intensity: number;
}
export interface Camera extends Point3D {
name: string;
type_name: 'orbital' | 'walkthrough';
lightSettings: CameraLightSettings;
background_image?: CameraBackgroundImage;
groupMarker?: number;
fov: number;
dx: number;
dy: number;
dz: number;
/**
* @range -1.0, 1.0
*/
ux: number;
/**
* @range -1.0, 1.0
*/
uy: number;
/**
* when -1 editor will set it to 1 on init
*
* @range -1.0, 1.0
*/
uz: number;
}
export interface FloorCamera extends Camera {
id: number;
}
export interface DesignSettings {
showCeilings3D: boolean;
engineAutoDims: boolean;
engineAutoThickness: boolean;
/**
* @range 0.1, 5.0
*/
scaleMultiplierDimensions: number;
/**
* @range 0.1, 5.0
*/
scaleMultiplierComments: number;
/**
* @range 0.5, 3.0
*/
areaLabelMultiplier: number;
/**
* @unit centimeter
*/
minWallLength?: number;
}
export interface Design {
id: number;
name: string;
items: Item[];
lines: Line[];
walls: Wall[];
areas: Area[];
labels: Label[];
cameras: Camera[];
surfaces: Surface[];
settings?: DesignSettings;
}
export interface Drawing {
url: string;
visible: boolean;
/**
* @default 'HIGH'
*/
depth: 'LOW' | 'HIGH';
/**
* @unit centimeter
*/
x: number;
/**
* @unit centimeter
*/
y: number;
/**
* @unit centimeter
*/
width: number;
/**
* @unit centimeter
*/
height: number;
/**
* @unit degree
* @range -180.0, 180.0
*/
rotation: number;
/**
* @unit percentage
* @range 0.0, 100.0
*/
alpha: number;
}
export interface Floor {
id: number;
name: string;
level: number;
designs: Design[];
drawing?: Drawing;
/**
* deprecated since cameras have moved to Design
*/
cameras?: FloorCamera[];
/**
* default wall height when drawing walls
*
* @unit centimeter
*/
height: number;
}
export interface ProjectSettings {
useMetric: boolean;
showGrid: boolean;
showDims: boolean;
showShortDims: boolean;
showAreaDims: boolean;
generateOuterDimension: boolean;
showDropShadows: boolean;
showObjects: boolean;
showFixtures: boolean;
showFixtures3D: boolean;
showItemOutline: boolean;
showObjectColour: boolean;
showStructuralColour: boolean;
showFloorsBelow: boolean;
showNorthArrow: boolean;
showObjects3D: boolean;
showObjectMono: boolean;
showSymbols: boolean;
showLights: boolean;
hideLightsOnPan: boolean;
useSection3D: boolean;
showLabels: boolean;
areaLabelOutline: boolean;
automaticAreaLabelColor: boolean;
blueprintMode: boolean;
dimLineFont: string;
dimLineLabelHorizontal: boolean;
exportLabels3D: boolean;
showShadows3D: boolean;
exportOrtho3D: boolean;
showTexts: boolean;
hideItemsAbove: boolean;
xRayWalls: boolean;
arrowHeadType: 'arrow-stop' | 'stop' | 'reverse-arrow-stop' | 'arrow';
visuals: 'ALL' | 'BW' | 'BWC';
/**
* @unit centimeter
*/
wallHeight: number;
/**
* @unit centimeter
*/
wallSectionHeight: number;
/**
* @unit centimeter
*/
wallThickness: number;
/**
* @unit centimeter
*/
wallOuterThickness: number;
/**
* @unit pixel
*/
areaLabelLetterSpacing: number;
/**
* @unit degree
* @range -180.0, 180.0
*/
northArrowRotation: number;
/**
* back-end id
*/
northArrowKind: number;
/**
* @unit centimeter
*/
hideItemsAboveHeight: number;
}
export interface Project {
id: number;
name: string;
public: boolean;
floors: Floor[];
settings?: ProjectSettings;
}