@ifc-lite/flow-nodes 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.
- package/LICENSE +373 -0
- package/README.md +34 -0
- package/dist/apply-table-node.d.ts +3 -0
- package/dist/apply-table-node.d.ts.map +1 -0
- package/dist/apply-table-node.js +119 -0
- package/dist/apply-table-node.js.map +1 -0
- package/dist/connector-nodes.d.ts +3 -0
- package/dist/connector-nodes.d.ts.map +1 -0
- package/dist/connector-nodes.js +192 -0
- package/dist/connector-nodes.js.map +1 -0
- package/dist/core-nodes.d.ts +3 -0
- package/dist/core-nodes.d.ts.map +1 -0
- package/dist/core-nodes.js +277 -0
- package/dist/core-nodes.js.map +1 -0
- package/dist/csv-nodes.d.ts +3 -0
- package/dist/csv-nodes.d.ts.map +1 -0
- package/dist/csv-nodes.js +111 -0
- package/dist/csv-nodes.js.map +1 -0
- package/dist/csv-parse.d.ts +26 -0
- package/dist/csv-parse.d.ts.map +1 -0
- package/dist/csv-parse.js +83 -0
- package/dist/csv-parse.js.map +1 -0
- package/dist/element-nodes.d.ts +36 -0
- package/dist/element-nodes.d.ts.map +1 -0
- package/dist/element-nodes.js +224 -0
- package/dist/element-nodes.js.map +1 -0
- package/dist/host.d.ts +107 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +94 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/model-nodes.d.ts +3 -0
- package/dist/model-nodes.d.ts.map +1 -0
- package/dist/model-nodes.js +200 -0
- package/dist/model-nodes.js.map +1 -0
- package/dist/script-node.d.ts +4 -0
- package/dist/script-node.d.ts.map +1 -0
- package/dist/script-node.js +140 -0
- package/dist/script-node.js.map +1 -0
- package/dist/strict-cell.d.ts +20 -0
- package/dist/strict-cell.d.ts.map +1 -0
- package/dist/strict-cell.js +33 -0
- package/dist/strict-cell.js.map +1 -0
- package/dist/table-nodes.d.ts +17 -0
- package/dist/table-nodes.d.ts.map +1 -0
- package/dist/table-nodes.js +200 -0
- package/dist/table-nodes.js.map +1 -0
- package/dist/viewer-nodes.d.ts +3 -0
- package/dist/viewer-nodes.d.ts.map +1 -0
- package/dist/viewer-nodes.js +93 -0
- package/dist/viewer-nodes.js.map +1 -0
- package/dist/write-nodes.d.ts +3 -0
- package/dist/write-nodes.d.ts.map +1 -0
- package/dist/write-nodes.js +63 -0
- package/dist/write-nodes.js.map +1 -0
- package/dist/xlsx-io.d.ts +24 -0
- package/dist/xlsx-io.d.ts.map +1 -0
- package/dist/xlsx-io.js +160 -0
- package/dist/xlsx-io.js.map +1 -0
- package/dist/xlsx-nodes.d.ts +3 -0
- package/dist/xlsx-nodes.d.ts.map +1 -0
- package/dist/xlsx-nodes.js +99 -0
- package/dist/xlsx-nodes.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,200 @@
|
|
|
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
|
+
* `table.*` — typed tables to and from entities.
|
|
6
|
+
*
|
|
7
|
+
* `table.fromEntities` is the Excel export loop's first half: one row per
|
|
8
|
+
* entity, keyed by GlobalId, every column stamped with the IFC value type
|
|
9
|
+
* and (for properties) its pset/prop binding so `ApplyTable` can write it
|
|
10
|
+
* back without guessing. `table.longFormat` is the canonical
|
|
11
|
+
* (GlobalId, Pset, Prop, Value, Type) shape that `pivot` widens.
|
|
12
|
+
*/
|
|
13
|
+
import { PropertyValueType } from '@ifc-lite/data';
|
|
14
|
+
import { groupRows, pivot, validateTable } from '@ifc-lite/flow';
|
|
15
|
+
import { findPropertyInSets } from '@ifc-lite/query';
|
|
16
|
+
import { ANY_GROUP, ENTITY_LIST, SCALAR_ITEM, SCALAR_LIST, TABLE_ITEM, entityOf, requireCapability, toSdkRef } from './host.js';
|
|
17
|
+
const COLUMN_TYPE_BY_VALUE_TYPE = {
|
|
18
|
+
[PropertyValueType.String]: 'string',
|
|
19
|
+
[PropertyValueType.Real]: 'real',
|
|
20
|
+
[PropertyValueType.Integer]: 'integer',
|
|
21
|
+
[PropertyValueType.Boolean]: 'boolean',
|
|
22
|
+
[PropertyValueType.Logical]: 'logical',
|
|
23
|
+
[PropertyValueType.Label]: 'label',
|
|
24
|
+
[PropertyValueType.Identifier]: 'identifier',
|
|
25
|
+
[PropertyValueType.Text]: 'text',
|
|
26
|
+
[PropertyValueType.Enum]: 'enum',
|
|
27
|
+
[PropertyValueType.Reference]: 'reference',
|
|
28
|
+
[PropertyValueType.List]: 'list',
|
|
29
|
+
};
|
|
30
|
+
export function columnTypeOf(valueType) {
|
|
31
|
+
return COLUMN_TYPE_BY_VALUE_TYPE[valueType] ?? 'string';
|
|
32
|
+
}
|
|
33
|
+
export const VALUE_TYPE_BY_COLUMN_TYPE = {
|
|
34
|
+
string: PropertyValueType.String,
|
|
35
|
+
real: PropertyValueType.Real,
|
|
36
|
+
integer: PropertyValueType.Integer,
|
|
37
|
+
boolean: PropertyValueType.Boolean,
|
|
38
|
+
logical: PropertyValueType.Logical,
|
|
39
|
+
label: PropertyValueType.Label,
|
|
40
|
+
identifier: PropertyValueType.Identifier,
|
|
41
|
+
text: PropertyValueType.Text,
|
|
42
|
+
enum: PropertyValueType.Enum,
|
|
43
|
+
reference: PropertyValueType.Reference,
|
|
44
|
+
list: PropertyValueType.List,
|
|
45
|
+
};
|
|
46
|
+
const GLOBAL_ID = { name: 'GlobalId', type: 'identifier' };
|
|
47
|
+
export function tableOf(v) {
|
|
48
|
+
const problems = validateTable(v);
|
|
49
|
+
if (problems.length > 0)
|
|
50
|
+
throw new Error(`not a table: ${problems.map((p) => `${p.path} ${p.message}`).join('; ')}`);
|
|
51
|
+
return v;
|
|
52
|
+
}
|
|
53
|
+
/** `Pset_WallCommon.FireRating` → { pset, prop }; a bare name is an attribute column. */
|
|
54
|
+
function parsePath(path) {
|
|
55
|
+
const dot = path.indexOf('.');
|
|
56
|
+
if (dot <= 0)
|
|
57
|
+
return { attribute: path };
|
|
58
|
+
return { pset: path.slice(0, dot), prop: path.slice(dot + 1) };
|
|
59
|
+
}
|
|
60
|
+
export const tableNodes = [
|
|
61
|
+
{
|
|
62
|
+
type: 'table.fromEntities',
|
|
63
|
+
title: 'Table from entities',
|
|
64
|
+
category: 'table',
|
|
65
|
+
doc: 'One row per entity. Columns are `Pset.Prop` paths or attributes (Name, Type, ObjectType).',
|
|
66
|
+
inputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
67
|
+
outputs: [{ name: 'table', type: TABLE_ITEM }],
|
|
68
|
+
params: [{ name: 'columns', kind: 'json', default: ['Name', 'Pset_WallCommon.FireRating'] }],
|
|
69
|
+
capabilities: ['model.read'],
|
|
70
|
+
reads: 'model',
|
|
71
|
+
run: (ctx, i, p) => {
|
|
72
|
+
requireCapability(ctx, 'model.read');
|
|
73
|
+
const paths = Array.isArray(p.columns) ? p.columns.map(String) : [];
|
|
74
|
+
const columns = [GLOBAL_ID];
|
|
75
|
+
const types = new Map();
|
|
76
|
+
const rows = [];
|
|
77
|
+
for (const ref of i.entities) {
|
|
78
|
+
const e = entityOf(ctx, ref);
|
|
79
|
+
const row = { GlobalId: e.globalId };
|
|
80
|
+
const psets = ctx.host.bim.properties(e.ref);
|
|
81
|
+
for (const path of paths) {
|
|
82
|
+
const parsed = parsePath(path);
|
|
83
|
+
if ('attribute' in parsed) {
|
|
84
|
+
const v = { Name: e.name, Type: e.type, Description: e.description, ObjectType: e.objectType }[parsed.attribute];
|
|
85
|
+
row[path] = v ?? null;
|
|
86
|
+
types.set(path, 'label');
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// An entity can carry two same-named sets (type + occurrence); the
|
|
90
|
+
// property may live on the second, so search across all of them.
|
|
91
|
+
const prop = findPropertyInSets(psets, parsed.pset, parsed.prop);
|
|
92
|
+
row[path] = prop?.value ?? null;
|
|
93
|
+
if (prop && !types.has(path))
|
|
94
|
+
types.set(path, columnTypeOf(prop.type));
|
|
95
|
+
}
|
|
96
|
+
rows.push(row);
|
|
97
|
+
}
|
|
98
|
+
for (const path of paths) {
|
|
99
|
+
const parsed = parsePath(path);
|
|
100
|
+
columns.push({ name: path, type: types.get(path) ?? 'string', binding: 'pset' in parsed ? parsed : undefined });
|
|
101
|
+
}
|
|
102
|
+
return { table: { columns, rows, key: 'GlobalId' } };
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
type: 'table.longFormat',
|
|
107
|
+
title: 'Long-format table',
|
|
108
|
+
category: 'table',
|
|
109
|
+
doc: 'Every property of every entity as (GlobalId, Pset, Prop, Value, Type) rows.',
|
|
110
|
+
inputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
111
|
+
outputs: [{ name: 'table', type: TABLE_ITEM }],
|
|
112
|
+
params: [],
|
|
113
|
+
capabilities: ['model.read'],
|
|
114
|
+
reads: 'model',
|
|
115
|
+
run: (ctx, i) => {
|
|
116
|
+
requireCapability(ctx, 'model.read');
|
|
117
|
+
const rows = [];
|
|
118
|
+
for (const ref of i.entities) {
|
|
119
|
+
const sdkRef = toSdkRef(ctx, ref);
|
|
120
|
+
for (const pset of ctx.host.bim.properties(sdkRef)) {
|
|
121
|
+
for (const prop of pset.properties) {
|
|
122
|
+
rows.push({ GlobalId: ref.globalId, Pset: pset.name, Prop: prop.name, Value: prop.value, Type: columnTypeOf(prop.type) });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const columns = [GLOBAL_ID, { name: 'Pset', type: 'label' }, { name: 'Prop', type: 'label' }, { name: 'Value', type: 'string' }, { name: 'Type', type: 'label' }];
|
|
127
|
+
return { table: { columns, rows, key: 'GlobalId' } };
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'table.column',
|
|
132
|
+
title: 'Column',
|
|
133
|
+
category: 'table',
|
|
134
|
+
inputs: [{ name: 'table', type: TABLE_ITEM }],
|
|
135
|
+
outputs: [{ name: 'values', type: SCALAR_LIST }],
|
|
136
|
+
params: [{ name: 'column', kind: 'string', default: 'GlobalId' }],
|
|
137
|
+
capabilities: [],
|
|
138
|
+
run: (_c, i, p) => {
|
|
139
|
+
const t = tableOf(i.table);
|
|
140
|
+
const name = String(p.column);
|
|
141
|
+
if (!t.columns.some((c) => c.name === name))
|
|
142
|
+
throw new Error(`no column "${name}"`);
|
|
143
|
+
return { values: t.rows.map((r) => r[name] ?? null) };
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'table.groupRows',
|
|
148
|
+
title: 'Group rows',
|
|
149
|
+
category: 'table',
|
|
150
|
+
doc: 'Rows under the value of a column (the key column by default); keyless rows are a separate output.',
|
|
151
|
+
inputs: [{ name: 'table', type: TABLE_ITEM }],
|
|
152
|
+
outputs: [
|
|
153
|
+
{ name: 'rows', type: ANY_GROUP },
|
|
154
|
+
{ name: 'unkeyed', type: { kind: 'any', access: 'list' } },
|
|
155
|
+
],
|
|
156
|
+
params: [{ name: 'by', kind: 'string' }],
|
|
157
|
+
capabilities: [],
|
|
158
|
+
run: (_c, i, p) => {
|
|
159
|
+
const t = tableOf(i.table);
|
|
160
|
+
const by = typeof p.by === 'string' && p.by.length > 0 ? p.by : t.key;
|
|
161
|
+
const { branches, unkeyed } = groupRows(t, by);
|
|
162
|
+
return { rows: branches, unkeyed };
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
type: 'table.pivot',
|
|
167
|
+
title: 'Pivot',
|
|
168
|
+
category: 'table',
|
|
169
|
+
doc: 'Long format → one row per key with a column per distinct value of the column-key column.',
|
|
170
|
+
inputs: [{ name: 'table', type: TABLE_ITEM }],
|
|
171
|
+
outputs: [
|
|
172
|
+
{ name: 'table', type: TABLE_ITEM },
|
|
173
|
+
{ name: 'duplicates', type: SCALAR_ITEM },
|
|
174
|
+
{ name: 'collisions', type: SCALAR_ITEM },
|
|
175
|
+
],
|
|
176
|
+
params: [
|
|
177
|
+
{ name: 'rowKey', kind: 'string', default: 'GlobalId' },
|
|
178
|
+
{ name: 'columnKey', kind: 'string', default: 'Prop' },
|
|
179
|
+
{ name: 'value', kind: 'string', default: 'Value' },
|
|
180
|
+
],
|
|
181
|
+
capabilities: [],
|
|
182
|
+
run: (ctx, i, p) => {
|
|
183
|
+
const { table, duplicates, collisions } = pivot(tableOf(i.table), String(p.rowKey), String(p.columnKey), String(p.value));
|
|
184
|
+
if (collisions > 0)
|
|
185
|
+
ctx.log('warn', `${collisions} row(s) name the key column "${String(p.rowKey)}" as their pivot column and were skipped`);
|
|
186
|
+
return { table, duplicates, collisions };
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
type: 'table.rowCount',
|
|
191
|
+
title: 'Row count',
|
|
192
|
+
category: 'table',
|
|
193
|
+
inputs: [{ name: 'table', type: TABLE_ITEM }],
|
|
194
|
+
outputs: [{ name: 'count', type: SCALAR_ITEM }],
|
|
195
|
+
params: [],
|
|
196
|
+
capabilities: [],
|
|
197
|
+
run: (_c, i) => ({ count: tableOf(i.table).rows.length }),
|
|
198
|
+
},
|
|
199
|
+
];
|
|
200
|
+
//# sourceMappingURL=table-nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-nodes.js","sourceRoot":"","sources":["../src/table-nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-nodes.d.ts","sourceRoot":"","sources":["../src/viewer-nodes.ts"],"names":[],"mappings":"AAYA,OAAO,EAAsD,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAIjG,eAAO,MAAM,WAAW,EAAE,WAAW,EAqFpC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
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 { ENTITY_LIST, requireCapability, toSdkRef } from './host.js';
|
|
5
|
+
const refs = (ctx, entities) => entities.map((e) => toSdkRef(ctx, e));
|
|
6
|
+
export const viewerNodes = [
|
|
7
|
+
{
|
|
8
|
+
type: 'viewer.colorize',
|
|
9
|
+
title: 'Colorize',
|
|
10
|
+
category: 'viewer',
|
|
11
|
+
inputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
12
|
+
outputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
13
|
+
params: [{ name: 'color', kind: 'string', default: '#ff0000' }],
|
|
14
|
+
capabilities: ['viewer.colorize'],
|
|
15
|
+
requires: { backend: ['viewer'] },
|
|
16
|
+
headless: 'noop',
|
|
17
|
+
run: (ctx, i, p) => {
|
|
18
|
+
requireCapability(ctx, 'viewer.colorize');
|
|
19
|
+
ctx.host.bim.viewer.colorize(refs(ctx, i.entities), String(p.color));
|
|
20
|
+
return { entities: i.entities };
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
type: 'viewer.isolate',
|
|
25
|
+
title: 'Isolate',
|
|
26
|
+
category: 'viewer',
|
|
27
|
+
inputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
28
|
+
outputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
29
|
+
params: [],
|
|
30
|
+
capabilities: ['viewer.isolate'],
|
|
31
|
+
requires: { backend: ['visibility'] },
|
|
32
|
+
headless: 'noop',
|
|
33
|
+
run: (ctx, i) => {
|
|
34
|
+
requireCapability(ctx, 'viewer.isolate');
|
|
35
|
+
ctx.host.bim.viewer.isolate(refs(ctx, i.entities));
|
|
36
|
+
return { entities: i.entities };
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: 'viewer.select',
|
|
41
|
+
title: 'Select in viewer',
|
|
42
|
+
category: 'viewer',
|
|
43
|
+
inputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
44
|
+
outputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
45
|
+
params: [],
|
|
46
|
+
capabilities: ['viewer.read'],
|
|
47
|
+
requires: { backend: ['selection'] },
|
|
48
|
+
headless: 'noop',
|
|
49
|
+
run: (ctx, i) => {
|
|
50
|
+
requireCapability(ctx, 'viewer.read');
|
|
51
|
+
ctx.host.bim.viewer.select(refs(ctx, i.entities));
|
|
52
|
+
return { entities: i.entities };
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
type: 'viewer.selection',
|
|
57
|
+
title: 'Current selection',
|
|
58
|
+
category: 'viewer',
|
|
59
|
+
inputs: [],
|
|
60
|
+
outputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
61
|
+
params: [],
|
|
62
|
+
capabilities: ['viewer.read'],
|
|
63
|
+
requires: { backend: ['selection'] },
|
|
64
|
+
headless: 'noop',
|
|
65
|
+
run: (ctx) => {
|
|
66
|
+
requireCapability(ctx, 'viewer.read');
|
|
67
|
+
const entities = [];
|
|
68
|
+
for (const ref of ctx.host.bim.viewer.getSelection()) {
|
|
69
|
+
const e = ctx.host.bim.entity(ref);
|
|
70
|
+
if (e)
|
|
71
|
+
entities.push({ globalId: e.globalId, modelId: ref.modelId, expressId: ref.expressId });
|
|
72
|
+
}
|
|
73
|
+
return { entities };
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
type: 'viewer.flyTo',
|
|
78
|
+
title: 'Fly to',
|
|
79
|
+
category: 'viewer',
|
|
80
|
+
inputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
81
|
+
outputs: [{ name: 'entities', type: ENTITY_LIST }],
|
|
82
|
+
params: [],
|
|
83
|
+
capabilities: ['viewer.fly'],
|
|
84
|
+
requires: { backend: ['viewer'] },
|
|
85
|
+
headless: 'noop',
|
|
86
|
+
run: (ctx, i) => {
|
|
87
|
+
requireCapability(ctx, 'viewer.fly');
|
|
88
|
+
ctx.host.bim.viewer.flyTo(refs(ctx, i.entities));
|
|
89
|
+
return { entities: i.entities };
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
//# sourceMappingURL=viewer-nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-nodes.js","sourceRoot":"","sources":["../src/viewer-nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-nodes.d.ts","sourceRoot":"","sources":["../src/write-nodes.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAyD,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAOpG,eAAO,MAAM,UAAU,EAAE,WAAW,EAkDnC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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 { ENTITY_ITEM, SCALAR_ITEM, requireCapability, toSdkRef } from './host.js';
|
|
5
|
+
const str = (v, name) => {
|
|
6
|
+
if (typeof v !== 'string' || v.length === 0)
|
|
7
|
+
throw new Error(`"${name}" must be a non-empty string`);
|
|
8
|
+
return v;
|
|
9
|
+
};
|
|
10
|
+
export const writeNodes = [
|
|
11
|
+
{
|
|
12
|
+
type: 'model.setProperty',
|
|
13
|
+
title: 'Set property',
|
|
14
|
+
category: 'model',
|
|
15
|
+
doc: 'Writes one property on each entity; a null value deletes the property.',
|
|
16
|
+
inputs: [
|
|
17
|
+
{ name: 'entity', type: ENTITY_ITEM },
|
|
18
|
+
{ name: 'value', type: SCALAR_ITEM, nullable: true },
|
|
19
|
+
],
|
|
20
|
+
outputs: [{ name: 'entity', type: ENTITY_ITEM }],
|
|
21
|
+
params: [
|
|
22
|
+
{ name: 'pset', kind: 'string', default: 'Pset_WallCommon' },
|
|
23
|
+
{ name: 'property', kind: 'string', default: 'FireRating' },
|
|
24
|
+
],
|
|
25
|
+
capabilities: ['model.mutate:*'],
|
|
26
|
+
writes: 'model',
|
|
27
|
+
requires: { backend: ['mutate'] },
|
|
28
|
+
run: (ctx, i, p) => {
|
|
29
|
+
const pset = str(p.pset, 'pset');
|
|
30
|
+
const prop = str(p.property, 'property');
|
|
31
|
+
requireCapability(ctx, `model.mutate:${pset}`);
|
|
32
|
+
const ref = toSdkRef(ctx, i.entity);
|
|
33
|
+
const value = i.value;
|
|
34
|
+
if (value === null || value === undefined)
|
|
35
|
+
ctx.host.bim.mutate.deleteProperty(ref, pset, prop);
|
|
36
|
+
else
|
|
37
|
+
ctx.host.bim.mutate.setProperty(ref, pset, prop, value);
|
|
38
|
+
return { entity: i.entity };
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: 'model.setAttribute',
|
|
43
|
+
title: 'Set attribute',
|
|
44
|
+
category: 'model',
|
|
45
|
+
doc: 'Writes a root attribute (Name, Description, ObjectType, Tag).',
|
|
46
|
+
inputs: [
|
|
47
|
+
{ name: 'entity', type: ENTITY_ITEM },
|
|
48
|
+
{ name: 'value', type: SCALAR_ITEM },
|
|
49
|
+
],
|
|
50
|
+
outputs: [{ name: 'entity', type: ENTITY_ITEM }],
|
|
51
|
+
params: [{ name: 'attribute', kind: 'enum', default: 'Name', options: ['Name', 'Description', 'ObjectType', 'Tag'] }],
|
|
52
|
+
capabilities: ['model.mutate:*'],
|
|
53
|
+
writes: 'model',
|
|
54
|
+
requires: { backend: ['mutate'] },
|
|
55
|
+
run: (ctx, i, p) => {
|
|
56
|
+
const attr = str(p.attribute, 'attribute');
|
|
57
|
+
requireCapability(ctx, `model.mutate:attr.${attr}`);
|
|
58
|
+
ctx.host.bim.mutate.setAttribute(toSdkRef(ctx, i.entity), attr, String(i.value));
|
|
59
|
+
return { entity: i.entity };
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
//# sourceMappingURL=write-nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-nodes.js","sourceRoot":"","sources":["../src/write-nodes.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAgB/D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAoB,MAAM,WAAW,CAAC;AAEpG,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,IAAY,EAAU,EAAE;IAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,8BAA8B,CAAC,CAAC;IACrG,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,OAAO;QACjB,GAAG,EAAE,wEAAwE;QAC7E,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;YACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;SACrD;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAChD,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE;YAC5D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;SAC5D;QACD,YAAY,EAAE,CAAC,gBAAgB,CAAC;QAChC,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;QACjC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACzC,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,MAAmB,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAe,CAAC;YAChC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;;gBAC1F,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,CAAC;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,OAAO;QACjB,GAAG,EAAE,+DAA+D;QACpE,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;YACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;SACrC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;QACrH,YAAY,EAAE,CAAC,gBAAgB,CAAC;QAChC,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;QACjC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC3C,iBAAiB,CAAC,GAAG,EAAE,qBAAqB,IAAI,EAAE,CAAC,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,MAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9F,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Table } from '@ifc-lite/flow';
|
|
2
|
+
export interface XlsxColumnSpec {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly type?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ReadXlsxOptions {
|
|
7
|
+
/** Sheet name; defaults to the first (only) worksheet. */
|
|
8
|
+
readonly sheet?: string;
|
|
9
|
+
/** Optional column types; defaults to the header row, all `string`. */
|
|
10
|
+
readonly columns?: readonly XlsxColumnSpec[];
|
|
11
|
+
readonly key?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ReadXlsxResult {
|
|
14
|
+
readonly table: Table;
|
|
15
|
+
readonly problems: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
/** Read one worksheet into a typed `Table`. Row 1 is the header; a row whose
|
|
18
|
+
* cell count does not match the header is still read and reported, never
|
|
19
|
+
* dropped (same contract as `table.readCsv`). */
|
|
20
|
+
export declare function readXlsxTable(data: Uint8Array, options?: ReadXlsxOptions): Promise<ReadXlsxResult>;
|
|
21
|
+
/** Write a `Table` to a flat, single-sheet `.xlsx` workbook: one header row,
|
|
22
|
+
* one row per table row, columns in table order. */
|
|
23
|
+
export declare function writeXlsxTable(table: Table, sheetName?: string): Promise<Uint8Array>;
|
|
24
|
+
//# sourceMappingURL=xlsx-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xlsx-io.d.ts","sourceRoot":"","sources":["../src/xlsx-io.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAyD,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAoCD;;kDAEkD;AAClD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAyE5G;AAED;qDACqD;AACrD,wBAAsB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,SAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAc5F"}
|
package/dist/xlsx-io.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
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
|
+
* The ONE `exceljs` read/write module for a flow `Table` (issue #5167
|
|
6
|
+
* phase 3.2, §4a: "new exceljs read, shared module"). `apps/viewer` and
|
|
7
|
+
* `packages/cli` both already depend on `@ifc-lite/flow-nodes` (the CLI to
|
|
8
|
+
* run flow graphs headlessly, the viewer to power its flow editor), so this
|
|
9
|
+
* is the shared home rather than a copy in each app.
|
|
10
|
+
*
|
|
11
|
+
* Pure data in, pure data out — no file-system or DOM access — so it runs
|
|
12
|
+
* identically in the browser and headlessly. `WriteXlsx` guards every string
|
|
13
|
+
* cell with `guardSpreadsheetFormula` (CWE-1236): unlike CSV, an `.xlsx`
|
|
14
|
+
* writer has no quoting step of its own to lean on, but the trigger
|
|
15
|
+
* characters (`=+-@`) are read by Excel/LibreOffice the same way regardless
|
|
16
|
+
* of container, so the same guard applies (see that function's doc for why
|
|
17
|
+
* it — not `escapeCsvCell` — is the one XLSX wants).
|
|
18
|
+
*/
|
|
19
|
+
import ExcelJS from 'exceljs';
|
|
20
|
+
import { guardSpreadsheetFormula } from '@ifc-lite/export';
|
|
21
|
+
import { PARSE_INVALID } from '@ifc-lite/mutations';
|
|
22
|
+
import { parseStrictCell } from './strict-cell.js';
|
|
23
|
+
import { COLUMN_TYPES } from '@ifc-lite/flow';
|
|
24
|
+
function columnType(spec) {
|
|
25
|
+
const t = spec?.type;
|
|
26
|
+
return typeof t === 'string' && COLUMN_TYPES.includes(t) ? t : 'string';
|
|
27
|
+
}
|
|
28
|
+
/** A cell that has no usable text: an Excel error or a kind this reader cannot read. */
|
|
29
|
+
class UnreadableCell extends Error {
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A worksheet cell's value as plain text for typed re-parsing. ExcelJS hands
|
|
33
|
+
* back objects for several cell kinds, and every one is handled explicitly:
|
|
34
|
+
* falling through to `String(v)` produced `"[object Object]"`, which a string
|
|
35
|
+
* column accepted and `model.applyTable` then wrote (#5377 review).
|
|
36
|
+
* - rich text `{ richText: [{ text }] }` → the runs joined (partially
|
|
37
|
+
* formatted text is ordinary in mapping sheets);
|
|
38
|
+
* - a formula `{ formula, result }` → its cached result, itself read again;
|
|
39
|
+
* - a hyperlink `{ text, hyperlink }` → its text;
|
|
40
|
+
* - an error `{ error: '#N/A' }`, or any other object → UnreadableCell, so
|
|
41
|
+
* the caller reports the cell instead of writing garbage.
|
|
42
|
+
*/
|
|
43
|
+
function cellText(v) {
|
|
44
|
+
if (v === null || v === undefined)
|
|
45
|
+
return '';
|
|
46
|
+
if (v instanceof Date)
|
|
47
|
+
return v.toISOString();
|
|
48
|
+
if (typeof v !== 'object')
|
|
49
|
+
return String(v);
|
|
50
|
+
const cell = v;
|
|
51
|
+
if (Array.isArray(cell.richText)) {
|
|
52
|
+
return cell.richText.map((run) => String(run.text ?? '')).join('');
|
|
53
|
+
}
|
|
54
|
+
if ('error' in cell)
|
|
55
|
+
throw new UnreadableCell(`spreadsheet error ${String(cell.error)}`);
|
|
56
|
+
if ('result' in cell)
|
|
57
|
+
return cellText(cell.result);
|
|
58
|
+
if ('text' in cell && typeof cell.text !== 'object')
|
|
59
|
+
return String(cell.text ?? '');
|
|
60
|
+
throw new UnreadableCell('a cell kind this reader cannot read');
|
|
61
|
+
}
|
|
62
|
+
/** Read one worksheet into a typed `Table`. Row 1 is the header; a row whose
|
|
63
|
+
* cell count does not match the header is still read and reported, never
|
|
64
|
+
* dropped (same contract as `table.readCsv`). */
|
|
65
|
+
export async function readXlsxTable(data, options = {}) {
|
|
66
|
+
const wb = new ExcelJS.Workbook();
|
|
67
|
+
// `Workbook.xlsx.load`'s declared param type is Node's `Buffer`, which this
|
|
68
|
+
// package's tsconfig does not pull in (it must typecheck for the browser
|
|
69
|
+
// too); ExcelJS accepts a plain `Uint8Array`/`ArrayBuffer` at runtime — the
|
|
70
|
+
// viewer's own xlsx export already relies on that (apps/viewer's
|
|
71
|
+
// `lib/lists/export/xlsx.ts`). The cast goes through the library's own
|
|
72
|
+
// declared param type rather than naming `Buffer`, so it stays correct if
|
|
73
|
+
// that type ever changes shape.
|
|
74
|
+
await wb.xlsx.load(data);
|
|
75
|
+
const ws = options.sheet ? wb.getWorksheet(options.sheet) : wb.worksheets[0];
|
|
76
|
+
if (!ws)
|
|
77
|
+
throw new Error(options.sheet ? `xlsx has no sheet "${options.sheet}"` : 'xlsx has no worksheets');
|
|
78
|
+
const headerRow = ws.getRow(1);
|
|
79
|
+
const header = [];
|
|
80
|
+
headerRow.eachCell({ includeEmpty: false }, (cell, colNumber) => {
|
|
81
|
+
try {
|
|
82
|
+
header.push(cellText(cell.value));
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
throw new Error(`header column ${colNumber}: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
const declared = options.columns;
|
|
89
|
+
const names = declared && declared.length > 0 ? declared.map((c) => c.name) : header;
|
|
90
|
+
const columns = names.map((name, idx) => ({ name, type: columnType(declared?.[idx]) }));
|
|
91
|
+
const problems = [];
|
|
92
|
+
const rows = [];
|
|
93
|
+
for (let r = 2; r <= ws.rowCount; r += 1) {
|
|
94
|
+
const excelRow = ws.getRow(r);
|
|
95
|
+
if (excelRow.cellCount === 0)
|
|
96
|
+
continue;
|
|
97
|
+
const cellsInRow = [];
|
|
98
|
+
for (let c = 1; c <= header.length; c += 1) {
|
|
99
|
+
try {
|
|
100
|
+
cellsInRow.push(cellText(excelRow.getCell(c).value));
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (!(error instanceof UnreadableCell))
|
|
104
|
+
throw error;
|
|
105
|
+
cellsInRow.push(error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
let widest = 0;
|
|
109
|
+
excelRow.eachCell({ includeEmpty: false }, (_cell, colNumber) => { widest = Math.max(widest, colNumber); });
|
|
110
|
+
if (widest > header.length)
|
|
111
|
+
problems.push(`row ${r}: expected ${header.length} column(s), got ${widest}`);
|
|
112
|
+
const row = {};
|
|
113
|
+
columns.forEach((col, idx) => {
|
|
114
|
+
const raw = cellsInRow[idx] ?? '';
|
|
115
|
+
if (raw instanceof UnreadableCell) {
|
|
116
|
+
problems.push(`row ${r}: column "${col.name}": ${raw.message}`);
|
|
117
|
+
row[col.name] = null;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (raw === '') {
|
|
121
|
+
row[col.name] = null;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (col.type === 'string' || col.type === 'label' || col.type === 'identifier' || col.type === 'text' || col.type === 'enum' || col.type === 'reference') {
|
|
125
|
+
row[col.name] = raw;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const parsed = parseStrictCell(raw, col.type);
|
|
129
|
+
if (parsed === PARSE_INVALID) {
|
|
130
|
+
problems.push(`row ${r}: column "${col.name}": cannot parse "${raw}" as ${col.type}`);
|
|
131
|
+
row[col.name] = null;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
row[col.name] = Array.isArray(parsed) ? parsed.join(';') : parsed;
|
|
135
|
+
});
|
|
136
|
+
rows.push(row);
|
|
137
|
+
}
|
|
138
|
+
const key = options.key && columns.some((c) => c.name === options.key) ? options.key : columns.some((c) => c.name === 'GlobalId') ? 'GlobalId' : (columns[0]?.name ?? 'GlobalId');
|
|
139
|
+
return { table: { columns, rows, key }, problems };
|
|
140
|
+
}
|
|
141
|
+
/** Write a `Table` to a flat, single-sheet `.xlsx` workbook: one header row,
|
|
142
|
+
* one row per table row, columns in table order. */
|
|
143
|
+
export async function writeXlsxTable(table, sheetName = 'Sheet1') {
|
|
144
|
+
const wb = new ExcelJS.Workbook();
|
|
145
|
+
const ws = wb.addWorksheet(sheetName.slice(0, 31) || 'Sheet1');
|
|
146
|
+
ws.addRow(table.columns.map((c) => guardSpreadsheetFormula(c.name)));
|
|
147
|
+
for (const row of table.rows) {
|
|
148
|
+
ws.addRow(table.columns.map((c) => {
|
|
149
|
+
const v = row[c.name];
|
|
150
|
+
if (v === null || v === undefined)
|
|
151
|
+
return null;
|
|
152
|
+
if (typeof v === 'number' || typeof v === 'boolean')
|
|
153
|
+
return v;
|
|
154
|
+
return guardSpreadsheetFormula(String(v));
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
const buf = await wb.xlsx.writeBuffer();
|
|
158
|
+
return new Uint8Array(buf);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=xlsx-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xlsx-io.js","sourceRoot":"","sources":["../src/xlsx-io.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xlsx-nodes.d.ts","sourceRoot":"","sources":["../src/xlsx-nodes.ts"],"names":[],"mappings":"AAcA,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA6CnF,eAAO,MAAM,SAAS,EAAE,WAAW,EA4ClC,CAAC"}
|