TkAstral3D/packages/editor/src/components/header/navigation/Copy.vue
2026-04-22 17:47:28 +08:00

56 lines
1.3 KiB
Vue

<template>
<n-tooltip trigger="hover">
<template #trigger>
<n-button text class="mr-2" :disabled="disabled" @click="handleClone()">
<template #icon>
<n-icon size="22" class="cursor-pointer">
<Copy />
</n-icon>
</template>
</n-button>
</template>
{{ t("layout.header.Clone") }}
</n-tooltip>
</template>
<script setup lang="ts">
import {onMounted, ref} from "vue";
import {Copy} from "@vicons/carbon";
import {NIcon, NTooltip} from "naive-ui";
import {t} from "@/language";
import {App,Hooks,Loader,Utils,AddObjectCommand} from "@astral3d/engine";
const disabled = ref(true);
function objectSelected(object){
disabled.value = object === null;
}
onMounted(() => {
Hooks.useAddSignal("objectSelected",objectSelected)
})
function handleClone() {
let object = App.selected;
//避免复制相机或场景
if (object === null || object.parent === null) return;
if (Utils.isHtmlPanelObject(object)) {
const _json = object.toJSON() as any;
Loader.objectLoader.parseAsync(_json).then(newObject3D => {
App.execute(new AddObjectCommand(newObject3D));
}).catch((e: Error) => window.$message?.error(e.message));
return;
}
object = object.clone();
App.execute(new AddObjectCommand(object));
}
</script>
<style scoped lang="less">
</style>