@nice2dev/spatial-core 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +160 -0
  2. package/dist/bim/index.d.ts +366 -0
  3. package/dist/bim/index.d.ts.map +1 -0
  4. package/dist/bim/index.js +60 -0
  5. package/dist/bim/index.js.map +1 -0
  6. package/dist/cad/index.d.ts +329 -0
  7. package/dist/cad/index.d.ts.map +1 -0
  8. package/dist/cad/index.js +124 -0
  9. package/dist/cad/index.js.map +1 -0
  10. package/dist/ecad/index.d.ts +316 -0
  11. package/dist/ecad/index.d.ts.map +1 -0
  12. package/dist/ecad/index.js +11 -0
  13. package/dist/ecad/index.js.map +1 -0
  14. package/dist/export/index.d.ts +93 -0
  15. package/dist/export/index.d.ts.map +1 -0
  16. package/dist/export/index.js +522 -0
  17. package/dist/export/index.js.map +1 -0
  18. package/dist/floor-plan/index.d.ts +248 -0
  19. package/dist/floor-plan/index.d.ts.map +1 -0
  20. package/dist/floor-plan/index.js +228 -0
  21. package/dist/floor-plan/index.js.map +1 -0
  22. package/dist/grid/index.d.ts +160 -0
  23. package/dist/grid/index.d.ts.map +1 -0
  24. package/dist/grid/index.js +319 -0
  25. package/dist/grid/index.js.map +1 -0
  26. package/dist/import/import.worker.d.ts +28 -0
  27. package/dist/import/import.worker.d.ts.map +1 -0
  28. package/dist/import/import.worker.js +52 -0
  29. package/dist/import/import.worker.js.map +1 -0
  30. package/dist/import/index.d.ts +111 -0
  31. package/dist/import/index.d.ts.map +1 -0
  32. package/dist/import/index.js +1092 -0
  33. package/dist/import/index.js.map +1 -0
  34. package/dist/import/workerImport.d.ts +56 -0
  35. package/dist/import/workerImport.d.ts.map +1 -0
  36. package/dist/import/workerImport.js +207 -0
  37. package/dist/import/workerImport.js.map +1 -0
  38. package/dist/index.d.ts +29 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +86 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/interior/index.d.ts +241 -0
  43. package/dist/interior/index.d.ts.map +1 -0
  44. package/dist/interior/index.js +101 -0
  45. package/dist/interior/index.js.map +1 -0
  46. package/dist/measurement/index.d.ts +186 -0
  47. package/dist/measurement/index.d.ts.map +1 -0
  48. package/dist/measurement/index.js +400 -0
  49. package/dist/measurement/index.js.map +1 -0
  50. package/dist/objects/index.d.ts +288 -0
  51. package/dist/objects/index.d.ts.map +1 -0
  52. package/dist/objects/index.js +463 -0
  53. package/dist/objects/index.js.map +1 -0
  54. package/dist/serialization/index.d.ts +421 -0
  55. package/dist/serialization/index.d.ts.map +1 -0
  56. package/dist/serialization/index.js +412 -0
  57. package/dist/serialization/index.js.map +1 -0
  58. package/dist/topology/index.d.ts +252 -0
  59. package/dist/topology/index.d.ts.map +1 -0
  60. package/dist/topology/index.js +525 -0
  61. package/dist/topology/index.js.map +1 -0
  62. package/dist/transitions/index.d.ts +141 -0
  63. package/dist/transitions/index.d.ts.map +1 -0
  64. package/dist/transitions/index.js +160 -0
  65. package/dist/transitions/index.js.map +1 -0
  66. package/dist/unified/index.d.ts +225 -0
  67. package/dist/unified/index.d.ts.map +1 -0
  68. package/dist/unified/index.js +474 -0
  69. package/dist/unified/index.js.map +1 -0
  70. package/dist/virtualization/QuadTree.d.ts +68 -0
  71. package/dist/virtualization/QuadTree.d.ts.map +1 -0
  72. package/dist/virtualization/QuadTree.js +228 -0
  73. package/dist/virtualization/QuadTree.js.map +1 -0
  74. package/dist/virtualization/ViewportCulling.d.ts +92 -0
  75. package/dist/virtualization/ViewportCulling.d.ts.map +1 -0
  76. package/dist/virtualization/ViewportCulling.js +123 -0
  77. package/dist/virtualization/ViewportCulling.js.map +1 -0
  78. package/dist/virtualization/index.d.ts +9 -0
  79. package/dist/virtualization/index.d.ts.map +1 -0
  80. package/dist/virtualization/index.js +9 -0
  81. package/dist/virtualization/index.js.map +1 -0
  82. package/package.json +64 -0
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Floor Plan Model — Unified floor plan data structures.
3
+ *
4
+ * Consolidates from:
5
+ * - cadModeUtils.ts (FloorPlan, WallSegment, RoomDefinition)
6
+ * - buildingTypes.ts (BuildingZone, FloorPlanZone)
7
+ * - NiceFloorPlanEditor types
8
+ *
9
+ * @module @nice2dev/spatial-core/floor-plan
10
+ */
11
+ import type { Point2D, BoundingBox } from '../grid/index';
12
+ import type { SpatialObject, RoomType } from '../objects/index';
13
+ export type { SpatialObject, Room, RoomType } from '../objects/index';
14
+ /** Floor plan document - the root object for .nsp.json files. */
15
+ export interface FloorPlanDocument {
16
+ /** Optional document identifier. */
17
+ id?: string;
18
+ /** Optional document name (mirrors `metadata.name` for convenience). */
19
+ name?: string;
20
+ /** Schema version. */
21
+ $schema?: string;
22
+ /** Document version. */
23
+ version?: string;
24
+ /** Document type. */
25
+ type?: FloorPlanType;
26
+ /** Document metadata. */
27
+ metadata?: FloorPlanMetadata;
28
+ /** Building/project info. */
29
+ building?: BuildingInfo;
30
+ /** Floors in the building. */
31
+ floors: Floor[];
32
+ /** Global settings. */
33
+ settings?: FloorPlanSettings;
34
+ }
35
+ /** Floor plan type determines available tools and rendering. */
36
+ export type FloorPlanType = 'floor-plan' | 'network-topology' | 'infrastructure' | 'cad' | 'interior' | 'game-scene';
37
+ /** Document metadata. */
38
+ export interface FloorPlanMetadata {
39
+ id?: string;
40
+ name?: string;
41
+ description?: string;
42
+ author?: string;
43
+ created?: string;
44
+ modified?: string;
45
+ /** Alias of {@link created} (ISO timestamp). */
46
+ createdAt?: string;
47
+ /** Alias of {@link modified} (ISO timestamp). */
48
+ modifiedAt?: string;
49
+ tags?: string[];
50
+ thumbnail?: string;
51
+ }
52
+ /** Building information. */
53
+ export interface BuildingInfo {
54
+ name: string;
55
+ address?: string;
56
+ type: BuildingType;
57
+ totalArea?: number;
58
+ floors: number;
59
+ yearBuilt?: number;
60
+ coordinates?: {
61
+ lat: number;
62
+ lng: number;
63
+ };
64
+ }
65
+ /** Building type. */
66
+ export type BuildingType = 'residential-house' | 'residential-apartment' | 'residential-condo' | 'office-small' | 'office-medium' | 'office-large' | 'office-campus' | 'retail-store' | 'retail-mall' | 'retail-warehouse' | 'industrial-factory' | 'industrial-warehouse' | 'industrial-datacenter' | 'hospitality-hotel' | 'hospitality-restaurant' | 'healthcare-clinic' | 'healthcare-hospital' | 'education-school' | 'education-university' | 'custom';
67
+ /** Floor plan settings. */
68
+ export interface FloorPlanSettings {
69
+ /** Unit system (metric/imperial). */
70
+ units: 'metric' | 'imperial';
71
+ /** Scale (pixels per meter). */
72
+ scale?: number;
73
+ /** Grid settings. */
74
+ grid?: {
75
+ visible: boolean;
76
+ size: number;
77
+ snapEnabled: boolean;
78
+ };
79
+ /** Convenience flat grid size (alias for `grid.size`). */
80
+ gridSize?: number;
81
+ /** Snap-to-grid toggle (alias for `grid.snapEnabled`). */
82
+ snapToGrid?: boolean;
83
+ /** Show measurement rulers. */
84
+ showRulers?: boolean;
85
+ /** Default floor height (used when creating new floors). */
86
+ defaultFloorHeight?: number;
87
+ /** Default wall height (meters). */
88
+ defaultWallHeight?: number;
89
+ /** Default wall thickness (meters). */
90
+ defaultWallThickness?: number;
91
+ /** Measurement precision (decimal places). */
92
+ precision?: number;
93
+ }
94
+ /** Single floor in a building. */
95
+ export interface Floor {
96
+ id: string;
97
+ name: string;
98
+ /** Floor level (0 = ground, -1 = basement, 1 = first, etc). */
99
+ level: number;
100
+ /** Floor height above ground (meters). */
101
+ elevation?: number;
102
+ /** Ceiling height (meters). */
103
+ ceilingHeight?: number;
104
+ /** Convenience floor height (used as both elevation and ceiling height when explicit values omitted). */
105
+ height?: number;
106
+ /** Optional background image (URL or null). */
107
+ backgroundImage?: string | null;
108
+ /** Floor bounds. */
109
+ bounds?: BoundingBox;
110
+ /** Optional explicit canvas dimensions for floor plan editors. */
111
+ dimensions?: {
112
+ width: number;
113
+ height: number;
114
+ };
115
+ /** Layers on this floor. */
116
+ layers: FloorLayer[];
117
+ }
118
+ /** Layer on a floor. */
119
+ export interface FloorLayer {
120
+ id: string;
121
+ name: string;
122
+ type: LayerType;
123
+ visible: boolean;
124
+ locked: boolean;
125
+ opacity: number;
126
+ color?: string;
127
+ /** Objects on this layer. */
128
+ objects: SpatialObject[];
129
+ }
130
+ /** Layer types for organization. */
131
+ export type LayerType = 'floor-plan' | 'walls' | 'rooms' | 'zones' | 'doors-windows' | 'furniture' | 'devices' | 'network' | 'infrastructure' | 'electrical' | 'plumbing' | 'hvac' | 'annotations' | 'dimensions' | 'grid' | 'background' | 'game-objects' | 'collision' | 'custom';
132
+ /** Zone in a floor plan (for automation, HVAC, security). */
133
+ export interface Zone {
134
+ id: string;
135
+ name: string;
136
+ type: ZoneType;
137
+ /** Polygon boundary. */
138
+ boundary: Point2D[];
139
+ /** Floor ID this zone belongs to. */
140
+ floorId: string;
141
+ /** Room IDs contained in this zone. */
142
+ roomIds: string[];
143
+ /** Zone color for visualization. */
144
+ color: string;
145
+ /** Automation settings. */
146
+ automationSettings?: ZoneAutomationSettings;
147
+ /** Climate settings. */
148
+ climateSettings?: ZoneClimateSettings;
149
+ /** Security level. */
150
+ securityLevel?: 'public' | 'restricted' | 'secure' | 'high-security';
151
+ }
152
+ /** Zone types for different purposes. */
153
+ export type ZoneType = 'hvac' | 'lighting' | 'security' | 'fire' | 'access-control' | 'occupancy' | 'audio' | 'network' | 'custom';
154
+ /** Automation settings for a zone. */
155
+ export interface ZoneAutomationSettings {
156
+ /** Occupancy-based control. */
157
+ occupancyControl: boolean;
158
+ /** Schedule-based control. */
159
+ scheduleControl: boolean;
160
+ /** Scene presets. */
161
+ scenes?: string[];
162
+ /** Default scene. */
163
+ defaultScene?: string;
164
+ }
165
+ /** Climate settings for a zone. */
166
+ export interface ZoneClimateSettings {
167
+ /** Target temperature setpoint. */
168
+ temperatureSetpoint?: number;
169
+ /** Temperature range (min, max). */
170
+ temperatureRange?: {
171
+ min: number;
172
+ max: number;
173
+ };
174
+ /** Humidity setpoint. */
175
+ humiditySetpoint?: number;
176
+ /** Ventilation mode. */
177
+ ventilationMode?: 'auto' | 'manual' | 'schedule';
178
+ }
179
+ /**
180
+ * Create a new empty floor plan document.
181
+ */
182
+ export declare function createFloorPlanDocument(name: string, type?: FloorPlanType): FloorPlanDocument;
183
+ /**
184
+ * Create a new floor.
185
+ */
186
+ export declare function createFloor(name: string, level: number, bounds: BoundingBox): Floor;
187
+ /**
188
+ * Create a new layer.
189
+ */
190
+ export declare function createLayer(name: string, type: LayerType): FloorLayer;
191
+ /**
192
+ * Add object to a layer.
193
+ */
194
+ export declare function addObjectToLayer(floor: Floor, layerId: string, object: SpatialObject): Floor;
195
+ /**
196
+ * Remove object from floor.
197
+ */
198
+ export declare function removeObjectFromFloor(floor: Floor, objectId: string): Floor;
199
+ /**
200
+ * Find object by ID in a floor.
201
+ */
202
+ export declare function findObjectInFloor(floor: Floor, objectId: string): {
203
+ object: SpatialObject;
204
+ layerId: string;
205
+ } | null;
206
+ /**
207
+ * Get all objects of a specific type from floor.
208
+ */
209
+ export declare function getObjectsByType<T extends SpatialObject>(floor: Floor, type: string): T[];
210
+ /**
211
+ * Calculate floor area from rooms.
212
+ */
213
+ export declare function calculateFloorArea(floor: Floor): number;
214
+ /**
215
+ * Calculate polygon area (Shoelace formula).
216
+ */
217
+ export declare function calculatePolygonArea(points: Point2D[]): number;
218
+ /**
219
+ * Check if point is inside polygon.
220
+ */
221
+ export declare function isPointInPolygon(point: Point2D, polygon: Point2D[]): boolean;
222
+ /** Room preset with suggested furniture. */
223
+ export interface RoomPreset {
224
+ name: string;
225
+ roomType: RoomType;
226
+ suggestedSize: {
227
+ width: number;
228
+ depth: number;
229
+ };
230
+ suggestedFurniture: string[];
231
+ }
232
+ /** Pre-defined room presets. */
233
+ export declare const ROOM_PRESETS: RoomPreset[];
234
+ declare const _default: {
235
+ createFloorPlanDocument: typeof createFloorPlanDocument;
236
+ createFloor: typeof createFloor;
237
+ createLayer: typeof createLayer;
238
+ addObjectToLayer: typeof addObjectToLayer;
239
+ removeObjectFromFloor: typeof removeObjectFromFloor;
240
+ findObjectInFloor: typeof findObjectInFloor;
241
+ getObjectsByType: typeof getObjectsByType;
242
+ calculateFloorArea: typeof calculateFloorArea;
243
+ calculatePolygonArea: typeof calculatePolygonArea;
244
+ isPointInPolygon: typeof isPointInPolygon;
245
+ ROOM_PRESETS: RoomPreset[];
246
+ };
247
+ export default _default;
248
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/floor-plan/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Floor Plan Model — Unified floor plan data structures.
3
+ *
4
+ * Consolidates from:
5
+ * - cadModeUtils.ts (FloorPlan, WallSegment, RoomDefinition)
6
+ * - buildingTypes.ts (BuildingZone, FloorPlanZone)
7
+ * - NiceFloorPlanEditor types
8
+ *
9
+ * @module @nice2dev/spatial-core/floor-plan
10
+ */
11
+ /* ================================================================
12
+ FLOOR PLAN UTILITIES
13
+ ================================================================ */
14
+ /**
15
+ * Create a new empty floor plan document.
16
+ */
17
+ export function createFloorPlanDocument(name, type = 'floor-plan') {
18
+ const now = new Date().toISOString();
19
+ return {
20
+ $schema: 'https://nice2dev.com/schemas/nsp-v1.json',
21
+ version: '1.0.0',
22
+ type,
23
+ metadata: {
24
+ id: generateId(),
25
+ name,
26
+ created: now,
27
+ modified: now,
28
+ },
29
+ floors: [],
30
+ settings: {
31
+ units: 'metric',
32
+ scale: 50, // 50 pixels per meter
33
+ grid: {
34
+ visible: true,
35
+ size: 0.5, // 50cm grid
36
+ snapEnabled: true,
37
+ },
38
+ defaultWallHeight: 2.7,
39
+ defaultWallThickness: 0.15,
40
+ precision: 2,
41
+ },
42
+ };
43
+ }
44
+ /**
45
+ * Create a new floor.
46
+ */
47
+ export function createFloor(name, level, bounds) {
48
+ return {
49
+ id: generateId(),
50
+ name,
51
+ level,
52
+ elevation: level * 3, // Assume 3m per floor
53
+ ceilingHeight: 2.7,
54
+ bounds,
55
+ layers: [
56
+ createLayer('Walls', 'walls'),
57
+ createLayer('Rooms', 'rooms'),
58
+ createLayer('Doors & Windows', 'doors-windows'),
59
+ createLayer('Furniture', 'furniture'),
60
+ createLayer('Devices', 'devices'),
61
+ createLayer('Annotations', 'annotations'),
62
+ ],
63
+ };
64
+ }
65
+ /**
66
+ * Create a new layer.
67
+ */
68
+ export function createLayer(name, type) {
69
+ return {
70
+ id: generateId(),
71
+ name,
72
+ type,
73
+ visible: true,
74
+ locked: false,
75
+ opacity: 1,
76
+ objects: [],
77
+ };
78
+ }
79
+ /**
80
+ * Add object to a layer.
81
+ */
82
+ export function addObjectToLayer(floor, layerId, object) {
83
+ return {
84
+ ...floor,
85
+ layers: floor.layers.map((layer) => layer.id === layerId ? { ...layer, objects: [...layer.objects, object] } : layer),
86
+ };
87
+ }
88
+ /**
89
+ * Remove object from floor.
90
+ */
91
+ export function removeObjectFromFloor(floor, objectId) {
92
+ return {
93
+ ...floor,
94
+ layers: floor.layers.map((layer) => ({
95
+ ...layer,
96
+ objects: layer.objects.filter((obj) => obj.id !== objectId),
97
+ })),
98
+ };
99
+ }
100
+ /**
101
+ * Find object by ID in a floor.
102
+ */
103
+ export function findObjectInFloor(floor, objectId) {
104
+ for (const layer of floor.layers) {
105
+ const object = layer.objects.find((obj) => obj.id === objectId);
106
+ if (object) {
107
+ return { object, layerId: layer.id };
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * Get all objects of a specific type from floor.
114
+ */
115
+ export function getObjectsByType(floor, type) {
116
+ const results = [];
117
+ for (const layer of floor.layers) {
118
+ for (const obj of layer.objects) {
119
+ if (obj.type === type) {
120
+ results.push(obj);
121
+ }
122
+ }
123
+ }
124
+ return results;
125
+ }
126
+ /**
127
+ * Calculate floor area from rooms.
128
+ */
129
+ export function calculateFloorArea(floor) {
130
+ const rooms = getObjectsByType(floor, 'room');
131
+ return rooms.reduce((sum, room) => sum + room.area, 0);
132
+ }
133
+ /**
134
+ * Calculate polygon area (Shoelace formula).
135
+ */
136
+ export function calculatePolygonArea(points) {
137
+ if (points.length < 3) {
138
+ return 0;
139
+ }
140
+ let area = 0;
141
+ const n = points.length;
142
+ for (let i = 0; i < n; i++) {
143
+ const j = (i + 1) % n;
144
+ area += points[i].x * points[j].y;
145
+ area -= points[j].x * points[i].y;
146
+ }
147
+ return Math.abs(area) / 2;
148
+ }
149
+ /**
150
+ * Check if point is inside polygon.
151
+ */
152
+ export function isPointInPolygon(point, polygon) {
153
+ let inside = false;
154
+ const n = polygon.length;
155
+ for (let i = 0, j = n - 1; i < n; j = i++) {
156
+ const xi = polygon[i].x, yi = polygon[i].y;
157
+ const xj = polygon[j].x, yj = polygon[j].y;
158
+ if (yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi) {
159
+ inside = !inside;
160
+ }
161
+ }
162
+ return inside;
163
+ }
164
+ /**
165
+ * Generate unique ID.
166
+ */
167
+ function generateId() {
168
+ return `${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 9)}`;
169
+ }
170
+ /** Pre-defined room presets. */
171
+ export const ROOM_PRESETS = [
172
+ {
173
+ name: 'Living Room',
174
+ roomType: 'living-room',
175
+ suggestedSize: { width: 5, depth: 4 },
176
+ suggestedFurniture: [
177
+ 'furn-sofa-3',
178
+ 'furn-coffee-table',
179
+ 'furn-armchair',
180
+ 'sh-tv',
181
+ 'sh-speaker',
182
+ ],
183
+ },
184
+ {
185
+ name: 'Bedroom',
186
+ roomType: 'bedroom',
187
+ suggestedSize: { width: 4, depth: 3.5 },
188
+ suggestedFurniture: ['furn-bed-queen', 'furn-dresser', 'furn-wardrobe', 'sh-light-dimmer'],
189
+ },
190
+ {
191
+ name: 'Home Office',
192
+ roomType: 'home-office',
193
+ suggestedSize: { width: 3, depth: 3 },
194
+ suggestedFurniture: ['furn-desk', 'furn-office-chair', 'furn-bookshelf', 'sh-light-rgb'],
195
+ },
196
+ {
197
+ name: 'Kitchen',
198
+ roomType: 'kitchen',
199
+ suggestedSize: { width: 4, depth: 3 },
200
+ suggestedFurniture: ['sh-light-bulb', 'sh-sensor-smoke', 'sh-appliance'],
201
+ },
202
+ {
203
+ name: 'Server Room',
204
+ roomType: 'server-room',
205
+ suggestedSize: { width: 4, depth: 4 },
206
+ suggestedFurniture: ['infra-rack-42u', 'infra-ups', 'infra-cooling', 'net-switch-48'],
207
+ },
208
+ {
209
+ name: 'Conference Room',
210
+ roomType: 'conference-room',
211
+ suggestedSize: { width: 6, depth: 4 },
212
+ suggestedFurniture: ['furn-dining-table-6', 'furn-office-chair', 'sh-projector', 'sh-speaker'],
213
+ },
214
+ ];
215
+ export default {
216
+ createFloorPlanDocument,
217
+ createFloor,
218
+ createLayer,
219
+ addObjectToLayer,
220
+ removeObjectFromFloor,
221
+ findObjectInFloor,
222
+ getObjectsByType,
223
+ calculateFloorArea,
224
+ calculatePolygonArea,
225
+ isPointInPolygon,
226
+ ROOM_PRESETS,
227
+ };
228
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/floor-plan/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Grid System — Unified snap-to-grid and alignment guides.
3
+ *
4
+ * Consolidates functionality from:
5
+ * - ui-diagrams/snapGrid.ts
6
+ * - ui-3d/modelEditorUtils.ts (snapToGrid)
7
+ * - game-engine/Tilemap grid logic
8
+ *
9
+ * @module @nice2dev/spatial-core/grid
10
+ */
11
+ /** 2D point. */
12
+ export interface Point2D {
13
+ x: number;
14
+ y: number;
15
+ }
16
+ /** 3D point. */
17
+ export interface Point3D {
18
+ x: number;
19
+ y: number;
20
+ z: number;
21
+ }
22
+ /** Snap mode for intelligent snapping. */
23
+ export type SnapMode = 'none' | 'grid' | 'endpoint' | 'midpoint' | 'center' | 'intersection' | 'perpendicular' | 'nearest' | 'angle';
24
+ /** Grid configuration. */
25
+ export interface GridConfig {
26
+ /** Grid cell size in units. */
27
+ cellSize: number;
28
+ /** Major grid line interval (e.g., every 10 cells). */
29
+ majorInterval: number;
30
+ /** Grid origin offset. */
31
+ origin: Point2D;
32
+ /** Whether grid is visible. */
33
+ visible: boolean;
34
+ /** Grid color (CSS color). */
35
+ color: string;
36
+ /** Major grid line color. */
37
+ majorColor: string;
38
+ /** Grid opacity (0-1). */
39
+ opacity: number;
40
+ /** Enabled snap modes. */
41
+ snapModes: SnapMode[];
42
+ /** Snap distance threshold in pixels. */
43
+ snapThreshold: number;
44
+ /** Angle snap increment in degrees (for 'angle' mode). */
45
+ angleIncrement: number;
46
+ }
47
+ /** Alignment guide line. */
48
+ export interface AlignmentGuide {
49
+ /** Guide type. */
50
+ type: 'horizontal' | 'vertical' | 'diagonal';
51
+ /** Line start point. */
52
+ start: Point2D;
53
+ /** Line end point. */
54
+ end: Point2D;
55
+ /** Distance to snapped object. */
56
+ distance: number;
57
+ /** Source object ID that generated this guide. */
58
+ sourceObjectId?: string;
59
+ }
60
+ /** Snap result with snapped position and guides. */
61
+ export interface SnapResult {
62
+ /** Snapped position. */
63
+ position: Point2D;
64
+ /** Whether snap occurred. */
65
+ snapped: boolean;
66
+ /** Active snap mode used. */
67
+ snapMode: SnapMode | null;
68
+ /** Generated alignment guides. */
69
+ guides: AlignmentGuide[];
70
+ /** Snap target object ID (if snapped to object). */
71
+ targetObjectId?: string;
72
+ }
73
+ /** Bounding box. */
74
+ export interface BoundingBox {
75
+ x: number;
76
+ y: number;
77
+ width: number;
78
+ height: number;
79
+ }
80
+ /** Object with spatial bounds for snap calculations. */
81
+ export interface SnapTarget {
82
+ id: string;
83
+ bounds: BoundingBox;
84
+ /** Optional custom snap points. */
85
+ snapPoints?: Point2D[];
86
+ /** Optional edges for perpendicular/nearest snap. */
87
+ edges?: Array<{
88
+ start: Point2D;
89
+ end: Point2D;
90
+ }>;
91
+ }
92
+ export declare const DEFAULT_GRID_CONFIG: GridConfig;
93
+ /**
94
+ * Snap a point to grid.
95
+ */
96
+ export declare function snapToGrid(point: Point2D, config: GridConfig): Point2D;
97
+ /**
98
+ * Snap a 3D point to grid.
99
+ */
100
+ export declare function snapToGrid3D(point: Point3D, cellSize: number): Point3D;
101
+ /**
102
+ * Convert world coordinates to grid cell.
103
+ */
104
+ export declare function worldToCell(point: Point2D, config: GridConfig): Point2D;
105
+ /**
106
+ * Convert grid cell to world coordinates (cell center).
107
+ */
108
+ export declare function cellToWorld(cell: Point2D, config: GridConfig): Point2D;
109
+ /**
110
+ * Check if point is on grid line.
111
+ */
112
+ export declare function isOnGridLine(point: Point2D, config: GridConfig): boolean;
113
+ /**
114
+ * Get snap points for an object (corners, center, midpoints).
115
+ */
116
+ export declare function getObjectSnapPoints(target: SnapTarget): Point2D[];
117
+ /**
118
+ * Find nearest snap point within threshold.
119
+ */
120
+ export declare function findNearestSnapPoint(point: Point2D, targets: SnapTarget[], threshold: number): {
121
+ point: Point2D;
122
+ targetId: string;
123
+ distance: number;
124
+ } | null;
125
+ /**
126
+ * Calculate distance between two 2D points.
127
+ */
128
+ export declare function distance2D(a: Point2D, b: Point2D): number;
129
+ /**
130
+ * Generate alignment guides for a dragged object.
131
+ */
132
+ export declare function generateAlignmentGuides(draggedBounds: BoundingBox, otherObjects: SnapTarget[], threshold: number): AlignmentGuide[];
133
+ /**
134
+ * Perform intelligent snapping based on enabled modes.
135
+ */
136
+ export declare function performSnap(point: Point2D, targets: SnapTarget[], config: GridConfig): SnapResult;
137
+ /**
138
+ * Generate grid lines for rendering.
139
+ */
140
+ export declare function generateGridLines(viewport: BoundingBox, config: GridConfig): Array<{
141
+ start: Point2D;
142
+ end: Point2D;
143
+ isMajor: boolean;
144
+ }>;
145
+ declare const _default: {
146
+ snapToGrid: typeof snapToGrid;
147
+ snapToGrid3D: typeof snapToGrid3D;
148
+ worldToCell: typeof worldToCell;
149
+ cellToWorld: typeof cellToWorld;
150
+ isOnGridLine: typeof isOnGridLine;
151
+ getObjectSnapPoints: typeof getObjectSnapPoints;
152
+ findNearestSnapPoint: typeof findNearestSnapPoint;
153
+ distance2D: typeof distance2D;
154
+ generateAlignmentGuides: typeof generateAlignmentGuides;
155
+ performSnap: typeof performSnap;
156
+ generateGridLines: typeof generateGridLines;
157
+ DEFAULT_GRID_CONFIG: GridConfig;
158
+ };
159
+ export default _default;
160
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/grid/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,gBAAgB;AAChB,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,gBAAgB;AAChB,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,0CAA0C;AAC1C,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,MAAM,GACN,UAAU,GACV,UAAU,GACV,QAAQ,GACR,cAAc,GACd,eAAe,GACf,SAAS,GACT,OAAO,CAAC;AAEZ,0BAA0B;AAC1B,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,4BAA4B;AAC5B,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;IAC7C,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,sBAAsB;IACtB,GAAG,EAAE,OAAO,CAAC;IACb,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,kCAAkC;IAClC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,mCAAmC;IACnC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;IACvB,qDAAqD;IACrD,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjD;AAMD,eAAO,MAAM,mBAAmB,EAAE,UAWjC,CAAC;AAMF;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAMtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAMvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAMtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAMxE;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,EAAE,CAoBjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,UAAU,EAAE,EACrB,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAc/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAEzD;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,WAAW,EAC1B,YAAY,EAAE,UAAU,EAAE,EAC1B,SAAS,EAAE,MAAM,GAChB,cAAc,EAAE,CAwFlB;AAqBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAuCjG;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,UAAU,GACjB,KAAK,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+B3D;;;;;;;;;;;;;;;AAED,wBAaE"}