@operato/scene-visualizer 9.2.2 → 10.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/carrier.d.ts +263 -0
- package/dist/carrier.js +272 -0
- package/dist/carrier.js.map +1 -0
- package/dist/desk.d.ts +238 -3
- package/dist/desk.js +1 -2
- package/dist/desk.js.map +1 -1
- package/dist/editors/index.d.ts +3 -0
- package/dist/editors/index.js +15 -0
- package/dist/editors/index.js.map +1 -1
- package/dist/editors/property-editor-gltf-fill-targets.d.ts +20 -0
- package/dist/editors/property-editor-gltf-fill-targets.js +313 -0
- package/dist/editors/property-editor-gltf-fill-targets.js.map +1 -0
- package/dist/editors/property-editor-gltf-info.d.ts +25 -3
- package/dist/editors/property-editor-gltf-info.js +333 -73
- package/dist/editors/property-editor-gltf-info.js.map +1 -1
- package/dist/editors/property-editor-gltf-play-targets.d.ts +25 -0
- package/dist/editors/property-editor-gltf-play-targets.js +388 -0
- package/dist/editors/property-editor-gltf-play-targets.js.map +1 -0
- package/dist/editors/property-editor-location-increase-pattern.js +87 -95
- package/dist/editors/property-editor-location-increase-pattern.js.map +1 -1
- package/dist/editors/property-editor-stocker-location.d.ts +13 -0
- package/dist/editors/property-editor-stocker-location.js +151 -0
- package/dist/editors/property-editor-stocker-location.js.map +1 -0
- package/dist/editors/property-editor-stocker-ports.d.ts +8 -0
- package/dist/editors/property-editor-stocker-ports.js +112 -0
- package/dist/editors/property-editor-stocker-ports.js.map +1 -0
- package/dist/effects/outline.js +1 -1
- package/dist/effects/outline.js.map +1 -1
- package/dist/index.d.ts +8 -17
- package/dist/index.js +10 -17
- package/dist/index.js.map +1 -1
- package/dist/rack-table-3d.d.ts +16 -0
- package/dist/rack-table-3d.js +95 -0
- package/dist/rack-table-3d.js.map +1 -0
- package/dist/rack-table-cell.d.ts +238 -3
- package/dist/rack-table-cell.js +44 -51
- package/dist/rack-table-cell.js.map +1 -1
- package/dist/rack-table-location.d.ts +37 -0
- package/dist/rack-table-location.js +227 -0
- package/dist/rack-table-location.js.map +1 -0
- package/dist/rack-table.d.ts +13 -29
- package/dist/rack-table.js +121 -380
- package/dist/rack-table.js.map +1 -1
- package/dist/rack.d.ts +16 -5
- package/dist/rack.js +106 -19
- package/dist/rack.js.map +1 -1
- package/dist/signal-tower.d.ts +492 -0
- package/dist/signal-tower.js +275 -0
- package/dist/signal-tower.js.map +1 -0
- package/dist/stock-hub.d.ts +25 -0
- package/dist/stock-hub.js +147 -0
- package/dist/stock-hub.js.map +1 -0
- package/dist/stock.d.ts +52 -8
- package/dist/stock.js +223 -120
- package/dist/stock.js.map +1 -1
- package/dist/stocker-3d.d.ts +23 -0
- package/dist/stocker-3d.js +352 -0
- package/dist/stocker-3d.js.map +1 -0
- package/dist/stocker-port-3d.d.ts +14 -0
- package/dist/stocker-port-3d.js +80 -0
- package/dist/stocker-port-3d.js.map +1 -0
- package/dist/stocker-port.d.ts +254 -0
- package/dist/stocker-port.js +123 -0
- package/dist/stocker-port.js.map +1 -0
- package/dist/stocker.d.ts +340 -0
- package/dist/stocker.js +370 -0
- package/dist/stocker.js.map +1 -0
- package/dist/tank.d.ts +492 -0
- package/dist/tank.js +312 -0
- package/dist/tank.js.map +1 -0
- package/dist/templates/carrier.d.ts +19 -0
- package/dist/templates/carrier.js +20 -0
- package/dist/templates/carrier.js.map +1 -0
- package/dist/templates/cube.js +1 -1
- package/dist/templates/cube.js.map +1 -1
- package/dist/templates/cylinder.js +3 -3
- package/dist/templates/cylinder.js.map +1 -1
- package/dist/templates/index.d.ts +38 -38
- package/dist/templates/index.js +15 -1
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/rack-table.d.ts +2 -0
- package/dist/templates/rack-table.js +4 -2
- package/dist/templates/rack-table.js.map +1 -1
- package/dist/templates/signal-tower.d.ts +21 -0
- package/dist/templates/signal-tower.js +22 -0
- package/dist/templates/signal-tower.js.map +1 -0
- package/dist/templates/sphere.d.ts +1 -0
- package/dist/templates/sphere.js +5 -4
- package/dist/templates/sphere.js.map +1 -1
- package/dist/templates/stock-hub.d.ts +14 -0
- package/dist/templates/stock-hub.js +15 -0
- package/dist/templates/stock-hub.js.map +1 -0
- package/dist/templates/stocker-port.d.ts +17 -0
- package/dist/templates/stocker-port.js +17 -0
- package/dist/templates/stocker-port.js.map +1 -0
- package/dist/templates/stocker.d.ts +27 -0
- package/dist/templates/stocker.js +38 -0
- package/dist/templates/stocker.js.map +1 -0
- package/dist/templates/tank.d.ts +21 -0
- package/dist/templates/tank.js +22 -0
- package/dist/templates/tank.js.map +1 -0
- package/dist/templates/vehicle.d.ts +19 -0
- package/dist/templates/vehicle.js +20 -0
- package/dist/templates/vehicle.js.map +1 -0
- package/dist/templates/visualizer.js +1 -1
- package/dist/templates/visualizer.js.map +1 -1
- package/dist/vehicle.d.ts +248 -0
- package/dist/vehicle.js +133 -0
- package/dist/vehicle.js.map +1 -0
- package/dist/visualizer.d.ts +5 -5
- package/dist/visualizer.js +72 -68
- package/dist/visualizer.js.map +1 -1
- package/icons/carrier.png +0 -0
- package/icons/signal-tower.png +0 -0
- package/icons/stock-hub.png +0 -0
- package/icons/tank.png +0 -0
- package/icons/vehicle.png +0 -0
- package/package.json +16 -18
- package/translations/en.json +6 -0
- package/translations/ja.json +5 -0
- package/translations/ko.json +6 -1
- package/translations/ms.json +5 -0
- package/translations/zh.json +5 -0
- package/dist/banner.d.ts +0 -15
- package/dist/banner.js +0 -76
- package/dist/banner.js.map +0 -1
- package/dist/camera.d.ts +0 -20
- package/dist/camera.js +0 -108
- package/dist/camera.js.map +0 -1
- package/dist/cube.d.ts +0 -13
- package/dist/cube.js +0 -38
- package/dist/cube.js.map +0 -1
- package/dist/cylinder.d.ts +0 -11
- package/dist/cylinder.js +0 -38
- package/dist/cylinder.js.map +0 -1
- package/dist/ellipse.d.ts +0 -5
- package/dist/ellipse.js +0 -22
- package/dist/ellipse.js.map +0 -1
- package/dist/gltf-object.d.ts +0 -20
- package/dist/gltf-object.js +0 -104
- package/dist/gltf-object.js.map +0 -1
- package/dist/html-overlay-element.d.ts +0 -1
- package/dist/html-overlay-element.js +0 -12
- package/dist/html-overlay-element.js.map +0 -1
- package/dist/light.d.ts +0 -15
- package/dist/light.js +0 -135
- package/dist/light.js.map +0 -1
- package/dist/polygon.d.ts +0 -17
- package/dist/polygon.js +0 -64
- package/dist/polygon.js.map +0 -1
- package/dist/rect.d.ts +0 -5
- package/dist/rect.js +0 -36
- package/dist/rect.js.map +0 -1
- package/dist/scene/component.d.ts +0 -1
- package/dist/scene/component.js +0 -29
- package/dist/scene/component.js.map +0 -1
- package/dist/sphere.d.ts +0 -11
- package/dist/sphere.js +0 -38
- package/dist/sphere.js.map +0 -1
- package/dist/sprite.d.ts +0 -9
- package/dist/sprite.js +0 -28
- package/dist/sprite.js.map +0 -1
- package/dist/text.d.ts +0 -1
- package/dist/text.js +0 -9
- package/dist/text.js.map +0 -1
- package/dist/three-container-editor.d.ts +0 -22
- package/dist/three-container-editor.js +0 -132
- package/dist/three-container-editor.js.map +0 -1
- package/dist/three-container.d.ts +0 -85
- package/dist/three-container.js +0 -565
- package/dist/three-container.js.map +0 -1
- package/dist/three-controls.d.ts +0 -11
- package/dist/three-controls.js +0 -616
- package/dist/three-controls.js.map +0 -1
- package/dist/three-layout.d.ts +0 -8
- package/dist/three-layout.js +0 -20
- package/dist/three-layout.js.map +0 -1
- package/dist/three-space.d.ts +0 -85
- package/dist/three-space.js +0 -570
- package/dist/three-space.js.map +0 -1
- package/dist/threed/common.d.ts +0 -22
- package/dist/threed/common.js +0 -19
- package/dist/threed/common.js.map +0 -1
- package/dist/threed/floor/floor.d.ts +0 -3
- package/dist/threed/floor/floor.js +0 -51
- package/dist/threed/floor/floor.js.map +0 -1
- package/dist/threed/html/elements.d.ts +0 -2
- package/dist/threed/html/elements.js +0 -21
- package/dist/threed/html/elements.js.map +0 -1
- package/dist/threed/index.d.ts +0 -15
- package/dist/threed/index.js +0 -16
- package/dist/threed/index.js.map +0 -1
- package/dist/threed/real-object-camera-meshed.d.ts +0 -12
- package/dist/threed/real-object-camera-meshed.js +0 -49
- package/dist/threed/real-object-camera-meshed.js.map +0 -1
- package/dist/threed/real-object-camera.d.ts +0 -9
- package/dist/threed/real-object-camera.js +0 -31
- package/dist/threed/real-object-camera.js.map +0 -1
- package/dist/threed/real-object-dom-element.d.ts +0 -9
- package/dist/threed/real-object-dom-element.js +0 -40
- package/dist/threed/real-object-dom-element.js.map +0 -1
- package/dist/threed/real-object-dummy.d.ts +0 -6
- package/dist/threed/real-object-dummy.js +0 -11
- package/dist/threed/real-object-dummy.js.map +0 -1
- package/dist/threed/real-object-extrude.d.ts +0 -21
- package/dist/threed/real-object-extrude.js +0 -173
- package/dist/threed/real-object-extrude.js.map +0 -1
- package/dist/threed/real-object-gltf.d.ts +0 -16
- package/dist/threed/real-object-gltf.js +0 -101
- package/dist/threed/real-object-gltf.js.map +0 -1
- package/dist/threed/real-object-group.d.ts +0 -5
- package/dist/threed/real-object-group.js +0 -11
- package/dist/threed/real-object-group.js.map +0 -1
- package/dist/threed/real-object-mesh.d.ts +0 -13
- package/dist/threed/real-object-mesh.js +0 -75
- package/dist/threed/real-object-mesh.js.map +0 -1
- package/dist/threed/real-object-plane.d.ts +0 -5
- package/dist/threed/real-object-plane.js +0 -22
- package/dist/threed/real-object-plane.js.map +0 -1
- package/dist/threed/real-object-scene.d.ts +0 -21
- package/dist/threed/real-object-scene.js +0 -67
- package/dist/threed/real-object-scene.js.map +0 -1
- package/dist/threed/real-object-sprite-2d.d.ts +0 -14
- package/dist/threed/real-object-sprite-2d.js +0 -45
- package/dist/threed/real-object-sprite-2d.js.map +0 -1
- package/dist/threed/real-object-sprite.d.ts +0 -11
- package/dist/threed/real-object-sprite.js +0 -50
- package/dist/threed/real-object-sprite.js.map +0 -1
- package/dist/threed/real-object-text.d.ts +0 -15
- package/dist/threed/real-object-text.js +0 -64
- package/dist/threed/real-object-text.js.map +0 -1
- package/dist/threed/real-object.d.ts +0 -64
- package/dist/threed/real-object.js +0 -260
- package/dist/threed/real-object.js.map +0 -1
- package/dist/threed/texture/canvas-texture.d.ts +0 -4
- package/dist/threed/texture/canvas-texture.js +0 -49
- package/dist/threed/texture/canvas-texture.js.map +0 -1
- package/dist/threed/texture/text-texture.d.ts +0 -8
- package/dist/threed/texture/text-texture.js +0 -79
- package/dist/threed/texture/text-texture.js.map +0 -1
- package/dist/threed/three-dimensional-container.d.ts +0 -8
- package/dist/threed/three-dimensional-container.js +0 -2
- package/dist/threed/three-dimensional-container.js.map +0 -1
- package/dist/threed/utils/bound-uv-generator.d.ts +0 -16
- package/dist/threed/utils/bound-uv-generator.js +0 -42
- package/dist/threed/utils/bound-uv-generator.js.map +0 -1
- package/dist/wall.d.ts +0 -13
- package/dist/wall.js +0 -45
- package/dist/wall.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-editor-location-increase-pattern.js","sourceRoot":"","sources":["../../src/editors/property-editor-location-increase-pattern.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/i18n/ox-i18n.js'\n\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\n\n@customElement('property-editor-location-increase-pattern')\nexport default class LocationIncreasePatternEditor extends OxPropertyEditor {\n static styles = [\n ...OxPropertyEditor.styles,\n css`\n fieldset {\n border: none;\n border-bottom: 1px solid #cfd8dc;\n color: var(--md-sys-color-secondary);\n font-size: 12px;\n padding: 0 0 10px 0;\n margin: 0 0 10px 0;\n }\n\n fieldset legend {\n padding: 5px 0 0 5px;\n font-size: 11px;\n color: #e46c2e;\n font-weight: bold;\n text-transform: capitalize;\n }\n\n .property-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n grid-gap: 5px;\n grid-auto-rows: minmax(24px, auto);\n margin: 10px 0 0 0;\n }\n\n .property-grid > * {\n line-height: 1.5;\n }\n\n .property-grid > label {\n grid-column: span 3;\n text-align: right;\n text-transform: capitalize;\n }\n\n .property-grid > input {\n grid-column: span 7;\n padding: 0;\n margin: 0;\n }\n\n .property-grid > .checkbox-row {\n grid-column: span 10;\n\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n grid-gap: 5px;\n grid-auto-rows: minmax(24px, auto);\n align-items: center;\n }\n\n .checkbox-row > input {\n grid-column: span 4 / auto;\n order: 1;\n place-self: center end;\n }\n\n .checkbox-row > label {\n grid-column: span 6;\n text-align: left;\n }\n\n #pattern-set {\n overflow: hidden;\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n }\n\n #pattern-set button {\n background: url('data:image/png;base64,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')\n no-repeat;\n display: block;\n width: 55px;\n height: 40px;\n min-width: inherit;\n border: 1px solid transparent;\n border-radius: 8px;\n transition: all 0.2s;\n padding: 0;\n cursor: pointer;\n margin: 0 auto;\n justify-self: center;\n }\n\n #pattern-set button:hover {\n border-color: var(--md-sys-color-primary);\n box-shadow: 0 2px 4px rgba(33, 150, 243, 0.2);\n }\n\n #pattern-set button:active {\n background-color: rgba(var(--md-sys-color-primary), 0.2);\n transform: scale(0.98);\n }\n\n #pattern-set button[data-value='+u+s'] {\n background-position: 50% 3px;\n }\n #pattern-set button[data-value='+u-s'] {\n background-position: 50% -97px;\n }\n #pattern-set button[data-value='-u+s'] {\n background-position: 50% -197px;\n }\n #pattern-set button[data-value='-u-s'] {\n background-position: 50% -297px;\n }\n #pattern-set button[data-value='+s+u'] {\n background-position: 50% -397px;\n }\n #pattern-set button[data-value='+s-u'] {\n background-position: 50% -497px;\n }\n #pattern-set button[data-value='-s+u'] {\n background-position: 50% -597px;\n }\n #pattern-set button[data-value='-s-u'] {\n background-position: 50% -697px;\n }\n #pattern-set button[data-value='cw'] {\n background-position: 50% -797px;\n }\n #pattern-set button[data-value='ccw'] {\n background-position: 50% -897px;\n }\n #pattern-set button[data-value='zigzag'] {\n background-position: 50% -997px;\n }\n #pattern-set button[data-value='zigzag-reverse'] {\n background-position: 50% -1097px;\n }\n\n label {\n order: initial;\n }\n\n input {\n order: initial;\n }\n\n #skip-numbering {\n order: initial;\n grid-column: span 4;\n }\n\n label[for='skip-numbering'] {\n order: 1;\n grid-column: span 5;\n text-align: left;\n }\n `\n ]\n\n editorTemplate(value: any, spec: PropertySpec): TemplateResult {\n // TODO: background image change to use the url-loader\n return html`\n <fieldset fullwidth>\n <legend><ox-i18n msgid=\"label.location-increase-pattern\">Increase Pattern</ox-i18n></legend>\n\n <div class=\"property-grid\">\n <label> <ox-i18n msgid=\"label.start-section\">Start Section</ox-i18n> </label>\n <input\n type=\"number\"\n data-start-section\n value=\"${this.startSection}\"\n @change=${(e: Event) => (this.startSection = (e.target! as HTMLInputElement).valueAsNumber)}\n />\n\n <label> <ox-i18n msgid=\"label.start-unit\">Start Unit</ox-i18n> </label>\n <input\n type=\"number\"\n data-start-unit\n value=\"${this.startUnit}\"\n @change=${(e: Event) => (this.startUnit = (e.target! as HTMLInputElement).valueAsNumber)}\n />\n\n <div class=\"checkbox-row\" fullwidth>\n <input id=\"skip-numbering\" type=\"checkbox\" data-skip-numbering ?checked=\"${this.skipNumbering}\" />\n <label for=\"skip-numbering\">\n <ox-i18n msgid=\"label.skip-numbering\">Skip Numbering</ox-i18n>\n </label>\n </div>\n\n <div\n id=\"pattern-set\"\n class=\"property-grid location-increase-pattern-btn\"\n @click=${(e: Event) => this._onTapType(e)}\n >\n <button data-value=\"cw\" type=\"button\"></button>\n <button data-value=\"ccw\" type=\"button\"></button>\n <button data-value=\"zigzag\" type=\"button\"></button>\n <button data-value=\"zigzag-reverse\" type=\"button\"></button>\n </div>\n </div>\n </fieldset>\n `\n }\n\n @property({ type: Number }) startSection: number = 1\n @property({ type: Number }) startUnit: number = 1\n @property({ type: Boolean }) skipNumbering: boolean = true\n @property({ type: Object }) _specificPropEl: HTMLElement | null = null\n\n connectedCallback() {\n super.connectedCallback()\n if (this.property && this.property.event) {\n Object.entries(this.property.event).forEach(entry => {\n if (entry[0]) {\n document.addEventListener(entry[0] as any, entry[1] as any)\n }\n })\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n if (this.property && this.property.event) {\n Object.entries(this.property.event).forEach(entry => {\n if (entry[0]) {\n document.removeEventListener(entry[0] as any, entry[1] as any)\n }\n })\n }\n }\n\n _onTapType(e: Event) {\n var target = e.target as HTMLElement\n\n const increasingDirection = target?.closest('[data-value]')?.getAttribute('data-value')\n if (!increasingDirection) {\n return\n }\n\n this.dispatchEvent(\n new CustomEvent('i-need-selected', {\n bubbles: true,\n composed: true,\n detail: {\n callback: (selected: any[]) => {\n const table = selected[0].parent\n table.increaseLocation(increasingDirection, this.skipNumbering, this.startSection, this.startUnit)\n }\n }\n })\n )\n\n e.stopPropagation()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"property-editor-location-increase-pattern.js","sourceRoot":"","sources":["../../src/editors/property-editor-location-increase-pattern.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/i18n/ox-i18n.js'\n\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\n\n@customElement('property-editor-location-increase-pattern')\nexport default class LocationIncreasePatternEditor extends OxPropertyEditor {\n static styles = [\n ...OxPropertyEditor.styles,\n css`\n fieldset {\n border: none;\n border-bottom: 1px solid #cfd8dc;\n color: var(--md-sys-color-secondary);\n font-size: 12px;\n padding: 0 0 10px 0;\n margin: 0 0 10px 0;\n }\n\n fieldset legend {\n padding: 5px 0 0 5px;\n font-size: 11px;\n color: #e46c2e;\n font-weight: bold;\n text-transform: capitalize;\n }\n\n .property-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n grid-gap: 5px;\n grid-auto-rows: minmax(24px, auto);\n margin: 10px 0 0 0;\n }\n\n .property-grid > * {\n line-height: 1.5;\n }\n\n .property-grid > label {\n grid-column: span 3;\n text-align: right;\n text-transform: capitalize;\n }\n\n .property-grid > input {\n grid-column: span 7;\n padding: 0;\n margin: 0;\n }\n\n .property-grid > .checkbox-row {\n grid-column: span 10;\n\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n grid-gap: 5px;\n grid-auto-rows: minmax(24px, auto);\n align-items: center;\n }\n\n .checkbox-row > input {\n grid-column: span 4 / auto;\n order: 1;\n place-self: center end;\n }\n\n .checkbox-row > label {\n grid-column: span 6;\n text-align: left;\n }\n\n #pattern-set {\n overflow: hidden;\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n }\n\n #pattern-set button {\n background: url('data:image/png;base64,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')\n no-repeat;\n display: block;\n width: 55px;\n height: 40px;\n min-width: inherit;\n border: 1px solid transparent;\n border-radius: 8px;\n transition: all 0.2s;\n padding: 0;\n cursor: pointer;\n margin: 0 auto;\n justify-self: center;\n }\n\n #pattern-set button:hover {\n border-color: var(--md-sys-color-primary);\n box-shadow: 0 2px 4px rgba(33, 150, 243, 0.2);\n }\n\n #pattern-set button:active {\n background-color: rgba(var(--md-sys-color-primary), 0.2);\n transform: scale(0.98);\n }\n\n #pattern-set button[data-value='+u+s'] {\n background-position: 50% 3px;\n }\n #pattern-set button[data-value='+u-s'] {\n background-position: 50% -97px;\n }\n #pattern-set button[data-value='-u+s'] {\n background-position: 50% -197px;\n }\n #pattern-set button[data-value='-u-s'] {\n background-position: 50% -297px;\n }\n #pattern-set button[data-value='+s+u'] {\n background-position: 50% -397px;\n }\n #pattern-set button[data-value='+s-u'] {\n background-position: 50% -497px;\n }\n #pattern-set button[data-value='-s+u'] {\n background-position: 50% -597px;\n }\n #pattern-set button[data-value='-s-u'] {\n background-position: 50% -697px;\n }\n #pattern-set button[data-value='cw'] {\n background-position: 50% -797px;\n }\n #pattern-set button[data-value='ccw'] {\n background-position: 50% -897px;\n }\n #pattern-set button[data-value='zigzag'] {\n background-position: 50% -997px;\n }\n #pattern-set button[data-value='zigzag-reverse'] {\n background-position: 50% -1097px;\n }\n\n label {\n order: initial;\n }\n\n input {\n order: initial;\n }\n\n #skip-numbering {\n order: initial;\n grid-column: span 4;\n }\n\n label[for='skip-numbering'] {\n order: 1;\n grid-column: span 5;\n text-align: left;\n }\n `\n ]\n\n editorTemplate(value: any, spec: PropertySpec): TemplateResult {\n // TODO: background image change to use the url-loader\n return html`\n <fieldset fullwidth>\n <legend><ox-i18n msgid=\"label.location-increase-pattern\">Increase Pattern</ox-i18n></legend>\n\n <div class=\"property-grid\">\n <label> <ox-i18n msgid=\"label.start-section\">Start Section</ox-i18n> </label>\n <input\n type=\"number\"\n data-start-section\n value=\"${this.startSection}\"\n @change=${(e: Event) => (this.startSection = (e.target! as HTMLInputElement).valueAsNumber)}\n />\n\n <label> <ox-i18n msgid=\"label.start-unit\">Start Unit</ox-i18n> </label>\n <input\n type=\"number\"\n data-start-unit\n value=\"${this.startUnit}\"\n @change=${(e: Event) => (this.startUnit = (e.target! as HTMLInputElement).valueAsNumber)}\n />\n\n <div class=\"checkbox-row\" fullwidth>\n <input id=\"skip-numbering\" type=\"checkbox\" data-skip-numbering ?checked=\"${this.skipNumbering}\" />\n <label for=\"skip-numbering\">\n <ox-i18n msgid=\"label.skip-numbering\">Skip Numbering</ox-i18n>\n </label>\n </div>\n\n <div\n id=\"pattern-set\"\n class=\"property-grid location-increase-pattern-btn\"\n @click=${(e: Event) => this._onTapType(e)}\n >\n <button data-value=\"cw\" type=\"button\"></button>\n <button data-value=\"ccw\" type=\"button\"></button>\n <button data-value=\"zigzag\" type=\"button\"></button>\n <button data-value=\"zigzag-reverse\" type=\"button\"></button>\n </div>\n </div>\n </fieldset>\n `\n }\n\n @property({ type: Number }) declare startSection: number\n @property({ type: Number }) declare startUnit: number\n @property({ type: Boolean }) declare skipNumbering: boolean\n @property({ type: Object }) declare _specificPropEl: HTMLElement | null\n\n connectedCallback() {\n super.connectedCallback()\n if (this.property && this.property.event) {\n Object.entries(this.property.event).forEach(entry => {\n if (entry[0]) {\n document.addEventListener(entry[0] as any, entry[1] as any)\n }\n })\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n if (this.property && this.property.event) {\n Object.entries(this.property.event).forEach(entry => {\n if (entry[0]) {\n document.removeEventListener(entry[0] as any, entry[1] as any)\n }\n })\n }\n }\n\n _onTapType(e: Event) {\n var target = e.target as HTMLElement\n\n const increasingDirection = target?.closest('[data-value]')?.getAttribute('data-value')\n if (!increasingDirection) {\n return\n }\n\n this.dispatchEvent(\n new CustomEvent('i-need-selected', {\n bubbles: true,\n composed: true,\n detail: {\n callback: (selected: any[]) => {\n const table = selected[0].parent\n table.increaseLocation(increasingDirection, this.skipNumbering, this.startSection, this.startUnit)\n }\n }\n })\n )\n\n e.stopPropagation()\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { TemplateResult } from 'lit';
|
|
2
|
+
import { OxPropertyEditor, PropertySpec } from '@operato/property-editor';
|
|
3
|
+
export default class StockerLocationEditor extends OxPropertyEditor {
|
|
4
|
+
static styles: import("lit").CSSResult[];
|
|
5
|
+
private _rule;
|
|
6
|
+
private _lastExternalValue;
|
|
7
|
+
constructor();
|
|
8
|
+
private _parseValue;
|
|
9
|
+
editorTemplate(value: any, _spec: PropertySpec): TemplateResult;
|
|
10
|
+
private _set;
|
|
11
|
+
private _setSideLabel;
|
|
12
|
+
private _apply;
|
|
13
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Stocker Location Rule Editor
|
|
5
|
+
*/
|
|
6
|
+
import { __decorate } from "tslib";
|
|
7
|
+
import { css, html } from 'lit';
|
|
8
|
+
import { customElement, state } from 'lit/decorators.js';
|
|
9
|
+
import { OxPropertyEditor } from '@operato/property-editor';
|
|
10
|
+
import { DEFAULT_LOCATION_RULE, buildLocationId } from '../stocker.js';
|
|
11
|
+
let StockerLocationEditor = class StockerLocationEditor extends OxPropertyEditor {
|
|
12
|
+
static styles = [
|
|
13
|
+
...OxPropertyEditor.styles,
|
|
14
|
+
css `
|
|
15
|
+
.loc-grid { display: grid; grid-template-columns: 80px 1fr; gap: 3px 6px; font-size: 11px; align-items: center; }
|
|
16
|
+
.loc-grid label { color: #555; font-weight: 500; font-size: 10px; }
|
|
17
|
+
.loc-grid input, .loc-grid select {
|
|
18
|
+
width: 100%; box-sizing: border-box; font-size: 11px; padding: 3px 4px;
|
|
19
|
+
border: 1px solid rgba(0,0,0,0.15); border-radius: 4px; background: #fff; color: #1c1b1f;
|
|
20
|
+
}
|
|
21
|
+
.loc-grid input[type="number"] { width: 50px; }
|
|
22
|
+
.side-labels { display: flex; gap: 4px; align-items: center; font-size: 10px; }
|
|
23
|
+
.side-labels input { width: 30px; text-align: center; }
|
|
24
|
+
.section-title { grid-column: 1 / -1; font-weight: 600; font-size: 10px; color: #6750a4; margin-top: 6px; padding-bottom: 2px; border-bottom: 1px solid rgba(0,0,0,0.08); }
|
|
25
|
+
.preview { grid-column: 1 / -1; margin-top: 6px; padding: 6px 8px; background: #f3edf7; border-radius: 6px; font-family: monospace; font-size: 11px; }
|
|
26
|
+
.preview-title { font-size: 9px; font-weight: 600; color: #555; margin-bottom: 3px; }
|
|
27
|
+
.preview-samples { display: flex; flex-wrap: wrap; gap: 4px; }
|
|
28
|
+
.preview-sample { padding: 1px 5px; background: #fff; border-radius: 3px; font-size: 10px; }
|
|
29
|
+
`
|
|
30
|
+
];
|
|
31
|
+
_lastExternalValue = undefined;
|
|
32
|
+
constructor() {
|
|
33
|
+
super();
|
|
34
|
+
this._rule = { ...DEFAULT_LOCATION_RULE };
|
|
35
|
+
}
|
|
36
|
+
_parseValue(value) {
|
|
37
|
+
if (!value)
|
|
38
|
+
return { ...DEFAULT_LOCATION_RULE };
|
|
39
|
+
if (typeof value === 'string') {
|
|
40
|
+
try {
|
|
41
|
+
return { ...DEFAULT_LOCATION_RULE, ...JSON.parse(value) };
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { ...DEFAULT_LOCATION_RULE };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { ...DEFAULT_LOCATION_RULE, ...value };
|
|
48
|
+
}
|
|
49
|
+
editorTemplate(value, _spec) {
|
|
50
|
+
const serialized = typeof value === 'string' ? value : JSON.stringify(value);
|
|
51
|
+
if (serialized !== this._lastExternalValue) {
|
|
52
|
+
this._lastExternalValue = serialized;
|
|
53
|
+
this._rule = this._parseValue(value);
|
|
54
|
+
}
|
|
55
|
+
const r = this._rule;
|
|
56
|
+
const rackConfig = { bays: 10, levels: 5, depthCount: 1 };
|
|
57
|
+
const samples = [
|
|
58
|
+
buildLocationId(r, 'L', 1, 1, 1, rackConfig),
|
|
59
|
+
buildLocationId(r, 'L', 5, 3, 1, rackConfig),
|
|
60
|
+
buildLocationId(r, 'R', 10, 5, 1, rackConfig)
|
|
61
|
+
];
|
|
62
|
+
return html `
|
|
63
|
+
<fieldset fullwidth>
|
|
64
|
+
<div class="loc-grid">
|
|
65
|
+
<div class="section-title">Pattern</div>
|
|
66
|
+
<label>Format</label>
|
|
67
|
+
<input type="text" .value=${r.pattern} placeholder="{side}{bay}-{level}-{depth}"
|
|
68
|
+
@change=${(e) => { e.stopPropagation(); this._set('pattern', e.target.value); }} />
|
|
69
|
+
|
|
70
|
+
<label>Side labels</label>
|
|
71
|
+
<div class="side-labels">
|
|
72
|
+
L=<input type="text" .value=${r.sideLabels.L}
|
|
73
|
+
@change=${(e) => { e.stopPropagation(); this._setSideLabel('L', e.target.value); }} />
|
|
74
|
+
R=<input type="text" .value=${r.sideLabels.R}
|
|
75
|
+
@change=${(e) => { e.stopPropagation(); this._setSideLabel('R', e.target.value); }} />
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<div class="section-title">Direction</div>
|
|
79
|
+
<label>Bay</label>
|
|
80
|
+
<select .value=${r.bayDir}
|
|
81
|
+
@change=${(e) => { e.stopPropagation(); this._set('bayDir', e.target.value); }}>
|
|
82
|
+
<option value="ltr">Left → Right</option>
|
|
83
|
+
<option value="rtl">Right → Left</option>
|
|
84
|
+
</select>
|
|
85
|
+
|
|
86
|
+
<label>Level</label>
|
|
87
|
+
<select .value=${r.levelDir}
|
|
88
|
+
@change=${(e) => { e.stopPropagation(); this._set('levelDir', e.target.value); }}>
|
|
89
|
+
<option value="btt">Bottom → Top</option>
|
|
90
|
+
<option value="ttb">Top → Bottom</option>
|
|
91
|
+
</select>
|
|
92
|
+
|
|
93
|
+
<div class="section-title">Start number</div>
|
|
94
|
+
<label>Bay start</label>
|
|
95
|
+
<input type="number" .value=${String(r.bayStart)} min="0" step="1"
|
|
96
|
+
@change=${(e) => { e.stopPropagation(); this._set('bayStart', Number(e.target.value)); }} />
|
|
97
|
+
<label>Level start</label>
|
|
98
|
+
<input type="number" .value=${String(r.levelStart)} min="0" step="1"
|
|
99
|
+
@change=${(e) => { e.stopPropagation(); this._set('levelStart', Number(e.target.value)); }} />
|
|
100
|
+
<label>Depth start</label>
|
|
101
|
+
<input type="number" .value=${String(r.depthStart)} min="0" step="1"
|
|
102
|
+
@change=${(e) => { e.stopPropagation(); this._set('depthStart', Number(e.target.value)); }} />
|
|
103
|
+
|
|
104
|
+
<div class="section-title">Digit padding</div>
|
|
105
|
+
<label>Bay digits</label>
|
|
106
|
+
<input type="number" .value=${String(r.bayDigits)} min="0" max="4" step="1"
|
|
107
|
+
@change=${(e) => { e.stopPropagation(); this._set('bayDigits', Number(e.target.value)); }} />
|
|
108
|
+
<label>Level digits</label>
|
|
109
|
+
<input type="number" .value=${String(r.levelDigits)} min="0" max="4" step="1"
|
|
110
|
+
@change=${(e) => { e.stopPropagation(); this._set('levelDigits', Number(e.target.value)); }} />
|
|
111
|
+
<label>Depth digits</label>
|
|
112
|
+
<input type="number" .value=${String(r.depthDigits)} min="0" max="4" step="1"
|
|
113
|
+
@change=${(e) => { e.stopPropagation(); this._set('depthDigits', Number(e.target.value)); }} />
|
|
114
|
+
|
|
115
|
+
<div class="preview">
|
|
116
|
+
<div class="preview-title">Preview (10 bays, 5 levels)</div>
|
|
117
|
+
<div class="preview-samples">
|
|
118
|
+
${samples.map(s => html `<span class="preview-sample">${s}</span>`)}
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</fieldset>
|
|
123
|
+
`;
|
|
124
|
+
}
|
|
125
|
+
_set(field, value) {
|
|
126
|
+
this._rule = { ...this._rule, [field]: value };
|
|
127
|
+
this._apply();
|
|
128
|
+
}
|
|
129
|
+
_setSideLabel(side, value) {
|
|
130
|
+
this._rule = { ...this._rule, sideLabels: { ...this._rule.sideLabels, [side]: value || side } };
|
|
131
|
+
this._apply();
|
|
132
|
+
}
|
|
133
|
+
_apply() {
|
|
134
|
+
const jsonValue = JSON.stringify(this._rule);
|
|
135
|
+
this.value = jsonValue;
|
|
136
|
+
this._lastExternalValue = jsonValue;
|
|
137
|
+
this.requestUpdate();
|
|
138
|
+
this.dispatchEvent(new CustomEvent('i-need-selected', {
|
|
139
|
+
bubbles: true, composed: true,
|
|
140
|
+
detail: { callback: (selected) => { selected[0]?.set('locationRule', jsonValue); } }
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
__decorate([
|
|
145
|
+
state()
|
|
146
|
+
], StockerLocationEditor.prototype, "_rule", void 0);
|
|
147
|
+
StockerLocationEditor = __decorate([
|
|
148
|
+
customElement('property-editor-stocker-location')
|
|
149
|
+
], StockerLocationEditor);
|
|
150
|
+
export default StockerLocationEditor;
|
|
151
|
+
//# sourceMappingURL=property-editor-stocker-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-editor-stocker-location.js","sourceRoot":"","sources":["../../src/editors/property-editor-stocker-location.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * Stocker Location Rule Editor\n */\n\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\nimport type { LocationRule } from '../stocker.js'\nimport { DEFAULT_LOCATION_RULE, buildLocationId } from '../stocker.js'\n\n@customElement('property-editor-stocker-location')\nexport default class StockerLocationEditor extends OxPropertyEditor {\n static styles = [\n ...OxPropertyEditor.styles,\n css`\n .loc-grid { display: grid; grid-template-columns: 80px 1fr; gap: 3px 6px; font-size: 11px; align-items: center; }\n .loc-grid label { color: #555; font-weight: 500; font-size: 10px; }\n .loc-grid input, .loc-grid select {\n width: 100%; box-sizing: border-box; font-size: 11px; padding: 3px 4px;\n border: 1px solid rgba(0,0,0,0.15); border-radius: 4px; background: #fff; color: #1c1b1f;\n }\n .loc-grid input[type=\"number\"] { width: 50px; }\n .side-labels { display: flex; gap: 4px; align-items: center; font-size: 10px; }\n .side-labels input { width: 30px; text-align: center; }\n .section-title { grid-column: 1 / -1; font-weight: 600; font-size: 10px; color: #6750a4; margin-top: 6px; padding-bottom: 2px; border-bottom: 1px solid rgba(0,0,0,0.08); }\n .preview { grid-column: 1 / -1; margin-top: 6px; padding: 6px 8px; background: #f3edf7; border-radius: 6px; font-family: monospace; font-size: 11px; }\n .preview-title { font-size: 9px; font-weight: 600; color: #555; margin-bottom: 3px; }\n .preview-samples { display: flex; flex-wrap: wrap; gap: 4px; }\n .preview-sample { padding: 1px 5px; background: #fff; border-radius: 3px; font-size: 10px; }\n `\n ]\n\n @state() private declare _rule: LocationRule\n private _lastExternalValue: any = undefined\n\n constructor() {\n super()\n this._rule = { ...DEFAULT_LOCATION_RULE }\n }\n\n private _parseValue(value: any): LocationRule {\n if (!value) return { ...DEFAULT_LOCATION_RULE }\n if (typeof value === 'string') {\n try { return { ...DEFAULT_LOCATION_RULE, ...JSON.parse(value) } } catch { return { ...DEFAULT_LOCATION_RULE } }\n }\n return { ...DEFAULT_LOCATION_RULE, ...value }\n }\n\n editorTemplate(value: any, _spec: PropertySpec): TemplateResult {\n const serialized = typeof value === 'string' ? value : JSON.stringify(value)\n if (serialized !== this._lastExternalValue) {\n this._lastExternalValue = serialized\n this._rule = this._parseValue(value)\n }\n\n const r = this._rule\n const rackConfig = { bays: 10, levels: 5, depthCount: 1 }\n const samples = [\n buildLocationId(r, 'L', 1, 1, 1, rackConfig),\n buildLocationId(r, 'L', 5, 3, 1, rackConfig),\n buildLocationId(r, 'R', 10, 5, 1, rackConfig)\n ]\n\n return html`\n <fieldset fullwidth>\n <div class=\"loc-grid\">\n <div class=\"section-title\">Pattern</div>\n <label>Format</label>\n <input type=\"text\" .value=${r.pattern} placeholder=\"{side}{bay}-{level}-{depth}\"\n @change=${(e: Event) => { e.stopPropagation(); this._set('pattern', (e.target as HTMLInputElement).value) }} />\n\n <label>Side labels</label>\n <div class=\"side-labels\">\n L=<input type=\"text\" .value=${r.sideLabels.L}\n @change=${(e: Event) => { e.stopPropagation(); this._setSideLabel('L', (e.target as HTMLInputElement).value) }} />\n R=<input type=\"text\" .value=${r.sideLabels.R}\n @change=${(e: Event) => { e.stopPropagation(); this._setSideLabel('R', (e.target as HTMLInputElement).value) }} />\n </div>\n\n <div class=\"section-title\">Direction</div>\n <label>Bay</label>\n <select .value=${r.bayDir}\n @change=${(e: Event) => { e.stopPropagation(); this._set('bayDir', (e.target as HTMLSelectElement).value) }}>\n <option value=\"ltr\">Left → Right</option>\n <option value=\"rtl\">Right → Left</option>\n </select>\n\n <label>Level</label>\n <select .value=${r.levelDir}\n @change=${(e: Event) => { e.stopPropagation(); this._set('levelDir', (e.target as HTMLSelectElement).value) }}>\n <option value=\"btt\">Bottom → Top</option>\n <option value=\"ttb\">Top → Bottom</option>\n </select>\n\n <div class=\"section-title\">Start number</div>\n <label>Bay start</label>\n <input type=\"number\" .value=${String(r.bayStart)} min=\"0\" step=\"1\"\n @change=${(e: Event) => { e.stopPropagation(); this._set('bayStart', Number((e.target as HTMLInputElement).value)) }} />\n <label>Level start</label>\n <input type=\"number\" .value=${String(r.levelStart)} min=\"0\" step=\"1\"\n @change=${(e: Event) => { e.stopPropagation(); this._set('levelStart', Number((e.target as HTMLInputElement).value)) }} />\n <label>Depth start</label>\n <input type=\"number\" .value=${String(r.depthStart)} min=\"0\" step=\"1\"\n @change=${(e: Event) => { e.stopPropagation(); this._set('depthStart', Number((e.target as HTMLInputElement).value)) }} />\n\n <div class=\"section-title\">Digit padding</div>\n <label>Bay digits</label>\n <input type=\"number\" .value=${String(r.bayDigits)} min=\"0\" max=\"4\" step=\"1\"\n @change=${(e: Event) => { e.stopPropagation(); this._set('bayDigits', Number((e.target as HTMLInputElement).value)) }} />\n <label>Level digits</label>\n <input type=\"number\" .value=${String(r.levelDigits)} min=\"0\" max=\"4\" step=\"1\"\n @change=${(e: Event) => { e.stopPropagation(); this._set('levelDigits', Number((e.target as HTMLInputElement).value)) }} />\n <label>Depth digits</label>\n <input type=\"number\" .value=${String(r.depthDigits)} min=\"0\" max=\"4\" step=\"1\"\n @change=${(e: Event) => { e.stopPropagation(); this._set('depthDigits', Number((e.target as HTMLInputElement).value)) }} />\n\n <div class=\"preview\">\n <div class=\"preview-title\">Preview (10 bays, 5 levels)</div>\n <div class=\"preview-samples\">\n ${samples.map(s => html`<span class=\"preview-sample\">${s}</span>`)}\n </div>\n </div>\n </div>\n </fieldset>\n `\n }\n\n private _set(field: string, value: any) {\n this._rule = { ...this._rule, [field]: value }\n this._apply()\n }\n\n private _setSideLabel(side: 'L' | 'R', value: string) {\n this._rule = { ...this._rule, sideLabels: { ...this._rule.sideLabels, [side]: value || side } }\n this._apply()\n }\n\n private _apply() {\n const jsonValue = JSON.stringify(this._rule)\n this.value = jsonValue\n this._lastExternalValue = jsonValue\n this.requestUpdate()\n\n this.dispatchEvent(new CustomEvent('i-need-selected', {\n bubbles: true, composed: true,\n detail: { callback: (selected: any[]) => { selected[0]?.set('locationRule', jsonValue) } }\n }))\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TemplateResult } from 'lit';
|
|
2
|
+
import { OxPropertyEditor, PropertySpec } from '@operato/property-editor';
|
|
3
|
+
export default class StockerPortsEditor extends OxPropertyEditor {
|
|
4
|
+
static styles: import("lit").CSSResult[];
|
|
5
|
+
editorTemplate(value: any, _spec: PropertySpec): TemplateResult;
|
|
6
|
+
private _set;
|
|
7
|
+
private _applyPorts;
|
|
8
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Stocker Port Configuration Editor
|
|
5
|
+
*
|
|
6
|
+
* 주의: OxPropertyEditor base class가 모든 change 이벤트를 잡아서
|
|
7
|
+
* this.value를 덮어쓰므로, 내부 input/select의 change 이벤트 버블링을 차단해야 함.
|
|
8
|
+
*/
|
|
9
|
+
import { __decorate } from "tslib";
|
|
10
|
+
import { css, html } from 'lit';
|
|
11
|
+
import { customElement } from 'lit/decorators.js';
|
|
12
|
+
import { OxPropertyEditor } from '@operato/property-editor';
|
|
13
|
+
function parsePorts(value) {
|
|
14
|
+
if (!value)
|
|
15
|
+
return [];
|
|
16
|
+
if (Array.isArray(value))
|
|
17
|
+
return value;
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(value);
|
|
21
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
let StockerPortsEditor = class StockerPortsEditor extends OxPropertyEditor {
|
|
30
|
+
static styles = [
|
|
31
|
+
...OxPropertyEditor.styles,
|
|
32
|
+
css `
|
|
33
|
+
.port-table { width: 100%; font-size: 11px; border-collapse: collapse; }
|
|
34
|
+
.port-table th { text-align: left; padding: 3px 4px; font-weight: 600; color: #555; border-bottom: 1px solid rgba(0,0,0,0.12); font-size: 10px; }
|
|
35
|
+
.port-table td { padding: 2px 3px; vertical-align: middle; }
|
|
36
|
+
.port-table select, .port-table input {
|
|
37
|
+
width: 100%; box-sizing: border-box; font-size: 11px; padding: 3px 4px;
|
|
38
|
+
border: 1px solid rgba(0,0,0,0.15); border-radius: 4px; background: #fff; color: #1c1b1f;
|
|
39
|
+
}
|
|
40
|
+
.port-table input[type="number"] { width: 50px; }
|
|
41
|
+
.port-table input[type="text"] { width: 60px; }
|
|
42
|
+
.btn-row { display: flex; gap: 4px; margin-top: 4px; }
|
|
43
|
+
.btn {
|
|
44
|
+
padding: 3px 8px; font-size: 10px; cursor: pointer;
|
|
45
|
+
border: 1px solid rgba(0,0,0,0.15); border-radius: 4px; background: #f3edf7; color: #1c1b1f;
|
|
46
|
+
}
|
|
47
|
+
.btn:hover { background: #ece6f0; }
|
|
48
|
+
.btn-remove { color: #b3261e; cursor: pointer; font-size: 14px; padding: 0 4px; background: none; border: none; }
|
|
49
|
+
`
|
|
50
|
+
];
|
|
51
|
+
editorTemplate(value, _spec) {
|
|
52
|
+
const ports = Array.isArray(this.value) ? this.value : parsePorts(value);
|
|
53
|
+
return html `
|
|
54
|
+
<fieldset fullwidth>
|
|
55
|
+
${ports.length > 0 ? html `
|
|
56
|
+
<table class="port-table">
|
|
57
|
+
<thead><tr><th>Type</th><th>Side</th><th>Pos</th><th>Label</th><th></th></tr></thead>
|
|
58
|
+
<tbody>
|
|
59
|
+
${ports.map((port, i) => html `
|
|
60
|
+
<tr>
|
|
61
|
+
<td><select @change=${(e) => { e.stopPropagation(); this._set(ports, i, 'type', e.target.value); }}>
|
|
62
|
+
<option value="in" ?selected=${port.type === 'in'}>IN</option>
|
|
63
|
+
<option value="out" ?selected=${port.type === 'out'}>OUT</option>
|
|
64
|
+
</select></td>
|
|
65
|
+
<td><select @change=${(e) => { e.stopPropagation(); this._set(ports, i, 'side', e.target.value); }}>
|
|
66
|
+
<option value="front" ?selected=${port.side === 'front'}>Front</option>
|
|
67
|
+
<option value="back" ?selected=${port.side === 'back'}>Back</option>
|
|
68
|
+
</select></td>
|
|
69
|
+
<td><input type="number" .value=${String(port.position)} min="1" step="1"
|
|
70
|
+
@change=${(e) => { e.stopPropagation(); this._set(ports, i, 'position', Number(e.target.value)); }} /></td>
|
|
71
|
+
<td><input type="text" .value=${port.label || ''} placeholder="auto"
|
|
72
|
+
@change=${(e) => { e.stopPropagation(); this._set(ports, i, 'label', e.target.value || undefined); }} /></td>
|
|
73
|
+
<td><button class="btn-remove" @click=${() => this._applyPorts(ports.filter((_, j) => j !== i))}>×</button></td>
|
|
74
|
+
</tr>
|
|
75
|
+
`)}
|
|
76
|
+
</tbody>
|
|
77
|
+
</table>
|
|
78
|
+
` : html `<div style="font-size:11px;color:#888;padding:4px">No ports</div>`}
|
|
79
|
+
<div class="btn-row">
|
|
80
|
+
<button class="btn" @click=${() => {
|
|
81
|
+
const maxPos = ports.length > 0 ? Math.max(...ports.map(p => p.position)) : 0;
|
|
82
|
+
this._applyPorts([...ports, { type: 'in', side: 'front', position: maxPos + 1 }]);
|
|
83
|
+
}}>+ IN</button>
|
|
84
|
+
<button class="btn" @click=${() => {
|
|
85
|
+
const maxPos = ports.length > 0 ? Math.max(...ports.map(p => p.position)) : 0;
|
|
86
|
+
this._applyPorts([...ports, { type: 'out', side: 'front', position: maxPos + 1 }]);
|
|
87
|
+
}}>+ OUT</button>
|
|
88
|
+
</div>
|
|
89
|
+
</fieldset>
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
_set(ports, index, field, val) {
|
|
93
|
+
this._applyPorts(ports.map((p, i) => i === index ? { ...p, [field]: val } : p));
|
|
94
|
+
}
|
|
95
|
+
_applyPorts(ports) {
|
|
96
|
+
this.value = ports;
|
|
97
|
+
this.requestUpdate();
|
|
98
|
+
this.dispatchEvent(new CustomEvent('i-need-selected', {
|
|
99
|
+
bubbles: true, composed: true,
|
|
100
|
+
detail: {
|
|
101
|
+
callback: (selected) => {
|
|
102
|
+
selected[0]?.set('ports', JSON.stringify(ports));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
StockerPortsEditor = __decorate([
|
|
109
|
+
customElement('property-editor-stocker-ports')
|
|
110
|
+
], StockerPortsEditor);
|
|
111
|
+
export default StockerPortsEditor;
|
|
112
|
+
//# sourceMappingURL=property-editor-stocker-ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-editor-stocker-ports.js","sourceRoot":"","sources":["../../src/editors/property-editor-stocker-ports.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * Stocker Port Configuration Editor\n *\n * 주의: OxPropertyEditor base class가 모든 change 이벤트를 잡아서\n * this.value를 덮어쓰므로, 내부 input/select의 change 이벤트 버블링을 차단해야 함.\n */\n\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement } from 'lit/decorators.js'\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\n\ninterface PortEntry {\n type: 'in' | 'out'\n side: 'front' | 'back'\n position: number\n label?: string\n}\n\nfunction parsePorts(value: any): PortEntry[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch { return [] }\n }\n return []\n}\n\n@customElement('property-editor-stocker-ports')\nexport default class StockerPortsEditor extends OxPropertyEditor {\n static styles = [\n ...OxPropertyEditor.styles,\n css`\n .port-table { width: 100%; font-size: 11px; border-collapse: collapse; }\n .port-table th { text-align: left; padding: 3px 4px; font-weight: 600; color: #555; border-bottom: 1px solid rgba(0,0,0,0.12); font-size: 10px; }\n .port-table td { padding: 2px 3px; vertical-align: middle; }\n .port-table select, .port-table input {\n width: 100%; box-sizing: border-box; font-size: 11px; padding: 3px 4px;\n border: 1px solid rgba(0,0,0,0.15); border-radius: 4px; background: #fff; color: #1c1b1f;\n }\n .port-table input[type=\"number\"] { width: 50px; }\n .port-table input[type=\"text\"] { width: 60px; }\n .btn-row { display: flex; gap: 4px; margin-top: 4px; }\n .btn {\n padding: 3px 8px; font-size: 10px; cursor: pointer;\n border: 1px solid rgba(0,0,0,0.15); border-radius: 4px; background: #f3edf7; color: #1c1b1f;\n }\n .btn:hover { background: #ece6f0; }\n .btn-remove { color: #b3261e; cursor: pointer; font-size: 14px; padding: 0 4px; background: none; border: none; }\n `\n ]\n\n editorTemplate(value: any, _spec: PropertySpec): TemplateResult {\n const ports: PortEntry[] = Array.isArray(this.value) ? this.value : parsePorts(value)\n\n return html`\n <fieldset fullwidth>\n ${ports.length > 0 ? html`\n <table class=\"port-table\">\n <thead><tr><th>Type</th><th>Side</th><th>Pos</th><th>Label</th><th></th></tr></thead>\n <tbody>\n ${ports.map((port, i) => html`\n <tr>\n <td><select @change=${(e: Event) => { e.stopPropagation(); this._set(ports, i, 'type', (e.target as HTMLSelectElement).value) }}>\n <option value=\"in\" ?selected=${port.type === 'in'}>IN</option>\n <option value=\"out\" ?selected=${port.type === 'out'}>OUT</option>\n </select></td>\n <td><select @change=${(e: Event) => { e.stopPropagation(); this._set(ports, i, 'side', (e.target as HTMLSelectElement).value) }}>\n <option value=\"front\" ?selected=${port.side === 'front'}>Front</option>\n <option value=\"back\" ?selected=${port.side === 'back'}>Back</option>\n </select></td>\n <td><input type=\"number\" .value=${String(port.position)} min=\"1\" step=\"1\"\n @change=${(e: Event) => { e.stopPropagation(); this._set(ports, i, 'position', Number((e.target as HTMLInputElement).value)) }} /></td>\n <td><input type=\"text\" .value=${port.label || ''} placeholder=\"auto\"\n @change=${(e: Event) => { e.stopPropagation(); this._set(ports, i, 'label', (e.target as HTMLInputElement).value || undefined) }} /></td>\n <td><button class=\"btn-remove\" @click=${() => this._applyPorts(ports.filter((_, j) => j !== i))}>×</button></td>\n </tr>\n `)}\n </tbody>\n </table>\n ` : html`<div style=\"font-size:11px;color:#888;padding:4px\">No ports</div>`}\n <div class=\"btn-row\">\n <button class=\"btn\" @click=${() => {\n const maxPos = ports.length > 0 ? Math.max(...ports.map(p => p.position)) : 0\n this._applyPorts([...ports, { type: 'in' as const, side: 'front' as const, position: maxPos + 1 }])\n }}>+ IN</button>\n <button class=\"btn\" @click=${() => {\n const maxPos = ports.length > 0 ? Math.max(...ports.map(p => p.position)) : 0\n this._applyPorts([...ports, { type: 'out' as const, side: 'front' as const, position: maxPos + 1 }])\n }}>+ OUT</button>\n </div>\n </fieldset>\n `\n }\n\n private _set(ports: PortEntry[], index: number, field: string, val: any) {\n this._applyPorts(ports.map((p, i) => i === index ? { ...p, [field]: val } : p))\n }\n\n private _applyPorts(ports: PortEntry[]) {\n this.value = ports\n this.requestUpdate()\n\n this.dispatchEvent(new CustomEvent('i-need-selected', {\n bubbles: true, composed: true,\n detail: {\n callback: (selected: any[]) => {\n selected[0]?.set('ports', JSON.stringify(ports))\n }\n }\n }))\n }\n}\n"]}
|
package/dist/effects/outline.js
CHANGED
|
@@ -30,7 +30,7 @@ function outlineMesh(mesh) {
|
|
|
30
30
|
// } else {
|
|
31
31
|
let outlineGeometry = mesh.geometry.clone();
|
|
32
32
|
// }
|
|
33
|
-
BufferGeometryUtils.
|
|
33
|
+
BufferGeometryUtils.mergeGeometries([mesh.geometry, outlineGeometry]); //.mergeVertices()
|
|
34
34
|
outlineGeometry.computeVertexNormals();
|
|
35
35
|
const newMesh = new THREE.Mesh(outlineGeometry, outlineMaterial.clone());
|
|
36
36
|
mesh.add(newMesh);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/effects/outline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,mBAAmB,MAAM,iDAAiD,CAAA;AAEtF,MAAM,YAAY,GAAG;;;;;CAKpB,CAAA;AAED,MAAM,cAAc,GAAG;;;;;;CAMtB,CAAA;AACD,MAAM,eAAe,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC;IAC/C,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QACzC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;QACvB,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;KACxB;IACD,YAAY;IACZ,cAAc;IACd,IAAI,EAAE,KAAK,CAAC,QAAQ;CACrB,CAAC,CAAA;AAEF,SAAS,WAAW,CAAC,IAAgB;IACnC,sBAAsB;IACtB,wCAAwC;IACxC,iFAAiF;IACjF,WAAW;IACX,IAAI,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAC3C,IAAI;IACJ,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/effects/outline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,mBAAmB,MAAM,iDAAiD,CAAA;AAEtF,MAAM,YAAY,GAAG;;;;;CAKpB,CAAA;AAED,MAAM,cAAc,GAAG;;;;;;CAMtB,CAAA;AACD,MAAM,eAAe,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC;IAC/C,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QACzC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;QACvB,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;KACxB;IACD,YAAY;IACZ,cAAc;IACd,IAAI,EAAE,KAAK,CAAC,QAAQ;CACrB,CAAC,CAAA;AAEF,SAAS,WAAW,CAAC,IAAgB;IACnC,sBAAsB;IACtB,wCAAwC;IACxC,iFAAiF;IACjF,WAAW;IACX,IAAI,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAC3C,IAAI;IACJ,mBAAmB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAA,CAAC,kBAAkB;IACxF,eAAe,CAAC,oBAAoB,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,CAAA;IACxE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACjB,OAAO,CAAC,IAAI,GAAG,SAAS,CAAA;IACxB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,qCAAqC;AACrC,4BAA4B;AAC5B,4BAA4B;AAC5B,4BAA4B;AAC5B,8EAA8E;AAC9E,uDAAuD;AACvD,6DAA6D;AAC7D,uDAAuD;AACvD,mCAAmC;AACnC,0CAA0C;AAC1C,IAAI","sourcesContent":["import * as THREE from 'three'\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js'\n\nconst vertexShader = `\nuniform float outline;\nvoid main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position + normal * outline, 1.0);\n}\n`\n\nconst fragmentShader = `\nuniform vec3 color;\nuniform float opacity;\nvoid main() {\n gl_FragColor = vec4(color, opacity);\n}\n`\nconst outlineMaterial = new THREE.ShaderMaterial({\n uniforms: {\n color: { value: new THREE.Color('#f00') },\n opacity: { value: 1.0 },\n outline: { value: 0.2 }\n },\n vertexShader,\n fragmentShader,\n side: THREE.BackSide\n})\n\nfunction outlineMesh(mesh: THREE.Mesh) {\n // let outlineGeometry\n // if (mesh.geometry.isBufferGeometry) {\n // outlineGeometry = new THREE.BufferGeometry().fromBufferGeometry(mesh.geometry)\n // } else {\n let outlineGeometry = mesh.geometry.clone()\n // }\n BufferGeometryUtils.mergeGeometries([mesh.geometry, outlineGeometry]) //.mergeVertices()\n outlineGeometry.computeVertexNormals()\n const newMesh = new THREE.Mesh(outlineGeometry, outlineMaterial.clone())\n mesh.add(newMesh)\n newMesh.name = 'outline'\n return newMesh\n}\n\n// function outlineAnimate(mesh, t) {\n// mesh.rotation.x += 0.01\n// mesh.rotation.y += 0.02\n// mesh.rotation.z += 0.01\n// let color = mesh.getObjectByName('outline').material.uniforms.color.value\n// color.r = Math.sin(t * 0.01 + Math.PI) * 0.5 + 0.5\n// color.g = Math.sin(t * 0.01 + Math.PI * 0.5) * 0.5 + 0.5\n// color.b = Math.sin(t * 0.01 + Math.PI) * 0.5 + 0.5\n// renderer.render(scene, camera)\n// window.requestAnimationFrame(animate)\n// }\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
|
-
import './scene/component.js';
|
|
2
|
-
import './text.js';
|
|
3
|
-
import './html-overlay-element.js';
|
|
4
|
-
export * from './threed/index.js';
|
|
5
|
-
export * from './gltf-object.js';
|
|
6
|
-
export * from './camera.js';
|
|
7
|
-
export * from './banner.js';
|
|
8
|
-
export * from './sprite.js';
|
|
9
|
-
export * from './cube.js';
|
|
10
|
-
export * from './cylinder.js';
|
|
11
1
|
export * from './desk.js';
|
|
12
|
-
export * from './ellipse.js';
|
|
13
|
-
export * from './polygon.js';
|
|
14
2
|
export * from './rack.js';
|
|
15
3
|
export * from './rack-table.js';
|
|
16
4
|
export * from './rack-table-cell.js';
|
|
17
|
-
export * from './rect.js';
|
|
18
|
-
export * from './sphere.js';
|
|
19
5
|
export * from './visualizer.js';
|
|
20
|
-
export * from './
|
|
21
|
-
export * from './
|
|
22
|
-
export * from './
|
|
6
|
+
export * from './stock.js';
|
|
7
|
+
export * from './signal-tower.js';
|
|
8
|
+
export * from './stock-hub.js';
|
|
9
|
+
export * from './tank.js';
|
|
10
|
+
export * from './vehicle.js';
|
|
11
|
+
export * from './carrier.js';
|
|
12
|
+
export * from './stocker.js';
|
|
13
|
+
export * from './stocker-port.js';
|
package/dist/index.js
CHANGED
|
@@ -1,26 +1,19 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import './html-overlay-element.js';
|
|
7
|
-
export * from './threed/index.js';
|
|
8
|
-
export * from './gltf-object.js';
|
|
9
|
-
export * from './camera.js';
|
|
10
|
-
export * from './banner.js';
|
|
11
|
-
export * from './sprite.js';
|
|
12
|
-
export * from './cube.js';
|
|
13
|
-
export * from './cylinder.js';
|
|
4
|
+
// threed 인프라 + 범용 3D 컴포넌트는 things-scene에서 제공
|
|
5
|
+
// 여기서는 도메인 특화 컴포넌트만 export
|
|
14
6
|
export * from './desk.js';
|
|
15
|
-
export * from './ellipse.js';
|
|
16
|
-
export * from './polygon.js';
|
|
17
7
|
export * from './rack.js';
|
|
18
8
|
export * from './rack-table.js';
|
|
19
9
|
export * from './rack-table-cell.js';
|
|
20
|
-
export * from './rect.js';
|
|
21
|
-
export * from './sphere.js';
|
|
22
10
|
export * from './visualizer.js';
|
|
23
|
-
export * from './
|
|
24
|
-
export * from './
|
|
25
|
-
export * from './
|
|
11
|
+
export * from './stock.js';
|
|
12
|
+
export * from './signal-tower.js';
|
|
13
|
+
export * from './stock-hub.js';
|
|
14
|
+
export * from './tank.js';
|
|
15
|
+
export * from './vehicle.js';
|
|
16
|
+
export * from './carrier.js';
|
|
17
|
+
export * from './stocker.js';
|
|
18
|
+
export * from './stocker-port.js';
|
|
26
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6CAA6C;AAC7C,2BAA2B;AAE3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\n// threed 인프라 + 범용 3D 컴포넌트는 things-scene에서 제공\n// 여기서는 도메인 특화 컴포넌트만 export\n\nexport * from './desk.js'\nexport * from './rack.js'\nexport * from './rack-table.js'\nexport * from './rack-table-cell.js'\nexport * from './visualizer.js'\nexport * from './stock.js'\nexport * from './signal-tower.js'\nexport * from './stock-hub.js'\nexport * from './tank.js'\nexport * from './vehicle.js'\nexport * from './carrier.js'\nexport * from './stocker.js'\nexport * from './stocker-port.js'\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RealObjectGroup } from '@hatiolab/things-scene';
|
|
2
|
+
import { Rack } from './rack.js';
|
|
3
|
+
export declare class RackTable3d extends RealObjectGroup {
|
|
4
|
+
private _frameMaterial?;
|
|
5
|
+
build(): void;
|
|
6
|
+
get position(): {
|
|
7
|
+
x: number;
|
|
8
|
+
y: any;
|
|
9
|
+
z: number;
|
|
10
|
+
};
|
|
11
|
+
private createFrameMaterial;
|
|
12
|
+
createRacks(): void;
|
|
13
|
+
mergeAndAddRackCommonObjects(racks: Rack[]): void;
|
|
14
|
+
dispose(): void;
|
|
15
|
+
updateAlpha(): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
|
|
6
|
+
import { RealObjectGroup } from '@hatiolab/things-scene';
|
|
7
|
+
import { Rack } from './rack.js';
|
|
8
|
+
const DEFAULT_FRAME_COLOR = 0x8a8a8a;
|
|
9
|
+
export class RackTable3d extends RealObjectGroup {
|
|
10
|
+
_frameMaterial;
|
|
11
|
+
build() {
|
|
12
|
+
super.build();
|
|
13
|
+
this.createRacks();
|
|
14
|
+
}
|
|
15
|
+
get position() {
|
|
16
|
+
const { zPos = 0 } = this.component.state;
|
|
17
|
+
return {
|
|
18
|
+
x: this.cx || 0,
|
|
19
|
+
y: zPos,
|
|
20
|
+
z: this.cy || 0
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
createFrameMaterial() {
|
|
24
|
+
this._frameMaterial?.dispose();
|
|
25
|
+
const { strokeStyle } = this.component.state;
|
|
26
|
+
const color = strokeStyle && typeof strokeStyle === 'string' ? strokeStyle : DEFAULT_FRAME_COLOR;
|
|
27
|
+
this._frameMaterial = new THREE.MeshStandardMaterial({
|
|
28
|
+
color,
|
|
29
|
+
roughness: 0.35,
|
|
30
|
+
metalness: 0.85
|
|
31
|
+
});
|
|
32
|
+
return this._frameMaterial;
|
|
33
|
+
}
|
|
34
|
+
createRacks() {
|
|
35
|
+
const { rotation = 0, shelfLocations, shelves = 1 } = this.component.state;
|
|
36
|
+
this.object3d.rotation.y = -rotation;
|
|
37
|
+
const racks = this.component.components
|
|
38
|
+
.map((cell) => {
|
|
39
|
+
const { shelfLocations: shelfLoc = shelfLocations, isEmpty } = cell.state;
|
|
40
|
+
if (!isEmpty) {
|
|
41
|
+
cell.setState('shelfLocations', shelfLoc);
|
|
42
|
+
const rack = new Rack(cell);
|
|
43
|
+
cell._realObject = rack; // 중복 생성 방지: addObject 재귀에서 skip
|
|
44
|
+
rack.update();
|
|
45
|
+
this.object3d.add(rack.object3d);
|
|
46
|
+
return rack;
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
})
|
|
50
|
+
.filter((rack) => !!rack);
|
|
51
|
+
this.mergeAndAddRackCommonObjects(racks);
|
|
52
|
+
}
|
|
53
|
+
mergeAndAddRackCommonObjects(racks) {
|
|
54
|
+
const framesGeometries = [];
|
|
55
|
+
const boardsGeometries = [];
|
|
56
|
+
if (racks.length > 0) {
|
|
57
|
+
racks.forEach(rack => {
|
|
58
|
+
const geometry = rack.frame;
|
|
59
|
+
if (!geometry) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
geometry.translate(rack.position.x, rack.position.y, rack.position.z);
|
|
63
|
+
geometry.scale(rack.scale.x, rack.scale.y, rack.scale.z);
|
|
64
|
+
framesGeometries.push(geometry);
|
|
65
|
+
});
|
|
66
|
+
if (framesGeometries.length > 0) {
|
|
67
|
+
const frameMesh = new THREE.Mesh(BufferGeometryUtils.mergeGeometries(framesGeometries), this.createFrameMaterial());
|
|
68
|
+
this.object3d.add(frameMesh);
|
|
69
|
+
}
|
|
70
|
+
racks.forEach(rack => {
|
|
71
|
+
const geometry = rack.board;
|
|
72
|
+
if (!geometry) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
geometry.translate(rack.position.x, rack.position.y, rack.position.z);
|
|
76
|
+
geometry.scale(rack.scale.x, rack.scale.y, rack.scale.z);
|
|
77
|
+
boardsGeometries.push(geometry);
|
|
78
|
+
});
|
|
79
|
+
if (boardsGeometries.length > 0) {
|
|
80
|
+
const material = Rack.boardMaterial;
|
|
81
|
+
material.opacity = 0.5;
|
|
82
|
+
material.transparent = true;
|
|
83
|
+
const boardMesh = new THREE.Mesh(BufferGeometryUtils.mergeGeometries(boardsGeometries), material);
|
|
84
|
+
this.object3d.add(boardMesh);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
dispose() {
|
|
89
|
+
this._frameMaterial?.dispose();
|
|
90
|
+
this._frameMaterial = undefined;
|
|
91
|
+
super.dispose();
|
|
92
|
+
}
|
|
93
|
+
updateAlpha() { }
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=rack-table-3d.js.map
|