Forráskód Böngészése

feat:CAD&VISIO解析

ananzhusen 3 hónapja
szülő
commit
7f24ef0148
4 módosított fájl, 155 hozzáadás és 3 törlés
  1. 27 1
      src/views/components/FileProps.vue
  2. 124 2
      src/views/components/Header.vue
  3. 2 0
      tsconfig.json
  4. 2 0
      vite.config.ts

+ 27 - 1
src/views/components/FileProps.vue

@@ -172,6 +172,16 @@
                   <t-switch :value="extendData.lineIntersect" class="ml-8 mt-8" size="small" @change="changeLineIntersect"></t-switch>
                 </div>
               </t-space>
+              <t-space direction="vertical" size="small">
+                <div class="form-item">
+                  <label title="此功能仅对dxf文件解析结果">dxf缩放倍率</label>
+                  <t-input
+                      class="ml-8"
+                      size="small"
+                      @change="refreshDxf"
+                  />
+                </div>
+              </t-space>
             </t-collapse-panel>
           </t-collapse>
         </t-space>
@@ -209,7 +219,7 @@ import { useMeta2dData,useExtendData } from '@/services/common';
 import { lineCross,clearLineCross,handleLineCross } from '@meta2d/utils';
 import GlobalStates from './GlobalStates.vue';
 import { getToken  } from '@le5le/auth-token';
-
+import D2M from 'dxf';
 const { getEnterprise } = useEnterprise();
 const { meta2dData, setMeta2dData } = useMeta2dData();
 const { extendData, setExtendData } = useExtendData();
@@ -428,6 +438,22 @@ onMounted(() => {
   }
 });
 
+async function refreshDxf(scale:number){
+  meta2d.clear()
+  // 然后这将显示一个文本文件
+  const parser = new D2M()
+  parser.parser.configs.scale = scale
+  const res = parser.reload()
+
+  if(res.success.length > 0 ){
+    const pens = await meta2d.addPens((res.success));
+    meta2d.gotoView(pens[Math.floor(pens.length / 2)])
+
+    // meta2d.gotoView(viewPen)
+    // Promise.resolve().then(()=>{meta2d.render()})
+  }
+}
+
 onUnmounted(() => {
   meta2d.off('opened', openData);
   meta2d.off('add', finishLine);

+ 124 - 2
src/views/components/Header.vue

@@ -13,9 +13,23 @@
         <t-dropdown-item @click="load(true)">
           <a>{{$t('打开文件')}}</a>
         </t-dropdown-item>
-        <t-dropdown-item divider="true" @click="load()">
+        <t-dropdown-item @click="load()">
           <a>{{$t('导入文件')}}</a>
         </t-dropdown-item>
+        <t-dropdown-item >
+          <a @click="importVisio">
+            <div class="flex">
+              导入visio(vsdx)文件<span class="flex-grow"></span>
+            </div>
+          </a>
+        </t-dropdown-item>
+        <t-dropdown-item divider="true">
+          <a @click="importDxf">
+            <div class="flex">
+              导入CAD(dxf)文件<span class="flex-grow"></span>
+            </div>
+          </a>
+        </t-dropdown-item>
         <t-dropdown-item>
           <a @click="save(SaveType.Save,'',true)">{{$t('保存')}}</a>
         </t-dropdown-item>
@@ -502,8 +516,10 @@ import {
 import { readFile } from '@/services/file';
 import { compareVersion, baseVer, upgrade } from '@/services/upgrade';
 import { parseSvg } from '@meta2d/svg';
-import { Pen, getGlobalColor, isShowChild } from '@meta2d/core';
+import { Pen, getGlobalColor, isShowChild, deepClone } from '@meta2d/core';
 import { cdn, upCdn, addCollection } from '@/services/api';
+import {V2M} from "visio2meta2d";
+import D2M from 'dxf';
 // import JSZip from 'jszip';
 import axios from 'axios';
 import { switchTheme } from '@/services/theme';
@@ -789,6 +805,112 @@ function load(isNew = false) {
   input.click();
 }
 
+async function importDxf(){
+  if (!(user && user.id)) {
+    MessagePlugin.warning(noLoginTip);
+    return;
+  }
+
+  // if (!user.vip) {
+  //   MessagePlugin.info('需要开通会员~');
+  //   gotoAccount();
+  //   return;
+  // }
+  const input = document.createElement('input');
+  input.type = 'file';
+  input.onchange = async (event) => {
+    const elem:any = event.target;
+    if (elem.files && elem.files[0]) {
+      // 路由跳转 可能在 openFile 后执行
+      if (elem.files[0].name.endsWith('.DXF') ||elem.files[0].name.endsWith('.dxf') ) {
+        const dataObj = elem.files[0]
+        if (dataObj) {
+          const reader = new FileReader();
+          reader.readAsText(dataObj, "UTF-8")
+          reader.addEventListener(
+              "load",
+              async () => {
+                // 然后这将显示一个文本文件
+                const parser = new D2M({
+                  scale: 10
+                },(e)=>{
+                  console.error('error',e)
+                })
+                const res = await parser.load(dataObj)
+                if(res.success.length > 0 ){
+                  const pens = await meta2d.addPens((res.success));
+                  meta2d.gotoView(pens[Math.floor(pens.length / 2)])
+                }
+              },
+              false,
+          );
+        }
+      }
+    }
+  };
+  input.click();
+
+}
+
+function importVisio() {
+  if (!(user && user.id)) {
+    MessagePlugin.warning(noLoginTip);
+    return;
+  }
+
+  // if (!user.isVip) {
+  //   gotoAccount();
+  //   return;
+  // }
+  // if (!user.vip) {
+  //   MessagePlugin.info('需要开通会员~');
+  //   gotoAccount();
+  //   return;
+  // }
+    const input = document.createElement('input');
+    input.type = 'file';
+    input.onchange = async (event) => {
+      const elem:any = event.target;
+      if (elem.files && elem.files[0]) {
+        if (elem.files[0].name.endsWith('.vsdx')) {
+          MessagePlugin.loading("文件正在加载中")
+          const dataObj = elem.files[0]
+          if (dataObj) {
+            let factory = new V2M({
+              ellipsis:false
+            },(e)=>{
+              MessagePlugin.closeAll();
+              MessagePlugin.error("文件加载失败,请检查文件是否正确(vsdx)")
+            });
+            factory.addGraphMap('Separator',{name:'rectangle'})
+            factory.addGraphMap('CFF Container',{name:'rectangle'})
+            const res = await factory.load(dataObj)
+            if(res.length > 0 ){
+              for (const page of res) {
+                const pens = await meta2d.addPens(deepClone(page.pens));
+                meta2d.combine(pens)
+                if(page.unmatch.length > 0){
+                  const unMatchList = page.unmatch.map(i=>i.origin.name).join(',');
+                }
+                pens.forEach((p)=>{
+                  if(p.children.length > 0){
+                    meta2d.pushChildren(p,p.children.map((c)=>meta2d.findOne(c)))
+                  }
+                })
+              }
+              meta2d.centerView()
+            }
+          }
+          MessagePlugin.closeAll();
+          MessagePlugin.success("加载成功")
+        }else {
+          MessagePlugin.info("仅支持vsdx文件")
+        }
+      };
+    }
+    input.click();
+}
+
 const openJson = async (file: File) => {
   const text = await readFile(file);
   try {

+ 2 - 0
tsconfig.json

@@ -15,6 +15,8 @@
       "@/*": ["src/*"],
       // "@meta2d/*": ["../meta2d.js/packages/*"],
       // "@2d-components/*": ["../2d-components/packages/*"],
+      "visio2meta2d": ["../visio2meta2d"],
+      "dxf": ["../dxf"],
       // "@meta3d/*": ["../meta3d.js/*"],
       // "@le5le/auth-token":["../auth-token"],
     },

+ 2 - 0
vite.config.ts

@@ -29,6 +29,8 @@ export default defineConfig({
       '@': path.resolve(__dirname, './src/'),
       // '@meta2d': path.resolve(__dirname, '../meta2d.js/packages'),
       // '@2d-components': path.resolve(__dirname, '../2d-components/packages'),
+      "visio2meta2d": path.resolve(__dirname, '../visio2meta2d'),
+      'dxf': path.resolve(__dirname, '../dxf'),
       // '@meta3d': path.resolve(__dirname, '../meta3d.js'),
       // "@le5le/auth-token":path.resolve(__dirname, '../auth-token'),
     },