slice-canvas.vue 3.79 KB
<template>
    <section class="slice-modal-body">
        <div class="body">
            <div class="canvas-parent">
                <div class="viewer-editor-slice" ref="sliceEditor" id="viewer-editor-slice" />
            </div>
            <span class="inputNumber">
                <el-input-number
                    class="el-input-number-unit"
                    v-model="sliceNumber"
                    :step="sliceStep"
                    :data-unit="`/ ${Math.round(maximum, 2) * 10 - 1}`"
                />
            </span>
        </div>
        <span class="slice-slider">
            <el-slider
                v-model="sliceNumber"
                vertical
                height="480px"
                :step="sliceStep"
                :max="Math.round(maximum, 2) * 10 - 1"
                :min="1"
                :show-tooltip="false"
            />
        </span>
    </section>
</template>

<script setup>
import { storeToRefs } from 'pinia';
import { ref, watch, onMounted } from 'vue';
import { useSlicingSliderStore } from '@/views/stores/useSlicingSliderStore';
import { useSliceModalStore } from '@/views/stores/useSliceModalStore';
import { useEditorStore } from '@/views/stores/useEditorStore';
import Editor from '@/utility/jsm/canvas/editor';

const store = useSlicingSliderStore();
const { maximum, minimum } = storeToRefs(store);

const sliceStore = useSliceModalStore();
const { sliceStep, sliceNumber } = storeToRefs(sliceStore);
const { setIsVisible } = sliceStore;

const editorStore = useEditorStore();
const { setSliceEditor, setSlicePlaneValue } = editorStore;

const sliceEditor = ref(null);
/*
watch(
    () => maximum.value,
    () => {
        console.log(maximum);
        console.log(minimum);
    }
);
*/
watch(
    () => sliceNumber.value,
    () => {
        setSlicePlaneValue(sliceNumber.value * 0.1);
    }
);

onMounted(() => {
    const editor = new Editor('viewer-editor-slice');
    if (editor) {
        editor.initialize(sliceEditor.value);
        setSliceEditor(editor);
        setIsVisible(false);
    }
});
</script>
<style lang="less" scoped>
.slice-modal-body {
    display: flex;
    flex-direction: row;
    .body {
        display: grid;
        flex-direction: column;
        padding: 15px;
        justify-content: center;
        .canvas-parent {
            width: 1152px;
            height: 648px;
            .viewer-editor-slice {
                width: 100%;
                height: 100%;
                display: block;
                background-color: #000;
            }
        }
        .inputNumber {
            -webkit-transform: translate(-50%, 0);
            transform: translate(-50%, 0);
            left: 50%;
            padding: 12px;
            :deep(.el-input-number .el-input__inner) {
                -webkit-appearance: none;
                -moz-appearance: textfield;
                line-height: 1;
                font-size: 16px;
            }
            :deep(.el-input-number .el-input__wrapper) {
                padding-left: 0px !important;
                padding-right: 48px !important;
            }
            .el-input-number-unit[data-unit] {
                position: relative;
                --el-input-number-unit-offset-x: 60px !important;
                width: 200px;
            }

            .el-input-number-unit[data-unit]::after {
                content: attr(data-unit);
                height: 100%;
                display: flex;
                align-items: center;
                position: absolute;
                top: 0;
                right: var(--el-input-number-unit-offset-x);
                color: #606266;
                font-size: 15px !important;
            }
        }
    }
    .slice-slider {
        :deep(.el-slider.is-vertical .el-slider__runway) {
            margin-bottom: 60px;
        }
    }
}
</style>