@ifc-lite/cli 0.2.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.
Files changed (78) hide show
  1. package/LICENSE +373 -0
  2. package/dist/commands/bcf.d.ts +2 -0
  3. package/dist/commands/bcf.d.ts.map +1 -0
  4. package/dist/commands/bcf.js +78 -0
  5. package/dist/commands/bcf.js.map +1 -0
  6. package/dist/commands/bsdd.d.ts +2 -0
  7. package/dist/commands/bsdd.d.ts.map +1 -0
  8. package/dist/commands/bsdd.js +73 -0
  9. package/dist/commands/bsdd.js.map +1 -0
  10. package/dist/commands/convert.d.ts +2 -0
  11. package/dist/commands/convert.d.ts.map +1 -0
  12. package/dist/commands/convert.js +49 -0
  13. package/dist/commands/convert.js.map +1 -0
  14. package/dist/commands/create.d.ts +2 -0
  15. package/dist/commands/create.d.ts.map +1 -0
  16. package/dist/commands/create.js +430 -0
  17. package/dist/commands/create.js.map +1 -0
  18. package/dist/commands/diff.d.ts +2 -0
  19. package/dist/commands/diff.d.ts.map +1 -0
  20. package/dist/commands/diff.js +106 -0
  21. package/dist/commands/diff.js.map +1 -0
  22. package/dist/commands/eval.d.ts +2 -0
  23. package/dist/commands/eval.d.ts.map +1 -0
  24. package/dist/commands/eval.js +47 -0
  25. package/dist/commands/eval.js.map +1 -0
  26. package/dist/commands/export.d.ts +2 -0
  27. package/dist/commands/export.d.ts.map +1 -0
  28. package/dist/commands/export.js +62 -0
  29. package/dist/commands/export.js.map +1 -0
  30. package/dist/commands/ids.d.ts +2 -0
  31. package/dist/commands/ids.d.ts.map +1 -0
  32. package/dist/commands/ids.js +187 -0
  33. package/dist/commands/ids.js.map +1 -0
  34. package/dist/commands/info.d.ts +2 -0
  35. package/dist/commands/info.d.ts.map +1 -0
  36. package/dist/commands/info.js +77 -0
  37. package/dist/commands/info.js.map +1 -0
  38. package/dist/commands/merge.d.ts +2 -0
  39. package/dist/commands/merge.d.ts.map +1 -0
  40. package/dist/commands/merge.js +60 -0
  41. package/dist/commands/merge.js.map +1 -0
  42. package/dist/commands/props.d.ts +2 -0
  43. package/dist/commands/props.d.ts.map +1 -0
  44. package/dist/commands/props.js +40 -0
  45. package/dist/commands/props.js.map +1 -0
  46. package/dist/commands/query.d.ts +2 -0
  47. package/dist/commands/query.d.ts.map +1 -0
  48. package/dist/commands/query.js +124 -0
  49. package/dist/commands/query.js.map +1 -0
  50. package/dist/commands/run.d.ts +2 -0
  51. package/dist/commands/run.d.ts.map +1 -0
  52. package/dist/commands/run.js +43 -0
  53. package/dist/commands/run.js.map +1 -0
  54. package/dist/commands/schema.d.ts +2 -0
  55. package/dist/commands/schema.d.ts.map +1 -0
  56. package/dist/commands/schema.js +107 -0
  57. package/dist/commands/schema.js.map +1 -0
  58. package/dist/commands/validate.d.ts +2 -0
  59. package/dist/commands/validate.d.ts.map +1 -0
  60. package/dist/commands/validate.js +111 -0
  61. package/dist/commands/validate.js.map +1 -0
  62. package/dist/headless-backend.d.ts +36 -0
  63. package/dist/headless-backend.d.ts.map +1 -0
  64. package/dist/headless-backend.js +441 -0
  65. package/dist/headless-backend.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +174 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/loader.d.ts +15 -0
  71. package/dist/loader.d.ts.map +1 -0
  72. package/dist/loader.js +46 -0
  73. package/dist/loader.js.map +1 -0
  74. package/dist/output.d.ts +30 -0
  75. package/dist/output.d.ts.map +1 -0
  76. package/dist/output.js +90 -0
  77. package/dist/output.js.map +1 -0
  78. package/package.json +66 -0
@@ -0,0 +1,441 @@
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
+ import { EntityNode } from '@ifc-lite/query';
5
+ import { RelationshipType, IfcTypeEnum, IfcTypeEnumFromString } from '@ifc-lite/data';
6
+ import { extractAllEntityAttributes, extractClassificationsOnDemand, extractMaterialsOnDemand, extractTypePropertiesOnDemand, extractDocumentsOnDemand, extractRelationshipsOnDemand, } from '@ifc-lite/parser';
7
+ import { exportToStep } from '@ifc-lite/export';
8
+ const MODEL_ID = 'default';
9
+ const REL_TYPE_MAP = {
10
+ IfcRelContainedInSpatialStructure: RelationshipType.ContainsElements,
11
+ IfcRelAggregates: RelationshipType.Aggregates,
12
+ IfcRelDefinesByType: RelationshipType.DefinesByType,
13
+ IfcRelVoidsElement: RelationshipType.VoidsElement,
14
+ IfcRelFillsElement: RelationshipType.FillsElement,
15
+ };
16
+ const IFC_SUBTYPES = {
17
+ IFCWALL: ['IFCWALLSTANDARDCASE', 'IFCWALLELEMENTEDCASE'],
18
+ IFCBEAM: ['IFCBEAMSTANDARDCASE'],
19
+ IFCCOLUMN: ['IFCCOLUMNSTANDARDCASE'],
20
+ IFCDOOR: ['IFCDOORSTANDARDCASE'],
21
+ IFCWINDOW: ['IFCWINDOWSTANDARDCASE'],
22
+ IFCSLAB: ['IFCSLABSTANDARDCASE', 'IFCSLABELEMENTEDCASE'],
23
+ IFCMEMBER: ['IFCMEMBERSTANDARDCASE'],
24
+ IFCPLATE: ['IFCPLATESTANDARDCASE'],
25
+ IFCOPENINGELEMENT: ['IFCOPENINGSTANDARDCASE'],
26
+ };
27
+ function expandTypes(types) {
28
+ const result = [];
29
+ for (const type of types) {
30
+ const upper = type.toUpperCase();
31
+ result.push(upper);
32
+ const subtypes = IFC_SUBTYPES[upper];
33
+ if (subtypes) {
34
+ for (const sub of subtypes)
35
+ result.push(sub);
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ function isProductType(type) {
41
+ const enumVal = IfcTypeEnumFromString(type);
42
+ if (enumVal === IfcTypeEnum.Unknown)
43
+ return false;
44
+ const upper = type.toUpperCase();
45
+ if (upper.startsWith('IFCREL'))
46
+ return false;
47
+ if (upper.startsWith('IFCPROPERTY'))
48
+ return false;
49
+ if (upper.startsWith('IFCQUANTITY'))
50
+ return false;
51
+ if (upper === 'IFCELEMENTQUANTITY')
52
+ return false;
53
+ if (upper.endsWith('TYPE'))
54
+ return false;
55
+ return true;
56
+ }
57
+ function normalizePropertyValue(value) {
58
+ if (value == null)
59
+ return null;
60
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
61
+ return value;
62
+ }
63
+ try {
64
+ return JSON.stringify(value);
65
+ }
66
+ catch {
67
+ return String(value);
68
+ }
69
+ }
70
+ export class HeadlessBackend {
71
+ model;
72
+ query;
73
+ selection;
74
+ visibility;
75
+ viewer;
76
+ mutate;
77
+ spatial;
78
+ export;
79
+ lens;
80
+ files;
81
+ store;
82
+ modelName;
83
+ constructor(store, modelName) {
84
+ this.store = store;
85
+ this.modelName = modelName;
86
+ this.model = this.createModelAdapter();
87
+ this.query = this.createQueryAdapter();
88
+ this.selection = this.createSelectionAdapter();
89
+ this.visibility = this.createVisibilityAdapter();
90
+ this.viewer = this.createViewerAdapter();
91
+ this.mutate = this.createMutateAdapter();
92
+ this.spatial = this.createSpatialAdapter();
93
+ this.export = this.createExportAdapter();
94
+ this.lens = this.createLensAdapter();
95
+ this.files = this.createFilesAdapter();
96
+ }
97
+ subscribe(_event, _handler) {
98
+ return () => { };
99
+ }
100
+ createModelAdapter() {
101
+ const store = this.store;
102
+ const name = this.modelName;
103
+ return {
104
+ list() {
105
+ return [{
106
+ id: MODEL_ID,
107
+ name,
108
+ schemaVersion: store.schemaVersion,
109
+ entityCount: store.entityCount,
110
+ fileSize: store.fileSize,
111
+ loadedAt: Date.now(),
112
+ }];
113
+ },
114
+ activeId() { return MODEL_ID; },
115
+ loadIfc() { },
116
+ };
117
+ }
118
+ createQueryAdapter() {
119
+ const store = this.store;
120
+ function getEntityData(ref) {
121
+ const node = new EntityNode(store, ref.expressId);
122
+ const type = node.type;
123
+ if (!type)
124
+ return null;
125
+ return {
126
+ ref,
127
+ globalId: node.globalId,
128
+ name: node.name,
129
+ type,
130
+ description: node.description,
131
+ objectType: node.objectType,
132
+ };
133
+ }
134
+ function getProperties(ref) {
135
+ const node = new EntityNode(store, ref.expressId);
136
+ return node.properties().map((pset) => ({
137
+ name: pset.name,
138
+ globalId: pset.globalId,
139
+ properties: pset.properties.map((p) => ({
140
+ name: p.name,
141
+ type: p.type,
142
+ value: p.value,
143
+ })),
144
+ }));
145
+ }
146
+ function getQuantities(ref) {
147
+ const node = new EntityNode(store, ref.expressId);
148
+ return node.quantities().map(qset => ({
149
+ name: qset.name,
150
+ quantities: qset.quantities.map(q => ({
151
+ name: q.name,
152
+ type: q.type,
153
+ value: q.value,
154
+ })),
155
+ }));
156
+ }
157
+ return {
158
+ entities(descriptor) {
159
+ const results = [];
160
+ let entityIds;
161
+ if (descriptor.types && descriptor.types.length > 0) {
162
+ entityIds = [];
163
+ for (const type of expandTypes(descriptor.types)) {
164
+ const typeIds = store.entityIndex.byType.get(type) ?? [];
165
+ for (const id of typeIds)
166
+ entityIds.push(id);
167
+ }
168
+ }
169
+ else {
170
+ entityIds = [];
171
+ for (const [typeName, ids] of store.entityIndex.byType) {
172
+ if (isProductType(typeName)) {
173
+ for (const id of ids)
174
+ entityIds.push(id);
175
+ }
176
+ }
177
+ }
178
+ for (const expressId of entityIds) {
179
+ if (expressId === 0)
180
+ continue;
181
+ const node = new EntityNode(store, expressId);
182
+ results.push({
183
+ ref: { modelId: MODEL_ID, expressId },
184
+ globalId: node.globalId,
185
+ name: node.name,
186
+ type: node.type,
187
+ description: node.description,
188
+ objectType: node.objectType,
189
+ });
190
+ }
191
+ let filtered = results;
192
+ if (descriptor.filters && descriptor.filters.length > 0) {
193
+ const propsCache = new Map();
194
+ const getCachedProps = (ref) => {
195
+ let cached = propsCache.get(ref.expressId);
196
+ if (!cached) {
197
+ cached = getProperties(ref);
198
+ propsCache.set(ref.expressId, cached);
199
+ }
200
+ return cached;
201
+ };
202
+ for (const filter of descriptor.filters) {
203
+ filtered = filtered.filter(entity => {
204
+ const props = getCachedProps(entity.ref);
205
+ const pset = props.find(p => p.name === filter.psetName);
206
+ if (!pset)
207
+ return false;
208
+ const prop = pset.properties.find(p => p.name === filter.propName);
209
+ if (!prop)
210
+ return false;
211
+ if (filter.operator === 'exists')
212
+ return true;
213
+ const val = prop.value;
214
+ switch (filter.operator) {
215
+ case '=': return String(val) === String(filter.value);
216
+ case '!=': return String(val) !== String(filter.value);
217
+ case '>': return Number(val) > Number(filter.value);
218
+ case '<': return Number(val) < Number(filter.value);
219
+ case '>=': return Number(val) >= Number(filter.value);
220
+ case '<=': return Number(val) <= Number(filter.value);
221
+ case 'contains': return String(val).includes(String(filter.value));
222
+ default: return false;
223
+ }
224
+ });
225
+ }
226
+ }
227
+ if (descriptor.offset != null && descriptor.offset > 0)
228
+ filtered = filtered.slice(descriptor.offset);
229
+ if (descriptor.limit != null && descriptor.limit > 0)
230
+ filtered = filtered.slice(0, descriptor.limit);
231
+ return filtered;
232
+ },
233
+ entityData: getEntityData,
234
+ attributes(ref) {
235
+ return extractAllEntityAttributes(store, ref.expressId);
236
+ },
237
+ properties: getProperties,
238
+ quantities: getQuantities,
239
+ classifications(ref) {
240
+ return extractClassificationsOnDemand(store, ref.expressId);
241
+ },
242
+ materials(ref) {
243
+ return extractMaterialsOnDemand(store, ref.expressId);
244
+ },
245
+ typeProperties(ref) {
246
+ const info = extractTypePropertiesOnDemand(store, ref.expressId);
247
+ if (!info)
248
+ return null;
249
+ return {
250
+ typeName: info.typeName,
251
+ typeId: info.typeId,
252
+ properties: info.properties.map((pset) => ({
253
+ name: pset.name,
254
+ globalId: pset.globalId,
255
+ properties: pset.properties.map((prop) => ({
256
+ name: prop.name,
257
+ type: prop.type,
258
+ value: normalizePropertyValue(prop.value),
259
+ })),
260
+ })),
261
+ };
262
+ },
263
+ documents(ref) {
264
+ return extractDocumentsOnDemand(store, ref.expressId);
265
+ },
266
+ relationships(ref) {
267
+ return extractRelationshipsOnDemand(store, ref.expressId);
268
+ },
269
+ related(ref, relType, direction) {
270
+ const relEnum = REL_TYPE_MAP[relType];
271
+ if (relEnum === undefined)
272
+ return [];
273
+ const targets = store.relationships.getRelated(ref.expressId, relEnum, direction);
274
+ return targets.map((expressId) => ({ modelId: ref.modelId, expressId }));
275
+ },
276
+ };
277
+ }
278
+ createSelectionAdapter() {
279
+ let selection = [];
280
+ return {
281
+ get() { return selection; },
282
+ set(refs) { selection = refs; },
283
+ };
284
+ }
285
+ createVisibilityAdapter() {
286
+ return {
287
+ hide() { },
288
+ show() { },
289
+ isolate() { },
290
+ reset() { },
291
+ };
292
+ }
293
+ createViewerAdapter() {
294
+ return {
295
+ colorize() { },
296
+ colorizeAll() { },
297
+ resetColors() { },
298
+ flyTo() { },
299
+ setSection() { },
300
+ getSection() { return null; },
301
+ setCamera() { },
302
+ getCamera() { return { mode: 'perspective' }; },
303
+ };
304
+ }
305
+ createMutateAdapter() {
306
+ return {
307
+ setProperty() { },
308
+ setAttribute() { },
309
+ deleteProperty() { },
310
+ batchBegin() { },
311
+ batchEnd() { },
312
+ undo() { return false; },
313
+ redo() { return false; },
314
+ };
315
+ }
316
+ createSpatialAdapter() {
317
+ return {
318
+ queryBounds() { return []; },
319
+ raycast() { return []; },
320
+ queryFrustum() { return []; },
321
+ };
322
+ }
323
+ createExportAdapter() {
324
+ const store = this.store;
325
+ const queryAdapter = this.query;
326
+ function escapeCsv(value, sep) {
327
+ if (value.includes(sep) || value.includes('"') || value.includes('\n')) {
328
+ return `"${value.replace(/"/g, '""')}"`;
329
+ }
330
+ return value;
331
+ }
332
+ function resolveColumn(data, col, props, qsets) {
333
+ if (col === 'Name' || col === 'name')
334
+ return data.name;
335
+ if (col === 'Type' || col === 'type')
336
+ return data.type;
337
+ if (col === 'GlobalId' || col === 'globalId')
338
+ return data.globalId;
339
+ if (col === 'Description' || col === 'description')
340
+ return data.description;
341
+ if (col === 'ObjectType' || col === 'objectType')
342
+ return data.objectType;
343
+ const dotIdx = col.indexOf('.');
344
+ if (dotIdx > 0) {
345
+ const setName = col.slice(0, dotIdx);
346
+ const valueName = col.slice(dotIdx + 1);
347
+ if (props) {
348
+ const pset = props.find(p => p.name === setName);
349
+ if (pset) {
350
+ const prop = pset.properties.find(p => p.name === valueName);
351
+ if (prop?.value != null)
352
+ return String(prop.value);
353
+ }
354
+ }
355
+ if (qsets) {
356
+ const qset = qsets.find(q => q.name === setName);
357
+ if (qset) {
358
+ const qty = qset.quantities.find(q => q.name === valueName);
359
+ if (qty?.value != null)
360
+ return String(qty.value);
361
+ }
362
+ }
363
+ }
364
+ return '';
365
+ }
366
+ return {
367
+ csv(refs, options) {
368
+ const entityRefs = refs;
369
+ const opts = options;
370
+ const columns = opts.columns;
371
+ const sep = opts.separator ?? ',';
372
+ const hasDotColumns = columns.some(c => c.indexOf('.') > 0);
373
+ const rows = [columns];
374
+ for (const ref of entityRefs) {
375
+ const data = queryAdapter.entityData(ref);
376
+ if (!data)
377
+ continue;
378
+ const props = hasDotColumns ? queryAdapter.properties(ref) : null;
379
+ const qsets = hasDotColumns ? queryAdapter.quantities(ref) : null;
380
+ rows.push(columns.map(col => resolveColumn(data, col, props, qsets)));
381
+ }
382
+ return rows.map(r => r.map(cell => escapeCsv(cell, sep)).join(sep)).join('\n');
383
+ },
384
+ json(refs, columns) {
385
+ const entityRefs = refs;
386
+ const cols = columns;
387
+ const hasDotColumns = cols.some(c => c.indexOf('.') > 0);
388
+ const result = [];
389
+ for (const ref of entityRefs) {
390
+ const data = queryAdapter.entityData(ref);
391
+ if (!data)
392
+ continue;
393
+ const props = hasDotColumns ? queryAdapter.properties(ref) : null;
394
+ const qsets = hasDotColumns ? queryAdapter.quantities(ref) : null;
395
+ const row = {};
396
+ for (const col of cols) {
397
+ const val = resolveColumn(data, col, props, qsets);
398
+ row[col] = val || null;
399
+ }
400
+ result.push(row);
401
+ }
402
+ return result;
403
+ },
404
+ ifc(refs, options) {
405
+ const entityRefs = refs;
406
+ const opts = (options ?? {});
407
+ const schema = opts.schema ?? store.schemaVersion ?? 'IFC4';
408
+ // If refs are provided, filter export to only those entities
409
+ const exportOpts = { schema };
410
+ if (entityRefs && entityRefs.length > 0) {
411
+ const isolatedIds = new Set(entityRefs.map(r => r.expressId));
412
+ exportOpts.visibleOnly = true;
413
+ exportOpts.isolatedEntityIds = isolatedIds;
414
+ exportOpts.hiddenEntityIds = new Set();
415
+ }
416
+ return exportToStep(store, exportOpts);
417
+ },
418
+ download(_content, _filename, _mimeType) {
419
+ /* no-op — CLI writes to stdout/file directly */
420
+ },
421
+ };
422
+ }
423
+ createLensAdapter() {
424
+ return {
425
+ presets() { return []; },
426
+ create() { return null; },
427
+ activate() { },
428
+ deactivate() { },
429
+ getActive() { return null; },
430
+ };
431
+ }
432
+ createFilesAdapter() {
433
+ return {
434
+ list() { return []; },
435
+ text() { return null; },
436
+ csv() { return null; },
437
+ csvColumns() { return []; },
438
+ };
439
+ }
440
+ }
441
+ //# sourceMappingURL=headless-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-backend.js","sourceRoot":"","sources":["../src/headless-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env node
2
+ /* This Source Code Form is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
5
+ /**
6
+ * ifc-lite CLI — BIM toolkit for the terminal
7
+ *
8
+ * Query, validate, export, create, merge, convert, diff, and script IFC files
9
+ * from the command line. Designed for both humans and LLM terminals.
10
+ */
11
+ import { infoCommand } from './commands/info.js';
12
+ import { queryCommand } from './commands/query.js';
13
+ import { propsCommand } from './commands/props.js';
14
+ import { exportCommand } from './commands/export.js';
15
+ import { idsCommand } from './commands/ids.js';
16
+ import { bcfCommand } from './commands/bcf.js';
17
+ import { createCommand } from './commands/create.js';
18
+ import { evalCommand } from './commands/eval.js';
19
+ import { runCommand } from './commands/run.js';
20
+ import { schemaCommand } from './commands/schema.js';
21
+ import { mergeCommand } from './commands/merge.js';
22
+ import { convertCommand } from './commands/convert.js';
23
+ import { diffCommand } from './commands/diff.js';
24
+ import { validateCommand } from './commands/validate.js';
25
+ import { bsddCommand } from './commands/bsdd.js';
26
+ const VERSION = '0.1.0';
27
+ const HELP = `
28
+ ifc-lite — BIM toolkit for the terminal
29
+
30
+ Usage: ifc-lite <command> [options]
31
+
32
+ Commands:
33
+ info <file.ifc> Model summary (schema, entities, storeys)
34
+ query <file.ifc> [--type T] [--json] Query entities by type/properties
35
+ props <file.ifc> --id <N> All properties for a single entity
36
+ export <file.ifc> --format csv|json|ifc Export data to file or stdout
37
+ ids <file.ifc> <rules.ids> Validate against IDS rules
38
+ bcf <create|list|add-comment> Work with BCF collaboration files
39
+ create <type> [options] --out F Create IFC elements (30+ types)
40
+ eval <file.ifc> "<expression>" Evaluate SDK expression
41
+ run <script.js> <file.ifc> Execute a script against model
42
+ schema Dump SDK API schema (for LLM tools)
43
+ merge <f1.ifc> <f2.ifc> --out F Merge multiple IFC files
44
+ convert <file.ifc> --schema VER --out F Convert between IFC schema versions
45
+ diff <f1.ifc> <f2.ifc> Compare two IFC files
46
+ validate <file.ifc> Structural validation checks
47
+ bsdd <class|search|psets|qsets> <arg> buildingSMART Data Dictionary lookup
48
+
49
+ Options:
50
+ --help, -h Show help
51
+ --version, -v Show version
52
+ --json Output as JSON (machine-readable)
53
+ --out <file> Write output to file instead of stdout
54
+
55
+ Examples:
56
+ ifc-lite info model.ifc
57
+ ifc-lite query model.ifc --type IfcWall --json
58
+ ifc-lite query model.ifc --type IfcDoor --props --limit 5
59
+ ifc-lite query model.ifc --type IfcWall --materials --classifications --json
60
+ ifc-lite query model.ifc --type IfcWall --all --json
61
+ ifc-lite query model.ifc --spatial
62
+ ifc-lite props model.ifc --id 42
63
+ ifc-lite export model.ifc --format csv --type IfcWall --columns Name,Type,GlobalId
64
+ ifc-lite export model.ifc --format json --type IfcWall,IfcDoor
65
+ ifc-lite ids model.ifc requirements.ids --json
66
+ ifc-lite bcf create --title "Missing door" --out issue.bcf
67
+ ifc-lite create wall --height 3 --thickness 0.2 --start 0,0,0 --end 5,0,0 --out wall.ifc
68
+ ifc-lite create stair --number-of-risers 12 --riser-height 0.175 --width 1.2 --out stair.ifc
69
+ ifc-lite create door --width 0.9 --height 2.1 --position 0,0,0 --out door.ifc
70
+ ifc-lite create i-shape-beam --start 0,0,3 --end 5,0,3 --out beam.ifc
71
+ ifc-lite create wall --from-json --out w.ifc < params.json
72
+ ifc-lite create wall --pset '{"Name":"Pset_WallCommon","Properties":[{"Name":"IsExternal","NominalValue":true}]}' --out w.ifc
73
+ ifc-lite create wall --material '{"Name":"Concrete","Category":"Structural"}' --out w.ifc
74
+ ifc-lite create wall --color 0.8,0.2,0.2 --out w.ifc
75
+ ifc-lite eval model.ifc "bim.query().byType('IfcWall').count()"
76
+ ifc-lite eval model.ifc "bim.storeys().map(s => s.name)"
77
+ ifc-lite run analysis.js model.ifc
78
+ ifc-lite schema
79
+ ifc-lite schema --compact
80
+ ifc-lite merge arch.ifc struct.ifc mep.ifc --out federated.ifc
81
+ ifc-lite convert model.ifc --schema IFC4 --out model-ifc4.ifc
82
+ ifc-lite diff model-v1.ifc model-v2.ifc --json
83
+ ifc-lite diff model-v1.ifc model-v2.ifc --by-entity
84
+ ifc-lite validate model.ifc --json
85
+ ifc-lite bsdd class IfcWall
86
+ ifc-lite bsdd search "concrete wall"
87
+ ifc-lite bsdd psets IfcWall
88
+
89
+ Pipe-friendly:
90
+ ifc-lite query model.ifc --type IfcWall --json | jq '.[].name'
91
+ ifc-lite export model.ifc --format csv --type IfcSlab > slabs.csv
92
+ echo '{"Start":[0,0,0],"End":[10,0,0],"Height":3}' | ifc-lite create wall --from-json --out w.ifc
93
+
94
+ Create element types:
95
+ wall, slab, column, beam, stair, roof, gable-roof, door, window,
96
+ wall-door, wall-window, ramp, railing, plate, member, footing, pile,
97
+ space, curtain-wall, furnishing, proxy, circular-column,
98
+ hollow-circular-column, i-shape-beam, l-shape-member, t-shape-member,
99
+ u-shape-member, rectangle-hollow-beam
100
+
101
+ Learn more: https://ifclite.com
102
+ `;
103
+ async function main() {
104
+ const args = process.argv.slice(2);
105
+ if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
106
+ process.stdout.write(HELP + '\n');
107
+ return;
108
+ }
109
+ if (args.includes('--version') || args.includes('-v')) {
110
+ process.stdout.write(`ifc-lite ${VERSION}\n`);
111
+ return;
112
+ }
113
+ const command = args[0];
114
+ const commandArgs = args.slice(1);
115
+ switch (command) {
116
+ case 'info':
117
+ await infoCommand(commandArgs);
118
+ break;
119
+ case 'query':
120
+ await queryCommand(commandArgs);
121
+ break;
122
+ case 'props':
123
+ await propsCommand(commandArgs);
124
+ break;
125
+ case 'export':
126
+ await exportCommand(commandArgs);
127
+ break;
128
+ case 'ids':
129
+ await idsCommand(commandArgs);
130
+ break;
131
+ case 'bcf':
132
+ await bcfCommand(commandArgs);
133
+ break;
134
+ case 'create':
135
+ await createCommand(commandArgs);
136
+ break;
137
+ case 'eval':
138
+ await evalCommand(commandArgs);
139
+ break;
140
+ case 'run':
141
+ await runCommand(commandArgs);
142
+ break;
143
+ case 'schema':
144
+ await schemaCommand(commandArgs);
145
+ break;
146
+ case 'merge':
147
+ await mergeCommand(commandArgs);
148
+ break;
149
+ case 'convert':
150
+ await convertCommand(commandArgs);
151
+ break;
152
+ case 'diff':
153
+ await diffCommand(commandArgs);
154
+ break;
155
+ case 'validate':
156
+ await validateCommand(commandArgs);
157
+ break;
158
+ case 'bsdd':
159
+ await bsddCommand(commandArgs);
160
+ break;
161
+ default:
162
+ process.stderr.write(`Unknown command: ${command}\n`);
163
+ process.stderr.write(`Run 'ifc-lite --help' for usage.\n`);
164
+ process.exit(1);
165
+ }
166
+ }
167
+ main().catch((err) => {
168
+ process.stderr.write(`Error: ${err.message}\n`);
169
+ if (process.env.DEBUG) {
170
+ process.stderr.write(err.stack ?? '' + '\n');
171
+ }
172
+ process.exit(1);
173
+ });
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type IfcDataStore } from '@ifc-lite/parser';
2
+ import { type BimContext } from '@ifc-lite/sdk';
3
+ /**
4
+ * Parse an IFC file from disk into an IfcDataStore.
5
+ * Suppresses parser console output for clean CLI experience.
6
+ */
7
+ export declare function loadIfcFile(filePath: string): Promise<IfcDataStore>;
8
+ /**
9
+ * Create a BimContext backed by a headless backend from an IFC file.
10
+ */
11
+ export declare function createHeadlessContext(filePath: string): Promise<{
12
+ bim: BimContext;
13
+ store: IfcDataStore;
14
+ }>;
15
+ //# sourceMappingURL=loader.d.ts.map