@ifc-lite/parser 2.1.9 → 2.3.0

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.
@@ -0,0 +1,511 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Schedule (4D) extractor — parses IfcTask, IfcTaskTime, IfcRelSequence,
6
+ * IfcRelAssignsToProcess, IfcRelAssignsToControl, IfcRelNests, IfcWorkSchedule,
7
+ * IfcWorkPlan, IfcLagTime from a parsed IfcDataStore and returns a normalized
8
+ * ScheduleExtraction that the viewer can drive a Gantt/4D animation from.
9
+ *
10
+ * Handles IFC4 / IFC4X3. IFC2X3 has a different IfcTask layout (no TaskTime
11
+ * attribute, ScheduleStart/ScheduleFinish/TaskOwner instead) and is supported
12
+ * with best-effort degradation.
13
+ */
14
+ import { EntityExtractor } from './entity-extractor.js';
15
+ /** IFC4 STEP attribute indices for IfcTask. */
16
+ const TASK_ATTR = {
17
+ GlobalId: 0,
18
+ Name: 2,
19
+ Description: 3,
20
+ ObjectType: 4,
21
+ Identification: 5,
22
+ LongDescription: 6,
23
+ Status: 7,
24
+ WorkMethod: 8,
25
+ IsMilestone: 9,
26
+ Priority: 10,
27
+ TaskTime: 11,
28
+ PredefinedType: 12,
29
+ };
30
+ /**
31
+ * IFC2X3 IfcTask layout — the attributes IfcTask itself adds over IfcObject
32
+ * (TaskId, Status, WorkMethod, IsMilestone, Priority). IFC2X3 schedule times
33
+ * live on `IfcScheduleTimeControl` and link to IfcTask via `IfcRelAssignsTasks`
34
+ * — we don't resolve those here yet; best-effort 2x3 models only surface task
35
+ * metadata without dates.
36
+ */
37
+ const TASK_ATTR_2X3 = {
38
+ GlobalId: 0,
39
+ Name: 2,
40
+ Description: 3,
41
+ ObjectType: 4,
42
+ TaskId: 5,
43
+ Status: 6,
44
+ WorkMethod: 7,
45
+ IsMilestone: 8,
46
+ Priority: 9,
47
+ };
48
+ const TASK_TIME_ATTR = {
49
+ Name: 0,
50
+ DurationType: 3,
51
+ ScheduleDuration: 4,
52
+ ScheduleStart: 5,
53
+ ScheduleFinish: 6,
54
+ EarlyStart: 7,
55
+ EarlyFinish: 8,
56
+ LateStart: 9,
57
+ LateFinish: 10,
58
+ FreeFloat: 11,
59
+ TotalFloat: 12,
60
+ IsCritical: 13,
61
+ StatusTime: 14,
62
+ ActualDuration: 15,
63
+ ActualStart: 16,
64
+ ActualFinish: 17,
65
+ RemainingTime: 18,
66
+ Completion: 19,
67
+ };
68
+ const REL_SEQUENCE_ATTR = {
69
+ GlobalId: 0,
70
+ RelatingProcess: 4,
71
+ RelatedProcess: 5,
72
+ TimeLag: 6,
73
+ SequenceType: 7,
74
+ UserDefinedSequenceType: 8,
75
+ };
76
+ const REL_ASSIGNS_TO_PROCESS_ATTR = {
77
+ RelatedObjects: 4,
78
+ RelatingProcess: 6,
79
+ };
80
+ const REL_ASSIGNS_TO_CONTROL_ATTR = {
81
+ RelatedObjects: 4,
82
+ RelatingControl: 6,
83
+ };
84
+ const REL_NESTS_ATTR = {
85
+ RelatingObject: 4,
86
+ RelatedObjects: 5,
87
+ };
88
+ const WORK_SCHEDULE_ATTR = {
89
+ GlobalId: 0,
90
+ Name: 2,
91
+ Description: 3,
92
+ ObjectType: 4,
93
+ Identification: 5,
94
+ CreationDate: 6,
95
+ Purpose: 8,
96
+ Duration: 9,
97
+ TotalFloat: 10,
98
+ StartTime: 11,
99
+ FinishTime: 12,
100
+ PredefinedType: 13,
101
+ };
102
+ const WORK_PLAN_ATTR = WORK_SCHEDULE_ATTR;
103
+ const LAG_TIME_ATTR = {
104
+ LagValue: 3,
105
+ DurationType: 4,
106
+ };
107
+ function asString(v) {
108
+ if (typeof v === 'string' && v.length > 0)
109
+ return v;
110
+ return undefined;
111
+ }
112
+ function asNumber(v) {
113
+ if (typeof v === 'number' && Number.isFinite(v))
114
+ return v;
115
+ return undefined;
116
+ }
117
+ function asBoolean(v) {
118
+ if (typeof v === 'boolean')
119
+ return v;
120
+ // STEP booleans are typically stored as '.T.' / '.F.' after parsing
121
+ if (typeof v === 'string') {
122
+ if (v === '.T.' || v === 'T')
123
+ return true;
124
+ if (v === '.F.' || v === 'F')
125
+ return false;
126
+ }
127
+ return undefined;
128
+ }
129
+ function asEnum(v) {
130
+ if (typeof v !== 'string' || v.length === 0)
131
+ return undefined;
132
+ // STEP enum looks like .PLANNED.
133
+ const match = v.match(/^\.([A-Z_]+)\.$/);
134
+ return match ? match[1] : undefined;
135
+ }
136
+ function asRef(v) {
137
+ if (typeof v === 'number' && Number.isInteger(v) && v > 0)
138
+ return v;
139
+ return undefined;
140
+ }
141
+ function asRefList(v) {
142
+ if (!Array.isArray(v))
143
+ return [];
144
+ const out = [];
145
+ for (const x of v) {
146
+ const id = asRef(x);
147
+ if (id !== undefined)
148
+ out.push(id);
149
+ }
150
+ return out;
151
+ }
152
+ function sequenceTypeFromString(s) {
153
+ switch (s) {
154
+ case 'START_START':
155
+ case 'START_FINISH':
156
+ case 'FINISH_START':
157
+ case 'FINISH_FINISH':
158
+ case 'USERDEFINED':
159
+ case 'NOTDEFINED':
160
+ return s;
161
+ default:
162
+ return 'FINISH_START';
163
+ }
164
+ }
165
+ function durationTypeFromString(s) {
166
+ switch (s) {
167
+ case 'WORKTIME':
168
+ case 'ELAPSEDTIME':
169
+ case 'NOTDEFINED':
170
+ return s;
171
+ default:
172
+ return undefined;
173
+ }
174
+ }
175
+ /**
176
+ * Parse an ISO-8601 duration string (e.g. "P1D", "PT2H30M", "P1Y2M3DT4H5M6S")
177
+ * into a number of seconds. Returns undefined on invalid input.
178
+ */
179
+ export function parseIso8601Duration(value) {
180
+ if (!value)
181
+ return undefined;
182
+ const match = value.match(/^P(?:(\d+(?:\.\d+)?)Y)?(?:(\d+(?:\.\d+)?)M)?(?:(\d+(?:\.\d+)?)W)?(?:(\d+(?:\.\d+)?)D)?(?:T(?:(\d+(?:\.\d+)?)H)?(?:(\d+(?:\.\d+)?)M)?(?:(\d+(?:\.\d+)?)S)?)?$/);
183
+ if (!match)
184
+ return undefined;
185
+ const [, y, mo, w, d, h, mi, s] = match;
186
+ // Reject bare "P" / "PT" which would otherwise silently return 0 and mask
187
+ // malformed IfcLagTime / IfcTaskTime durations.
188
+ if (y === undefined && mo === undefined && w === undefined && d === undefined
189
+ && h === undefined && mi === undefined && s === undefined) {
190
+ return undefined;
191
+ }
192
+ const yearSec = 365.2425 * 86400;
193
+ const monthSec = yearSec / 12;
194
+ return ((y ? parseFloat(y) * yearSec : 0) +
195
+ (mo ? parseFloat(mo) * monthSec : 0) +
196
+ (w ? parseFloat(w) * 7 * 86400 : 0) +
197
+ (d ? parseFloat(d) * 86400 : 0) +
198
+ (h ? parseFloat(h) * 3600 : 0) +
199
+ (mi ? parseFloat(mi) * 60 : 0) +
200
+ (s ? parseFloat(s) : 0));
201
+ }
202
+ function extractTaskTime(extractor, store, taskTimeId) {
203
+ const ref = store.entityIndex.byId.get(taskTimeId);
204
+ if (!ref)
205
+ return undefined;
206
+ const entity = extractor.extractEntity(ref);
207
+ if (!entity)
208
+ return undefined;
209
+ const t = entity.type.toUpperCase();
210
+ if (t !== 'IFCTASKTIME' && t !== 'IFCTASKTIMERECURRING')
211
+ return undefined;
212
+ const a = entity.attributes || [];
213
+ return {
214
+ durationType: durationTypeFromString(asEnum(a[TASK_TIME_ATTR.DurationType])),
215
+ scheduleDuration: asString(a[TASK_TIME_ATTR.ScheduleDuration]),
216
+ scheduleStart: asString(a[TASK_TIME_ATTR.ScheduleStart]),
217
+ scheduleFinish: asString(a[TASK_TIME_ATTR.ScheduleFinish]),
218
+ earlyStart: asString(a[TASK_TIME_ATTR.EarlyStart]),
219
+ earlyFinish: asString(a[TASK_TIME_ATTR.EarlyFinish]),
220
+ lateStart: asString(a[TASK_TIME_ATTR.LateStart]),
221
+ lateFinish: asString(a[TASK_TIME_ATTR.LateFinish]),
222
+ freeFloat: asString(a[TASK_TIME_ATTR.FreeFloat]),
223
+ totalFloat: asString(a[TASK_TIME_ATTR.TotalFloat]),
224
+ isCritical: asBoolean(a[TASK_TIME_ATTR.IsCritical]),
225
+ statusTime: asString(a[TASK_TIME_ATTR.StatusTime]),
226
+ actualDuration: asString(a[TASK_TIME_ATTR.ActualDuration]),
227
+ actualStart: asString(a[TASK_TIME_ATTR.ActualStart]),
228
+ actualFinish: asString(a[TASK_TIME_ATTR.ActualFinish]),
229
+ remainingTime: asString(a[TASK_TIME_ATTR.RemainingTime]),
230
+ completion: asNumber(a[TASK_TIME_ATTR.Completion]),
231
+ };
232
+ }
233
+ function extractLagTimeSeconds(extractor, store, lagId) {
234
+ const ref = store.entityIndex.byId.get(lagId);
235
+ if (!ref)
236
+ return {};
237
+ const entity = extractor.extractEntity(ref);
238
+ if (!entity)
239
+ return {};
240
+ if (entity.type.toUpperCase() !== 'IFCLAGTIME')
241
+ return {};
242
+ const a = entity.attributes || [];
243
+ const lagValue = a[LAG_TIME_ATTR.LagValue];
244
+ // lagValue is an IfcTimeOrRatioSelect — either a typed wrapper like
245
+ // ['IFCDURATION', 'P1D'] or a direct ratio number.
246
+ if (Array.isArray(lagValue) && lagValue.length === 2) {
247
+ const typeName = String(lagValue[0]).toUpperCase();
248
+ const inner = lagValue[1];
249
+ if (typeName === 'IFCDURATION' && typeof inner === 'string') {
250
+ return { seconds: parseIso8601Duration(inner), duration: inner };
251
+ }
252
+ }
253
+ else if (typeof lagValue === 'string') {
254
+ return { seconds: parseIso8601Duration(lagValue), duration: lagValue };
255
+ }
256
+ return {};
257
+ }
258
+ /**
259
+ * Extract all scheduling data from a parsed IFC store.
260
+ *
261
+ * Walks every IfcTask / IfcTaskTime / IfcRelSequence / IfcRelAssignsToProcess /
262
+ * IfcRelAssignsToControl / IfcRelNests / IfcWorkSchedule / IfcWorkPlan entity
263
+ * and assembles a connected ScheduleExtraction.
264
+ */
265
+ export function extractScheduleOnDemand(store) {
266
+ if (!store.source?.length) {
267
+ return { workSchedules: [], tasks: [], sequences: [], hasSchedule: false };
268
+ }
269
+ const byType = store.entityIndex.byType;
270
+ const taskIds = byType.get('IFCTASK') ?? [];
271
+ const workScheduleIds = byType.get('IFCWORKSCHEDULE') ?? [];
272
+ const workPlanIds = byType.get('IFCWORKPLAN') ?? [];
273
+ const relSeqIds = byType.get('IFCRELSEQUENCE') ?? [];
274
+ const relAssignsProcessIds = byType.get('IFCRELASSIGNSTOPROCESS') ?? [];
275
+ const relAssignsControlIds = byType.get('IFCRELASSIGNSTOCONTROL') ?? [];
276
+ const relNestsIds = byType.get('IFCRELNESTS') ?? [];
277
+ const hasAny = taskIds.length +
278
+ workScheduleIds.length +
279
+ workPlanIds.length +
280
+ relSeqIds.length >
281
+ 0;
282
+ if (!hasAny) {
283
+ return { workSchedules: [], tasks: [], sequences: [], hasSchedule: false };
284
+ }
285
+ const extractor = new EntityExtractor(store.source);
286
+ const schemaIs2x3 = store.schemaVersion === 'IFC2X3';
287
+ /** expressId -> task record (for cross-linking) */
288
+ const taskByExpressId = new Map();
289
+ /** expressId -> globalId (for products & schedules & tasks) */
290
+ const globalIdByExpressId = new Map();
291
+ // Pass 1: extract base IfcTask records.
292
+ for (const expressId of taskIds) {
293
+ const ref = store.entityIndex.byId.get(expressId);
294
+ if (!ref)
295
+ continue;
296
+ const entity = extractor.extractEntity(ref);
297
+ if (!entity)
298
+ continue;
299
+ const a = entity.attributes || [];
300
+ if (schemaIs2x3) {
301
+ const globalId = asString(a[TASK_ATTR_2X3.GlobalId]) ?? '';
302
+ const task = {
303
+ expressId,
304
+ globalId,
305
+ name: asString(a[TASK_ATTR_2X3.Name]) ?? '',
306
+ description: asString(a[TASK_ATTR_2X3.Description]),
307
+ objectType: asString(a[TASK_ATTR_2X3.ObjectType]),
308
+ identification: asString(a[TASK_ATTR_2X3.TaskId]),
309
+ status: asString(a[TASK_ATTR_2X3.Status]),
310
+ workMethod: asString(a[TASK_ATTR_2X3.WorkMethod]),
311
+ isMilestone: asBoolean(a[TASK_ATTR_2X3.IsMilestone]) ?? false,
312
+ priority: asNumber(a[TASK_ATTR_2X3.Priority]),
313
+ childGlobalIds: [],
314
+ productExpressIds: [],
315
+ productGlobalIds: [],
316
+ controllingScheduleGlobalIds: [],
317
+ };
318
+ if (globalId)
319
+ globalIdByExpressId.set(expressId, globalId);
320
+ taskByExpressId.set(expressId, task);
321
+ }
322
+ else {
323
+ const globalId = asString(a[TASK_ATTR.GlobalId]) ?? '';
324
+ const taskTimeId = asRef(a[TASK_ATTR.TaskTime]);
325
+ const task = {
326
+ expressId,
327
+ globalId,
328
+ name: asString(a[TASK_ATTR.Name]) ?? '',
329
+ description: asString(a[TASK_ATTR.Description]),
330
+ objectType: asString(a[TASK_ATTR.ObjectType]),
331
+ identification: asString(a[TASK_ATTR.Identification]),
332
+ longDescription: asString(a[TASK_ATTR.LongDescription]),
333
+ status: asString(a[TASK_ATTR.Status]),
334
+ workMethod: asString(a[TASK_ATTR.WorkMethod]),
335
+ isMilestone: asBoolean(a[TASK_ATTR.IsMilestone]) ?? false,
336
+ priority: asNumber(a[TASK_ATTR.Priority]),
337
+ predefinedType: asEnum(a[TASK_ATTR.PredefinedType]),
338
+ taskTime: taskTimeId !== undefined
339
+ ? extractTaskTime(extractor, store, taskTimeId)
340
+ : undefined,
341
+ childGlobalIds: [],
342
+ productExpressIds: [],
343
+ productGlobalIds: [],
344
+ controllingScheduleGlobalIds: [],
345
+ };
346
+ if (globalId)
347
+ globalIdByExpressId.set(expressId, globalId);
348
+ taskByExpressId.set(expressId, task);
349
+ }
350
+ }
351
+ // Pass 2: walk IfcRelNests — build task hierarchy.
352
+ for (const relId of relNestsIds) {
353
+ const ref = store.entityIndex.byId.get(relId);
354
+ if (!ref)
355
+ continue;
356
+ const entity = extractor.extractEntity(ref);
357
+ if (!entity)
358
+ continue;
359
+ const a = entity.attributes || [];
360
+ const parent = asRef(a[REL_NESTS_ATTR.RelatingObject]);
361
+ const children = asRefList(a[REL_NESTS_ATTR.RelatedObjects]);
362
+ if (parent === undefined)
363
+ continue;
364
+ const parentTask = taskByExpressId.get(parent);
365
+ if (!parentTask)
366
+ continue; // nesting over non-task entities — ignore
367
+ for (const childId of children) {
368
+ const childTask = taskByExpressId.get(childId);
369
+ if (!childTask)
370
+ continue;
371
+ parentTask.childGlobalIds.push(childTask.globalId);
372
+ if (!childTask.parentGlobalId) {
373
+ childTask.parentGlobalId = parentTask.globalId;
374
+ }
375
+ }
376
+ }
377
+ // Pass 3: resolve IfcRelAssignsToProcess — products assigned to tasks.
378
+ for (const relId of relAssignsProcessIds) {
379
+ const ref = store.entityIndex.byId.get(relId);
380
+ if (!ref)
381
+ continue;
382
+ const entity = extractor.extractEntity(ref);
383
+ if (!entity)
384
+ continue;
385
+ const a = entity.attributes || [];
386
+ const taskId = asRef(a[REL_ASSIGNS_TO_PROCESS_ATTR.RelatingProcess]);
387
+ const products = asRefList(a[REL_ASSIGNS_TO_PROCESS_ATTR.RelatedObjects]);
388
+ if (taskId === undefined)
389
+ continue;
390
+ const task = taskByExpressId.get(taskId);
391
+ if (!task)
392
+ continue;
393
+ for (const productId of products) {
394
+ // resolve product globalId lazily from the entity table if available
395
+ const gid = store.entities?.getGlobalId?.(productId) ?? undefined;
396
+ task.productExpressIds.push(productId);
397
+ task.productGlobalIds.push(gid ?? '');
398
+ if (gid)
399
+ globalIdByExpressId.set(productId, gid);
400
+ }
401
+ }
402
+ // Pass 4: extract work schedules / work plans.
403
+ const workSchedules = [];
404
+ const scheduleByExpressId = new Map();
405
+ const extractSchedule = (expressId, kind) => {
406
+ const ref = store.entityIndex.byId.get(expressId);
407
+ if (!ref)
408
+ return null;
409
+ const entity = extractor.extractEntity(ref);
410
+ if (!entity)
411
+ return null;
412
+ const a = entity.attributes || [];
413
+ const layout = kind === 'WorkPlan' ? WORK_PLAN_ATTR : WORK_SCHEDULE_ATTR;
414
+ const globalId = asString(a[layout.GlobalId]) ?? '';
415
+ const info = {
416
+ expressId,
417
+ kind,
418
+ globalId,
419
+ name: asString(a[layout.Name]) ?? kind,
420
+ description: asString(a[layout.Description]),
421
+ identification: asString(a[layout.Identification]),
422
+ creationDate: asString(a[layout.CreationDate]),
423
+ purpose: asString(a[layout.Purpose]),
424
+ duration: asString(a[layout.Duration]),
425
+ startTime: asString(a[layout.StartTime]),
426
+ finishTime: asString(a[layout.FinishTime]),
427
+ predefinedType: asEnum(a[layout.PredefinedType]),
428
+ taskGlobalIds: [],
429
+ };
430
+ if (globalId)
431
+ globalIdByExpressId.set(expressId, globalId);
432
+ return info;
433
+ };
434
+ for (const id of workScheduleIds) {
435
+ const info = extractSchedule(id, 'WorkSchedule');
436
+ if (info) {
437
+ workSchedules.push(info);
438
+ scheduleByExpressId.set(id, info);
439
+ }
440
+ }
441
+ for (const id of workPlanIds) {
442
+ const info = extractSchedule(id, 'WorkPlan');
443
+ if (info) {
444
+ workSchedules.push(info);
445
+ scheduleByExpressId.set(id, info);
446
+ }
447
+ }
448
+ // Pass 5: IfcRelAssignsToControl — map schedules to tasks.
449
+ for (const relId of relAssignsControlIds) {
450
+ const ref = store.entityIndex.byId.get(relId);
451
+ if (!ref)
452
+ continue;
453
+ const entity = extractor.extractEntity(ref);
454
+ if (!entity)
455
+ continue;
456
+ const a = entity.attributes || [];
457
+ const controlId = asRef(a[REL_ASSIGNS_TO_CONTROL_ATTR.RelatingControl]);
458
+ const objects = asRefList(a[REL_ASSIGNS_TO_CONTROL_ATTR.RelatedObjects]);
459
+ if (controlId === undefined)
460
+ continue;
461
+ const schedule = scheduleByExpressId.get(controlId);
462
+ if (!schedule)
463
+ continue;
464
+ for (const objId of objects) {
465
+ const task = taskByExpressId.get(objId);
466
+ if (!task)
467
+ continue;
468
+ schedule.taskGlobalIds.push(task.globalId);
469
+ task.controllingScheduleGlobalIds.push(schedule.globalId);
470
+ }
471
+ }
472
+ // Pass 6: IfcRelSequence — dependency edges between tasks.
473
+ const sequences = [];
474
+ for (const relId of relSeqIds) {
475
+ const ref = store.entityIndex.byId.get(relId);
476
+ if (!ref)
477
+ continue;
478
+ const entity = extractor.extractEntity(ref);
479
+ if (!entity)
480
+ continue;
481
+ const a = entity.attributes || [];
482
+ const relatingId = asRef(a[REL_SEQUENCE_ATTR.RelatingProcess]);
483
+ const relatedId = asRef(a[REL_SEQUENCE_ATTR.RelatedProcess]);
484
+ if (relatingId === undefined || relatedId === undefined)
485
+ continue;
486
+ const relating = taskByExpressId.get(relatingId);
487
+ const related = taskByExpressId.get(relatedId);
488
+ if (!relating || !related)
489
+ continue;
490
+ const lagId = asRef(a[REL_SEQUENCE_ATTR.TimeLag]);
491
+ const { seconds: timeLagSeconds, duration: timeLagDuration } = lagId !== undefined
492
+ ? extractLagTimeSeconds(extractor, store, lagId)
493
+ : {};
494
+ sequences.push({
495
+ globalId: asString(a[REL_SEQUENCE_ATTR.GlobalId]) ?? '',
496
+ relatingTaskGlobalId: relating.globalId,
497
+ relatedTaskGlobalId: related.globalId,
498
+ sequenceType: sequenceTypeFromString(asEnum(a[REL_SEQUENCE_ATTR.SequenceType])),
499
+ userDefinedSequenceType: asString(a[REL_SEQUENCE_ATTR.UserDefinedSequenceType]),
500
+ timeLagSeconds,
501
+ timeLagDuration,
502
+ });
503
+ }
504
+ return {
505
+ workSchedules,
506
+ tasks: Array.from(taskByExpressId.values()),
507
+ sequences,
508
+ hasSchedule: true,
509
+ };
510
+ }
511
+ //# sourceMappingURL=schedule-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-extractor.js","sourceRoot":"","sources":["../src/schedule-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Serialize a `ScheduleExtraction` to IFC4-conformant STEP entity lines.
3
+ *
4
+ * The output is a list of `#N=IFC...(...);` lines (no preamble, no
5
+ * `DATA;`/`ENDSEC;` framing) ready to be spliced into an existing STEP file
6
+ * just before its terminating `ENDSEC;`. Every emitted entity carries:
7
+ *
8
+ * • a freshly minted express ID starting at `nextId` (the caller computes
9
+ * `max(existing IDs) + 1`),
10
+ * • a 22-character GlobalId — the one already on the `ScheduleExtraction`
11
+ * when set, otherwise generated,
12
+ * • a reference to the supplied `ownerHistoryId` for IfcRoot ownership
13
+ * (pass `undefined` to emit `$`),
14
+ * • IFC4-correct attribute counts and ordering — IfcWorkSchedule,
15
+ * IfcTask + IfcTaskTime, IfcRelSequence + IfcLagTime, and the
16
+ * IfcRelAssignsToControl / IfcRelAssignsToProcess / IfcRelNests edges.
17
+ *
18
+ * The function is pure — it doesn't mutate the input and never touches the
19
+ * STEP source buffer. Re-running it with the same inputs produces the same
20
+ * output (deterministic), which keeps round-trip exports stable and makes
21
+ * unit tests simple.
22
+ */
23
+ import type { ScheduleExtraction } from './schedule-extractor.js';
24
+ export interface SerializeScheduleOptions {
25
+ /** First free express ID for the synthesized entities. */
26
+ nextId: number;
27
+ /**
28
+ * Express ID of an existing `IfcOwnerHistory` to reference, if the host
29
+ * file has one. When omitted, every emitted entity uses `$` for ownership.
30
+ */
31
+ ownerHistoryId?: number;
32
+ /**
33
+ * Look up an existing express ID for a product GlobalId (for binding
34
+ * `IfcRelAssignsToProcess.RelatedObjects`). When omitted, the relationship
35
+ * is skipped — the schedule is still valid IFC, just without product links.
36
+ */
37
+ resolveProductExpressId?: (productGlobalId: string) => number | undefined;
38
+ }
39
+ export interface SerializeScheduleResult {
40
+ /** STEP entity lines (each terminated with `;`). */
41
+ lines: string[];
42
+ /** First express ID after the last entity emitted. */
43
+ nextId: number;
44
+ /** Statistics for diagnostics / preview UI. */
45
+ stats: {
46
+ workSchedules: number;
47
+ tasks: number;
48
+ taskTimes: number;
49
+ sequences: number;
50
+ lagTimes: number;
51
+ assignsToControl: number;
52
+ assignsToProcess: number;
53
+ relNests: number;
54
+ };
55
+ }
56
+ export declare function serializeScheduleToStep(data: ScheduleExtraction, options: SerializeScheduleOptions): SerializeScheduleResult;
57
+ //# sourceMappingURL=schedule-serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-serializer.d.ts","sourceRoot":"","sources":["../src/schedule-serializer.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,wBAAwB;IACvC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC3E;AAED,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AA6DD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,wBAAwB,GAChC,uBAAuB,CAgIzB"}