useViewsAngleStore.js 4.59 KB
import GRIDIMAGE from '@/views/assets/images/views-angle/grid.png';
import SECTIONVIEWIMAGE from '@/views/assets/images/views-angle/sectionView.png';
import FITIMAGE from '@/views/assets/images/views-angle/zoom-to-fit.png';

import FRONT from '@/views/assets/images/views-angle/front.png';
import BACK from '@/views/assets/images/views-angle/back.png';
import RIGHT from '@/views/assets/images/views-angle/right.png';
import LEFT from '@/views/assets/images/views-angle/left.png';
import TOP from '@/views/assets/images/views-angle/top.png';
import BOTTOM from '@/views/assets/images/views-angle/bottom.png';
import ANGLE from '@/views/assets/images/views-angle/angle.png';

import { Vector3 } from 'three';
import { defineStore, storeToRefs } from 'pinia';
import { useRoute } from 'vue-router';
import { watch, ref } from 'vue';
import { setCameraViewAngle } from '@/utility/jsm/viewAngleControl';
import { GRID_NAME, PLATFORM_NAME } from '@/utility/constants/mesh-named';
import { useEditorStore } from './useEditorStore';

export const useViewsAngleStore = defineStore('viewsAngle', () => {
    const store = useEditorStore();
    const { editor, isLoadEnd } = storeToRefs(store);
    const { zoomToFit, setPlatformOpacity, setSectionViewControl } = store;

    const route = useRoute();

    const objectitems = ref([
        {
            key: 'grid',
            image: GRIDIMAGE,
            selected: true,
            enabled: true
        },
        {
            key: 'sectionview',
            image: SECTIONVIEWIMAGE,
            selected: false,
            enabled: false
        },
        {
            key: 'zoomtofit',
            image: FITIMAGE,
            selected: false,
            enabled: true
        }
    ]);

    const viewitems = ref([
        {
            key: 'front',
            image: FRONT
        },
        {
            key: 'back',
            image: BACK
        },
        {
            key: 'right',
            image: RIGHT
        },
        {
            key: 'left',
            image: LEFT
        },
        {
            key: 'top',
            image: TOP
        },
        {
            key: 'bottom',
            image: BOTTOM
        },
        {
            key: 'angle',
            image: ANGLE
        }
    ]);

    const view = ref('front');

    const isSectionViewVisible = ref(false);

    const setViewsAngle = (key) => {
        if (!editor.value) return;
        const { control, camera, container } = editor.value;

        if (!control) return;
        if (!camera) return;

        camera.up.copy(new Vector3(0, 0, 1));
        setCameraViewAngle(key, camera, control, container, new Vector3(), new Vector3());
        setPlatformOpacity();
        view.value = key;
    };

    const setZoomToFit = () => {
        zoomToFit();
    };

    const setGridOnoff = (isVisible) => {
        if (!editor.value) return;
        const { scene } = editor.value;
        if (!scene) return;
        const mesh = scene.getObjectByName(GRID_NAME);
        if (mesh) {
            mesh.visible = isVisible;
        }
    };

    const setSectionViewONoff = (isVisible) => {
        isSectionViewVisible.value = isVisible;
        setSectionViewControl(isVisible);
    };

    const handleClickObjects = (key) => {
        const index = objectitems.value.findIndex((el) => el.key === key);
        if (index > -1) {
            if (key !== 'zoomtofit') objectitems.value[index].selected = !objectitems.value[index].selected;
            if (!objectitems.value[index].enabled) return;
            switch (key) {
                case 'grid':
                    setGridOnoff(objectitems.value[index].selected);
                    break;
                case 'sectionview':
                    setSectionViewONoff(objectitems.value[index].selected);
                    break;
                case 'zoomtofit':
                    setZoomToFit();
                    break;
                default:
                    break;
            }
        }
    };

    const setViewsObjectEnabled = (key = 'grid', isEnable = true) => {
        const object = objectitems.value.find((el) => el.key === key);
        if (object) {
            object.enabled = isEnable;
        }
    };

    watch(
        () => isLoadEnd.value,
        () => {
            const { final_file } = route.query;
            if (final_file) {
                handleClickObjects('grid');
            }
        }
    );

    return {
        objectitems,
        viewitems,
        isSectionViewVisible,
        setViewsAngle,
        setZoomToFit,
        setGridOnoff,
        setSectionViewONoff,
        handleClickObjects,
        setViewsObjectEnabled
    };
});