@ifc-lite/lens 1.7.0 → 1.8.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/dist/colors.d.ts CHANGED
@@ -20,4 +20,16 @@ export declare function rgbaToHex(rgba: RGBAColor): string;
20
20
  * Used to exclude ghost entries from UI legends.
21
21
  */
22
22
  export declare function isGhostColor(rgba: RGBAColor): boolean;
23
+ /**
24
+ * Generate a unique color for index `i` using golden-angle hue distribution.
25
+ *
26
+ * Produces unlimited perceptually distinct colors:
27
+ * - Hue: golden angle spacing (maximally distributed for any N)
28
+ * - Saturation: alternates between 65% and 80% to add variety
29
+ * - Lightness: cycles through 3 levels (45%, 55%, 35%) for depth
30
+ *
31
+ * No two indices produce the same color (hue wraps but never repeats
32
+ * due to irrational golden angle).
33
+ */
34
+ export declare function uniqueColor(i: number): string;
23
35
  //# sourceMappingURL=colors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,oEAAoE;AACpE,eAAO,MAAM,WAAW,EAAE,SAAiC,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAM/D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAKjD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAErD"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,oEAAoE;AACpE,eAAO,MAAM,WAAW,EAAE,SAAiC,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAM/D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAKjD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAErD;AAiCD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM7C"}
package/dist/colors.js CHANGED
@@ -35,4 +35,67 @@ export function rgbaToHex(rgba) {
35
35
  export function isGhostColor(rgba) {
36
36
  return rgba[3] < 0.2;
37
37
  }
38
+ /**
39
+ * Golden angle in degrees (~137.508°).
40
+ * Successive multiples of this produce maximally distributed hues
41
+ * on the color wheel — guarantees every new color is as far as
42
+ * possible from all previously generated colors, for any N.
43
+ */
44
+ const GOLDEN_ANGLE = 137.508;
45
+ /**
46
+ * Convert HSL to hex string.
47
+ * h in [0, 360), s and l in [0, 1].
48
+ */
49
+ function hslToHex(h, s, l) {
50
+ const c = (1 - Math.abs(2 * l - 1)) * s;
51
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
52
+ const m = l - c / 2;
53
+ let r = 0, g = 0, b = 0;
54
+ if (h < 60) {
55
+ r = c;
56
+ g = x;
57
+ }
58
+ else if (h < 120) {
59
+ r = x;
60
+ g = c;
61
+ }
62
+ else if (h < 180) {
63
+ g = c;
64
+ b = x;
65
+ }
66
+ else if (h < 240) {
67
+ g = x;
68
+ b = c;
69
+ }
70
+ else if (h < 300) {
71
+ r = x;
72
+ b = c;
73
+ }
74
+ else {
75
+ r = c;
76
+ b = x;
77
+ }
78
+ const ri = Math.round((r + m) * 255);
79
+ const gi = Math.round((g + m) * 255);
80
+ const bi = Math.round((b + m) * 255);
81
+ return `#${ri.toString(16).padStart(2, '0')}${gi.toString(16).padStart(2, '0')}${bi.toString(16).padStart(2, '0')}`;
82
+ }
83
+ /**
84
+ * Generate a unique color for index `i` using golden-angle hue distribution.
85
+ *
86
+ * Produces unlimited perceptually distinct colors:
87
+ * - Hue: golden angle spacing (maximally distributed for any N)
88
+ * - Saturation: alternates between 65% and 80% to add variety
89
+ * - Lightness: cycles through 3 levels (45%, 55%, 35%) for depth
90
+ *
91
+ * No two indices produce the same color (hue wraps but never repeats
92
+ * due to irrational golden angle).
93
+ */
94
+ export function uniqueColor(i) {
95
+ const hue = (i * GOLDEN_ANGLE) % 360;
96
+ const saturation = i % 2 === 0 ? 0.65 : 0.80;
97
+ const lightnessLevels = [0.45, 0.55, 0.35];
98
+ const lightness = lightnessLevels[i % 3];
99
+ return hslToHex(hue, saturation, lightness);
100
+ }
38
101
  //# sourceMappingURL=colors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAI/D,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IAClD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAe;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Data discovery for the lens system.
3
+ *
4
+ * Two-phase approach for zero loading impact:
5
+ * 1. `discoverClasses()` — instant, reads unique type names from entity table
6
+ * (O(n) array scan, zero STEP parsing). Called when models load.
7
+ * 2. `discoverDataSources()` — expensive, samples entities for psets/quantities/
8
+ * materials/classifications. Called lazily when user opens a dropdown.
9
+ */
10
+ import type { LensDataProvider } from './types.js';
11
+ /** Result of lens data discovery */
12
+ export interface DiscoveredLensData {
13
+ /** All IFC class names found in loaded models, sorted alphabetically */
14
+ classes: string[];
15
+ /** Property set names → property names (sorted). Null = not yet discovered. */
16
+ propertySets: Map<string, string[]> | null;
17
+ /** Quantity set names → quantity names (sorted). Null = not yet discovered. */
18
+ quantitySets: Map<string, string[]> | null;
19
+ /** Classification system names found. Null = not yet discovered. */
20
+ classificationSystems: string[] | null;
21
+ /** Material names found. Null = not yet discovered. */
22
+ materials: string[] | null;
23
+ }
24
+ /**
25
+ * Discover IFC classes from loaded models — INSTANT.
26
+ *
27
+ * O(n) scan of entity type names only. No STEP buffer parsing.
28
+ * Typically <5ms for 100k entities.
29
+ */
30
+ export declare function discoverClasses(provider: LensDataProvider): string[];
31
+ /**
32
+ * Discover data sources by sampling entities — EXPENSIVE.
33
+ *
34
+ * Samples up to SAMPLE_SIZE entities per type to collect property sets,
35
+ * quantity sets, classification systems, and material names.
36
+ * Only call when the user actively needs this data (e.g., opens a dropdown).
37
+ */
38
+ export declare function discoverDataSources(provider: LensDataProvider, categories: {
39
+ properties?: boolean;
40
+ quantities?: boolean;
41
+ classifications?: boolean;
42
+ materials?: boolean;
43
+ }): Partial<Pick<DiscoveredLensData, 'propertySets' | 'quantitySets' | 'classificationSystems' | 'materials'>>;
44
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKnD,oCAAoC;AACpC,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,+EAA+E;IAC/E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,oEAAoE;IACpE,qBAAqB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvC,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAOpE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE;IACV,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,cAAc,GAAG,uBAAuB,GAAG,WAAW,CAAC,CAAC,CAsG5G"}
@@ -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
+ /** Max entities to sample per type for property/quantity discovery */
5
+ const SAMPLE_SIZE = 30;
6
+ /**
7
+ * Discover IFC classes from loaded models — INSTANT.
8
+ *
9
+ * O(n) scan of entity type names only. No STEP buffer parsing.
10
+ * Typically <5ms for 100k entities.
11
+ */
12
+ export function discoverClasses(provider) {
13
+ const classSet = new Set();
14
+ provider.forEachEntity((globalId) => {
15
+ const typeName = provider.getEntityType(globalId);
16
+ if (typeName)
17
+ classSet.add(typeName);
18
+ });
19
+ return Array.from(classSet).sort();
20
+ }
21
+ /**
22
+ * Discover data sources by sampling entities — EXPENSIVE.
23
+ *
24
+ * Samples up to SAMPLE_SIZE entities per type to collect property sets,
25
+ * quantity sets, classification systems, and material names.
26
+ * Only call when the user actively needs this data (e.g., opens a dropdown).
27
+ */
28
+ export function discoverDataSources(provider, categories) {
29
+ const result = {};
30
+ const needsProperties = categories.properties === true;
31
+ const needsQuantities = categories.quantities === true;
32
+ const needsClassifications = categories.classifications === true;
33
+ const needsMaterials = categories.materials === true;
34
+ if (!needsProperties && !needsQuantities && !needsClassifications && !needsMaterials) {
35
+ return result;
36
+ }
37
+ const propertySets = needsProperties ? new Map() : null;
38
+ const quantitySets = needsQuantities ? new Map() : null;
39
+ const classificationSystems = needsClassifications ? new Set() : null;
40
+ const materials = needsMaterials ? new Set() : null;
41
+ // Collect sample IDs grouped by type
42
+ const sampleIds = [];
43
+ const seenPerType = new Map();
44
+ provider.forEachEntity((globalId) => {
45
+ const typeName = provider.getEntityType(globalId);
46
+ if (!typeName)
47
+ return;
48
+ const count = seenPerType.get(typeName) ?? 0;
49
+ if (count < SAMPLE_SIZE) {
50
+ sampleIds.push(globalId);
51
+ seenPerType.set(typeName, count + 1);
52
+ }
53
+ });
54
+ // Sample entities
55
+ for (const globalId of sampleIds) {
56
+ if (propertySets) {
57
+ const psets = provider.getPropertySets(globalId);
58
+ for (const pset of psets) {
59
+ if (!pset.name)
60
+ continue;
61
+ let propNames = propertySets.get(pset.name);
62
+ if (!propNames) {
63
+ propNames = new Set();
64
+ propertySets.set(pset.name, propNames);
65
+ }
66
+ for (const prop of pset.properties) {
67
+ if (prop.name)
68
+ propNames.add(prop.name);
69
+ }
70
+ }
71
+ }
72
+ if (quantitySets && provider.getQuantitySets) {
73
+ const qsets = provider.getQuantitySets(globalId);
74
+ for (const qset of qsets) {
75
+ if (!qset.name)
76
+ continue;
77
+ let quantNames = quantitySets.get(qset.name);
78
+ if (!quantNames) {
79
+ quantNames = new Set();
80
+ quantitySets.set(qset.name, quantNames);
81
+ }
82
+ for (const q of qset.quantities) {
83
+ if (q.name)
84
+ quantNames.add(q.name);
85
+ }
86
+ }
87
+ }
88
+ if (classificationSystems && provider.getClassifications) {
89
+ const cls = provider.getClassifications(globalId);
90
+ for (const c of cls) {
91
+ if (c.system)
92
+ classificationSystems.add(c.system);
93
+ }
94
+ }
95
+ if (materials && provider.getMaterialName) {
96
+ const mat = provider.getMaterialName(globalId);
97
+ if (mat)
98
+ materials.add(mat);
99
+ }
100
+ }
101
+ // Convert sets to sorted arrays
102
+ if (propertySets) {
103
+ const psResult = new Map();
104
+ for (const [name, propSet] of propertySets) {
105
+ psResult.set(name, Array.from(propSet).sort());
106
+ }
107
+ result.propertySets = psResult;
108
+ }
109
+ if (quantitySets) {
110
+ const qsResult = new Map();
111
+ for (const [name, quantSet] of quantitySets) {
112
+ qsResult.set(name, Array.from(quantSet).sort());
113
+ }
114
+ result.quantitySets = qsResult;
115
+ }
116
+ if (classificationSystems) {
117
+ result.classificationSystems = Array.from(classificationSystems).sort();
118
+ }
119
+ if (materials) {
120
+ result.materials = Array.from(materials).sort();
121
+ }
122
+ return result;
123
+ }
124
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
package/dist/engine.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Lens, LensEvaluationResult, LensDataProvider } from './types.js';
1
+ import type { Lens, LensEvaluationResult, LensDataProvider, AutoColorSpec, AutoColorLegendEntry } from './types.js';
2
2
  /**
3
3
  * Evaluate a lens against all entities in the data provider.
4
4
  *
@@ -11,4 +11,23 @@ import type { Lens, LensEvaluationResult, LensDataProvider } from './types.js';
11
11
  * @returns Color map, hidden IDs, per-rule counts, and execution time
12
12
  */
13
13
  export declare function evaluateLens(lens: Lens, provider: LensDataProvider): LensEvaluationResult;
14
+ /**
15
+ * Result of auto-color lens evaluation, extends standard result
16
+ * with legend entries for UI display.
17
+ */
18
+ export interface AutoColorEvaluationResult extends LensEvaluationResult {
19
+ /** Legend entries for UI — one per distinct value, sorted by count desc */
20
+ legend: AutoColorLegendEntry[];
21
+ }
22
+ /**
23
+ * Evaluate an auto-color lens against all entities.
24
+ *
25
+ * Single O(n) pass: extracts the target value for each entity, groups by
26
+ * distinct values, and assigns colors from the palette.
27
+ *
28
+ * @param autoColor - Data source specification
29
+ * @param provider - Data provider for entity access
30
+ * @returns Color map, legend, and per-value entity IDs
31
+ */
32
+ export declare function evaluateAutoColorLens(autoColor: AutoColorSpec, provider: LensDataProvider): AutoColorEvaluationResult;
14
33
  //# sourceMappingURL=engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,IAAI,EACJ,oBAAoB,EACpB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,gBAAgB,GACzB,oBAAoB,CAuDtB"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,IAAI,EACJ,oBAAoB,EACpB,gBAAgB,EAGhB,aAAa,EACb,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,gBAAgB,GACzB,oBAAoB,CAuDtB;AA0BD;;;GAGG;AACH,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,2EAA2E;IAC3E,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,gBAAgB,GACzB,yBAAyB,CA+D3B"}
package/dist/engine.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { matchesCriteria } from './matching.js';
5
- import { hexToRgba, GHOST_COLOR } from './colors.js';
5
+ import { hexToRgba, GHOST_COLOR, uniqueColor } from './colors.js';
6
6
  /**
7
7
  * Evaluate a lens against all entities in the data provider.
8
8
  *
@@ -76,4 +76,114 @@ function applyRuleAction(rule, globalId, colorMap, hiddenIds) {
76
76
  break;
77
77
  }
78
78
  }
79
+ /**
80
+ * Evaluate an auto-color lens against all entities.
81
+ *
82
+ * Single O(n) pass: extracts the target value for each entity, groups by
83
+ * distinct values, and assigns colors from the palette.
84
+ *
85
+ * @param autoColor - Data source specification
86
+ * @param provider - Data provider for entity access
87
+ * @returns Color map, legend, and per-value entity IDs
88
+ */
89
+ export function evaluateAutoColorLens(autoColor, provider) {
90
+ const startTime = performance.now();
91
+ // Phase 1: Extract values and group entities by distinct value
92
+ const valueGroups = new Map();
93
+ const ghostIds = [];
94
+ provider.forEachEntity((globalId) => {
95
+ const raw = extractAutoColorValue(autoColor, globalId, provider);
96
+ const value = raw != null ? String(raw).trim() : '';
97
+ if (value === '') {
98
+ ghostIds.push(globalId);
99
+ return;
100
+ }
101
+ let group = valueGroups.get(value);
102
+ if (!group) {
103
+ group = [];
104
+ valueGroups.set(value, group);
105
+ }
106
+ group.push(globalId);
107
+ });
108
+ // Phase 2: Sort distinct values by entity count (descending) for best color allocation
109
+ const sortedEntries = Array.from(valueGroups.entries())
110
+ .sort((a, b) => b[1].length - a[1].length);
111
+ // Phase 3: Assign colors and build result
112
+ const colorMap = new Map();
113
+ const hiddenIds = new Set();
114
+ const ruleCounts = new Map();
115
+ const ruleEntityIds = new Map();
116
+ const legend = [];
117
+ for (let i = 0; i < sortedEntries.length; i++) {
118
+ const [value, entityIds] = sortedEntries[i];
119
+ const color = uniqueColor(i);
120
+ const ruleId = `auto-${i}`;
121
+ const rgba = hexToRgba(color, 1);
122
+ for (const id of entityIds) {
123
+ colorMap.set(id, rgba);
124
+ }
125
+ ruleCounts.set(ruleId, entityIds.length);
126
+ ruleEntityIds.set(ruleId, entityIds);
127
+ legend.push({ id: ruleId, name: value, color, count: entityIds.length });
128
+ }
129
+ // Ghost unmatched (null/empty value) entities
130
+ for (const id of ghostIds) {
131
+ colorMap.set(id, GHOST_COLOR);
132
+ }
133
+ return {
134
+ colorMap,
135
+ hiddenIds,
136
+ ruleCounts,
137
+ ruleEntityIds,
138
+ legend,
139
+ executionTime: performance.now() - startTime,
140
+ };
141
+ }
142
+ /**
143
+ * Extract the target value for a single entity based on the auto-color spec.
144
+ * Returns the raw value (string, number, etc.) or undefined if not available.
145
+ */
146
+ function extractAutoColorValue(spec, globalId, provider) {
147
+ switch (spec.source) {
148
+ case 'ifcType':
149
+ return provider.getEntityType(globalId);
150
+ case 'attribute':
151
+ if (!spec.propertyName || !provider.getEntityAttribute)
152
+ return undefined;
153
+ return provider.getEntityAttribute(globalId, spec.propertyName);
154
+ case 'property':
155
+ if (!spec.psetName || !spec.propertyName)
156
+ return undefined;
157
+ {
158
+ const val = provider.getPropertyValue(globalId, spec.psetName, spec.propertyName);
159
+ return val != null ? String(val) : undefined;
160
+ }
161
+ case 'quantity':
162
+ if (!spec.psetName || !spec.propertyName || !provider.getQuantityValue)
163
+ return undefined;
164
+ return provider.getQuantityValue(globalId, spec.psetName, spec.propertyName);
165
+ case 'classification':
166
+ if (!provider.getClassifications)
167
+ return undefined;
168
+ {
169
+ const cls = provider.getClassifications(globalId);
170
+ if (!cls || cls.length === 0)
171
+ return undefined;
172
+ // Use "system: identification" as the grouping key
173
+ const c = cls[0];
174
+ const parts = [];
175
+ if (c.system)
176
+ parts.push(c.system);
177
+ if (c.identification)
178
+ parts.push(c.identification);
179
+ return parts.length > 0 ? parts.join(': ') : c.name;
180
+ }
181
+ case 'material':
182
+ if (!provider.getMaterialName)
183
+ return undefined;
184
+ return provider.getMaterialName(globalId);
185
+ default:
186
+ return undefined;
187
+ }
188
+ }
79
189
  //# sourceMappingURL=engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -17,12 +17,15 @@
17
17
  * // result.ruleCounts — Map<ruleId, count>
18
18
  * ```
19
19
  */
20
- export type { LensDataProvider, PropertySetInfo, LensCriteria, LensRule, Lens, LensEvaluationResult, RGBAColor, } from './types.js';
20
+ export type { LensDataProvider, PropertySetInfo, ClassificationInfo, LensCriteria, LensRule, Lens, AutoColorSpec, AutoColorLegendEntry, LensEvaluationResult, RGBAColor, } from './types.js';
21
21
  export { COMMON_IFC_CLASSES,
22
22
  /** @deprecated Use COMMON_IFC_CLASSES instead */
23
- COMMON_IFC_CLASSES as COMMON_IFC_TYPES, LENS_PALETTE, IFC_SUBTYPE_TO_BASE, } from './types.js';
24
- export { evaluateLens } from './engine.js';
23
+ COMMON_IFC_CLASSES as COMMON_IFC_TYPES, LENS_PALETTE, IFC_SUBTYPE_TO_BASE, LENS_CRITERIA_TYPES, AUTO_COLOR_SOURCES, ENTITY_ATTRIBUTE_NAMES, } from './types.js';
24
+ export { evaluateLens, evaluateAutoColorLens } from './engine.js';
25
+ export type { AutoColorEvaluationResult } from './engine.js';
25
26
  export { matchesCriteria } from './matching.js';
26
- export { GHOST_COLOR, hexToRgba, rgbaToHex, isGhostColor, } from './colors.js';
27
+ export { GHOST_COLOR, hexToRgba, rgbaToHex, isGhostColor, uniqueColor, } from './colors.js';
27
28
  export { BUILTIN_LENSES } from './presets.js';
29
+ export { discoverClasses, discoverDataSources } from './discovery.js';
30
+ export type { DiscoveredLensData } from './discovery.js';
28
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,oBAAoB,EACpB,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB;AAClB,iDAAiD;AACjD,kBAAkB,IAAI,gBAAgB,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMhD,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,GACb,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB;AAClB,iDAAiD;AACjD,kBAAkB,IAAI,gBAAgB,EACtC,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAM7D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMhD,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAM9C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACtE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -3,11 +3,11 @@
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  export { COMMON_IFC_CLASSES,
5
5
  /** @deprecated Use COMMON_IFC_CLASSES instead */
6
- COMMON_IFC_CLASSES as COMMON_IFC_TYPES, LENS_PALETTE, IFC_SUBTYPE_TO_BASE, } from './types.js';
6
+ COMMON_IFC_CLASSES as COMMON_IFC_TYPES, LENS_PALETTE, IFC_SUBTYPE_TO_BASE, LENS_CRITERIA_TYPES, AUTO_COLOR_SOURCES, ENTITY_ATTRIBUTE_NAMES, } from './types.js';
7
7
  // ============================================================================
8
8
  // Engine
9
9
  // ============================================================================
10
- export { evaluateLens } from './engine.js';
10
+ export { evaluateLens, evaluateAutoColorLens } from './engine.js';
11
11
  // ============================================================================
12
12
  // Matching
13
13
  // ============================================================================
@@ -15,9 +15,13 @@ export { matchesCriteria } from './matching.js';
15
15
  // ============================================================================
16
16
  // Colors
17
17
  // ============================================================================
18
- export { GHOST_COLOR, hexToRgba, rgbaToHex, isGhostColor, } from './colors.js';
18
+ export { GHOST_COLOR, hexToRgba, rgbaToHex, isGhostColor, uniqueColor, } from './colors.js';
19
19
  // ============================================================================
20
20
  // Presets
21
21
  // ============================================================================
22
22
  export { BUILTIN_LENSES } from './presets.js';
23
+ // ============================================================================
24
+ // Discovery
25
+ // ============================================================================
26
+ export { discoverClasses, discoverDataSources } from './discovery.js';
23
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAoC/D,OAAO,EACL,kBAAkB;AAClB,iDAAiD;AACjD,kBAAkB,IAAI,gBAAgB,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAuC/D,OAAO,EACL,kBAAkB;AAClB,iDAAiD;AACjD,kBAAkB,IAAI,gBAAgB,EACtC,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGlE,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -2,7 +2,7 @@ import type { LensCriteria, LensDataProvider } from './types.js';
2
2
  /**
3
3
  * Check if an entity matches a {@link LensCriteria}.
4
4
  *
5
- * Performance: O(1) for type matching, O(psets) for property/material.
5
+ * Performance: O(1) for type/attribute, O(psets) for property/material/classification.
6
6
  */
7
7
  export declare function matchesCriteria(criteria: LensCriteria, globalId: number, provider: LensDataProvider): boolean;
8
8
  //# sourceMappingURL=matching.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../src/matching.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGjE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAWT"}
1
+ {"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../src/matching.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGjE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAiBT"}
package/dist/matching.js CHANGED
@@ -5,7 +5,7 @@ import { IFC_SUBTYPE_TO_BASE } from './types.js';
5
5
  /**
6
6
  * Check if an entity matches a {@link LensCriteria}.
7
7
  *
8
- * Performance: O(1) for type matching, O(psets) for property/material.
8
+ * Performance: O(1) for type/attribute, O(psets) for property/material/classification.
9
9
  */
10
10
  export function matchesCriteria(criteria, globalId, provider) {
11
11
  switch (criteria.type) {
@@ -15,6 +15,12 @@ export function matchesCriteria(criteria, globalId, provider) {
15
15
  return matchesProperty(criteria, globalId, provider);
16
16
  case 'material':
17
17
  return matchesMaterial(criteria, globalId, provider);
18
+ case 'attribute':
19
+ return matchesAttribute(criteria, globalId, provider);
20
+ case 'quantity':
21
+ return matchesQuantity(criteria, globalId, provider);
22
+ case 'classification':
23
+ return matchesClassification(criteria, globalId, provider);
18
24
  default:
19
25
  return false;
20
26
  }
@@ -50,14 +56,23 @@ function matchesProperty(criteria, globalId, provider) {
50
56
  }
51
57
  return value !== null && value !== undefined;
52
58
  }
53
- /** Match by material (scans material-related property sets) */
59
+ /** Match by material prefers dedicated getMaterialName, falls back to pset scan */
54
60
  function matchesMaterial(criteria, globalId, provider) {
55
61
  if (!criteria.materialName)
56
62
  return false;
63
+ const pattern = criteria.materialName.toLowerCase();
64
+ // Prefer dedicated material accessor if available
65
+ if (provider.getMaterialName) {
66
+ const matName = provider.getMaterialName(globalId);
67
+ if (matName) {
68
+ return matName.toLowerCase().includes(pattern);
69
+ }
70
+ return false;
71
+ }
72
+ // Fallback: scan material-related property sets
57
73
  const psets = provider.getPropertySets(globalId);
58
74
  if (!psets || psets.length === 0)
59
75
  return false;
60
- const pattern = criteria.materialName.toLowerCase();
61
76
  for (const pset of psets) {
62
77
  if (pset.name.toLowerCase().includes('material')) {
63
78
  for (const prop of pset.properties) {
@@ -69,4 +84,63 @@ function matchesMaterial(criteria, globalId, provider) {
69
84
  }
70
85
  return false;
71
86
  }
87
+ /** Match by entity attribute (Name, Description, ObjectType, Tag) */
88
+ function matchesAttribute(criteria, globalId, provider) {
89
+ if (!criteria.attributeName)
90
+ return false;
91
+ if (!provider.getEntityAttribute)
92
+ return false;
93
+ const value = provider.getEntityAttribute(globalId, criteria.attributeName);
94
+ if (criteria.operator === 'exists') {
95
+ return value !== undefined && value !== '';
96
+ }
97
+ if (criteria.operator === 'contains' && criteria.attributeValue !== undefined) {
98
+ return (value ?? '').toLowerCase().includes(criteria.attributeValue.toLowerCase());
99
+ }
100
+ // Default: equals
101
+ if (criteria.attributeValue !== undefined) {
102
+ return (value ?? '') === criteria.attributeValue;
103
+ }
104
+ return value !== undefined && value !== '';
105
+ }
106
+ /** Match by quantity value (supports equals, contains, exists operators) */
107
+ function matchesQuantity(criteria, globalId, provider) {
108
+ if (!criteria.quantitySet || !criteria.quantityName)
109
+ return false;
110
+ if (!provider.getQuantityValue)
111
+ return false;
112
+ const value = provider.getQuantityValue(globalId, criteria.quantitySet, criteria.quantityName);
113
+ if (criteria.operator === 'exists') {
114
+ return value !== undefined && value !== null;
115
+ }
116
+ if (value === undefined || value === null)
117
+ return false;
118
+ if (criteria.operator === 'contains' && criteria.quantityValue !== undefined) {
119
+ return String(value).toLowerCase().includes(criteria.quantityValue.toLowerCase());
120
+ }
121
+ // Default: equals (string comparison)
122
+ if (criteria.quantityValue !== undefined) {
123
+ return String(value) === criteria.quantityValue;
124
+ }
125
+ return true;
126
+ }
127
+ /** Match by classification system and/or code */
128
+ function matchesClassification(criteria, globalId, provider) {
129
+ if (!criteria.classificationSystem && !criteria.classificationCode)
130
+ return false;
131
+ if (!provider.getClassifications)
132
+ return false;
133
+ const classifications = provider.getClassifications(globalId);
134
+ if (!classifications || classifications.length === 0)
135
+ return false;
136
+ for (const cls of classifications) {
137
+ const systemMatch = !criteria.classificationSystem ||
138
+ (cls.system ?? '').toLowerCase().includes(criteria.classificationSystem.toLowerCase());
139
+ const codeMatch = !criteria.classificationCode ||
140
+ (cls.identification ?? '').toLowerCase().includes(criteria.classificationCode.toLowerCase());
141
+ if (systemMatch && codeMatch)
142
+ return true;
143
+ }
144
+ return false;
145
+ }
72
146
  //# sourceMappingURL=matching.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"matching.js","sourceRoot":"","sources":["../src/matching.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../src/matching.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,IAAI,EAmDzC,CAAC"}
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,IAAI,EAoDzC,CAAC"}
package/dist/presets.js CHANGED
@@ -8,20 +8,13 @@
8
8
  * The viewer marks them with `builtin: true` so they cannot be deleted.
9
9
  */
10
10
  export const BUILTIN_LENSES = [
11
+ // Auto-color by IFC Class — colors ALL classes automatically from model data
11
12
  {
12
- id: 'lens-by-type',
13
+ id: 'lens-by-class',
13
14
  name: 'By IFC Class',
14
15
  builtin: true,
15
- rules: [
16
- { id: 'wall', name: 'Walls', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcWall' }, action: 'colorize', color: '#8D6E63' },
17
- { id: 'slab', name: 'Slabs', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcSlab' }, action: 'colorize', color: '#607D8B' },
18
- { id: 'column', name: 'Columns', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcColumn' }, action: 'colorize', color: '#E53935' },
19
- { id: 'beam', name: 'Beams', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcBeam' }, action: 'colorize', color: '#1E88E5' },
20
- { id: 'door', name: 'Doors', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcDoor' }, action: 'colorize', color: '#00897B' },
21
- { id: 'window', name: 'Windows', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcWindow' }, action: 'colorize', color: '#42A5F5' },
22
- { id: 'stair', name: 'Stairs', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcStairFlight' }, action: 'colorize', color: '#FF8F00' },
23
- { id: 'roof', name: 'Roofs', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcRoof' }, action: 'colorize', color: '#8E24AA' },
24
- ],
16
+ rules: [],
17
+ autoColor: { source: 'ifcType' },
25
18
  },
26
19
  {
27
20
  id: 'lens-structural',
@@ -58,5 +51,13 @@ export const BUILTIN_LENSES = [
58
51
  { id: 'railing', name: 'Railings', enabled: true, criteria: { type: 'ifcType', ifcType: 'IfcRailing' }, action: 'colorize', color: '#78909C' },
59
52
  ],
60
53
  },
54
+ // Auto-color by material
55
+ {
56
+ id: 'lens-auto-material',
57
+ name: 'By Material',
58
+ builtin: true,
59
+ rules: [],
60
+ autoColor: { source: 'material' },
61
+ },
61
62
  ];
62
63
  //# sourceMappingURL=presets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -2,8 +2,12 @@
2
2
  * @ifc-lite/lens — Rule-based 3D filtering and colorization
3
3
  *
4
4
  * A lens is a collection of rules that match entities by IFC class, property
5
- * value, or material name, then apply a visual action (colorize, hide, or
6
- * make transparent). Unmatched entities are ghosted for context.
5
+ * value, material name, attribute, quantity, or classification, then apply a
6
+ * visual action (colorize, hide, or make transparent). Unmatched entities are
7
+ * ghosted for context.
8
+ *
9
+ * Auto-color mode: given a data source (e.g. property column, attribute),
10
+ * automatically discovers distinct values and assigns a unique color to each.
7
11
  *
8
12
  * Multi-model support: evaluation works across federated models using
9
13
  * global IDs. The {@link LensDataProvider} abstracts data access so
@@ -35,6 +39,37 @@ export interface LensDataProvider {
35
39
  * Used for material matching (scans psets whose name contains "material").
36
40
  */
37
41
  getPropertySets(globalId: number): PropertySetInfo[];
42
+ /**
43
+ * Get a single entity attribute by name (e.g. "Name", "Description",
44
+ * "ObjectType", "Tag"). Optional — engine skips attribute criteria
45
+ * when not implemented.
46
+ */
47
+ getEntityAttribute?(globalId: number, attrName: string): string | undefined;
48
+ /**
49
+ * Get a quantity value by quantity-set name and quantity name.
50
+ * Returns the numeric or string value, or `undefined` if not found.
51
+ */
52
+ getQuantityValue?(globalId: number, qsetName: string, quantName: string): number | string | undefined;
53
+ /**
54
+ * Get classification references for an entity.
55
+ * Returns an empty array when the entity has no classifications.
56
+ */
57
+ getClassifications?(globalId: number): ClassificationInfo[];
58
+ /**
59
+ * Get the material name for an entity.
60
+ * Returns the top-level material name, or the first layer/constituent name.
61
+ */
62
+ getMaterialName?(globalId: number): string | undefined;
63
+ /**
64
+ * Get quantity sets for an entity (used for discovery).
65
+ * Returns quantity set names and their quantity names.
66
+ */
67
+ getQuantitySets?(globalId: number): ReadonlyArray<{
68
+ name: string;
69
+ quantities: ReadonlyArray<{
70
+ name: string;
71
+ }>;
72
+ }>;
38
73
  }
39
74
  /** Property set returned by {@link LensDataProvider.getPropertySets} */
40
75
  export interface PropertySetInfo {
@@ -44,9 +79,15 @@ export interface PropertySetInfo {
44
79
  value: unknown;
45
80
  }>;
46
81
  }
82
+ /** Classification reference returned by {@link LensDataProvider.getClassifications} */
83
+ export interface ClassificationInfo {
84
+ system?: string;
85
+ identification?: string;
86
+ name?: string;
87
+ }
47
88
  /** Criteria for matching entities */
48
89
  export interface LensCriteria {
49
- type: 'ifcType' | 'property' | 'material';
90
+ type: 'ifcType' | 'property' | 'material' | 'attribute' | 'quantity' | 'classification';
50
91
  /** IFC class name (e.g. "IfcWall") — used when type === "ifcType" */
51
92
  ifcType?: string;
52
93
  /** Property set name (e.g. "Pset_WallCommon") — used when type === "property" */
@@ -59,6 +100,20 @@ export interface LensCriteria {
59
100
  propertyValue?: string;
60
101
  /** Material name pattern — used when type === "material" */
61
102
  materialName?: string;
103
+ /** Attribute name (e.g. "Name", "Description") — used when type === "attribute" */
104
+ attributeName?: string;
105
+ /** Attribute value to compare against */
106
+ attributeValue?: string;
107
+ /** Quantity set name (e.g. "Qto_WallBaseQuantities") — used when type === "quantity" */
108
+ quantitySet?: string;
109
+ /** Quantity name (e.g. "Length") — used when type === "quantity" */
110
+ quantityName?: string;
111
+ /** Quantity value to compare against (stringified) */
112
+ quantityValue?: string;
113
+ /** Classification system (e.g. "Uniclass") — used when type === "classification" */
114
+ classificationSystem?: string;
115
+ /** Classification code (e.g. "Pr_60_10_32") — used when type === "classification" */
116
+ classificationCode?: string;
62
117
  }
63
118
  /** A single rule within a Lens */
64
119
  export interface LensRule {
@@ -70,6 +125,20 @@ export interface LensRule {
70
125
  /** Hex color for colorize/transparent actions (e.g. "#E53935") */
71
126
  color: string;
72
127
  }
128
+ /**
129
+ * Data source specification for automatic coloring.
130
+ *
131
+ * In auto-color mode, the engine iterates all entities, extracts the
132
+ * specified value, groups by distinct values, and assigns a unique color
133
+ * to each group. No manual rule authoring needed.
134
+ */
135
+ export interface AutoColorSpec {
136
+ source: 'ifcType' | 'attribute' | 'property' | 'quantity' | 'classification' | 'material';
137
+ /** Property/quantity set name — for source "property" or "quantity" */
138
+ psetName?: string;
139
+ /** Attribute, property, or quantity name */
140
+ propertyName?: string;
141
+ }
73
142
  /** A saved Lens configuration */
74
143
  export interface Lens {
75
144
  id: string;
@@ -77,11 +146,8 @@ export interface Lens {
77
146
  rules: LensRule[];
78
147
  /** Built-in presets cannot be deleted */
79
148
  builtin?: boolean;
80
- /** Auto-color mode: color entities by distinct property values */
81
- autoColorProperty?: {
82
- propertySetName: string;
83
- propertyName: string;
84
- };
149
+ /** Auto-color mode: color entities by distinct values from a data column */
150
+ autoColor?: AutoColorSpec;
85
151
  }
86
152
  /** RGBA color tuple with values in the 0–1 range */
87
153
  export type RGBAColor = [number, number, number, number];
@@ -98,6 +164,19 @@ export interface LensEvaluationResult {
98
164
  /** Wall-clock evaluation time in milliseconds */
99
165
  executionTime: number;
100
166
  }
167
+ /** Auto-color legend entry (synthetic rule for UI display) */
168
+ export interface AutoColorLegendEntry {
169
+ id: string;
170
+ name: string;
171
+ color: string;
172
+ count: number;
173
+ }
174
+ /** Supported auto-color data sources for display in UI */
175
+ export declare const AUTO_COLOR_SOURCES: readonly ["ifcType", "attribute", "property", "quantity", "classification", "material"];
176
+ /** All supported criteria types for lens rules */
177
+ export declare const LENS_CRITERIA_TYPES: readonly ["ifcType", "attribute", "property", "quantity", "classification", "material"];
178
+ /** Common entity attribute names for the lens rule editor */
179
+ export declare const ENTITY_ATTRIBUTE_NAMES: readonly ["Name", "Description", "ObjectType", "Tag"];
101
180
  /** Common IFC classes for lens rule editor UI */
102
181
  export declare const COMMON_IFC_CLASSES: readonly ["IfcWall", "IfcWallStandardCase", "IfcSlab", "IfcSlabStandardCase", "IfcColumn", "IfcColumnStandardCase", "IfcBeam", "IfcBeamStandardCase", "IfcDoor", "IfcWindow", "IfcStairFlight", "IfcStair", "IfcRoof", "IfcRamp", "IfcRampFlight", "IfcRailing", "IfcCovering", "IfcCurtainWall", "IfcPlate", "IfcFooting", "IfcPile", "IfcMember", "IfcBuildingElementProxy", "IfcFurnishingElement", "IfcSpace", "IfcFlowSegment", "IfcFlowTerminal", "IfcFlowFitting", "IfcDistributionElement", "IfcOpeningElement"];
103
182
  /** Preset colors for new lens rules — high contrast, perceptually distinct */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,9 +1,18 @@
1
1
  /* This Source Code Form is subject to the terms of the Mozilla Public
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
- // ============================================================================
5
- // Constants
6
- // ============================================================================
4
+ /** Supported auto-color data sources for display in UI */
5
+ export const AUTO_COLOR_SOURCES = [
6
+ 'ifcType', 'attribute', 'property', 'quantity', 'classification', 'material',
7
+ ];
8
+ /** All supported criteria types for lens rules */
9
+ export const LENS_CRITERIA_TYPES = [
10
+ 'ifcType', 'attribute', 'property', 'quantity', 'classification', 'material',
11
+ ];
12
+ /** Common entity attribute names for the lens rule editor */
13
+ export const ENTITY_ATTRIBUTE_NAMES = [
14
+ 'Name', 'Description', 'ObjectType', 'Tag',
15
+ ];
7
16
  /** Common IFC classes for lens rule editor UI */
8
17
  export const COMMON_IFC_CLASSES = [
9
18
  'IfcWall', 'IfcWallStandardCase',
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkI/D,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,iDAAiD;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,qBAAqB;IAChC,SAAS,EAAE,qBAAqB;IAChC,WAAW,EAAE,uBAAuB;IACpC,SAAS,EAAE,qBAAqB;IAChC,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,UAAU;IAC5B,SAAS,EAAE,SAAS,EAAE,eAAe;IACrC,YAAY,EAAE,aAAa;IAC3B,gBAAgB,EAAE,UAAU;IAC5B,YAAY,EAAE,SAAS;IACvB,WAAW,EAAE,yBAAyB;IACtC,sBAAsB,EAAE,UAAU;IAClC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB;IACrD,wBAAwB;IACxB,mBAAmB;CACX,CAAC;AAEX,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAC1C,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAC1C,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;CAClC,CAAC;AAEX,qEAAqE;AACrE,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE,mBAAmB,EAAE,SAAS;IAC9B,mBAAmB,EAAE,SAAS;IAC9B,qBAAqB,EAAE,WAAW;IAClC,mBAAmB,EAAE,SAAS;IAC9B,cAAc,EAAE,UAAU;IAC1B,aAAa,EAAE,SAAS;CACzB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAyN/D,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU;CACpE,CAAC;AAEX,kDAAkD;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU;CACpE,CAAC;AAEX,6DAA6D;AAC7D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK;CAClC,CAAC;AAEX,iDAAiD;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,qBAAqB;IAChC,SAAS,EAAE,qBAAqB;IAChC,WAAW,EAAE,uBAAuB;IACpC,SAAS,EAAE,qBAAqB;IAChC,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,UAAU;IAC5B,SAAS,EAAE,SAAS,EAAE,eAAe;IACrC,YAAY,EAAE,aAAa;IAC3B,gBAAgB,EAAE,UAAU;IAC5B,YAAY,EAAE,SAAS;IACvB,WAAW,EAAE,yBAAyB;IACtC,sBAAsB,EAAE,UAAU;IAClC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB;IACrD,wBAAwB;IACxB,mBAAmB;CACX,CAAC;AAEX,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAC1C,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAC1C,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;CAClC,CAAC;AAEX,qEAAqE;AACrE,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE,mBAAmB,EAAE,SAAS;IAC9B,mBAAmB,EAAE,SAAS;IAC9B,qBAAqB,EAAE,WAAW;IAClC,mBAAmB,EAAE,SAAS;IAC9B,cAAc,EAAE,UAAU;IAC1B,aAAa,EAAE,SAAS;CACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/lens",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "Rule-based 3D filtering and colorization for IFC models",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",