Stories

Detail Return Return

(JS實現編輯DWG文件)網頁CAD SDK集成方法 - Stories Detail

前言

我們基於mxcad創建了一個在線的CAD項目,該項目中包含了預覽、編輯圖紙、操作圖紙數據庫等多種CAD功能。用户集成後支持二次開發。當前我們提供了兩種集成方式,方案1:通過iframe集成mxcad項目;方案2:直接在項目中集成mxcad-app插件。
下面我們詳細講解第2種mxcad-app的集成方式,這種方式與iframe嵌套集成相比更加方便,集成後也只需要維護當前一個系統項目。

MxCAD項目初始化界面如下:

一、基礎集成步驟

1.1、基於vite集成mxcad-app

第一步,在main.js中引入mxcad項目所需要的樣式文件,創建初始MxCAD項目

   // 引入mxcad-app樣式
   import "mxcad-app/style";
   // 引入MxCADView
   import { MxCADView } from "mxcad-app";
   // 創建默認mxcad項目
   new MxCADView().create();

第二步,在vite.config.js中加入MxCAD項目相關的資源配置

   import { defineConfig } from "vite";
   import { mxcadAssetsPlugin } from "mxcad-app/vite";
   export default defineConfig({
     plugins: [
         ...
         mxcadAssetsPlugin(),
         ...
     ],
   });

1.2、基於webpack集成mxcad-app

第一步,在main.js中引入mxcad項目所需要的樣式文件,創建初始MxCAD項目

   // 引入mxcad-app樣式
   import "mxcad-app/style";
   // 引入MxCADView
   import { MxCADView } from "mxcad-app";
   // 創建默認mxcad項目
   new MxCADView().create();

第二步,在vite.config.js中加入MxCAD項目相關的資源配置

npm install style-loader css-loader
const { MxCadAssetsWebpackPlugin } = require("mxcad-app/webpack");
   // webpack.config.js
   const webpack = require("webpack");
   module.exports = {
     // ...
     mode: "development",
     module: {
       rules: [
         {
           test: /\.css$/, // 匹配所有 .css 文件
           use: [
             "style-loader", // 第二步:將 CSS 代碼注入到 DOM 的 <style> 標籤中
             "css-loader", // 第一步:解析 CSS 文件,處理 @import 和 url()
           ],
           include: [path.resolve(__dirname, "src"), path.resolve(__dirname, "node_modules/mxcad-app")], // 可選:只處理 src 下的 css
         },
       ],
     },
     plugins: [
       new webpack.ContextReplacementPlugin(
         /mxcad-app/, // 匹配包含 mxcad-app 的模塊路徑
         path.resolve(__dirname, "src") // 限制上下文查找範圍
       ),
       new MxCadAssetsWebpackPlugin(),
     ],
     // ...
     devServer: {
       static: "./dist",
       port: 3000,
     },
   };

二、高階調用

2.1、自定義界面容器

mxcad-app如果不指定頁面的容器元素,會默認直接在項目界面創建一個寬高為100vw,100vh的容器,mxcad項目也將全屏展示。在某些情境下,我們需要動態控制mxcad項目的顯隱或顯示範圍,因此,我們設置如下相關配置來指定mxcad-app的特定界面容器。

<div id="myMxCAD" style="width: 50vw; height: 50vh"></div>
// 自定義容器
   import { MxCADView, mxcadApp } from "mxcad-app";
   /**
    * openFile:需要打開的文件路徑
    * rootContainer:mxcad項目容器名
    * map:是否顯示地圖模式
    */
   new MxCADView({
   // mxcadApp.getStaticAssetPath()).toString() 獲取mxcad-app的靜態資源路徑,默認使用的靜態資源為nodemodules/mxcad-app/dist/mxcadAppAssets
     openFile: new URL("test.mxweb", mxcadApp.getStaticAssetPath()).toString(),
     rootContainer: "#myMxCAD",
   }).create();

如果需要修改MxCAD項目內部的靜態資源路徑,可以通過調用setStaticAssetPath()方法修改。

2.2、構建配置設置

mxcad-app插件內提供了mxcadAssetsPlugin方法對MxCAD項目的加載wasm方式、第三方依賴、資源存放的子目錄名、界面UI、快捷命令、服務配置、主題樣式等進行設置,用户可以根據自己的需求在不同的場景裏修改MxCAD項目的內部配置,基於vite的配置:

  import { mxcadAssetsPlugin } from "mxcad-app/vite";
   // vite.config.js
   export default {
     plugins: [
       mxcadAssetsPlugin({
         isWasmSt:true,
         libraryNames: ["vue"],
         outputDir:'testName',
               // 修改UI配置
         transformMxUiConfig: (config) => {
           config.title = "我的CAD"; // 修改標題
           return config;
         },
         // 修改服務器配置  
         transformMxServerConfig: (config) => {
           config.serverUrl = "/api/cad"; // 修改API地址
           return config;
         },
         // 修改快捷命令(命令別名)
         // transformMxQuickCommand: (config) => config
   
         // 修改草圖與註釋UI模式的配置
         // transformMxSketchesAndNotesUiConfig: (config) => config
           
         // 修改Vuetify主題配置
         // transformVuetifyThemeConfig: (config) => config
       }),
     ],
   };

基於webpack的配置:

 import { MxCadAssetsWebpackPlugin } from "mxcad-app/webpack";
   module.exports = {
     plugins: [
       new MxCadAssetsWebpackPlugin({
         isWasmSt:true,
         libraryNames: ["vue"],
         outputDir:'testName',
         transformMxServerConfig: (config) => {
           if (process.env.NODE_ENV === 'production') {
             config.serverUrl = 'https://api.prod.com/cad';
           }
           return config;
         }
           ...
       })
    ]
   };

設置加載wasm方式
MxCAD項目內部默認使用多線程加載wasm資源,如果需要設置單線程加載,可以設置mxcadAssetsPlugin方法中的isWasmSt屬性。

  /** 是否單線程加載wasm (默認使用多線程及加載) */
  isWasmSt:true

第三方依賴
用户可以直接引入使用mxcad-app內部使用的mxcad和mxdraw模塊,如果用户有需要使用mxcad-app內的其他依賴可以直接在mxcadAssetsPlugin方法中的libraryNames屬性中添加這些外部依賴的npm庫,然後直接使用。
目前支持的依賴映射的庫有vue, axios, vuetify, vuetify/components, mapboxgl, pinia 你也可以訪問window.MXCADAPP_EXTERNALLIBRARIES獲取到所有提供的依賴庫,從而不依賴與構建工具的使用。

libraryNames: ["vue","axios"...]
// 在配置文件中添加後,就可以正常使用mxcad-app中的vue模塊(mxcad-app打包的內部vue模塊)
import { ref } from "vue";
const n = ref(1);

構建打包後mxcad-app靜態資源存放的子目錄名
在自己的項目中安裝mxcad-app導入MxCAD項目後,構建打包的時候會默認創建名為 mxcadAppAssets 的文件夾來存放 MxCAD 相關的所有靜態資源。如果用户需要修改放置靜態資源的文件夾名,可以直接調用mxcadAssetsPlugin方法中的outputDir屬性值。

outputDir:'testName'

修改界面UI、CAD快捷命令、服務配置、主題樣式等
調用mxcadAssetsPlugin方法中的提供的transform方法深度設置MxCAD項目。

   // 修改UI配置
  /** 更多UI配置可點擊config內部查看 */
  transformMxUiConfig: (config) => {
      config.title = "我的CAD"; // 修改標題
      config.mTopButtonBarData.push({
          "icon": "textIcon",
          "prompt": "test",
          "cmd": "Mx_test"
      });// 添加頂部按鈕欄按鈕
      ...
      return config;
  }
  // 修改草圖與註釋UI模式的配置同上
     // transformMxSketchesAndNotesUiConfig: (config) => config
     // 修改CAD快捷命令(命令別名)
     /** 更多修改CAD快捷命令配置可點擊config內部查看 */
     transformMxQuickCommand: (config) => {
         // 添加命令Mx_test的別名'_test'、't'
         // config 為MxCAD內部命名別名數組對象
         config.push(['Mx_test','_test','t'])
      return config
     }
     // 修改服務器配置  
     /** 更多修改服務器配置可點擊config內部查看 */
     transformMxServerConfig: (config) => {
         config.serverUrl = "/api/cad"; // 修改API地址
         config.font.push('txt.shx', 'gdt.shx');// 添加MxCAD項目初始需要加載的字體文件
         ...
      return config;
     }
     // 修改Vuetify主題配置
     /** 更多修改Vuetify主題配置可點擊config內部查看 */
     transformVuetifyThemeConfig: (config) => {
         config.defaultTheme = 'light';//dark或者light
      return config
     }

2.3、核心依賴庫

mxcad-app內置了mxcad 核心庫,用户可以直接使用mxcad 不需要在項目中再次安裝mxcad插件。如果不是模塊化的方式使用,mxcadwindow.MxCAD掛載你可以直接使用MxCAD訪問到需要的方法和類。

   import { MxCpp } from 'mxcad'
   // 獲取當前mxcad對象
   const mxcad = MxCpp.getCurrentMxCAD();

mxcad依賴mxdraw, 用户在項目中也可以直接使用mxdraw。如果不是模塊化的方式使用, mxdraw在 window.Mx掛載。你可以直接使用Mx訪問到需要的方法和類。

   import { MxFun } from 'mxdraw'
   // 輸出命令行內容
   MxFun.acutPrintf('測試輸出')

直接引入mxcadmxdraw模塊的前提是要使用構建工具構建。我們提供給了webpack和vite的插件, 用於支持模塊化開發,只要使用了插件就可以直接使用import引入mxcadmxdraw模塊。

三、MxCAD項目二次開發示例

基於上述操作,我們已經在我們的項目中集成了MxCAD項目並完成了初始化配置,接下來我們就可以直接基於該CAD項目做二次開發了,下面以在項目中實現參數化繪製多種直線為例,在我們自己的系統之實現繪製命令後註冊,再在MxCAD項目調用我們的繪製直線的命令並執行對應的參數操作。

3.1、添加繪製多種直線的方法

   import { MxCpp, McCmColor } from "mxcad";
   function Mx_Test_DrawLine() {
     let mxcad = MxCpp.getCurrentMxCAD();
     //清空當前顯示內容
     mxcad.newFile();
     //把顏色改回黑白色
     mxcad.drawColorIndex = 0;
     //把線型改成實線
     mxcad.drawLinetype = "";
     //設置線寬 4
     mxcad.drawLineWidth = 0;
     //創建一個圖層,名為"LineLayer"
     mxcad.addLayer("LineLayer");
     //設置當前圖層為"LineLayer"
     mxcad.drawLayer = "LineLayer";
     // 直接繪製一個實線
     // 參數一直線的開始點x座標,參數二直線的開始點y座標,參數三直線的結束點x座標,參數四直線的結束點y座標
     mxcad.drawLine(0, 0, 100, 0);
     // 繪製一個實斜線
     mxcad.drawLine(200, 0, 300, 100);
     //----------------------------------------------------------------------------------------------------------
     //繪製一個虛線
     //定義虛線數據據,"MyLineType"是線型名,"6,-8"是虛線的一個單位定義,6是實線長,-8是空格長。
     mxcad.addLinetype("MyLineType", "6,-10");
     //設計當前線型為"MyLineType"
     mxcad.drawLinetype = "MyLineType";
     // 繪製一個虛線
     mxcad.drawLine(0, 30, 100, 30);
     // 繪製一個斜虛線
     mxcad.drawLine(200, 30, 300, 130);
     //---------------------------------------------------------------------------------------------------------
     // 修改繪線的顏色為 16711680(藍色),  16711680轉成16進制是0xFF 00 00,其中,FF是藍色,00是綠色,第個二00是紅色。
     mxcad.drawColor = new McCmColor(0, 0, 255);
     // 繪製一個藍色的虛線
     mxcad.drawLine(0, 60, 100, 60);
     // 繪製一個藍色的斜虛線
     mxcad.drawLine(200, 60, 300, 160);
     //---------------------------------------------------------------------------------------------------------
     //把顏色改回黑白色
     mxcad.drawColorIndex = 0;
     //把線型改成實線
     mxcad.drawLinetype = "";
     //設置線寬 4
     mxcad.drawLineWidth = 4;
     //繪製一個帶寬度的直線。
     mxcad.drawLine(0, 90, 100, 90);
     // 繪製一個帶寬度的斜線
     mxcad.drawLine(200, 90, 300, 190);
     //---------------------------------------------------------------------------------------------------------
     //繪製一個點劃線虛線
     mxcad.addLinetype("MyLineType2", "10,-2,3,-2");
     //把線型改點劃線
     mxcad.drawLinetype = "MyLineType2";
     // 修改繪線的顏色為 255(紅色),  255轉成16進制是0x00 00 FF,其中,00是藍色,第個二00是綠色,FF是紅色。
     mxcad.drawColor = new McCmColor(255, 0, 0);
     //繪製一個帶寬度的紅色點劃線。
     mxcad.drawLine(0, 120, 100, 120);
     // 繪製一個帶寬度紅色點劃斜線
     mxcad.drawLine(200, 120, 300, 220);
     //---------------------------------------------------------------------------------------------------------
     //增加一個帶有形的線型
     mxcad.addTextStyle("MyLineTypeTextStyle", "txt.shx", "hztxt.shx", 1);
     mxcad.addLinetypeEx("MyLineType3", "(12.7,(\"T=MxDraw\",\"S=2.54\",\"L=-5.08\",\"R=0.0\",\"X=-2.54\",\"Y=-1.27\"),-10.08)", "MyLineTypeTextStyle");
     mxcad.drawLinetype = "MyLineType3";
     mxcad.drawLineWidth = 0;
     //繪製一個帶寬度的紅色點劃線。
     mxcad.drawLine(350, 120, 600, 120);
     //---------------------------------------------------------------------------------------------------------
     //增加一個帶有形的線型
     //把顏色改回黑白色
     mxcad.drawColorIndex = 0;
     mxcad.drawLineWidth = 4;
     //繪製一個帶寬度的紅色點劃線。
     mxcad.drawLine(350, 220, 600, 220);                                        
     //把所有的實體都放到當前顯示視區
     mxcad.zoomAll();
     //更新視區顯示
     mxcad.updateDisplay();
   }

3.2、註冊繪製命令

   import { MxFun } from 'mxdraw';
   MxFun.addCommand("Mx_Test_DrawLine", Mx_Test_DrawLine);

3.3、綁定調用邏輯(以點擊按鈕為例)

   <button onclick="MyTestFun('Mx_Test_DrawLine')">繪製直線</button>
   const MyTestFun = (str:string)=> MxFun.sendStringToExecute(str);

3.4、功能效果演示:


更多mxcad-app相關示例項目引用,可以下載我們的mxdraw雲圖開發包查看更多詳情。

user avatar dingtongya Avatar steven_code Avatar mihuartuanr Avatar zourongle Avatar qian5201314 Avatar yqyx36 Avatar zzd41 Avatar zxl20070701 Avatar nznznz Avatar songminzh Avatar yangxiansheng_5a1b9b93a3a44 Avatar fanudekaixinguo Avatar
Favorites 65 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.