@operato/scene-visualizer 10.0.0-beta.3 → 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.
Files changed (37) hide show
  1. package/dist/editors/property-editor-gltf-fill-targets.d.ts +1 -1
  2. package/dist/editors/property-editor-gltf-fill-targets.js +5 -7
  3. package/dist/editors/property-editor-gltf-fill-targets.js.map +1 -1
  4. package/dist/editors/property-editor-location-increase-pattern.js +0 -4
  5. package/dist/editors/property-editor-location-increase-pattern.js.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/rack-table-3d.js +1 -0
  10. package/dist/rack-table-3d.js.map +1 -1
  11. package/dist/rack-table.js +13 -0
  12. package/dist/rack-table.js.map +1 -1
  13. package/dist/rack.d.ts +6 -0
  14. package/dist/rack.js +10 -1
  15. package/dist/rack.js.map +1 -1
  16. package/dist/stock-hub.d.ts +25 -0
  17. package/dist/stock-hub.js +147 -0
  18. package/dist/stock-hub.js.map +1 -0
  19. package/dist/stock.d.ts +2 -0
  20. package/dist/stock.js +22 -33
  21. package/dist/stock.js.map +1 -1
  22. package/dist/templates/index.d.ts +0 -41
  23. package/dist/templates/index.js +2 -0
  24. package/dist/templates/index.js.map +1 -1
  25. package/dist/templates/rack-table.d.ts +2 -0
  26. package/dist/templates/rack-table.js +4 -2
  27. package/dist/templates/rack-table.js.map +1 -1
  28. package/dist/templates/stock-hub.d.ts +14 -0
  29. package/dist/templates/stock-hub.js +15 -0
  30. package/dist/templates/stock-hub.js.map +1 -0
  31. package/dist/templates/visualizer.js +1 -1
  32. package/dist/templates/visualizer.js.map +1 -1
  33. package/dist/visualizer.d.ts +2 -1
  34. package/dist/visualizer.js +47 -48
  35. package/dist/visualizer.js.map +1 -1
  36. package/icons/stock-hub.png +0 -0
  37. package/package.json +2 -2
package/dist/rack.d.ts CHANGED
@@ -9,6 +9,12 @@ export declare class Rack extends RealObject {
9
9
  static boardGeometry: THREE.PlaneGeometry;
10
10
  private static _boardMaterial?;
11
11
  get visualizer(): Visualizer | undefined;
12
+ /**
13
+ * Stock 등록 대상: 1순위 조상 Visualizer(하위호환), 2순위 서비스 레지스트리의 stock-hub
14
+ */
15
+ get stockRegistry(): {
16
+ putObject(id: string, obj: RealObject): void;
17
+ } | undefined;
12
18
  get rackTable(): RackTable | undefined;
13
19
  get cz(): number;
14
20
  static get boardMaterial(): THREE.MeshStandardMaterial;
package/dist/rack.js CHANGED
@@ -20,6 +20,15 @@ export class Rack extends RealObject {
20
20
  component = component.parent;
21
21
  }
22
22
  }
23
+ /**
24
+ * Stock 등록 대상: 1순위 조상 Visualizer(하위호환), 2순위 서비스 레지스트리의 stock-hub
25
+ */
26
+ get stockRegistry() {
27
+ const vis = this.visualizer;
28
+ if (vis)
29
+ return vis;
30
+ return this.component.root?.getService?.('stock');
31
+ }
23
32
  get rackTable() {
24
33
  var component = this.component;
25
34
  while (component) {
@@ -87,7 +96,7 @@ export class Rack extends RealObject {
87
96
  var binCode = (bins[b] || '').replace('.', '');
88
97
  stock.object3d.name = `${this.makeLocationString(shelfLocIds[i])}${binCode}`;
89
98
  this.object3d.add(stock.object3d);
90
- this.visualizer?.putObject(stock.object3d.name, stock);
99
+ this.stockRegistry?.putObject(stock.object3d.name, stock);
91
100
  }
92
101
  }
93
102
  }
package/dist/rack.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rack.js","sourceRoot":"","sources":["../src/rack.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport * as THREE from 'three'\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js'\n\nimport { RealObject } from '@hatiolab/things-scene'\nimport { Stock } from './stock.js'\nimport { RackTable } from './rack-table.js'\nimport { Visualizer } from './visualizer.js'\n\nexport class Rack extends RealObject {\n private _frame?: THREE.BufferGeometry\n private _board?: THREE.BufferGeometry\n\n static rackFrameGeometry = new THREE.BoxGeometry(1, 1, 1)\n static boardGeometry = new THREE.PlaneGeometry(1, 1, 1, 1)\n\n private static _boardMaterial?: THREE.MeshStandardMaterial\n\n get visualizer(): Visualizer | undefined {\n var component = this.component\n\n while (component) {\n if (component.state.type == 'visualizer') {\n return component as unknown as Visualizer\n }\n component = component.parent\n }\n }\n\n get rackTable(): RackTable | undefined {\n var component = this.component\n\n while (component) {\n if (component.state.type == 'rack-table') {\n return component as unknown as RackTable\n }\n component = component.parent\n }\n }\n\n get cz() {\n var { shelves = 1, depth = 1 } = this.rackTable!.state\n\n return 0.5 * depth * shelves\n }\n\n static get boardMaterial() {\n if (!Rack._boardMaterial) {\n Rack._boardMaterial = new THREE.MeshStandardMaterial({\n color: '#dedede',\n side: THREE.DoubleSide,\n polygonOffset: true,\n polygonOffsetFactor: -0.1\n })\n }\n\n return Rack._boardMaterial\n }\n\n get frame() {\n return this._frame\n }\n\n get board() {\n return this._board\n }\n\n build() {\n super.build()\n\n var { depth, hideRackFrame, shelves, shelfLocations: commonShelfLocation, stockScale = 0.7 } = this.rackTable!.state\n\n var { width, height, shelfLocations = commonShelfLocation, binLocations = '' } = this.component.state\n\n let scale = stockScale\n\n var shelfLocIds\n\n if (!shelfLocations) {\n shelfLocIds = []\n for (var i = 0; i < shelves; i++) shelfLocIds.push(i + 1)\n } else shelfLocIds = shelfLocations.split(/\\s*,\\s*/)\n\n var shelfBins = binLocations.trim().split('\\n').reverse()\n\n if (!hideRackFrame) {\n this._frame = this.createRackFrame(width, height, depth * shelves)\n this._board = this.createRackBoards(shelves, width, height, depth, shelfLocIds)\n }\n\n for (var i = 0; i < shelves; i++) {\n let bottom = -depth * shelves * 0.5\n if (shelfLocIds[i] == '') {\n continue\n }\n\n var bins = (shelfBins[i] || '').trim().split(/\\s*,\\s*/)\n\n var binWidth = width / (bins.length || 1)\n for (var b = 0; b < bins.length; b++) {\n let stock = new Stock(this.component, {\n width: binWidth * scale,\n height: height * scale,\n depth: depth * scale\n })\n stock.update()\n\n let stockDepth = depth * scale\n\n stock.object3d.position.set(\n (width / 2) * ((2 * b - (bins.length - 1)) / bins.length),\n bottom + depth * i + stockDepth * 0.5,\n 0\n )\n var binCode = (bins[b] || '').replace('.', '')\n stock.object3d.name = `${this.makeLocationString(shelfLocIds[i])}${binCode}`\n\n this.object3d.add(stock.object3d)\n this.visualizer?.putObject(stock.object3d.name, stock)\n }\n }\n }\n\n createRackFrame(w: number, h: number, d: number): THREE.BufferGeometry {\n const frameWeight = Math.round(Math.min(w, h) / 10)\n const geometries = []\n\n for (let i = 0; i < 4; i++) {\n const geometry = Rack.rackFrameGeometry.clone()\n geometry.scale(frameWeight, d, frameWeight)\n\n switch (i) {\n case 0:\n geometry.translate(w / 2, 0, h / 2)\n break\n case 1:\n geometry.translate(w / 2, 0, -h / 2)\n break\n case 2:\n geometry.translate(-w / 2, 0, h / 2)\n break\n case 3:\n geometry.translate(-w / 2, 0, -h / 2)\n break\n }\n\n geometries.push(geometry)\n }\n\n return BufferGeometryUtils.mergeGeometries(geometries)\n }\n\n createRackBoards(\n shelves: number,\n width: number,\n height: number,\n depth: number,\n shelfLocIds: string[]\n ): THREE.BufferGeometry {\n let bottom = -depth * shelves * 0.5\n const geometries = []\n\n for (let i = 1; i < shelves; i++) {\n if (shelfLocIds[i] === '') {\n continue\n }\n\n const geometry = Rack.boardGeometry.clone()\n\n geometry.scale(width, height, 1)\n geometry.rotateX(Math.PI / 2)\n geometry.translate(0, bottom + depth * i, 0)\n\n geometries.push(geometry)\n }\n\n return BufferGeometryUtils.mergeGeometries(geometries)\n }\n\n makeLocationString(shelfString: string) {\n var { section = '', unit = '' } = this.component.state\n var { locPattern = '{z}{s}-{u}-{sh}', zone = '' } = this.rackTable!.state\n\n var locationString = locPattern\n\n locationString = locationString.replace(/{z}/i, zone)\n locationString = locationString.replace(/{s}/i, section)\n locationString = locationString.replace(/{u}/i, unit)\n locationString = locationString.replace(/{sh}/i, shelfString)\n\n return locationString\n }\n\n makeShelfString(pattern: string, shelf: number, length: number) {\n /**\n * pattern #: 숫자\n * pattern 0: 고정 자리수\n * pattern -: 역순\n */\n\n if (!pattern || !shelf || !length) return\n\n var isReverse = /^\\-/.test(pattern)\n pattern = pattern.replace(/#+/, '#')\n\n var fixedLength = (pattern.match(/0/g) || []).length || 0\n var shelfString = String(isReverse ? length - shelf + 1 : shelf)\n\n if (shelfString.length > fixedLength && fixedLength > 0) {\n shelfString = shelfString.substring(shelfString.length - fixedLength)\n } else {\n var prefix = ''\n for (var i = 0; i < fixedLength - shelfString.length; i++) {\n prefix += '0'\n }\n shelfString = prefix + shelfString\n }\n\n return shelfString\n }\n\n updateAlpha() {}\n}\n"]}
1
+ {"version":3,"file":"rack.js","sourceRoot":"","sources":["../src/rack.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport * as THREE from 'three'\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js'\n\nimport { RealObject } from '@hatiolab/things-scene'\nimport { Stock } from './stock.js'\nimport { RackTable } from './rack-table.js'\nimport { Visualizer } from './visualizer.js'\n\nexport class Rack extends RealObject {\n private _frame?: THREE.BufferGeometry\n private _board?: THREE.BufferGeometry\n\n static rackFrameGeometry = new THREE.BoxGeometry(1, 1, 1)\n static boardGeometry = new THREE.PlaneGeometry(1, 1, 1, 1)\n\n private static _boardMaterial?: THREE.MeshStandardMaterial\n\n get visualizer(): Visualizer | undefined {\n var component = this.component\n\n while (component) {\n if (component.state.type == 'visualizer') {\n return component as unknown as Visualizer\n }\n component = component.parent\n }\n }\n\n /**\n * Stock 등록 대상: 1순위 조상 Visualizer(하위호환), 2순위 서비스 레지스트리의 stock-hub\n */\n get stockRegistry(): { putObject(id: string, obj: RealObject): void } | undefined {\n const vis = this.visualizer\n if (vis) return vis\n return (this.component.root as any)?.getService?.('stock')\n }\n\n get rackTable(): RackTable | undefined {\n var component = this.component\n\n while (component) {\n if (component.state.type == 'rack-table') {\n return component as unknown as RackTable\n }\n component = component.parent\n }\n }\n\n get cz() {\n var { shelves = 1, depth = 1 } = this.rackTable!.state\n\n return 0.5 * depth * shelves\n }\n\n static get boardMaterial() {\n if (!Rack._boardMaterial) {\n Rack._boardMaterial = new THREE.MeshStandardMaterial({\n color: '#dedede',\n side: THREE.DoubleSide,\n polygonOffset: true,\n polygonOffsetFactor: -0.1\n })\n }\n\n return Rack._boardMaterial\n }\n\n get frame() {\n return this._frame\n }\n\n get board() {\n return this._board\n }\n\n build() {\n super.build()\n\n var { depth, hideRackFrame, shelves, shelfLocations: commonShelfLocation, stockScale = 0.7 } = this.rackTable!.state\n\n var { width, height, shelfLocations = commonShelfLocation, binLocations = '' } = this.component.state\n\n let scale = stockScale\n\n var shelfLocIds\n\n if (!shelfLocations) {\n shelfLocIds = []\n for (var i = 0; i < shelves; i++) shelfLocIds.push(i + 1)\n } else shelfLocIds = shelfLocations.split(/\\s*,\\s*/)\n\n var shelfBins = binLocations.trim().split('\\n').reverse()\n\n if (!hideRackFrame) {\n this._frame = this.createRackFrame(width, height, depth * shelves)\n this._board = this.createRackBoards(shelves, width, height, depth, shelfLocIds)\n }\n\n for (var i = 0; i < shelves; i++) {\n let bottom = -depth * shelves * 0.5\n if (shelfLocIds[i] == '') {\n continue\n }\n\n var bins = (shelfBins[i] || '').trim().split(/\\s*,\\s*/)\n\n var binWidth = width / (bins.length || 1)\n for (var b = 0; b < bins.length; b++) {\n let stock = new Stock(this.component, {\n width: binWidth * scale,\n height: height * scale,\n depth: depth * scale\n })\n stock.update()\n\n let stockDepth = depth * scale\n\n stock.object3d.position.set(\n (width / 2) * ((2 * b - (bins.length - 1)) / bins.length),\n bottom + depth * i + stockDepth * 0.5,\n 0\n )\n var binCode = (bins[b] || '').replace('.', '')\n stock.object3d.name = `${this.makeLocationString(shelfLocIds[i])}${binCode}`\n\n this.object3d.add(stock.object3d)\n this.stockRegistry?.putObject(stock.object3d.name, stock)\n }\n }\n }\n\n createRackFrame(w: number, h: number, d: number): THREE.BufferGeometry {\n const frameWeight = Math.round(Math.min(w, h) / 10)\n const geometries = []\n\n for (let i = 0; i < 4; i++) {\n const geometry = Rack.rackFrameGeometry.clone()\n geometry.scale(frameWeight, d, frameWeight)\n\n switch (i) {\n case 0:\n geometry.translate(w / 2, 0, h / 2)\n break\n case 1:\n geometry.translate(w / 2, 0, -h / 2)\n break\n case 2:\n geometry.translate(-w / 2, 0, h / 2)\n break\n case 3:\n geometry.translate(-w / 2, 0, -h / 2)\n break\n }\n\n geometries.push(geometry)\n }\n\n return BufferGeometryUtils.mergeGeometries(geometries)\n }\n\n createRackBoards(\n shelves: number,\n width: number,\n height: number,\n depth: number,\n shelfLocIds: string[]\n ): THREE.BufferGeometry {\n let bottom = -depth * shelves * 0.5\n const geometries = []\n\n for (let i = 1; i < shelves; i++) {\n if (shelfLocIds[i] === '') {\n continue\n }\n\n const geometry = Rack.boardGeometry.clone()\n\n geometry.scale(width, height, 1)\n geometry.rotateX(Math.PI / 2)\n geometry.translate(0, bottom + depth * i, 0)\n\n geometries.push(geometry)\n }\n\n return BufferGeometryUtils.mergeGeometries(geometries)\n }\n\n makeLocationString(shelfString: string) {\n var { section = '', unit = '' } = this.component.state\n var { locPattern = '{z}{s}-{u}-{sh}', zone = '' } = this.rackTable!.state\n\n var locationString = locPattern\n\n locationString = locationString.replace(/{z}/i, zone)\n locationString = locationString.replace(/{s}/i, section)\n locationString = locationString.replace(/{u}/i, unit)\n locationString = locationString.replace(/{sh}/i, shelfString)\n\n return locationString\n }\n\n makeShelfString(pattern: string, shelf: number, length: number) {\n /**\n * pattern #: 숫자\n * pattern 0: 고정 자리수\n * pattern -: 역순\n */\n\n if (!pattern || !shelf || !length) return\n\n var isReverse = /^\\-/.test(pattern)\n pattern = pattern.replace(/#+/, '#')\n\n var fixedLength = (pattern.match(/0/g) || []).length || 0\n var shelfString = String(isReverse ? length - shelf + 1 : shelf)\n\n if (shelfString.length > fixedLength && fixedLength > 0) {\n shelfString = shelfString.substring(shelfString.length - fixedLength)\n } else {\n var prefix = ''\n for (var i = 0; i < fixedLength - shelfString.length; i++) {\n prefix += '0'\n }\n shelfString = prefix + shelfString\n }\n\n return shelfString\n }\n\n updateAlpha() {}\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { Component, ComponentNature, Properties, RealObject, ServiceComponent } from '@hatiolab/things-scene';
2
+ import * as THREE from 'three';
3
+ import { type StockMaterialProvider } from './stock.js';
4
+ export declare class StockHub extends ServiceComponent implements StockMaterialProvider {
5
+ static _icon?: HTMLImageElement;
6
+ static get icon(): HTMLImageElement;
7
+ _stock_materials: THREE.Material[];
8
+ _default_material?: THREE.Material;
9
+ _empty_material?: THREE.Material;
10
+ private _legendTarget?;
11
+ _objects: {
12
+ [id: string]: RealObject;
13
+ };
14
+ get nature(): ComponentNature;
15
+ get serviceName(): string;
16
+ get hideEmptyStock(): boolean;
17
+ get legendTarget(): Component | undefined;
18
+ putObject(id: string, object: RealObject): void;
19
+ getObject(id: string): RealObject;
20
+ dispose(): void;
21
+ onchangeData(): void;
22
+ onchange(after: Properties, before: Properties): void;
23
+ private _onLegendChanged;
24
+ private _resetMaterials;
25
+ }
@@ -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"]}