@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,62 @@
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
+ * ifc-lite export <file.ifc> --format csv|json|ifc [options]
6
+ *
7
+ * Export IFC data to CSV, JSON, or IFC STEP format.
8
+ * Supports type filtering, column selection, and schema conversion on export.
9
+ */
10
+ import { writeFile } from 'node:fs/promises';
11
+ import { createHeadlessContext } from '../loader.js';
12
+ import { getFlag, fatal, writeOutput } from '../output.js';
13
+ export async function exportCommand(args) {
14
+ const filePath = args.find(a => !a.startsWith('-'));
15
+ const format = getFlag(args, '--format') ?? 'csv';
16
+ const outPath = getFlag(args, '--out');
17
+ const type = getFlag(args, '--type');
18
+ const columnsStr = getFlag(args, '--columns');
19
+ const separator = getFlag(args, '--separator') ?? ',';
20
+ const limit = getFlag(args, '--limit');
21
+ if (!filePath)
22
+ fatal('Usage: ifc-lite export <file.ifc> --format csv|json|ifc [--type IfcWall] [--columns Name,Type,GlobalId] [--out file]');
23
+ const { bim } = await createHeadlessContext(filePath);
24
+ // Build entity query
25
+ let q = bim.query();
26
+ if (type) {
27
+ q = q.byType(...type.split(','));
28
+ }
29
+ if (limit) {
30
+ q = q.limit(parseInt(limit, 10));
31
+ }
32
+ const entities = q.toArray();
33
+ const refs = entities.map(e => e.ref);
34
+ const columns = columnsStr
35
+ ? columnsStr.split(',')
36
+ : ['Type', 'Name', 'GlobalId', 'Description', 'ObjectType'];
37
+ switch (format) {
38
+ case 'csv': {
39
+ const csv = bim.export.csv(refs, { columns, separator });
40
+ await writeOutput(csv, outPath);
41
+ break;
42
+ }
43
+ case 'json': {
44
+ const json = bim.export.json(refs, columns);
45
+ const content = JSON.stringify(json, null, 2);
46
+ await writeOutput(content, outPath);
47
+ break;
48
+ }
49
+ case 'ifc': {
50
+ const schema = getFlag(args, '--schema');
51
+ const content = bim.export.ifc(refs, { schema });
52
+ if (!outPath)
53
+ fatal('--out is required for IFC export');
54
+ await writeFile(outPath, content, 'utf-8');
55
+ process.stderr.write(`Written to ${outPath}\n`);
56
+ break;
57
+ }
58
+ default:
59
+ fatal(`Unknown format: ${format}. Supported: csv, json, ifc`);
60
+ }
61
+ }
62
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function idsCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/commands/ids.ts"],"names":[],"mappings":"AAsBA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD9D"}
@@ -0,0 +1,187 @@
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
+ * ifc-lite ids <file.ifc> <rules.ids> [options]
6
+ *
7
+ * Validate an IFC file against IDS (Information Delivery Specification) rules.
8
+ */
9
+ import { readFile } from 'node:fs/promises';
10
+ import { createHeadlessContext } from '../loader.js';
11
+ import { printJson, hasFlag, getFlag, fatal } from '../output.js';
12
+ import { EntityNode } from '@ifc-lite/query';
13
+ import { extractClassificationsOnDemand, extractMaterialsOnDemand, extractAllEntityAttributes, } from '@ifc-lite/parser';
14
+ import { RelationshipType } from '@ifc-lite/data';
15
+ export async function idsCommand(args) {
16
+ const positional = args.filter(a => !a.startsWith('-'));
17
+ if (positional.length < 2)
18
+ fatal('Usage: ifc-lite ids <file.ifc> <rules.ids> [--json]');
19
+ const [ifcPath, idsPath] = positional;
20
+ const jsonOutput = hasFlag(args, '--json');
21
+ const locale = (getFlag(args, '--locale') ?? 'en');
22
+ const { bim, store } = await createHeadlessContext(ifcPath);
23
+ // Read IDS file
24
+ const idsContent = await readFile(idsPath, 'utf-8');
25
+ // Parse and validate
26
+ const idsDoc = await bim.ids.parse(idsContent);
27
+ // Build accessor for validation
28
+ const accessor = buildIdsAccessor(store);
29
+ const report = await bim.ids.validate(idsDoc, {
30
+ accessor,
31
+ modelInfo: { schemaVersion: store.schemaVersion },
32
+ locale,
33
+ onProgress: (p) => {
34
+ if (!jsonOutput) {
35
+ process.stderr.write(`\r Validating: ${p.specName} (${p.current}/${p.total})`);
36
+ }
37
+ },
38
+ });
39
+ if (!jsonOutput)
40
+ process.stderr.write('\n');
41
+ const summary = bim.ids.summarize(report);
42
+ if (jsonOutput) {
43
+ printJson({ summary, report });
44
+ return;
45
+ }
46
+ process.stdout.write(`\n IDS Validation Results\n`);
47
+ process.stdout.write(` ─────────────────────\n`);
48
+ process.stdout.write(` Specifications: ${summary.passedSpecifications}/${summary.totalSpecifications} passed\n`);
49
+ process.stdout.write(` Entities: ${summary.passedEntities}/${summary.totalEntities} passed\n`);
50
+ process.stdout.write(` Failed: ${summary.failedEntities} entities in ${summary.failedSpecifications} specs\n`);
51
+ const exitCode = summary.failedSpecifications > 0 ? 1 : 0;
52
+ process.stdout.write(`\n Result: ${exitCode === 0 ? 'PASS' : 'FAIL'}\n\n`);
53
+ process.exitCode = exitCode;
54
+ }
55
+ const REL_TYPE_MAP = {
56
+ IfcRelAggregates: RelationshipType.Aggregates,
57
+ IfcRelContainedInSpatialStructure: RelationshipType.ContainsElements,
58
+ IfcRelNests: RelationshipType.Aggregates, // closest mapping
59
+ IfcRelVoidsElement: RelationshipType.VoidsElement,
60
+ IfcRelFillsElement: RelationshipType.FillsElement,
61
+ };
62
+ /**
63
+ * Build a complete IFCDataAccessor for the IDS validator.
64
+ * Implements all 12+ methods the validator expects.
65
+ */
66
+ function buildIdsAccessor(store) {
67
+ return {
68
+ getEntityType(expressId) {
69
+ return store.entities.getTypeName(expressId) || undefined;
70
+ },
71
+ getEntityName(expressId) {
72
+ const node = new EntityNode(store, expressId);
73
+ return node.name || undefined;
74
+ },
75
+ getGlobalId(expressId) {
76
+ const node = new EntityNode(store, expressId);
77
+ return node.globalId || undefined;
78
+ },
79
+ getDescription(expressId) {
80
+ const node = new EntityNode(store, expressId);
81
+ return node.description || undefined;
82
+ },
83
+ getObjectType(expressId) {
84
+ const node = new EntityNode(store, expressId);
85
+ return node.objectType || undefined;
86
+ },
87
+ getEntitiesByType(typeName) {
88
+ const upper = typeName.toUpperCase();
89
+ return [...(store.entityIndex.byType.get(upper) ?? [])];
90
+ },
91
+ getAllEntityIds() {
92
+ const ids = [];
93
+ for (const [, typeIds] of store.entityIndex.byType) {
94
+ for (const id of typeIds)
95
+ ids.push(id);
96
+ }
97
+ return ids;
98
+ },
99
+ getPropertyValue(expressId, propertySetName, propertyName) {
100
+ const node = new EntityNode(store, expressId);
101
+ const psets = node.properties();
102
+ for (const pset of psets) {
103
+ if (pset.name === propertySetName) {
104
+ for (const prop of pset.properties) {
105
+ if (prop.name === propertyName) {
106
+ return {
107
+ value: prop.value ?? null,
108
+ dataType: prop.type ?? 'IFCLABEL',
109
+ propertySetName: pset.name,
110
+ propertyName: prop.name,
111
+ };
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return undefined;
117
+ },
118
+ getPropertySets(expressId) {
119
+ const node = new EntityNode(store, expressId);
120
+ return node.properties().map(pset => ({
121
+ name: pset.name,
122
+ properties: pset.properties.map(p => ({
123
+ name: p.name,
124
+ value: p.value ?? null,
125
+ dataType: p.type ?? 'IFCLABEL',
126
+ })),
127
+ }));
128
+ },
129
+ getClassifications(expressId) {
130
+ const classifications = extractClassificationsOnDemand(store, expressId);
131
+ return classifications.map(c => ({
132
+ system: c.system ?? '',
133
+ value: c.identification ?? '',
134
+ name: c.name ?? undefined,
135
+ }));
136
+ },
137
+ getMaterials(expressId) {
138
+ const materialData = extractMaterialsOnDemand(store, expressId);
139
+ if (!materialData)
140
+ return [];
141
+ const materials = [];
142
+ if (materialData.name) {
143
+ materials.push({ name: materialData.name });
144
+ }
145
+ if (materialData.layers) {
146
+ for (const layer of materialData.layers) {
147
+ if (layer.materialName) {
148
+ materials.push({ name: layer.materialName, category: layer.category ?? undefined });
149
+ }
150
+ }
151
+ }
152
+ return materials;
153
+ },
154
+ getParent(expressId, relationType) {
155
+ const relEnum = REL_TYPE_MAP[relationType];
156
+ if (relEnum === undefined)
157
+ return undefined;
158
+ const parents = store.relationships.getRelated(expressId, relEnum, 'inverse');
159
+ if (parents.length === 0)
160
+ return undefined;
161
+ const parentId = parents[0];
162
+ const parentType = store.entities.getTypeName(parentId);
163
+ return {
164
+ expressId: parentId,
165
+ entityType: parentType ?? '',
166
+ predefinedType: undefined,
167
+ };
168
+ },
169
+ getAttribute(expressId, attributeName) {
170
+ const node = new EntityNode(store, expressId);
171
+ switch (attributeName) {
172
+ case 'Name': return node.name || undefined;
173
+ case 'Description': return node.description || undefined;
174
+ case 'ObjectType': return node.objectType || undefined;
175
+ case 'GlobalId': return node.globalId || undefined;
176
+ case 'Tag': return node.tag || undefined;
177
+ default: {
178
+ // Fall back to full attribute extraction
179
+ const attrs = extractAllEntityAttributes(store, expressId);
180
+ const attr = attrs.find(a => a.name === attributeName);
181
+ return attr?.value != null ? String(attr.value) : undefined;
182
+ }
183
+ }
184
+ },
185
+ };
186
+ }
187
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/commands/ids.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function infoCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAcA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsE/D"}
@@ -0,0 +1,77 @@
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
+ * ifc-lite info <file.ifc>
6
+ *
7
+ * Print a summary of an IFC file: schema, entity counts, spatial structure.
8
+ */
9
+ import { loadIfcFile } from '../loader.js';
10
+ import { printJson, formatTable, hasFlag, fatal } from '../output.js';
11
+ import { EntityNode } from '@ifc-lite/query';
12
+ export async function infoCommand(args) {
13
+ const filePath = args.find(a => !a.startsWith('-'));
14
+ if (!filePath)
15
+ fatal('Usage: ifc-lite info <file.ifc> [--format json|table]');
16
+ const jsonOutput = hasFlag(args, '--json') || args.includes('--format') && args[args.indexOf('--format') + 1] === 'json';
17
+ const store = await loadIfcFile(filePath);
18
+ // Collect type counts
19
+ const typeCounts = {};
20
+ for (const [typeName, ids] of store.entityIndex.byType) {
21
+ if (ids.length > 0) {
22
+ // Convert to PascalCase display name
23
+ const displayName = store.entities.getTypeName(ids[0]) || typeName;
24
+ typeCounts[displayName] = (typeCounts[displayName] ?? 0) + ids.length;
25
+ }
26
+ }
27
+ // Collect storeys
28
+ const storeyIds = store.entityIndex.byType.get('IFCBUILDINGSTOREY') ?? [];
29
+ const storeys = storeyIds.map(id => {
30
+ const node = new EntityNode(store, id);
31
+ return { name: node.name, expressId: id };
32
+ });
33
+ const summary = {
34
+ file: filePath,
35
+ schema: store.schemaVersion,
36
+ fileSize: store.fileSize,
37
+ fileSizeHuman: formatSize(store.fileSize),
38
+ entityCount: store.entityCount,
39
+ parseTime: `${store.parseTime.toFixed(0)}ms`,
40
+ storeys: storeys.map(s => s.name),
41
+ typeCounts,
42
+ };
43
+ if (jsonOutput) {
44
+ printJson(summary);
45
+ return;
46
+ }
47
+ // Table output
48
+ process.stdout.write(`\n File: ${filePath}\n`);
49
+ process.stdout.write(` Schema: ${store.schemaVersion}\n`);
50
+ process.stdout.write(` Size: ${summary.fileSizeHuman}\n`);
51
+ process.stdout.write(` Entities: ${store.entityCount.toLocaleString()}\n`);
52
+ process.stdout.write(` Parsed: ${summary.parseTime}\n`);
53
+ if (storeys.length > 0) {
54
+ process.stdout.write(`\n Storeys:\n`);
55
+ for (const s of storeys) {
56
+ process.stdout.write(` - ${s.name || '(unnamed)'}\n`);
57
+ }
58
+ }
59
+ // Top entity types
60
+ const sorted = Object.entries(typeCounts)
61
+ .filter(([name]) => !name.startsWith('IfcRel') && !name.startsWith('IfcProperty') && !name.startsWith('IfcQuantity'))
62
+ .sort((a, b) => b[1] - a[1])
63
+ .slice(0, 20);
64
+ if (sorted.length > 0) {
65
+ process.stdout.write(`\n Entity types (top ${sorted.length}):\n`);
66
+ process.stdout.write(formatTable(['Type', 'Count'], sorted.map(([name, count]) => [name, count.toLocaleString()])).split('\n').map(l => ' ' + l).join('\n') + '\n');
67
+ }
68
+ process.stdout.write('\n');
69
+ }
70
+ function formatSize(bytes) {
71
+ if (bytes < 1024)
72
+ return `${bytes} B`;
73
+ if (bytes < 1024 * 1024)
74
+ return `${(bytes / 1024).toFixed(1)} KB`;
75
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
76
+ }
77
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function mergeCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAgBA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDhE"}
@@ -0,0 +1,60 @@
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
+ * ifc-lite merge <file1.ifc> <file2.ifc> [...] --out <merged.ifc>
6
+ *
7
+ * Merge multiple IFC files into a single file.
8
+ * Spatial hierarchy (storeys, buildings) is unified by name/elevation.
9
+ */
10
+ import { writeFile } from 'node:fs/promises';
11
+ import { basename } from 'node:path';
12
+ import { loadIfcFile } from '../loader.js';
13
+ import { getFlag, hasFlag, fatal, printJson } from '../output.js';
14
+ export async function mergeCommand(args) {
15
+ const outPath = getFlag(args, '--out');
16
+ if (!outPath)
17
+ fatal('--out is required: ifc-lite merge <file1.ifc> <file2.ifc> --out merged.ifc');
18
+ const schema = getFlag(args, '--schema');
19
+ const jsonOutput = hasFlag(args, '--json');
20
+ // Collect all positional args as input files
21
+ const files = [];
22
+ for (let i = 0; i < args.length; i++) {
23
+ if (args[i].startsWith('-')) {
24
+ if (args[i] === '--out' || args[i] === '--schema')
25
+ i++; // skip value
26
+ continue;
27
+ }
28
+ files.push(args[i]);
29
+ }
30
+ if (files.length < 2)
31
+ fatal('At least 2 IFC files are required for merge');
32
+ process.stderr.write(`Loading ${files.length} files...\n`);
33
+ const models = [];
34
+ for (let i = 0; i < files.length; i++) {
35
+ const store = await loadIfcFile(files[i]);
36
+ models.push({
37
+ id: `model-${i}`,
38
+ name: basename(files[i]),
39
+ dataStore: store,
40
+ });
41
+ process.stderr.write(` Loaded ${files[i]} (${store.entityCount} entities)\n`);
42
+ }
43
+ // Dynamic import to avoid loading the exporter unless needed
44
+ const { MergedExporter } = await import('@ifc-lite/export');
45
+ const exporter = new MergedExporter(models);
46
+ const result = exporter.export({ schema: (schema ?? 'IFC4') });
47
+ await writeFile(outPath, result.content, 'utf-8');
48
+ if (jsonOutput) {
49
+ printJson({
50
+ file: outPath,
51
+ modelCount: result.stats.modelCount,
52
+ totalEntityCount: result.stats.totalEntityCount,
53
+ fileSize: result.stats.fileSize,
54
+ });
55
+ }
56
+ else {
57
+ process.stderr.write(`Merged ${result.stats.modelCount} models → ${outPath} (${result.stats.totalEntityCount} entities)\n`);
58
+ }
59
+ }
60
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function propsCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../src/commands/props.ts"],"names":[],"mappings":"AAaA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhE"}
@@ -0,0 +1,40 @@
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
+ * ifc-lite props <file.ifc> --id <expressId>
6
+ *
7
+ * Show all properties, quantities, materials, and classifications for an entity.
8
+ */
9
+ import { createHeadlessContext } from '../loader.js';
10
+ import { printJson, getFlag, fatal } from '../output.js';
11
+ export async function propsCommand(args) {
12
+ const filePath = args.find(a => !a.startsWith('-'));
13
+ const idStr = getFlag(args, '--id');
14
+ if (!filePath || !idStr)
15
+ fatal('Usage: ifc-lite props <file.ifc> --id <expressId>');
16
+ const expressId = parseInt(idStr, 10);
17
+ if (isNaN(expressId))
18
+ fatal('--id must be a number');
19
+ const { bim } = await createHeadlessContext(filePath);
20
+ const ref = { modelId: 'default', expressId };
21
+ const entity = bim.entity(ref);
22
+ if (!entity)
23
+ fatal(`Entity #${expressId} not found`);
24
+ const result = {
25
+ type: entity.type,
26
+ name: entity.name,
27
+ globalId: entity.globalId,
28
+ description: entity.description || undefined,
29
+ objectType: entity.objectType || undefined,
30
+ attributes: bim.attributes(ref),
31
+ properties: bim.properties(ref),
32
+ quantities: bim.quantities(ref),
33
+ classifications: bim.classifications(ref),
34
+ materials: bim.materials(ref),
35
+ typeProperties: bim.typeProperties(ref),
36
+ relationships: bim.relationships(ref),
37
+ };
38
+ printJson(result);
39
+ }
40
+ //# sourceMappingURL=props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/commands/props.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAEpF,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,SAAS,CAAC;QAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAErD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEtD,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;IAErD,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;QAC5C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;QAC1C,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAC/B,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAC/B,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAC/B,eAAe,EAAE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;QACzC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;QAC7B,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC;QACvC,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;KACtC,CAAC;IAEF,SAAS,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function queryCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAeA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGhE"}
@@ -0,0 +1,124 @@
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
+ * ifc-lite query <file.ifc> [options]
6
+ *
7
+ * Query entities from an IFC file with type and property filters.
8
+ * Supports all entity data: properties, quantities, materials,
9
+ * classifications, attributes, relationships, type properties.
10
+ */
11
+ import { createHeadlessContext } from '../loader.js';
12
+ import { printJson, formatTable, getFlag, hasFlag, fatal } from '../output.js';
13
+ export async function queryCommand(args) {
14
+ const filePath = args.find(a => !a.startsWith('-'));
15
+ if (!filePath)
16
+ fatal('Usage: ifc-lite query <file.ifc> --type IfcWall [--props] [--limit N]');
17
+ const type = getFlag(args, '--type');
18
+ const limit = getFlag(args, '--limit');
19
+ const offset = getFlag(args, '--offset');
20
+ const propFilter = getFlag(args, '--where');
21
+ const showProps = hasFlag(args, '--props');
22
+ const showQuantities = hasFlag(args, '--quantities');
23
+ const showMaterials = hasFlag(args, '--materials');
24
+ const showClassifications = hasFlag(args, '--classifications');
25
+ const showAttributes = hasFlag(args, '--attributes');
26
+ const showRelationships = hasFlag(args, '--relationships');
27
+ const showTypeProps = hasFlag(args, '--type-props');
28
+ const showDocuments = hasFlag(args, '--documents');
29
+ const showAll = hasFlag(args, '--all');
30
+ const jsonOutput = hasFlag(args, '--json');
31
+ const countOnly = hasFlag(args, '--count');
32
+ const spatial = hasFlag(args, '--spatial');
33
+ const { bim } = await createHeadlessContext(filePath);
34
+ // Spatial tree mode
35
+ if (spatial) {
36
+ const storeys = bim.storeys();
37
+ const tree = {};
38
+ for (const storey of storeys) {
39
+ const contained = bim.contains(storey.ref);
40
+ tree[storey.name || `Storey #${storey.ref.expressId}`] = contained.map(e => ({
41
+ type: e.type,
42
+ name: e.name,
43
+ globalId: e.globalId,
44
+ }));
45
+ }
46
+ printJson(tree);
47
+ return;
48
+ }
49
+ // Build query
50
+ let q = bim.query();
51
+ if (type) {
52
+ const types = type.split(',');
53
+ q = q.byType(...types);
54
+ }
55
+ if (propFilter) {
56
+ // Format: "PsetName.PropName=Value" or "PsetName.PropName"
57
+ const eqIdx = propFilter.indexOf('=');
58
+ const dotIdx = propFilter.indexOf('.');
59
+ if (dotIdx > 0) {
60
+ const psetName = propFilter.slice(0, dotIdx);
61
+ if (eqIdx > dotIdx) {
62
+ const propName = propFilter.slice(dotIdx + 1, eqIdx);
63
+ const value = propFilter.slice(eqIdx + 1);
64
+ q = q.where(psetName, propName, '=', value);
65
+ }
66
+ else {
67
+ const propName = propFilter.slice(dotIdx + 1);
68
+ q = q.where(psetName, propName, 'exists');
69
+ }
70
+ }
71
+ }
72
+ if (limit)
73
+ q = q.limit(parseInt(limit, 10));
74
+ if (offset)
75
+ q = q.offset(parseInt(offset, 10));
76
+ if (countOnly) {
77
+ const count = q.count();
78
+ if (jsonOutput) {
79
+ printJson({ count });
80
+ }
81
+ else {
82
+ process.stdout.write(`${count}\n`);
83
+ }
84
+ return;
85
+ }
86
+ const entities = q.toArray();
87
+ const needsDetail = showProps || showQuantities || showMaterials || showClassifications
88
+ || showAttributes || showRelationships || showTypeProps || showDocuments || showAll;
89
+ if (jsonOutput || needsDetail) {
90
+ const result = entities.map(e => {
91
+ const entry = {
92
+ type: e.type,
93
+ name: e.name,
94
+ globalId: e.globalId,
95
+ description: e.description || undefined,
96
+ objectType: e.objectType || undefined,
97
+ };
98
+ if (showAttributes || showAll)
99
+ entry.attributes = bim.attributes(e.ref);
100
+ if (showProps || showAll)
101
+ entry.properties = bim.properties(e.ref);
102
+ if (showQuantities || showAll)
103
+ entry.quantities = bim.quantities(e.ref);
104
+ if (showMaterials || showAll)
105
+ entry.materials = bim.materials(e.ref);
106
+ if (showClassifications || showAll)
107
+ entry.classifications = bim.classifications(e.ref);
108
+ if (showTypeProps || showAll)
109
+ entry.typeProperties = bim.typeProperties(e.ref);
110
+ if (showDocuments || showAll)
111
+ entry.documents = bim.documents(e.ref);
112
+ if (showRelationships || showAll)
113
+ entry.relationships = bim.relationships(e.ref);
114
+ return entry;
115
+ });
116
+ printJson(result);
117
+ return;
118
+ }
119
+ // Table output
120
+ const rows = entities.map(e => [e.type, e.name, e.globalId]);
121
+ process.stdout.write(formatTable(['Type', 'Name', 'GlobalId'], rows) + '\n');
122
+ process.stderr.write(`\n${entities.length} entities\n`);
123
+ }
124
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}