diff --git a/README.md b/README.md index f543a3d..6f7714f 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,8 @@ You can always find the most up-to-date [API documentation here](https://mod-con ## Data Model +> **Note on Units**: All units decsribing the geometry of prefab elements are expressed in **millimeters (mm)** unless otherwise specified. + ```mermaid erDiagram PrefabElement { diff --git a/src/types/common/boundingBoxSchema.ts b/src/types/common/boundingBoxSchema.ts index a42c181..b1b1315 100644 --- a/src/types/common/boundingBoxSchema.ts +++ b/src/types/common/boundingBoxSchema.ts @@ -1,12 +1,19 @@ import { z } from "zod"; -const BoundingBoxSchema = z.object({ - width: z.number().gt(0, "Width must be greater than 0"), - height: z.number().gt(0, "Height must be greater than 0"), - depth: z.number().gt(0, "Depth must be greater than 0") +const BoundingBoxSchema = z.object({ + max: z.tuple([ + z.number().positive(), + z.number().positive(), + z.number().positive() + ]).describe("Maximum corner in millimeters and defined in the local coordianate system"), + }).openapi({ - description: "The bounding box of an element in millimeters.", + description: "Local bounding box aligned to element's own axes, origin at (0,0,0). Dimensions in millimeters." }); type BoundingBox = z.infer; -export { BoundingBoxSchema, BoundingBox }; \ No newline at end of file + +export { + BoundingBoxSchema, + BoundingBox, +}; \ No newline at end of file diff --git a/src/types/common/dimensionalAttributesSchema.ts b/src/types/common/dimensionalAttributesSchema.ts index eecb412..d96e5a7 100644 --- a/src/types/common/dimensionalAttributesSchema.ts +++ b/src/types/common/dimensionalAttributesSchema.ts @@ -2,9 +2,18 @@ import { z } from "zod"; import { RangeSchema } from "./rangeSchema"; const DimensionalAttributesSchema = z.object({ - width: RangeSchema, - height: RangeSchema, - length: RangeSchema + length: RangeSchema.describe("Primary dimension along the longest horizontal axis of the element. Used for linear elements like beams, walls, and slabs."), + width: RangeSchema.describe("Secondary horizontal dimension perpendicular to length. Used for planar elements like slabs, walls, and panels."), + height: RangeSchema.describe("Vertical dimension. Defines the elevation of elements like walls and columns."), + depth: RangeSchema.describe("Cross-sectional dimension of structural members like beams and columns."), + thickness: RangeSchema.describe("Smallest dimension of planar elements such as walls, slabs, or panels. Represents the cross-sectional depth."), + radius: RangeSchema.describe("Radius of circular or cylindrical elements like columns, piles, or pipes."), +}).openapi({ + description: + "Dimensional attributes defining the physical size of prefab elements. " + + "All dimensions are optional and dependent on element type. " + + "All measurements are in millimeters (mm). " + + "Ranges represent manufacturing constraints.", }); type DimensionalAttributes = z.infer; diff --git a/src/types/entities/prefabElementSchema.ts b/src/types/entities/prefabElementSchema.ts index aa3da33..02c9abf 100644 --- a/src/types/entities/prefabElementSchema.ts +++ b/src/types/entities/prefabElementSchema.ts @@ -49,9 +49,9 @@ const PrefabElementSchema = z.object({ example: "This CLT wall panel is suitable for multi-story residential buildings and meets fire resistance standards." }), boundingBox: BoundingBoxSchema - .describe("3D bounding dimensions of the prefab element.") + .describe("3D bounding dimensions of the prefab element, located at the Local Origin (0,0,0).") .openapi({ - description: "3D bounding dimensions of the prefab element, defining its spatial envelope." + description: "3D bounding dimensions of the prefab element, located at the local origin (0,0,0)." }), images: z.array(z.string()).min(1, "At least one image is required") .describe("Image URLs of the element")