|
@@ -114,30 +114,13 @@
|
|
|
</div>
|
|
|
</a>
|
|
|
</t-dropdown-item>
|
|
|
- <t-dropdown-item divider="true">
|
|
|
+ <t-dropdown-item>
|
|
|
<a @click="onPaste">
|
|
|
<div class="flex">
|
|
|
粘贴 <span class="flex-grow"></span> Ctrl + V
|
|
|
</div>
|
|
|
</a>
|
|
|
</t-dropdown-item>
|
|
|
- <!-- <t-dropdown-item>
|
|
|
- <a @click="onAddAnchorHand">
|
|
|
- <div class="flex">添加手柄 <span class="flex-grow"></span> H</div>
|
|
|
- </a>
|
|
|
- </t-dropdown-item>
|
|
|
- <t-dropdown-item>
|
|
|
- <a @click="onRemoveAnchorHand">
|
|
|
- <div class="flex">删除手柄 <span class="flex-grow"></span> D</div>
|
|
|
- </a>
|
|
|
- </t-dropdown-item>
|
|
|
- <t-dropdown-item>
|
|
|
- <a @click="onToggleAnchorHand">
|
|
|
- <div class="flex">
|
|
|
- 切换手柄 <span class="flex-grow"></span> Shift
|
|
|
- </div>
|
|
|
- </a>
|
|
|
- </t-dropdown-item> -->
|
|
|
</t-dropdown-menu>
|
|
|
</t-dropdown>
|
|
|
<t-dropdown
|
|
@@ -194,9 +177,12 @@
|
|
|
</t-dropdown-item>
|
|
|
<t-dropdown-item>
|
|
|
<a @click="onToggleAnchor">
|
|
|
- <div class="flex" :style="{
|
|
|
- color:showAnchor?'':'#4f5b75'}
|
|
|
- ">
|
|
|
+ <div
|
|
|
+ class="flex"
|
|
|
+ :style="{
|
|
|
+ color: showAnchor ? '' : '#4f5b75',
|
|
|
+ }"
|
|
|
+ >
|
|
|
添加/删除锚点 <span class="flex-grow"></span> A
|
|
|
</div>
|
|
|
</a>
|
|
@@ -270,22 +256,22 @@
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-import { reactive, ref, onMounted, onUnmounted, nextTick } from "vue";
|
|
|
-import { useRouter, useRoute } from "vue-router";
|
|
|
-import { useUser } from "@/services/user";
|
|
|
-import { NotifyPlugin, MessagePlugin } from "tdesign-vue-next";
|
|
|
+import { reactive, ref, onMounted, onUnmounted, nextTick } from 'vue';
|
|
|
+import { useRouter, useRoute } from 'vue-router';
|
|
|
+import { useUser } from '@/services/user';
|
|
|
+import { NotifyPlugin, MessagePlugin } from 'tdesign-vue-next';
|
|
|
import {
|
|
|
showNotification,
|
|
|
Meta2dBackData,
|
|
|
dealwithFormatbeforeOpen,
|
|
|
gotoAccount,
|
|
|
checkData,
|
|
|
-} from "@/services/utils";
|
|
|
-import { readFile, upload, dataURLtoBlob } from "@/services/file";
|
|
|
-import { compareVersion, baseVer, upgrade } from "@/services/upgrade";
|
|
|
-import { parseSvg } from "@meta2d/svg";
|
|
|
-import { Pen, Rect, getGlobalColor, isShowChild } from "@meta2d/core";
|
|
|
-import localforage from "localforage";
|
|
|
+} from '@/services/utils';
|
|
|
+import { readFile, upload, dataURLtoBlob } from '@/services/file';
|
|
|
+import { compareVersion, baseVer, upgrade } from '@/services/upgrade';
|
|
|
+import { parseSvg } from '@meta2d/svg';
|
|
|
+import { Pen, Rect, getGlobalColor, isShowChild } from '@meta2d/core';
|
|
|
+import localforage from 'localforage';
|
|
|
import {
|
|
|
delImage,
|
|
|
getFolders,
|
|
@@ -294,12 +280,12 @@ import {
|
|
|
updateFolders,
|
|
|
cdn,
|
|
|
upCdn,
|
|
|
-} from "@/services/api";
|
|
|
-import JSZip from "jszip";
|
|
|
-import axios from "axios";
|
|
|
-import { switchTheme } from "@/services/theme";
|
|
|
-import { noLoginTip, localMeta2dDataName } from "@/services/utils";
|
|
|
-import { useDot, notificFn } from "@/services/common";
|
|
|
+} from '@/services/api';
|
|
|
+import JSZip from 'jszip';
|
|
|
+import axios from 'axios';
|
|
|
+import { switchTheme } from '@/services/theme';
|
|
|
+import { noLoginTip, localMeta2dDataName } from '@/services/utils';
|
|
|
+import { useDot, notificFn } from '@/services/common';
|
|
|
import {
|
|
|
save,
|
|
|
newFile,
|
|
@@ -312,19 +298,19 @@ import {
|
|
|
title,
|
|
|
drawPen,
|
|
|
map,
|
|
|
- magnifier
|
|
|
-} from "@/services/common";
|
|
|
+ magnifier,
|
|
|
+} from '@/services/common';
|
|
|
|
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
|
|
|
|
const market = import.meta.env.VITE_MARKET;
|
|
|
-const baseUrl = import.meta.env.BASE_URL || "/";
|
|
|
+const baseUrl = import.meta.env.BASE_URL || '/';
|
|
|
|
|
|
const { user, message, getUser, getMessage, signout } = useUser();
|
|
|
const { dot } = useDot();
|
|
|
const data = reactive({
|
|
|
- name: "空白文件",
|
|
|
+ name: '空白文件',
|
|
|
});
|
|
|
|
|
|
const inputMeta2dName = () => {
|
|
@@ -332,15 +318,15 @@ const inputMeta2dName = () => {
|
|
|
};
|
|
|
|
|
|
const initMeta2dName = () => {
|
|
|
- data.name = (meta2d.store.data as Meta2dBackData).name || "";
|
|
|
+ data.name = (meta2d.store.data as Meta2dBackData).name || '';
|
|
|
};
|
|
|
|
|
|
nextTick(() => {
|
|
|
- meta2d.on("opened", initMeta2dName);
|
|
|
+ meta2d.on('opened', initMeta2dName);
|
|
|
});
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
- meta2d.off("opened", initMeta2dName);
|
|
|
+ meta2d.off('opened', initMeta2dName);
|
|
|
});
|
|
|
|
|
|
function login() {
|
|
@@ -359,24 +345,24 @@ function login() {
|
|
|
}
|
|
|
|
|
|
function load(newT: boolean = false) {
|
|
|
- const input = document.createElement("input");
|
|
|
- input.type = "file";
|
|
|
+ const input = document.createElement('input');
|
|
|
+ input.type = 'file';
|
|
|
input.onchange = (event) => {
|
|
|
const elem = event.target as HTMLInputElement;
|
|
|
if (elem.files && elem.files[0]) {
|
|
|
newT && newfile(true);
|
|
|
// 路由跳转 可能在 openFile 后执行
|
|
|
- if (elem.files[0].name.endsWith(".json")) {
|
|
|
+ if (elem.files[0].name.endsWith('.json')) {
|
|
|
openJson(elem.files[0], newT);
|
|
|
- } else if (elem.files[0].name.endsWith(".svg")) {
|
|
|
+ } else if (elem.files[0].name.endsWith('.svg')) {
|
|
|
MessagePlugin.info(
|
|
|
- "可二次编辑但转换存在损失,若作为图片使用,请使用右侧属性面板的上传图片功能"
|
|
|
+ '可二次编辑但转换存在损失,若作为图片使用,请使用右侧属性面板的上传图片功能'
|
|
|
);
|
|
|
openSvg(elem.files[0]);
|
|
|
- } else if (elem.files[0].name.endsWith(".zip")) {
|
|
|
+ } else if (elem.files[0].name.endsWith('.zip')) {
|
|
|
openZip(elem.files[0], newT);
|
|
|
} else {
|
|
|
- MessagePlugin.info("打开文件只支持 json,svg,zip 格式");
|
|
|
+ MessagePlugin.info('打开文件只支持 json,svg,zip 格式');
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -388,7 +374,7 @@ const openJson = async (file: File, isNew: boolean = false) => {
|
|
|
try {
|
|
|
let data: Meta2dBackData = JSON.parse(text);
|
|
|
if (!data.name) {
|
|
|
- data.name = file.name.replace(".json", "");
|
|
|
+ data.name = file.name.replace('.json', '');
|
|
|
}
|
|
|
if (!data.version || compareVersion(data.version, baseVer) === -1) {
|
|
|
// 如果版本号不存在或者版本号 version < 1.0.0
|
|
@@ -416,7 +402,7 @@ const openSvg = async (file: File) => {
|
|
|
const text = await readFile(file);
|
|
|
const pens: Pen[] = parseSvg(text);
|
|
|
meta2d.canvas.addCaches = pens;
|
|
|
- MessagePlugin.info("svg转换成功,请点击画布决定放置位置");
|
|
|
+ MessagePlugin.info('svg转换成功,请点击画布决定放置位置');
|
|
|
};
|
|
|
|
|
|
const openZip = async (file: File, isNew: boolean = false) => {
|
|
@@ -431,16 +417,16 @@ const openZip = async (file: File, isNew: boolean = false) => {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const { default: JSZip } = await import("jszip");
|
|
|
+ const { default: JSZip } = await import('jszip');
|
|
|
const zip = new JSZip();
|
|
|
await zip.loadAsync(file);
|
|
|
|
|
|
- let dataStr = "";
|
|
|
+ let dataStr = '';
|
|
|
for (const key in zip.files) {
|
|
|
if (zip.files[key].dir) {
|
|
|
continue;
|
|
|
}
|
|
|
- if (key.endsWith(".json")) {
|
|
|
+ if (key.endsWith('.json')) {
|
|
|
// 认为只有一个 json 文件
|
|
|
// dataStr = await zip.file(key).async('string');
|
|
|
break;
|
|
@@ -462,15 +448,15 @@ const openZip = async (file: File, isNew: boolean = false) => {
|
|
|
let _keyLower = key.toLowerCase();
|
|
|
// if (!key.endsWith('.json') && (_png !== -1 || _img !== -1 || _image !== -1 || _file !== -1)) {
|
|
|
if (
|
|
|
- _keyLower.endsWith(".png") ||
|
|
|
- _keyLower.endsWith(".svg") ||
|
|
|
- _keyLower.endsWith(".gif") ||
|
|
|
- _keyLower.endsWith(".jpg") ||
|
|
|
- _keyLower.endsWith(".jpeg")
|
|
|
+ _keyLower.endsWith('.png') ||
|
|
|
+ _keyLower.endsWith('.svg') ||
|
|
|
+ _keyLower.endsWith('.gif') ||
|
|
|
+ _keyLower.endsWith('.jpg') ||
|
|
|
+ _keyLower.endsWith('.jpeg')
|
|
|
) {
|
|
|
- let filename = key.substr(key.lastIndexOf("/") + 1);
|
|
|
- const extPos = filename.lastIndexOf(".");
|
|
|
- let ext = "";
|
|
|
+ let filename = key.substr(key.lastIndexOf('/') + 1);
|
|
|
+ const extPos = filename.lastIndexOf('.');
|
|
|
+ let ext = '';
|
|
|
if (extPos > 0) {
|
|
|
ext = filename.substr(extPos);
|
|
|
}
|
|
@@ -521,7 +507,7 @@ const openZip = async (file: File, isNew: boolean = false) => {
|
|
|
let data: Meta2dBackData = JSON.parse(dataStr);
|
|
|
if (data) {
|
|
|
if (!data.name) {
|
|
|
- data.name = file.name.replace(".zip", "");
|
|
|
+ data.name = file.name.replace('.zip', '');
|
|
|
}
|
|
|
if (!data.version || compareVersion(data.version, baseVer) === -1) {
|
|
|
// 如果版本号不存在或者版本号 version < 1.0.0
|
|
@@ -566,15 +552,15 @@ const downloadJson = () => {
|
|
|
const data: Meta2dBackData = meta2d.data();
|
|
|
if (data._id) delete data._id;
|
|
|
checkData(data);
|
|
|
- import("file-saver").then(({ saveAs }) => {
|
|
|
+ import('file-saver').then(({ saveAs }) => {
|
|
|
saveAs(
|
|
|
new Blob(
|
|
|
- [JSON.stringify(data).replaceAll(cdn, "").replaceAll(upCdn, "")],
|
|
|
+ [JSON.stringify(data).replaceAll(cdn, '').replaceAll(upCdn, '')],
|
|
|
{
|
|
|
- type: "text/plain;charset=utf-8",
|
|
|
+ type: 'text/plain;charset=utf-8',
|
|
|
}
|
|
|
),
|
|
|
- `${data.name || "le5le.meta2d"}.json`
|
|
|
+ `${data.name || 'le5le.meta2d'}.json`
|
|
|
);
|
|
|
});
|
|
|
};
|
|
@@ -590,27 +576,27 @@ const downloadZip = async () => {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- MessagePlugin.info("正在下载打包中,可能需要几分钟,请耐心等待...");
|
|
|
+ MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
|
const [{ default: JSZip }, { saveAs }] = await Promise.all([
|
|
|
- import("jszip"),
|
|
|
- import("file-saver"),
|
|
|
+ import('jszip'),
|
|
|
+ import('file-saver'),
|
|
|
]);
|
|
|
|
|
|
const zip: any = new JSZip();
|
|
|
const data: Meta2dBackData = meta2d.data();
|
|
|
let _fileName =
|
|
|
- (data.name && data.name.replace(/\//g, "_").replace(/:/g, "_")) ||
|
|
|
- "le5le.meta2d";
|
|
|
+ (data.name && data.name.replace(/\//g, '_').replace(/:/g, '_')) ||
|
|
|
+ 'le5le.meta2d';
|
|
|
const _zip = zip.folder(`${_fileName}`);
|
|
|
if (data._id) delete data._id;
|
|
|
checkData(data);
|
|
|
_zip.file(
|
|
|
`${_fileName}.json`,
|
|
|
- JSON.stringify(data).replaceAll(cdn, "").replaceAll(upCdn, "")
|
|
|
+ JSON.stringify(data).replaceAll(cdn, '').replaceAll(upCdn, '')
|
|
|
);
|
|
|
await zipImages(_zip, meta2d.store.data.pens);
|
|
|
|
|
|
- const blob = await zip.generateAsync({ type: "blob" });
|
|
|
+ const blob = await zip.generateAsync({ type: 'blob' });
|
|
|
saveAs(blob, `${_fileName}.zip`);
|
|
|
};
|
|
|
|
|
@@ -625,28 +611,28 @@ const downloadHtml = async () => {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- MessagePlugin.info("正在下载打包中,可能需要几分钟,请耐心等待...");
|
|
|
+ MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
|
|
|
|
const data: Meta2dBackData = meta2d.data();
|
|
|
if (data._id) delete data._id;
|
|
|
checkData(data);
|
|
|
const [{ default: JSZip }, { saveAs }] = await Promise.all([
|
|
|
- import("jszip"),
|
|
|
- import("file-saver"),
|
|
|
+ import('jszip'),
|
|
|
+ import('file-saver'),
|
|
|
]);
|
|
|
const zip = new JSZip();
|
|
|
let _fileName =
|
|
|
- (data.name && data.name.replace(/\//g, "_").replace(/:/g, "_")) ||
|
|
|
- "le5le.meta2d";
|
|
|
+ (data.name && data.name.replace(/\//g, '_').replace(/:/g, '_')) ||
|
|
|
+ 'le5le.meta2d';
|
|
|
|
|
|
//处理cdn图片地址
|
|
|
const _zip: any = zip.folder(`${_fileName}`);
|
|
|
_zip.file(
|
|
|
- "data.json",
|
|
|
- JSON.stringify(data).replaceAll(cdn, "").replaceAll(upCdn, "")
|
|
|
+ 'data.json',
|
|
|
+ JSON.stringify(data).replaceAll(cdn, '').replaceAll(upCdn, '')
|
|
|
);
|
|
|
await Promise.all([zipImages(_zip, meta2d.store.data.pens), zipFiles(_zip)]);
|
|
|
- const blob = await zip.generateAsync({ type: "blob" });
|
|
|
+ const blob = await zip.generateAsync({ type: 'blob' });
|
|
|
saveAs(blob, `${_fileName}.zip`);
|
|
|
};
|
|
|
|
|
@@ -679,23 +665,23 @@ async function downloadAsFrame(type: Frame) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- MessagePlugin.info("正在下载打包中,可能需要几分钟,请耐心等待...");
|
|
|
+ MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
|
|
|
|
const data: Meta2dBackData = meta2d.data();
|
|
|
if (data._id) delete data._id;
|
|
|
checkData(data);
|
|
|
const [{ default: JSZip }, { saveAs }] = await Promise.all([
|
|
|
- import("jszip"),
|
|
|
- import("file-saver"),
|
|
|
+ import('jszip'),
|
|
|
+ import('file-saver'),
|
|
|
]);
|
|
|
const zip = new JSZip();
|
|
|
let _fileName =
|
|
|
- (data.name && data.name.replace(/\//g, "_").replace(/:/g, "_")) ||
|
|
|
- "le5le.meta2d";
|
|
|
+ (data.name && data.name.replace(/\//g, '_').replace(/:/g, '_')) ||
|
|
|
+ 'le5le.meta2d';
|
|
|
const _zip: any = zip.folder(`${_fileName}`);
|
|
|
_zip.file(
|
|
|
- "data.json",
|
|
|
- JSON.stringify(data).replaceAll(cdn, "").replaceAll(upCdn, "")
|
|
|
+ 'data.json',
|
|
|
+ JSON.stringify(data).replaceAll(cdn, '').replaceAll(upCdn, '')
|
|
|
);
|
|
|
await Promise.all([
|
|
|
zipImages(_zip, meta2d.store.data.pens),
|
|
@@ -705,18 +691,18 @@ async function downloadAsFrame(type: Frame) {
|
|
|
? zipVue2Files(_zip)
|
|
|
: zipReactFiles(_zip),
|
|
|
]);
|
|
|
- const blob = await zip.generateAsync({ type: "blob" });
|
|
|
+ const blob = await zip.generateAsync({ type: 'blob' });
|
|
|
saveAs(blob, `${_fileName}.zip`);
|
|
|
}
|
|
|
|
|
|
async function zipVue3Files(zip: JSZip) {
|
|
|
const files = [
|
|
|
- "/view/js/marked.min.js",
|
|
|
- "/view/js/lcjs.iife.js",
|
|
|
- "/view/vue3/Meta2d.vue",
|
|
|
- "/view/index.html",
|
|
|
- "/view/js/meta2d.js",
|
|
|
- "/view/使用说明.md",
|
|
|
+ '/view/js/marked.min.js',
|
|
|
+ '/view/js/lcjs.iife.js',
|
|
|
+ '/view/vue3/Meta2d.vue',
|
|
|
+ '/view/index.html',
|
|
|
+ '/view/js/meta2d.js',
|
|
|
+ '/view/使用说明.md',
|
|
|
] as const;
|
|
|
// 文件同时加载
|
|
|
await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
|
|
@@ -724,12 +710,12 @@ async function zipVue3Files(zip: JSZip) {
|
|
|
|
|
|
async function zipVue2Files(zip: JSZip) {
|
|
|
const files = [
|
|
|
- "/view/js/marked.min.js",
|
|
|
- "/view/js/lcjs.iife.js",
|
|
|
- "/view/vue2/Meta2d.vue",
|
|
|
- "/view/index.html",
|
|
|
- "/view/js/meta2d.js",
|
|
|
- "/view/使用说明.md",
|
|
|
+ '/view/js/marked.min.js',
|
|
|
+ '/view/js/lcjs.iife.js',
|
|
|
+ '/view/vue2/Meta2d.vue',
|
|
|
+ '/view/index.html',
|
|
|
+ '/view/js/meta2d.js',
|
|
|
+ '/view/使用说明.md',
|
|
|
] as const;
|
|
|
// 文件同时加载
|
|
|
await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
|
|
@@ -737,13 +723,13 @@ async function zipVue2Files(zip: JSZip) {
|
|
|
|
|
|
async function zipReactFiles(zip: JSZip) {
|
|
|
const files = [
|
|
|
- "/view/js/marked.min.js",
|
|
|
- "/view/js/lcjs.iife.js",
|
|
|
- "/view/react/Meta2d.jsx",
|
|
|
- "/view/react/Meta2d.css",
|
|
|
- "/view/index.html",
|
|
|
- "/view/js/meta2d.js",
|
|
|
- "/view/使用说明.md",
|
|
|
+ '/view/js/marked.min.js',
|
|
|
+ '/view/js/lcjs.iife.js',
|
|
|
+ '/view/react/Meta2d.jsx',
|
|
|
+ '/view/react/Meta2d.css',
|
|
|
+ '/view/index.html',
|
|
|
+ '/view/js/meta2d.js',
|
|
|
+ '/view/使用说明.md',
|
|
|
] as const;
|
|
|
// 文件同时加载
|
|
|
await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
|
|
@@ -751,24 +737,24 @@ async function zipReactFiles(zip: JSZip) {
|
|
|
|
|
|
async function zipFiles(zip: JSZip) {
|
|
|
const files = [
|
|
|
- "/view/js/marked.min.js",
|
|
|
- "/view/js/lcjs.iife.js",
|
|
|
- "/view/js/index.js",
|
|
|
- "/view/js/meta2d.js",
|
|
|
- "/view/index.html",
|
|
|
- "/view/index.css",
|
|
|
- "/view/favicon.ico",
|
|
|
- "/view/使用说明.pdf",
|
|
|
+ '/view/js/marked.min.js',
|
|
|
+ '/view/js/lcjs.iife.js',
|
|
|
+ '/view/js/index.js',
|
|
|
+ '/view/js/meta2d.js',
|
|
|
+ '/view/index.html',
|
|
|
+ '/view/index.css',
|
|
|
+ '/view/favicon.ico',
|
|
|
+ '/view/使用说明.pdf',
|
|
|
] as const;
|
|
|
// 文件同时加载
|
|
|
await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
|
|
|
}
|
|
|
|
|
|
async function zipFile(zip: JSZip, filePath: string) {
|
|
|
- const res: Blob = await axios.get(cdn + "/2d" + filePath, {
|
|
|
- responseType: "blob",
|
|
|
+ const res: Blob = await axios.get(cdn + '/2d' + filePath, {
|
|
|
+ responseType: 'blob',
|
|
|
});
|
|
|
- zip.file(filePath.replace("/view", ""), res, { createFolders: true });
|
|
|
+ zip.file(filePath.replace('/view', ''), res, { createFolders: true });
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -783,10 +769,10 @@ async function zipImages(zip: JSZip, pens: Pen[]) {
|
|
|
// 不止 image 上有图片, strokeImage ,backgroundImage 也有图片
|
|
|
const imageKeys = [
|
|
|
{
|
|
|
- string: "image",
|
|
|
+ string: 'image',
|
|
|
},
|
|
|
- { string: "strokeImage" },
|
|
|
- { string: "backgroundImage" },
|
|
|
+ { string: 'strokeImage' },
|
|
|
+ { string: 'backgroundImage' },
|
|
|
] as const;
|
|
|
const images: string[] = [];
|
|
|
for (const pen of pens) {
|
|
@@ -795,7 +781,7 @@ async function zipImages(zip: JSZip, pens: Pen[]) {
|
|
|
if (image) {
|
|
|
// HTMLImageElement 无法精确控制图片格式
|
|
|
if (
|
|
|
- image.startsWith("/") ||
|
|
|
+ image.startsWith('/') ||
|
|
|
image.startsWith(cdn) ||
|
|
|
image.startsWith(upCdn)
|
|
|
) {
|
|
@@ -813,23 +799,23 @@ async function zipImages(zip: JSZip, pens: Pen[]) {
|
|
|
|
|
|
async function zipImage(zip: JSZip, image: string) {
|
|
|
const res: Blob = await axios.get(image, {
|
|
|
- responseType: "blob",
|
|
|
+ responseType: 'blob',
|
|
|
params: {
|
|
|
isZip: true,
|
|
|
},
|
|
|
});
|
|
|
- zip.file(cdn ? image.replace(cdn, "").replace(upCdn, "") : image, res, {
|
|
|
+ zip.file(cdn ? image.replace(cdn, '').replace(upCdn, '') : image, res, {
|
|
|
createFolders: true,
|
|
|
});
|
|
|
}
|
|
|
|
|
|
const downloadImageTips =
|
|
|
- "无法下载,宽度不合法,画布可能没有画笔/画布大小超出浏览器最大限制";
|
|
|
+ '无法下载,宽度不合法,画布可能没有画笔/画布大小超出浏览器最大限制';
|
|
|
|
|
|
const downloadPng = () => {
|
|
|
const name = (meta2d.store.data as Meta2dBackData).name;
|
|
|
try {
|
|
|
- meta2d.downloadPng(name ? name + ".png" : undefined);
|
|
|
+ meta2d.downloadPng(name ? name + '.png' : undefined);
|
|
|
} catch (e) {
|
|
|
MessagePlugin.warning(downloadImageTips);
|
|
|
}
|
|
@@ -843,9 +829,9 @@ async function getIconDefs(url: string) {
|
|
|
}
|
|
|
|
|
|
const downloadSvg = async () => {
|
|
|
- await import("@/assets/canvas2svg");
|
|
|
+ await import('@/assets/canvas2svg');
|
|
|
if (!C2S) {
|
|
|
- MessagePlugin.error("请先加载乐吾乐官网下的canvas2svg.js");
|
|
|
+ MessagePlugin.error('请先加载乐吾乐官网下的canvas2svg.js');
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -857,7 +843,7 @@ const downloadSvg = async () => {
|
|
|
rect.x -= 10;
|
|
|
rect.y -= 10;
|
|
|
const ctx = new C2S(rect.width + 20, rect.height + 20);
|
|
|
- ctx.textBaseline = "middle";
|
|
|
+ ctx.textBaseline = 'middle';
|
|
|
ctx.strokeStyle = getGlobalColor(meta2d.store);
|
|
|
for (const pen of meta2d.store.data.pens) {
|
|
|
// 不使用 calculative.inView 的原因是,如果 pen 在 view 之外,那么它的 calculative.inView 为 false,但是它的绘制还是需要的
|
|
@@ -873,18 +859,18 @@ const downloadSvg = async () => {
|
|
|
);
|
|
|
if (icon_pens && icon_pens.length > 0) {
|
|
|
let iconList = [
|
|
|
- "/icon/国家电网/iconfont.css",
|
|
|
- "/icon/电气工程/iconfont.css",
|
|
|
- "/icon/通用图标/iconfont.css",
|
|
|
+ '/icon/国家电网/iconfont.css',
|
|
|
+ '/icon/电气工程/iconfont.css',
|
|
|
+ '/icon/通用图标/iconfont.css',
|
|
|
];
|
|
|
let defsList: any = await Promise.all(
|
|
|
iconList.map((item) => getIconDefs(item))
|
|
|
);
|
|
|
mySerializedSVG = mySerializedSVG.replace(
|
|
|
- "<defs/>",
|
|
|
+ '<defs/>',
|
|
|
`<defs>
|
|
|
<style type="text/css">
|
|
|
-${defsList.join("\n")}
|
|
|
+${defsList.join('\n')}
|
|
|
</style>
|
|
|
{{bk}}
|
|
|
</defs>
|
|
@@ -906,30 +892,30 @@ ${defsList.join("\n")}
|
|
|
);
|
|
|
*/
|
|
|
if (meta2d.store.data.background) {
|
|
|
- mySerializedSVG = mySerializedSVG.replace("{{bk}}", "");
|
|
|
+ mySerializedSVG = mySerializedSVG.replace('{{bk}}', '');
|
|
|
mySerializedSVG = mySerializedSVG.replace(
|
|
|
- "{{bkRect}}",
|
|
|
+ '{{bkRect}}',
|
|
|
`<rect x="0" y="0" width="100%" height="100%" fill="${meta2d.store.data.background}"></rect>`
|
|
|
);
|
|
|
} else {
|
|
|
- mySerializedSVG = mySerializedSVG.replace("{{bk}}", "");
|
|
|
- mySerializedSVG = mySerializedSVG.replace("{{bkRect}}", "");
|
|
|
+ mySerializedSVG = mySerializedSVG.replace('{{bk}}', '');
|
|
|
+ mySerializedSVG = mySerializedSVG.replace('{{bkRect}}', '');
|
|
|
}
|
|
|
|
|
|
- mySerializedSVG = mySerializedSVG.replace(/--le5le--/g, "&#x");
|
|
|
+ mySerializedSVG = mySerializedSVG.replace(/--le5le--/g, '&#x');
|
|
|
|
|
|
const urlObject: any = (window as any).URL || window;
|
|
|
const export_blob = new Blob([mySerializedSVG]);
|
|
|
const url = urlObject.createObjectURL(export_blob);
|
|
|
|
|
|
- const a = document.createElement("a");
|
|
|
+ const a = document.createElement('a');
|
|
|
a.setAttribute(
|
|
|
- "download",
|
|
|
- `${(meta2d.store.data as Meta2dBackData).name || "le5le.meta2d"}.svg`
|
|
|
+ 'download',
|
|
|
+ `${(meta2d.store.data as Meta2dBackData).name || 'le5le.meta2d'}.svg`
|
|
|
);
|
|
|
- a.setAttribute("href", url);
|
|
|
- const evt = document.createEvent("MouseEvents");
|
|
|
- evt.initEvent("click", true, true);
|
|
|
+ a.setAttribute('href', url);
|
|
|
+ const evt = document.createEvent('MouseEvents');
|
|
|
+ evt.initEvent('click', true, true);
|
|
|
a.dispatchEvent(evt);
|
|
|
};
|
|
|
|
|
@@ -997,48 +983,46 @@ const onDisableAnchor = () => {
|
|
|
};
|
|
|
|
|
|
const changeDisableAnchor = () => {
|
|
|
- const { disableAnchor, autoAnchor } =
|
|
|
- meta2d.store.options;
|
|
|
- showAnchor.value = (!disableAnchor) || false;
|
|
|
+ const { disableAnchor, autoAnchor } = meta2d.store.options;
|
|
|
+ showAnchor.value = !disableAnchor || false;
|
|
|
if (disableAnchor && autoAnchor) {
|
|
|
// 禁用瞄点开了,需要关闭自动瞄点
|
|
|
onAutoAnchor();
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-
|
|
|
const helpList = [
|
|
|
{
|
|
|
- name: "产品介绍",
|
|
|
- url: "https://doc.le5le.com/document/118756411",
|
|
|
- target: "_blank",
|
|
|
+ name: '产品介绍',
|
|
|
+ url: 'https://doc.le5le.com/document/118756411',
|
|
|
+ target: '_blank',
|
|
|
},
|
|
|
{
|
|
|
- name: "快速上手",
|
|
|
- url: "https://doc.le5le.com/document/119363000",
|
|
|
- target: "_blank",
|
|
|
+ name: '快速上手',
|
|
|
+ url: 'https://doc.le5le.com/document/119363000',
|
|
|
+ target: '_blank',
|
|
|
},
|
|
|
{
|
|
|
- name: "使用手册",
|
|
|
- url: "https://doc.le5le.com/document/118764244",
|
|
|
- target: "_blank",
|
|
|
+ name: '使用手册',
|
|
|
+ url: 'https://doc.le5le.com/document/118764244',
|
|
|
+ target: '_blank',
|
|
|
},
|
|
|
{
|
|
|
- name: "快捷键",
|
|
|
- url: "https://doc.le5le.com/document/119620214",
|
|
|
- target: "_blank",
|
|
|
+ name: '快捷键',
|
|
|
+ url: 'https://doc.le5le.com/document/119620214',
|
|
|
+ target: '_blank',
|
|
|
divider: true,
|
|
|
},
|
|
|
{
|
|
|
- name: "企业服务与支持",
|
|
|
- url: "https://doc.le5le.com/document/119296274",
|
|
|
- target: "_blank",
|
|
|
+ name: '企业服务与支持',
|
|
|
+ url: 'https://doc.le5le.com/document/119296274',
|
|
|
+ target: '_blank',
|
|
|
divider: true,
|
|
|
},
|
|
|
{
|
|
|
- name: "关于我们",
|
|
|
- url: "https://le5le.com/about.html",
|
|
|
- target: "_blank",
|
|
|
+ name: '关于我们',
|
|
|
+ url: 'https://le5le.com/about.html',
|
|
|
+ target: '_blank',
|
|
|
},
|
|
|
];
|
|
|
</script>
|