一個基於typescript + canvas 實現的開源在線繪圖的引擎Topology。採用引擎 + 圖形庫中間件的思路可以方便、快速的擴展、集成到前端項目。目前暫時實現了基本圖形、流程圖圖形庫,可以知足微服務架構圖、網絡拓撲圖和流程圖的繪製。後面計劃陸續實現活動圖/時序圖/類圖等UML圖。前端
在線無償使用(由於操做方便問題,暫時沒有適配移動端)
node
主要由:層、節點、連線和箭頭等組成。
git
層:這裏的層,主要是爲了提高性能的邏輯層;與ps裏面的用戶圖層無關。 es6
離屏層:包含全部繪圖數據,是最穩定的圖層。
選中層:用戶選中部分或所有節點/連線的高亮圖層,並設置相關屬性、縮放、和旋轉等。
動畫層:主要用於演示動畫。
活動層:主要用於箭頭鼠標交互事件,好比錨點和連線過程。github
節點:是畫布的主要組成部分,節點內部還能夠包含圖標或文字。
連線和箭頭:連線和箭頭是關聯在一塊兒的。連線兩端能夠選擇設置或不設置箭頭。節點能夠經過控制點進行總體縮放、旋轉。
typescript
繪畫與屬性
節點和連線各類有自身的繪畫屬性,同時還能夠設置一個附加的自定義數據
npm
es6使用示例:
https://github.com/le5le-com/...canvas
typescript使用示例:
https://github.com/le5le-com/...api
# 安裝繪圖引擎 npm install topology-core # 安裝圖形庫 - 流程圖 npm install topology-flow-diagram # ...其餘圖形庫
// 1. 導入繪畫引擎 import { Topology } from 'topology-core'; // 2. 建立畫布 // 其中,第一個參數'topo-canvas'表示canvas的dom元素id; // 第二個參數{}表示畫布選項,這裏表示所有使用默認值。具體選項請參考後面的api文檔。 var canvas = new Topology('topo-canvas', {}); // 3. 渲染圖形 // 其中,第一個參數{}表示圖形數據 // 第二個參數true,表示打開一個新文件;不然在當前文件打開,覆蓋已存在的圖形數據 canvas.render({}, true);
// 獲取畫布數據 const data = this.canvas.data(); // 保存爲圖片blob // toImage函數參數:type, quality, callback this.canvas.toImage(null, null, blob => { // Do sth. }); // 下載爲圖片 // saveAsImage函數參數:filename, type, quality this.canvas.saveAsImage('canvas.png'); // 編輯相關操做 this.canvas.cut(); this.canvas.copy(); this.canvas.parse(); this.canvas.undo(); this.canvas.redo();
// 使用第三方圖形庫 // 1. 先導入註冊函數 import { registerNode } from 'topology-core/middles'; // 2. 導入圖形庫圖形及其相關元素 import { flowData, flowDataAnchors, flowDataIconRect, flowDataTextRect, flowSubprocess, flowSubprocessIconRect, flowSubprocessTextRect, flowDb, flowDbIconRect, flowDbTextRect, flowDocument, flowDocumentAnchors, flowDocumentIconRect, flowDocumentTextRect, flowInternalStorage, flowInternalStorageIconRect, flowInternalStorageTextRect, flowExternStorage, flowExternStorageAnchors, flowExternStorageIconRect, flowExternStorageTextRect, flowQueue, flowQueueIconRect, flowQueueTextRect, flowManually, flowManuallyAnchors, flowManuallyIconRect, flowManuallyTextRect, flowDisplay, flowDisplayAnchors, flowDisplayIconRect, flowDisplayTextRect, flowParallel, flowParallelAnchors, flowComment, flowCommentAnchors } from 'topology-flow-diagram'; // 3. 向引擎註冊圖形庫圖形及其相關元素 registerNode('flowData', flowData, flowDataAnchors, flowDataIconRect, flowDataTextRect); registerNode('flowSubprocess', flowSubprocess, null, flowSubprocessIconRect, flowSubprocessTextRect); registerNode('flowDb', flowDb, null, flowDbIconRect, flowDbTextRect); registerNode('flowDocument', flowDocument, flowDocumentAnchors, flowDocumentIconRect, flowDocumentTextRect); // ... // 下面是簡單的註冊函數介紹,詳情請參考api文檔 // registerNode: 註冊一個自定義圖形節點node. // name - node名稱. // drawFn - node渲染函數。傳入canvas ctx和node數據,本身決定如何繪畫node // anchorsFn - 計算node的錨點,若是爲null,表示使用缺省計算錨點方法 // iconRectFn - 計算node的圖標區域,若是爲null,表示使用缺省計算圖標區域方法 // textRectFn - 計算node的文字區域,若是爲null,表示使用缺省計算文字區域方法 // force - 若是已經存在同名node,是否覆蓋. export function registerNode( name: string, drawFn: (ctx: CanvasRenderingContext2D, node: Node) => void, anchorsFn?: (node: Node) => void, iconRectFn?: (node: Node) => void, textRectFn?: (node: Node) => void, force?: boolean );
參考開發文檔:https://www.yuque.com/alsmile...微信
微信: alsmile123
微信討論羣:(下圖7天有效,若是失效,請點擊此連接打開在線二維碼圖片)