From 8b1fbb4c1d0c040e10f4c781197913d6af91995c Mon Sep 17 00:00:00 2001 From: wass08 Date: Tue, 27 Jan 2026 07:05:37 +0900 Subject: [PATCH] slab type --- packages/core/src/events/bus.ts | 3 ++- packages/core/src/schema/index.ts | 4 ++-- packages/core/src/schema/nodes/level.ts | 4 ++-- packages/core/src/schema/nodes/slab.ts | 24 ++++++++++++++++++++++++ packages/core/src/schema/types.ts | 2 ++ 5 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 packages/core/src/schema/nodes/slab.ts diff --git a/packages/core/src/events/bus.ts b/packages/core/src/events/bus.ts index 3a221bec..698de8bc 100644 --- a/packages/core/src/events/bus.ts +++ b/packages/core/src/events/bus.ts @@ -1,6 +1,6 @@ import type { ThreeEvent } from '@react-three/fiber' import mitt from 'mitt' -import type { BuildingNode, ItemNode, WallNode, ZoneNode } from '../schema' +import type { BuildingNode, ItemNode, SlabNode, WallNode, ZoneNode } from '../schema' import type { AnyNode } from '../schema/types' // Base event interfaces @@ -22,6 +22,7 @@ export type WallEvent = NodeEvent export type ItemEvent = NodeEvent export type BuildingEvent = NodeEvent export type ZoneEvent = NodeEvent +export type SlabEvent = NodeEvent // Event suffixes - exported for use in hooks export const eventSuffixes = [ diff --git a/packages/core/src/schema/index.ts b/packages/core/src/schema/index.ts index 659f1381..a08a404e 100644 --- a/packages/core/src/schema/index.ts +++ b/packages/core/src/schema/index.ts @@ -8,10 +8,10 @@ export { ItemNode } from './nodes/item' export { LevelNode } from './nodes/level' // Nodes export { SiteNode } from './nodes/site' +export { SlabNode, SlabPolygon } from './nodes/slab' export { WallNode } from './nodes/wall' -// Zones -export { ZoneNode } from './nodes/zone' export type { ZonePolygon } from './nodes/zone' +export { ZoneNode } from './nodes/zone' export type { AnyNodeId, AnyNodeType } from './types' // Union types export { AnyNode } from './types' diff --git a/packages/core/src/schema/nodes/level.ts b/packages/core/src/schema/nodes/level.ts index 77685b7e..3cfdc0c7 100644 --- a/packages/core/src/schema/nodes/level.ts +++ b/packages/core/src/schema/nodes/level.ts @@ -1,14 +1,14 @@ import dedent from 'dedent' import { z } from 'zod' import { BaseNode, nodeType, objectId } from '../base' +import { SlabNode } from './slab' import { WallNode } from './wall' import { ZoneNode } from './zone' - export const LevelNode = BaseNode.extend({ id: objectId('level'), type: nodeType('level'), - children: z.array(z.union([WallNode.shape.id, ZoneNode.shape.id])).default([]), + children: z.array(z.union([WallNode.shape.id, ZoneNode.shape.id, SlabNode.shape.id])).default([]), // Specific props level: z.number().default(0), }).describe( diff --git a/packages/core/src/schema/nodes/slab.ts b/packages/core/src/schema/nodes/slab.ts new file mode 100644 index 00000000..0a0f90a2 --- /dev/null +++ b/packages/core/src/schema/nodes/slab.ts @@ -0,0 +1,24 @@ +import dedent from 'dedent' +import { z } from 'zod' +import { BaseNode, nodeType, objectId } from '../base' + +// Polygon boundary for zone area - array of [x, z] coordinates +export const SlabPolygon = z.array(z.tuple([z.number(), z.number()])) + +export const SlabNode = BaseNode.extend({ + id: objectId('slab'), + type: nodeType('slab'), + // Specific props + // Polygon boundary - array of [x, z] coordinates defining the slab + polygon: SlabPolygon, + elevation: z.number().default(0.05), // Elevation in meters +}).describe( + dedent` + Slab node - used to represent a slab/floor in the building + - polygon: array of [x, z] points defining the slab boundary + - elevation: elevation in meters + `, +) + +export type SlabNode = z.infer +export type SlabPolygon = z.infer diff --git a/packages/core/src/schema/types.ts b/packages/core/src/schema/types.ts index cca1b644..9b3da384 100644 --- a/packages/core/src/schema/types.ts +++ b/packages/core/src/schema/types.ts @@ -3,6 +3,7 @@ import { BuildingNode } from './nodes/building' import { ItemNode } from './nodes/item' import { LevelNode } from './nodes/level' import { SiteNode } from './nodes/site' +import { SlabNode } from './nodes/slab' import { WallNode } from './nodes/wall' import { ZoneNode } from './nodes/zone' @@ -13,6 +14,7 @@ export const AnyNode = z.discriminatedUnion('type', [ WallNode, ItemNode, ZoneNode, + SlabNode, ]) export type AnyNode = z.infer