@operato/scene-visualizer 10.0.0-beta.4 → 10.0.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,147 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ var StockHub_1;
5
+ import { __decorate } from "tslib";
6
+ import { ServiceComponent, sceneComponent } from '@hatiolab/things-scene';
7
+ const STOCK_HUB_ICON_SRC = 'data:image/svg+xml;base64,' +
8
+ btoa(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="#d09050">
9
+ <rect x="8" y="28" width="18" height="28" rx="2" opacity="0.8"/>
10
+ <rect x="23" y="18" width="18" height="38" rx="2" opacity="0.6"/>
11
+ <rect x="38" y="8" width="18" height="48" rx="2" opacity="0.9"/>
12
+ <rect x="4" y="56" width="56" height="4" rx="1"/>
13
+ </svg>`);
14
+ const NATURE = {
15
+ mutable: false,
16
+ resizable: true,
17
+ rotatable: true,
18
+ properties: [
19
+ {
20
+ type: 'string',
21
+ label: 'location-field',
22
+ name: 'locationField',
23
+ placeholder: 'location'
24
+ },
25
+ {
26
+ type: 'id-input',
27
+ label: 'legend-target',
28
+ name: 'legendTarget',
29
+ property: {
30
+ component: 'legend'
31
+ }
32
+ },
33
+ {
34
+ type: 'checkbox',
35
+ label: 'hide-empty-stock',
36
+ name: 'hideEmptyStock'
37
+ }
38
+ ],
39
+ help: 'scene/component/stock-hub'
40
+ };
41
+ let StockHub = class StockHub extends ServiceComponent {
42
+ static { StockHub_1 = this; }
43
+ static _icon;
44
+ static get icon() {
45
+ if (!StockHub_1._icon) {
46
+ StockHub_1._icon = new Image();
47
+ StockHub_1._icon.src = STOCK_HUB_ICON_SRC;
48
+ }
49
+ return StockHub_1._icon;
50
+ }
51
+ // === StockMaterialProvider ===
52
+ _stock_materials = [];
53
+ _default_material;
54
+ _empty_material;
55
+ _legendTarget;
56
+ // === Stock 레지스트리 ===
57
+ _objects = {};
58
+ get nature() {
59
+ return NATURE;
60
+ }
61
+ get serviceName() {
62
+ return 'stock';
63
+ }
64
+ get hideEmptyStock() {
65
+ return !!this.getState('hideEmptyStock');
66
+ }
67
+ get legendTarget() {
68
+ const { legendTarget } = this.state;
69
+ if (!this._legendTarget && legendTarget) {
70
+ this._legendTarget = this.root.findById?.(legendTarget);
71
+ this._legendTarget?.on('change', this._onLegendChanged, this);
72
+ }
73
+ return this._legendTarget;
74
+ }
75
+ /* === Stock 레지스트리 메서드 === */
76
+ putObject(id, object) {
77
+ id && (this._objects[id] = object);
78
+ }
79
+ getObject(id) {
80
+ return this._objects[id];
81
+ }
82
+ /* === 라이프사이클 === */
83
+ dispose() {
84
+ this._legendTarget?.off('change', this._onLegendChanged, this);
85
+ delete this._legendTarget;
86
+ this._resetMaterials();
87
+ this._objects = {};
88
+ super.dispose();
89
+ }
90
+ /* === 데이터 분배 === */
91
+ onchangeData() {
92
+ if (typeof this.data !== 'object') {
93
+ return;
94
+ }
95
+ let data = this.data;
96
+ const locationField = this.getState('locationField') || 'location';
97
+ if (data instanceof Array) {
98
+ data = data.reduce((acc, value) => {
99
+ const location = value[locationField];
100
+ if (!location) {
101
+ return acc;
102
+ }
103
+ if (acc[location]) {
104
+ acc[location]['items'].push(value);
105
+ }
106
+ else {
107
+ acc[location] = { items: [value] };
108
+ }
109
+ return acc;
110
+ }, {});
111
+ }
112
+ for (const key in data) {
113
+ if (data.hasOwnProperty(key)) {
114
+ const d = data[key];
115
+ const object = this.getObject(key);
116
+ if (object) {
117
+ ;
118
+ object.onchangeStockData(d);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ /* === 이벤트 핸들러 === */
124
+ onchange(after, before) {
125
+ if ('legendTarget' in before || 'legendTarget' in after) {
126
+ this._legendTarget?.off('change', this._onLegendChanged, this);
127
+ delete this._legendTarget;
128
+ this._resetMaterials();
129
+ }
130
+ this.invalidate();
131
+ }
132
+ _onLegendChanged() {
133
+ this._resetMaterials();
134
+ this.invalidate();
135
+ }
136
+ _resetMaterials() {
137
+ this._stock_materials.forEach(m => m.dispose?.());
138
+ this._stock_materials = [];
139
+ delete this._default_material;
140
+ delete this._empty_material;
141
+ }
142
+ };
143
+ StockHub = StockHub_1 = __decorate([
144
+ sceneComponent('stock-hub')
145
+ ], StockHub);
146
+ export { StockHub };
147
+ //# sourceMappingURL=stock-hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock-hub.js","sourceRoot":"","sources":["../src/stock-hub.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport {\n Component,\n ComponentNature,\n Properties,\n RealObject,\n ServiceComponent,\n sceneComponent\n} from '@hatiolab/things-scene'\nimport * as THREE from 'three'\nimport { Stock, type StockMaterialProvider } from './stock.js'\n\nconst STOCK_HUB_ICON_SRC =\n 'data:image/svg+xml;base64,' +\n btoa(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" fill=\"#d09050\">\n <rect x=\"8\" y=\"28\" width=\"18\" height=\"28\" rx=\"2\" opacity=\"0.8\"/>\n <rect x=\"23\" y=\"18\" width=\"18\" height=\"38\" rx=\"2\" opacity=\"0.6\"/>\n <rect x=\"38\" y=\"8\" width=\"18\" height=\"48\" rx=\"2\" opacity=\"0.9\"/>\n <rect x=\"4\" y=\"56\" width=\"56\" height=\"4\" rx=\"1\"/>\n</svg>`\n )\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'string',\n label: 'location-field',\n name: 'locationField',\n placeholder: 'location'\n },\n {\n type: 'id-input',\n label: 'legend-target',\n name: 'legendTarget',\n property: {\n component: 'legend'\n }\n },\n {\n type: 'checkbox',\n label: 'hide-empty-stock',\n name: 'hideEmptyStock'\n }\n ],\n help: 'scene/component/stock-hub'\n}\n\n@sceneComponent('stock-hub')\nexport class StockHub extends ServiceComponent implements StockMaterialProvider {\n static _icon?: HTMLImageElement\n\n static get icon(): HTMLImageElement {\n if (!StockHub._icon) {\n StockHub._icon = new Image()\n StockHub._icon.src = STOCK_HUB_ICON_SRC\n }\n return StockHub._icon\n }\n\n // === StockMaterialProvider ===\n _stock_materials: THREE.Material[] = []\n _default_material?: THREE.Material\n _empty_material?: THREE.Material\n private _legendTarget?: Component\n\n // === Stock 레지스트리 ===\n _objects: { [id: string]: RealObject } = {}\n\n get nature(): ComponentNature {\n return NATURE\n }\n\n get serviceName(): string {\n return 'stock'\n }\n\n get hideEmptyStock(): boolean {\n return !!this.getState('hideEmptyStock')\n }\n\n get legendTarget(): Component | undefined {\n const { legendTarget } = this.state\n\n if (!this._legendTarget && legendTarget) {\n this._legendTarget = this.root.findById?.(legendTarget)\n this._legendTarget?.on('change', this._onLegendChanged, this)\n }\n\n return this._legendTarget\n }\n\n /* === Stock 레지스트리 메서드 === */\n\n putObject(id: string, object: RealObject): void {\n id && (this._objects[id] = object)\n }\n\n getObject(id: string): RealObject {\n return this._objects[id]\n }\n\n /* === 라이프사이클 === */\n\n dispose(): void {\n this._legendTarget?.off('change', this._onLegendChanged, this)\n delete this._legendTarget\n this._resetMaterials()\n this._objects = {}\n\n super.dispose()\n }\n\n /* === 데이터 분배 === */\n\n onchangeData(): void {\n if (typeof this.data !== 'object') {\n return\n }\n\n let data = this.data as any\n const locationField = this.getState('locationField') || 'location'\n\n if (data instanceof Array) {\n data = data.reduce((acc: any, value: any) => {\n const location = value[locationField]\n\n if (!location) {\n return acc\n }\n\n if (acc[location]) {\n acc[location]['items'].push(value)\n } else {\n acc[location] = { items: [value] }\n }\n\n return acc\n }, {})\n }\n\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n const d = data[key]\n const object = this.getObject(key)\n if (object) {\n ;(object as Stock).onchangeStockData(d)\n }\n }\n }\n }\n\n /* === 이벤트 핸들러 === */\n\n onchange(after: Properties, before: Properties): void {\n if ('legendTarget' in before || 'legendTarget' in after) {\n this._legendTarget?.off('change', this._onLegendChanged, this)\n delete this._legendTarget\n this._resetMaterials()\n }\n\n this.invalidate()\n }\n\n private _onLegendChanged(): void {\n this._resetMaterials()\n this.invalidate()\n }\n\n private _resetMaterials(): void {\n this._stock_materials.forEach(m => m.dispose?.())\n this._stock_materials = []\n delete this._default_material\n delete this._empty_material\n }\n}\n"]}
package/dist/stock.d.ts CHANGED
@@ -16,6 +16,8 @@ export declare class Stock extends RealObject<THREE.Mesh> {
16
16
  static defaultEmptyMaterial: THREE.MeshStandardMaterial;
17
17
  static stockGeometry: THREE.BoxGeometry;
18
18
  _hideEmptyStock: boolean;
19
+ _focused: boolean;
20
+ _focusedAt?: number;
19
21
  model: any;
20
22
  constructor(component: Component, model: any);
21
23
  protected getObject3dInstance(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
package/dist/stock.js CHANGED
@@ -4,19 +4,26 @@
4
4
  import { RealObject } from '@hatiolab/things-scene';
5
5
  import * as THREE from 'three';
6
6
  const STOCK_COLOR = '#ccaa76';
7
- export class Stock extends RealObject {
8
- static defaultMaterial = new THREE.MeshStandardMaterial({
9
- color: STOCK_COLOR,
7
+ function createStockMaterial(color, opts) {
8
+ const mat = new THREE.MeshStandardMaterial({
9
+ color,
10
10
  side: THREE.FrontSide,
11
- roughness: 0.7
12
- });
13
- static defaultEmptyMaterial = new THREE.MeshStandardMaterial({
14
- color: STOCK_COLOR,
15
- opacity: 0.33,
16
- transparent: true
11
+ metalness: 0,
12
+ roughness: 1,
13
+ envMapIntensity: 0
17
14
  });
15
+ if (opts?.opacity !== undefined) {
16
+ mat.opacity = opts.opacity;
17
+ mat.transparent = opts.transparent ?? true;
18
+ }
19
+ return mat;
20
+ }
21
+ export class Stock extends RealObject {
22
+ static defaultMaterial = createStockMaterial(STOCK_COLOR);
23
+ static defaultEmptyMaterial = createStockMaterial(STOCK_COLOR, { opacity: 0.33, transparent: true });
18
24
  static stockGeometry = new THREE.BoxGeometry(1, 1, 1);
19
25
  _hideEmptyStock = false;
26
+ _focused = false;
20
27
  model;
21
28
  constructor(component, model) {
22
29
  super(component);
@@ -49,11 +56,7 @@ export class Stock extends RealObject {
49
56
  this.stockMaterials[index] = this.userDefineDefaultMaterial;
50
57
  }
51
58
  if (!this.stockMaterials[index]) {
52
- this.stockMaterials[index] = new THREE.MeshStandardMaterial({
53
- color: range.color,
54
- side: THREE.FrontSide,
55
- roughness: 0.7
56
- });
59
+ this.stockMaterials[index] = createStockMaterial(range.color);
57
60
  }
58
61
  var alpha = range.color.replace(/^.*,(.+)\)/, '$1');
59
62
  if (alpha > 0 && alpha < 1) {
@@ -73,16 +76,9 @@ export class Stock extends RealObject {
73
76
  const defaultColor = status?.defaultColor;
74
77
  if (!defaultColor)
75
78
  return Stock.defaultMaterial;
76
- p._default_material = new THREE.MeshStandardMaterial({
77
- color: defaultColor,
78
- side: THREE.FrontSide,
79
- roughness: 0.7
80
- });
81
- var alpha = defaultColor.replace(/^.*,(.+)\)/, '$1');
82
- if (alpha > 0 && alpha < 1) {
83
- p._default_material.opacity = alpha;
84
- p._default_material.transparent = true;
85
- }
79
+ var alpha = Number(defaultColor.replace(/^.*,(.+)\)/, '$1'));
80
+ var hasAlpha = alpha > 0 && alpha < 1;
81
+ p._default_material = createStockMaterial(defaultColor, hasAlpha ? { opacity: alpha, transparent: true } : undefined);
86
82
  }
87
83
  return p._default_material;
88
84
  }
@@ -94,16 +90,9 @@ export class Stock extends RealObject {
94
90
  if (!p._empty_material) {
95
91
  const status = this._legendStatus;
96
92
  const defaultColor = status?.defaultColor || STOCK_COLOR;
97
- p._empty_material = new THREE.MeshStandardMaterial({ color: defaultColor });
98
93
  var alpha = Number(defaultColor.replace(/^.*,(.+)\)/, '$1'));
99
- if (alpha > 0 && alpha < 1) {
100
- p._empty_material.opacity = alpha;
101
- p._empty_material.transparent = true;
102
- }
103
- else {
104
- p._empty_material.opacity = 0.33;
105
- p._empty_material.transparent = true;
106
- }
94
+ var opacity = (alpha > 0 && alpha < 1) ? alpha : 0.33;
95
+ p._empty_material = createStockMaterial(defaultColor, { opacity, transparent: true });
107
96
  }
108
97
  return p._empty_material;
109
98
  }
package/dist/stock.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stock.js","sourceRoot":"","sources":["../src/stock.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { Component, Model, RealObject } from '@hatiolab/things-scene'\nimport * as THREE from 'three'\n\nconst STOCK_COLOR = '#ccaa76'\n\n/**\n * Stock material/legend 정보를 제공하는 컴포넌트 인터페이스.\n * Visualizer와 RackTable 모두 이를 구현한다.\n */\nexport interface StockMaterialProvider {\n _stock_materials: THREE.Material[]\n _default_material?: THREE.Material\n _empty_material?: THREE.Material\n legendTarget?: Component\n hideEmptyStock?: boolean\n}\n\nexport class Stock extends RealObject<THREE.Mesh> {\n static defaultMaterial = new THREE.MeshStandardMaterial({\n color: STOCK_COLOR,\n side: THREE.FrontSide,\n roughness: 0.7\n })\n static defaultEmptyMaterial = new THREE.MeshStandardMaterial({\n color: STOCK_COLOR,\n opacity: 0.33,\n transparent: true\n })\n static stockGeometry = new THREE.BoxGeometry(1, 1, 1)\n\n _hideEmptyStock: boolean = false\n\n model: any\n\n constructor(component: Component, model: any) {\n super(component)\n this.model = model\n }\n\n protected getObject3dInstance() {\n return new THREE.Mesh()\n }\n\n /**\n * 가장 가까운 StockMaterialProvider 조상을 찾는다 (RackTable 또는 Visualizer).\n */\n get provider(): StockMaterialProvider | undefined {\n let component = this.component\n\n while (component) {\n if ('_stock_materials' in component) {\n return component as unknown as StockMaterialProvider\n }\n component = component.parent\n }\n }\n\n private get _legendStatus(): any | undefined {\n return this.provider?.legendTarget?.getState('status') || undefined\n }\n\n getMaterial(index: number) {\n const status = this._legendStatus\n if (!status) return this.userDefineDefaultMaterial\n\n const range = status.ranges?.[index]\n if (!(range && range.color)) {\n this.stockMaterials[index] = this.userDefineDefaultMaterial\n }\n\n if (!this.stockMaterials[index]) {\n this.stockMaterials[index] = new THREE.MeshStandardMaterial({\n color: range.color,\n side: THREE.FrontSide,\n roughness: 0.7\n })\n }\n\n var alpha = range.color.replace(/^.*,(.+)\\)/, '$1')\n if (alpha > 0 && alpha < 1) {\n this.stockMaterials[index].opacity = alpha\n this.stockMaterials[index].transparent = true\n }\n\n return this.stockMaterials[index]\n }\n\n get stockMaterials(): THREE.Material[] {\n return this.provider?._stock_materials ?? []\n }\n\n get userDefineDefaultMaterial(): THREE.Material {\n const p = this.provider\n\n if (p) {\n if (!p._default_material) {\n const status = this._legendStatus\n const defaultColor = status?.defaultColor\n if (!defaultColor) return Stock.defaultMaterial\n\n p._default_material = new THREE.MeshStandardMaterial({\n color: defaultColor,\n side: THREE.FrontSide,\n roughness: 0.7\n })\n var alpha = defaultColor.replace(/^.*,(.+)\\)/, '$1')\n if (alpha > 0 && alpha < 1) {\n p._default_material.opacity = alpha\n p._default_material.transparent = true\n }\n }\n return p._default_material\n }\n\n return Stock.defaultMaterial\n }\n\n get emptyMaterial(): THREE.Material {\n const p = this.provider\n\n if (p) {\n if (!p._empty_material) {\n const status = this._legendStatus\n const defaultColor = status?.defaultColor || STOCK_COLOR\n\n p._empty_material = new THREE.MeshStandardMaterial({ color: defaultColor })\n var alpha = Number(defaultColor.replace(/^.*,(.+)\\)/, '$1'))\n if (alpha > 0 && alpha < 1) {\n p._empty_material.opacity = alpha\n p._empty_material.transparent = true\n } else {\n p._empty_material.opacity = 0.33\n p._empty_material.transparent = true\n }\n }\n return p._empty_material\n }\n\n return Stock.defaultEmptyMaterial\n }\n\n build() {\n super.build()\n\n var { width, height, depth } = this.model\n\n this._hideEmptyStock = !!this.provider?.hideEmptyStock\n\n this.createStock(width, height, depth)\n }\n\n createStock(w: number, h: number, d: number) {\n this.object3d.geometry = Stock.stockGeometry\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n\n this.object3d.scale.set(w, d, h)\n\n this.object3d.receiveShadow = true\n\n this.object3d.castShadow = true\n this.object3d.onBeforeRender = () => {\n this.onBeforeRender()\n }\n }\n\n onchangeStockData(data: any) {\n this.object3d.userData = {\n ...this.object3d.userData,\n data\n }\n\n const stockStatus = this._legendStatus as\n | { field: string; aggregation?: string; ranges: { min?: string | number; max?: string | number }[] }\n | undefined\n if (!stockStatus) return\n\n var statusField = stockStatus.field\n var aggregation = stockStatus.aggregation || 'sum'\n var ranges = stockStatus.ranges\n\n if (!(statusField && ranges)) return\n\n var items = data.items\n\n if (!items) {\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n return\n }\n\n // Collect all status values from items\n var statusValues: any[] = items\n .map((item: any) => item && item[statusField])\n .filter((value: any) => value !== undefined && value !== null)\n\n if (statusValues.length === 0) {\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n return\n }\n\n // Apply aggregation function\n var status: number\n switch (aggregation) {\n case 'sum':\n status = statusValues.reduce((sum: number, val: any) => sum + Number(val), 0)\n break\n case 'avg':\n status = statusValues.reduce((sum: number, val: any) => sum + Number(val), 0) / statusValues.length\n break\n case 'min':\n status = Math.min(...statusValues.map((val: any) => Number(val)))\n break\n case 'max':\n status = Math.max(...statusValues.map((val: any) => Number(val)))\n break\n default:\n status = statusValues.reduce((sum: number, val: any) => sum + Number(val), 0)\n }\n\n var isInRanges = ranges.some((range, index) => {\n let { min: minValue, max: maxValue } = range\n\n var min: number | undefined =\n minValue !== undefined && minValue !== null && minValue !== '' ? Number(minValue) : undefined\n var max: number | undefined =\n maxValue !== undefined && maxValue !== null && maxValue !== '' ? Number(maxValue) : undefined\n\n // If max is not set, treat it as infinity\n var maxCheck = max === undefined ? true : max > status\n var minCheck = min === undefined ? true : min <= status\n\n if (maxCheck && minCheck) {\n this.object3d.material = this.getMaterial(index)\n return true\n } else {\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n return false\n }\n })\n if (!isInRanges) {\n this.object3d.material = this.userDefineDefaultMaterial\n }\n }\n\n onBeforeRender = () => {\n if (this._focused) {\n var lastTime = performance.now() - this._focusedAt!\n var progress = lastTime / 2000\n\n this.object3d.rotation.y = 2 * Math.PI * progress\n this.component.invalidate()\n } else if (this._focusedAt) {\n delete this._focusedAt\n this.object3d.rotation.y = 0\n this.component.invalidate()\n }\n }\n\n onmouseup(e: MouseEvent, _context: unknown, callback: (arg: { data: any; location: string }) => void) {\n if (!this.object3d.visible) return\n\n if (!this.object3d.userData || !this.object3d.userData.data)\n this.object3d.userData = {\n ...this.object3d.userData,\n data: {\n loc: this.object3d.name,\n items: [\n {\n loc: this.object3d.name\n }\n ]\n }\n }\n\n if (callback && typeof callback == 'function') {\n callback({\n ...this.object3d.userData.data,\n color: '#' + (this.object3d.material as any).color?.getHexString()\n })\n }\n }\n\n // all update functions should be intentionally empty. important!\n updateTransform() {}\n updateDimension() {}\n updateAlpha() {}\n updateFillStyle() {}\n updateStrokeStyle() {}\n updateHidden() {}\n updateText() {}\n}\n"]}
1
+ {"version":3,"file":"stock.js","sourceRoot":"","sources":["../src/stock.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { Component, Model, RealObject } from '@hatiolab/things-scene'\nimport * as THREE from 'three'\n\nconst STOCK_COLOR = '#ccaa76'\n\nfunction createStockMaterial(color: string | number, opts?: { opacity?: number; transparent?: boolean }): THREE.MeshStandardMaterial {\n const mat = new THREE.MeshStandardMaterial({\n color,\n side: THREE.FrontSide,\n metalness: 0,\n roughness: 1,\n envMapIntensity: 0\n })\n if (opts?.opacity !== undefined) {\n mat.opacity = opts.opacity\n mat.transparent = opts.transparent ?? true\n }\n return mat\n}\n\n/**\n * Stock material/legend 정보를 제공하는 컴포넌트 인터페이스.\n * Visualizer와 RackTable 모두 이를 구현한다.\n */\nexport interface StockMaterialProvider {\n _stock_materials: THREE.Material[]\n _default_material?: THREE.Material\n _empty_material?: THREE.Material\n legendTarget?: Component\n hideEmptyStock?: boolean\n}\n\nexport class Stock extends RealObject<THREE.Mesh> {\n static defaultMaterial = createStockMaterial(STOCK_COLOR)\n static defaultEmptyMaterial = createStockMaterial(STOCK_COLOR, { opacity: 0.33, transparent: true })\n static stockGeometry = new THREE.BoxGeometry(1, 1, 1)\n\n _hideEmptyStock: boolean = false\n _focused: boolean = false\n declare _focusedAt?: number\n\n model: any\n\n constructor(component: Component, model: any) {\n super(component)\n this.model = model\n }\n\n protected getObject3dInstance() {\n return new THREE.Mesh()\n }\n\n /**\n * 가장 가까운 StockMaterialProvider 조상을 찾는다 (RackTable 또는 Visualizer).\n */\n get provider(): StockMaterialProvider | undefined {\n let component = this.component\n\n while (component) {\n if ('_stock_materials' in component) {\n return component as unknown as StockMaterialProvider\n }\n component = component.parent\n }\n }\n\n private get _legendStatus(): any | undefined {\n return this.provider?.legendTarget?.getState('status') || undefined\n }\n\n getMaterial(index: number) {\n const status = this._legendStatus\n if (!status) return this.userDefineDefaultMaterial\n\n const range = status.ranges?.[index]\n if (!(range && range.color)) {\n this.stockMaterials[index] = this.userDefineDefaultMaterial\n }\n\n if (!this.stockMaterials[index]) {\n this.stockMaterials[index] = createStockMaterial(range.color)\n }\n\n var alpha = range.color.replace(/^.*,(.+)\\)/, '$1')\n if (alpha > 0 && alpha < 1) {\n this.stockMaterials[index].opacity = alpha\n this.stockMaterials[index].transparent = true\n }\n\n return this.stockMaterials[index]\n }\n\n get stockMaterials(): THREE.Material[] {\n return this.provider?._stock_materials ?? []\n }\n\n get userDefineDefaultMaterial(): THREE.Material {\n const p = this.provider\n\n if (p) {\n if (!p._default_material) {\n const status = this._legendStatus\n const defaultColor = status?.defaultColor\n if (!defaultColor) return Stock.defaultMaterial\n\n var alpha = Number(defaultColor.replace(/^.*,(.+)\\)/, '$1'))\n var hasAlpha = alpha > 0 && alpha < 1\n p._default_material = createStockMaterial(defaultColor, hasAlpha ? { opacity: alpha, transparent: true } : undefined)\n }\n return p._default_material\n }\n\n return Stock.defaultMaterial\n }\n\n get emptyMaterial(): THREE.Material {\n const p = this.provider\n\n if (p) {\n if (!p._empty_material) {\n const status = this._legendStatus\n const defaultColor = status?.defaultColor || STOCK_COLOR\n\n var alpha = Number(defaultColor.replace(/^.*,(.+)\\)/, '$1'))\n var opacity = (alpha > 0 && alpha < 1) ? alpha : 0.33\n p._empty_material = createStockMaterial(defaultColor, { opacity, transparent: true })\n }\n return p._empty_material\n }\n\n return Stock.defaultEmptyMaterial\n }\n\n build() {\n super.build()\n\n var { width, height, depth } = this.model\n\n this._hideEmptyStock = !!this.provider?.hideEmptyStock\n\n this.createStock(width, height, depth)\n }\n\n createStock(w: number, h: number, d: number) {\n this.object3d.geometry = Stock.stockGeometry\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n\n this.object3d.scale.set(w, d, h)\n\n this.object3d.receiveShadow = true\n\n this.object3d.castShadow = true\n this.object3d.onBeforeRender = () => {\n this.onBeforeRender()\n }\n }\n\n onchangeStockData(data: any) {\n this.object3d.userData = {\n ...this.object3d.userData,\n data\n }\n\n const stockStatus = this._legendStatus as\n | { field: string; aggregation?: string; ranges: { min?: string | number; max?: string | number }[] }\n | undefined\n if (!stockStatus) return\n\n var statusField = stockStatus.field\n var aggregation = stockStatus.aggregation || 'sum'\n var ranges = stockStatus.ranges\n\n if (!(statusField && ranges)) return\n\n var items = data.items\n\n if (!items) {\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n return\n }\n\n // Collect all status values from items\n var statusValues: any[] = items\n .map((item: any) => item && item[statusField])\n .filter((value: any) => value !== undefined && value !== null)\n\n if (statusValues.length === 0) {\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n return\n }\n\n // Apply aggregation function\n var status: number\n switch (aggregation) {\n case 'sum':\n status = statusValues.reduce((sum: number, val: any) => sum + Number(val), 0)\n break\n case 'avg':\n status = statusValues.reduce((sum: number, val: any) => sum + Number(val), 0) / statusValues.length\n break\n case 'min':\n status = Math.min(...statusValues.map((val: any) => Number(val)))\n break\n case 'max':\n status = Math.max(...statusValues.map((val: any) => Number(val)))\n break\n default:\n status = statusValues.reduce((sum: number, val: any) => sum + Number(val), 0)\n }\n\n var isInRanges = ranges.some((range, index) => {\n let { min: minValue, max: maxValue } = range\n\n var min: number | undefined =\n minValue !== undefined && minValue !== null && minValue !== '' ? Number(minValue) : undefined\n var max: number | undefined =\n maxValue !== undefined && maxValue !== null && maxValue !== '' ? Number(maxValue) : undefined\n\n // If max is not set, treat it as infinity\n var maxCheck = max === undefined ? true : max > status\n var minCheck = min === undefined ? true : min <= status\n\n if (maxCheck && minCheck) {\n this.object3d.material = this.getMaterial(index)\n return true\n } else {\n this.object3d.material = this._hideEmptyStock ? this.emptyMaterial : this.userDefineDefaultMaterial\n return false\n }\n })\n if (!isInRanges) {\n this.object3d.material = this.userDefineDefaultMaterial\n }\n }\n\n onBeforeRender = () => {\n if (this._focused) {\n var lastTime = performance.now() - this._focusedAt!\n var progress = lastTime / 2000\n\n this.object3d.rotation.y = 2 * Math.PI * progress\n this.component.invalidate()\n } else if (this._focusedAt) {\n delete this._focusedAt\n this.object3d.rotation.y = 0\n this.component.invalidate()\n }\n }\n\n onmouseup(e: MouseEvent, _context: unknown, callback: (arg: { data: any; location: string }) => void) {\n if (!this.object3d.visible) return\n\n if (!this.object3d.userData || !this.object3d.userData.data)\n this.object3d.userData = {\n ...this.object3d.userData,\n data: {\n loc: this.object3d.name,\n items: [\n {\n loc: this.object3d.name\n }\n ]\n }\n }\n\n if (callback && typeof callback == 'function') {\n callback({\n ...this.object3d.userData.data,\n color: '#' + (this.object3d.material as any).color?.getHexString()\n })\n }\n }\n\n // all update functions should be intentionally empty. important!\n updateTransform() {}\n updateDimension() {}\n updateAlpha() {}\n updateFillStyle() {}\n updateStrokeStyle() {}\n updateHidden() {}\n updateText() {}\n}\n"]}
@@ -9,30 +9,6 @@ declare const _default: ({
9
9
  top: number;
10
10
  width: number;
11
11
  height: number;
12
- fillStyle: string;
13
- fov: number;
14
- near: number;
15
- far: number;
16
- zoom: number;
17
- threed: boolean;
18
- };
19
- } | {
20
- type: string;
21
- description: string;
22
- group: string;
23
- icon: string;
24
- model: {
25
- type: string;
26
- top: number;
27
- left: number;
28
- width: number;
29
- height: number;
30
- locPattern: string;
31
- increasePattern: string;
32
- strokeStyle: string;
33
- lineWidth: number;
34
- rows: number;
35
- columns: number;
36
12
  };
37
13
  } | {
38
14
  type: string;
@@ -54,23 +30,6 @@ declare const _default: ({
54
30
  lineDash: string;
55
31
  lineCap: string;
56
32
  };
57
- } | {
58
- type: string;
59
- description: string;
60
- group: string;
61
- icon: string;
62
- model: {
63
- type: string;
64
- left: number;
65
- top: number;
66
- width: number;
67
- height: number;
68
- depth: number;
69
- fillStyle: string;
70
- strokeStyle: string;
71
- lineWidth: number;
72
- alpha: number;
73
- };
74
33
  } | {
75
34
  type: string;
76
35
  description: string;
@@ -15,9 +15,11 @@ import signalTower from './signal-tower.js';
15
15
  import tank from './tank.js';
16
16
  import vehicle from './vehicle.js';
17
17
  import carrier from './carrier.js';
18
+ import stockHub from './stock-hub.js';
18
19
  export default [
19
20
  threeContainer,
20
21
  visualizer,
22
+ stockHub,
21
23
  rackTable,
22
24
  camera,
23
25
  light,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mBAAmB,CAAA;AAC9C,OAAO,UAAU,MAAM,iBAAiB,CAAA;AACxC,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,UAAU,MAAM,kBAAkB,CAAA;AACzC,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,eAAe;IACb,cAAc;IACd,UAAU;IACV,SAAS;IACT,MAAM;IACN,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,OAAO;IACP,OAAO;CACR,CAAA","sourcesContent":["import threeContainer from './3d-container.js'\nimport visualizer from './visualizer.js'\nimport rackTable from './rack-table.js'\nimport cube from './cube.js'\nimport cylinder from './cylinder.js'\nimport sphere from './sphere.js'\nimport banner from './banner.js'\nimport sprite from './sprite.js'\nimport wall from './wall.js'\nimport desk from './desk.js'\nimport camera from './camera.js'\nimport light from './light.js'\nimport GLTFObject from './gltf-object.js'\nimport signalTower from './signal-tower.js'\nimport tank from './tank.js'\nimport vehicle from './vehicle.js'\nimport carrier from './carrier.js'\n\nexport default [\n threeContainer,\n visualizer,\n rackTable,\n camera,\n light,\n cube,\n cylinder,\n sphere,\n sprite,\n banner,\n wall,\n desk,\n GLTFObject,\n signalTower,\n tank,\n vehicle,\n carrier\n]\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mBAAmB,CAAA;AAC9C,OAAO,UAAU,MAAM,iBAAiB,CAAA;AACxC,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,UAAU,MAAM,kBAAkB,CAAA;AACzC,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAErC,eAAe;IACb,cAAc;IACd,UAAU;IACV,QAAQ;IACR,SAAS;IACT,MAAM;IACN,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,OAAO;IACP,OAAO;CACR,CAAA","sourcesContent":["import threeContainer from './3d-container.js'\nimport visualizer from './visualizer.js'\nimport rackTable from './rack-table.js'\nimport cube from './cube.js'\nimport cylinder from './cylinder.js'\nimport sphere from './sphere.js'\nimport banner from './banner.js'\nimport sprite from './sprite.js'\nimport wall from './wall.js'\nimport desk from './desk.js'\nimport camera from './camera.js'\nimport light from './light.js'\nimport GLTFObject from './gltf-object.js'\nimport signalTower from './signal-tower.js'\nimport tank from './tank.js'\nimport vehicle from './vehicle.js'\nimport carrier from './carrier.js'\nimport stockHub from './stock-hub.js'\n\nexport default [\n threeContainer,\n visualizer,\n stockHub,\n rackTable,\n camera,\n light,\n cube,\n cylinder,\n sphere,\n sprite,\n banner,\n wall,\n desk,\n GLTFObject,\n signalTower,\n tank,\n vehicle,\n carrier\n]\n"]}
@@ -15,6 +15,8 @@ declare const _default: {
15
15
  lineWidth: number;
16
16
  rows: number;
17
17
  columns: number;
18
+ shelves: number;
19
+ depth: number;
18
20
  };
19
21
  };
20
22
  export default _default;
@@ -2,7 +2,7 @@ const icon = new URL('../../icons/rack-table.png', import.meta.url).href;
2
2
  export default {
3
3
  type: 'rack-table',
4
4
  description: '3D rack-table',
5
- group: '3D' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,
5
+ group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,
6
6
  icon,
7
7
  model: {
8
8
  type: 'rack-table',
@@ -15,7 +15,9 @@ export default {
15
15
  strokeStyle: '#999',
16
16
  lineWidth: 2,
17
17
  rows: 5,
18
- columns: 5
18
+ columns: 5,
19
+ shelves: 6,
20
+ depth: 12
19
21
  }
20
22
  };
21
23
  //# sourceMappingURL=rack-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rack-table.js","sourceRoot":"","sources":["../../src/templates/rack-table.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAExE,eAAe;IACb,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,eAAe;IAC5B,KAAK,EAAE,IAAI,CAAC,gGAAgG;IAC5G,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,gBAAgB;QAC5B,eAAe,EAAE,MAAM;QACvB,WAAW,EAAE,MAAM;QACnB,SAAS,EAAE,CAAC;QACZ,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;KACX;CACF,CAAA","sourcesContent":["const icon = new URL('../../icons/rack-table.png', import.meta.url).href\n\nexport default {\n type: 'rack-table',\n description: '3D rack-table',\n group: '3D' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,\n icon,\n model: {\n type: 'rack-table',\n top: 100,\n left: 100,\n width: 500,\n height: 200,\n locPattern: '{z}{s}-{u}{sh}',\n increasePattern: '+u+s',\n strokeStyle: '#999',\n lineWidth: 2,\n rows: 5,\n columns: 5\n }\n}\n"]}
1
+ {"version":3,"file":"rack-table.js","sourceRoot":"","sources":["../../src/templates/rack-table.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAExE,eAAe;IACb,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,eAAe;IAC5B,KAAK,EAAE,WAAW,CAAC,gGAAgG;IACnH,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,gBAAgB;QAC5B,eAAe,EAAE,MAAM;QACvB,WAAW,EAAE,MAAM;QACnB,SAAS,EAAE,CAAC;QACZ,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,EAAE;KACV;CACF,CAAA","sourcesContent":["const icon = new URL('../../icons/rack-table.png', import.meta.url).href\n\nexport default {\n type: 'rack-table',\n description: '3D rack-table',\n group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,\n icon,\n model: {\n type: 'rack-table',\n top: 100,\n left: 100,\n width: 500,\n height: 200,\n locPattern: '{z}{s}-{u}{sh}',\n increasePattern: '+u+s',\n strokeStyle: '#999',\n lineWidth: 2,\n rows: 5,\n columns: 5,\n shelves: 6,\n depth: 12\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ declare const _default: {
2
+ type: string;
3
+ description: string;
4
+ group: string;
5
+ icon: string;
6
+ model: {
7
+ type: string;
8
+ left: number;
9
+ top: number;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ };
14
+ export default _default;
@@ -0,0 +1,15 @@
1
+ const icon = new URL('../../icons/stock-hub.png', import.meta.url).href;
2
+ export default {
3
+ type: 'stock-hub',
4
+ description: 'stock data hub',
5
+ group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,
6
+ icon,
7
+ model: {
8
+ type: 'stock-hub',
9
+ left: 100,
10
+ top: 100,
11
+ width: 60,
12
+ height: 60
13
+ }
14
+ };
15
+ //# sourceMappingURL=stock-hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock-hub.js","sourceRoot":"","sources":["../../src/templates/stock-hub.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAEvE,eAAe;IACb,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,gBAAgB;IAC7B,KAAK,EAAE,WAAW,CAAC,gGAAgG;IACnH,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;KACX;CACF,CAAA","sourcesContent":["const icon = new URL('../../icons/stock-hub.png', import.meta.url).href\n\nexport default {\n type: 'stock-hub',\n description: 'stock data hub',\n group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,\n icon,\n model: {\n type: 'stock-hub',\n left: 100,\n top: 100,\n width: 60,\n height: 60\n }\n}\n"]}
@@ -2,7 +2,7 @@ const icon = new URL('../../icons/visualizer.png', import.meta.url).href;
2
2
  export default {
3
3
  type: 'visualizer',
4
4
  description: '3D visualizer',
5
- group: '3D' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,
5
+ group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,
6
6
  icon,
7
7
  model: {
8
8
  type: 'visualizer',
@@ -1 +1 @@
1
- {"version":3,"file":"visualizer.js","sourceRoot":"","sources":["../../src/templates/visualizer.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAExE,eAAe;IACb,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,eAAe;IAC5B,KAAK,EAAE,IAAI,CAAC,gGAAgG;IAC5G,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,UAAU;QACrB,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,KAAK;KACd;CACF,CAAA","sourcesContent":["const icon = new URL('../../icons/visualizer.png', import.meta.url).href\n\nexport default {\n type: 'visualizer',\n description: '3D visualizer',\n group: '3D' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,\n icon,\n model: {\n type: 'visualizer',\n left: 100,\n top: 100,\n width: 800,\n height: 600,\n fillStyle: 'darkgray',\n fov: 60,\n near: 10,\n far: 10000,\n zoom: 100,\n threed: false\n }\n}\n"]}
1
+ {"version":3,"file":"visualizer.js","sourceRoot":"","sources":["../../src/templates/visualizer.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAExE,eAAe;IACb,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,eAAe;IAC5B,KAAK,EAAE,WAAW,CAAC,gGAAgG;IACnH,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,UAAU;QACrB,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,KAAK;KACd;CACF,CAAA","sourcesContent":["const icon = new URL('../../icons/visualizer.png', import.meta.url).href\n\nexport default {\n type: 'visualizer',\n description: '3D visualizer',\n group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,\n icon,\n model: {\n type: 'visualizer',\n left: 100,\n top: 100,\n width: 800,\n height: 600,\n fillStyle: 'darkgray',\n fov: 60,\n near: 10,\n far: 10000,\n zoom: 100,\n threed: false\n }\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import { Component, Properties, ComponentNature, RealObject, ThreeContainer } from '@hatiolab/things-scene';
2
2
  import * as THREE from 'three';
3
- import { type StockMaterialProvider } from './stock.js';
3
+ import { Stock, type StockMaterialProvider } from './stock.js';
4
4
  export declare class Visualizer extends ThreeContainer implements StockMaterialProvider {
5
5
  _legendTarget?: Component;
6
+ _focused_stock?: Stock;
6
7
  _objects: {
7
8
  [id: string]: RealObject;
8
9
  };