mxgraph使用文檔

概述

mxGraph是一個(gè)JS繪圖組件適用于需要在網(wǎng)頁(yè)中設(shè)計(jì)/編輯Workflow/BPM流程圖、圖表、網(wǎng)絡(luò)圖和普通圖形的Web應(yīng)用程序。mxgraph下載包中包括用javascript寫的前端程序旗芬。

學(xué)習(xí)路徑

API:http://jgraph.github.io/mxgraph/docs/js-api/files/index-txt.html
demo:http://jgraph.github.io/mxgraph/javascript/index.html

例子

liuchengtu.png

wall.png

安裝

npm install mxgraph

引入

首先要聲名一個(gè)全局變量 mxBasePath 指向一個(gè)路徑,然后引入 mxGraph捆蜀。mxBasePath 指向的路徑作為 mxGraph 的靜態(tài)資源路徑疮丛。

import mx from 'mxgraph';
const mxgraph = mx({
    mxImageBasePath: './src/images',
    mxBasePath: './src'
});
export default mxgraph;

在使用的組件頁(yè)面引入mxgraph

import mxgraph from '@/util/mxgraph'

使用解構(gòu)的方式按照需求引入需要的模塊

const { mxGraph, mxUtils, mxEvent } = mxgraph

檢查瀏覽器

代碼的第一部分是檢查瀏覽器是否支持mxgraph,如果瀏覽器不支持就能在此顯示錯(cuò)誤信息辆它。
對(duì)于主函數(shù)function main(){}沒有什么特殊的規(guī)定誊薄。function引用頭部加載的文件,并且可以有任何名稱包含任何參數(shù)娩井。在這個(gè)例子中參數(shù)是body中的dom節(jié)點(diǎn)

<script type="text/javascript";>
function main(container)
{
  // Checks if the browser is supported
//檢查瀏覽器是否支持
  if (!mxClient.isBrowserSupported())
  {
    // Displays an error message if the browser is not supported.
//如果瀏覽器不支持暇屋,則顯示錯(cuò)誤信息
    mxUtils.error('Browser is not supported!', 200, false);
  }
Container 容器

頁(yè)面用一個(gè)dom節(jié)點(diǎn)將graph與javascript結(jié)合。它可以使用document.getElementById在body中取得或者直接動(dòng)態(tài)創(chuàng)建(如createElement)洞辣。如果你想讓容器中有滾動(dòng)條咐刨,那么將容器樣式的屬性 overflow 設(shè)為auto昙衅。

let container = document.createElement("div");
      container.style.position = "absolute";
      container.style.overflow = "hidden";
      container.style.left = "0px";
      container.style.top = "0px";
      container.style.right = "0px";
      container.style.bottom = "0px";
Graph 圖

代碼創(chuàng)建了一個(gè)空的graph圖模型并通過容器和空的模型來(lái)構(gòu)建具體的圖

var model = new mxGraphModel();
var graph = new mxGraph(container, model);

如果你希望graph圖只讀,可用 graph.setEnabed(false)
常用屬性:

graph.setCellsEditable(true);//單元格是否可編輯
graph.setCellsResizable(false);//是否可調(diào)整大小
graph.setConnectable(false);//是否可以連接
graph.setCellsMovable(true);//是否可以移動(dòng)
graph.setAutoSizeCells(true);//是否可以自動(dòng)調(diào)節(jié)大小
graph.setPanning(true);//移動(dòng)鏡頭  
graph.connectionHandler.setCreateTarget(true);//是否創(chuàng)建目標(biāo)
graph.setAllowLoops(true);// 允許連線的目標(biāo)和源是同一元素
graph.setVertexLabelsMovable(true);// 允許移動(dòng) Vertex 的 Label
mxGraphHandler.prototype.guidesEnabled = true;//顯示細(xì)胞位置標(biāo)尺  
/*禁用節(jié)點(diǎn)雙擊定鸟,防止改變數(shù)據(jù) */  
graph.dblClick = function (evt, cell)
 {        
   var model = graph.getModel();   
        if (model.isVertex(cell)) 
{       
            return false;     
     }  }; 
 //重寫方法不允許那條線(edge)可以編輯    
graph.isCellEditable = function(cell)  
{   
 return !this.getModel().isEdge(cell)&&!this.getModel().isVertex(cell);  
  };
Vertices (節(jié)點(diǎn))and Edges(連線)

程序需要在beginUpdate和endUpdate中來(lái)插入節(jié)點(diǎn)和連線(更新圖形)而涉。endUpdate應(yīng)放在finally-block中以確保endUpdate一直執(zhí)行。但beginUpdate不能在try-block中联予,這樣如果beginUpdate失敗那么endupdate永遠(yuǎn)不會(huì)執(zhí)行啼县。 塊內(nèi)的部分為圖形創(chuàng)建節(jié)點(diǎn)和連線。默認(rèn)的父節(jié)點(diǎn)是在用graph時(shí)無(wú)需參數(shù)自動(dòng)創(chuàng)建在圖中根節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)

//為插入節(jié)點(diǎn)獲得默認(rèn)的父節(jié)點(diǎn)沸久。
 //這通常是根節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)
var parent = graph.getDefaultParent();
// Adds cells to the model in a single step
//在單獨(dú)的一步中添加cell
model.beginUpdate();
try
{
  var v1 = graph.insertVertex(parent, null, 'Hello,', 20, 20, 80, 30);
  var v2 = graph.insertVertex(parent, null, 'World!', 200, 150, 80, 30);
  var e1 = graph.insertEdge(parent, null, '', v1, v2);
}
finally
{
  // Updates the display
//更新顯示
  model.endUpdate();
} 
Stylesheet 樣式表

cell的樣式由樣式表(mxStylesheet的實(shí)例)來(lái)決定季眷。樣式表規(guī)定了樣式名稱到樣式之間的映射關(guān)系。一個(gè)樣式是一個(gè)鍵的數(shù)組卷胯。那些鍵對(duì)應(yīng)所用cell的值子刮。值在mxConstants中定義,可以是字符串和數(shù)字窑睁、javascript對(duì)象挺峡、函數(shù)等 。 修改節(jié)點(diǎn)和連線的默認(rèn)樣式

var vertexStyle = graph.getStylesheet().getDefaultVertexStyle();
vertexStyle[mxConstants.ROUNDED] = true;
var edgeStyle = graph.getStylesheet().getDefaultEdgeStyle();
edgeStyle[mxConstants.STYLE_EDGE] = mxEdgeStyle.TopToBottom;

Styles 樣式

cell的樣式在屬性style中(cell.style)担钮。樣式是cell狀態(tài)的一部分橱赠,它可以通mxGraphModel.setStyle來(lái)改變。style是form[stylename;|key=value;]中的一段字符串箫津。默認(rèn)樣式可覆蓋此cell的制定鍵值狭姨。例如:你用 rounded 樣式,它可以覆蓋 stroke和fillColor

單個(gè)樣式
1.字體相關(guān)
fontColor # 顏色
fontSize # 字體大小
fontFamily # 字體庫(kù)
fontStyle # 字體樣式
textDirection # 文本書寫方向
align # 水平對(duì)齊
verticalAlign # 垂直對(duì)齊
2.標(biāo)簽相關(guān)
labelWidth # 寬
labelPosition # 水平位置
verticalLabelPosition # 垂直位置
noLabel # 不顯示標(biāo)簽
labelBackgroundColor # 背景顏色
labelBorderColor # 邊框顏色
labelPadding # 標(biāo)簽文字和邊框之間的距離
spacing # 標(biāo)簽與頂點(diǎn)的間距
spacingLet # 標(biāo)簽與頂點(diǎn)的左間距
spacingBottom # 標(biāo)簽與頂點(diǎn)的下間距
spacingRight # 標(biāo)簽與頂點(diǎn)的右間距
spacingTop # 標(biāo)簽與頂點(diǎn)的上間距
3.頂點(diǎn)相關(guān)
fillColor # 填充顏色
strokeColor # 描邊顏色
strokeWidth # 描邊線寬
dashed # 虛線邊
dashPattern # 虛線點(diǎn)大小和間距
rounded # 圓角
arcSize # 圓角大小
glass # 玻璃按鈕
4.邊相關(guān)
perimeterSpacing # 周邊間距的關(guān)鍵點(diǎn)
sourcePerimeterSpacing # 邊與源關(guān)鍵點(diǎn)周邊間距
targetPerimeterSpacing # 邊與目標(biāo)關(guān)鍵點(diǎn)周邊間距

例:

var v1 = graph.insertVertex(parent, null, 'Hello',  20, 20, 80, 30, 'rounded;strokeColor=red;fillColor=green');
全局設(shè)置
1.設(shè)置vertex的style
var style = new Object();
style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_RECTANGLE;
style[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter;
style[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER;
style[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE;
style[mxConstants.STYLE_GRADIENTCOLOR] = '#41B9F5';
style[mxConstants.STYLE_FILLCOLOR] = '#8CCDF5';
style[mxConstants.STYLE_STROKECOLOR] = '#1B78C8';
style[mxConstants.STYLE_FONTCOLOR] = '#000000';
style[mxConstants.STYLE_ROUNDED] = true;
style[mxConstants.STYLE_OPACITY] = '80';
style[mxConstants.STYLE_FONTSIZE] = '12';
style[mxConstants.STYLE_FONTSTYLE] = 0;
style[mxConstants.STYLE_IMAGE_WIDTH] = '48';
style[mxConstants.STYLE_IMAGE_HEIGHT] = '48';
graph.getStylesheet().putDefaultVertexStyle(style);
2.設(shè)置edge的style
style = graph.getStylesheet().getDefaultEdgeStyle();
style[mxConstants.STYLE_LABEL_BACKGROUNDCOLOR] = '#FFFFFF';
style[mxConstants.STYLE_STROKEWIDTH] = '2';
style[mxConstants.STYLE_ROUNDED] = true;
style[mxConstants.STYLE_EDGE] = mxEdgeStyle.SegmentConnector;
3.設(shè)置cell的 style
style = new Object();
style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_SWIMLANE;
style[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter;
style[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER;
style[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_TOP;
style[mxConstants.STYLE_FILLCOLOR] = '#FF9103';
style[mxConstants.STYLE_GRADIENTCOLOR] = '#F8C48B';
style[mxConstants.STYLE_STROKECOLOR] = '#E86A00';
style[mxConstants.STYLE_FONTCOLOR] = '#000000';
style[mxConstants.STYLE_ROUNDED] = true;
style[mxConstants.STYLE_OPACITY] = '80';
style[mxConstants.STYLE_STARTSIZE] = '30';
style[mxConstants.STYLE_FONTSIZE] = '16';
style[mxConstants.STYLE_FONTSTYLE] = 1;
graph.getStylesheet().putCellStyle('group', style);

屬性選項(xiàng)值

  • mxgraph 提供的圖形
SHAPE_RECTANGLE: 'rectangle'
SHAPE_ELLIPSE: 'ellipse'
SHAPE_DOUBLE_ELLIPSE: 'doubleEllipse'
SHAPE_RHOMBUS: 'rhombus'
SHAPE_LINE: 'line'
SHAPE_IMAGE: 'image'
SHAPE_ARROW: 'arrow'
SHAPE_ARROW_CONNECTOR: 'arrowConnector'
SHAPE_LABEL: 'label'
SHAPE_CYLINDER: 'cylinder'
SHAPE_SWIMLINE: 'swimlane'
SHAPE_CONNECTOR: 'connector'
SHAPE_ACTOR: 'actor'
SHAPE_CLOUD: 'cloud'
SHAPE_TRIANGLE: 'triangle'
SHAPE_HEXAGON: 'hexagon'
image.png
  • 線連接樣式
EDGESTYLE_ELBOW: 'elbowEdgeStyle'
EDGESTYLE_ENTITY_RELATION: 'entityRelationEdgeStyle'
EDGESTYLE_LOOP: 'loopEdgeStyle'
EDGESTYLE_SIDETOSIDE: 'sideToSideEdgeStyle'
EDGESTYLE_TOPTOBOTTOM: 'topToBottomEdgeStyle'
EDGESTYLE_ORTHOGONAL: 'orthogonalEdgeStyle'
EDGESTYLE_SEGMENT: 'segmentEdgeStyle'

// elbowEdgeStyle 方向?qū)傩?STYLE_ELBOW: 'elbow'
ELBOW_VERTICAL: 'vertical'
ELBOW_HORIZONTAL: 'horizontal'
  • 邊箭頭樣式
ARROW_CLASSIC: 'classic'
ARROW_CLASSIC_THIN: 'classicThin'
ARROW_BLOCK: 'block'
ARROW_BLOCK_THIN: 'blockThin'
ARROW_OPEN: 'open'
ARROW_OPEN_THIN: 'openThin'
ARROW_OVAL: 'oval'
ARROW_DIMAND: 'diamond'
ARROW_DIMAND_THIN: 'diamondThin'
  • 文字樣式
涉及 STYLE_FONTSTYLE

FONT_BOLD: 1
FONT_ITALIC: 2
FONT_UNDERLINE: 4
  • 文本對(duì)齊
涉及 STYLE_ALIGN鲤嫡、STYLE_VERTICAL_ALIGN送挑、STYLE_LABEL_ALIGN、STYLE_VERTICAL_LABEL_ALIGN

ALIGN_LET: 'left'
ALITGN_CENTER: 'center'
ALIGN_RIGHT: 'right'
ALIGN_TOP: 'top'
ALIGN_MIDDLE: 'middle'
ALIGN_BOTTOM: 'bottom'
  • 文本書寫方向
涉及 STYLE_TEXT_DIRECTION

TEXT_DIRECTION_AUTO: 'auto'
TEXT_DIRECTION_LTR: 'ltr'
TEXT_DIRECTION_RTL: 'rtl'
  • 圖形的方向
涉及 STYLE_DIRECTION

DIRECTION_NORTH : 'north'
DIRECTION_SOUTH: 'south'
DIRECTION_EAST: 'east'
DIRECTION_WEST: 'west'
  • 周長(zhǎng)相關(guān)
涉及 STYLE_PERIMETER

PERIMETER_ELLIPSE: 'ellipsePerimeter'
PERIMETER_RECTANGLE: 'rectangelPerimeter'
PERIMETER_RHOMBUS: 'rhombusPerimeter'
PERIMETER_HEXAGON: 'hexagonPerimeter'
PERIMETER_TRIANGLE: 'trianglePerimater'

拓展

還可以自定圖形暖眼,替換原有的圖形或者形狀

let style = this.getPrefix(type) + "labelPosition=right";
            const v = graph.insertVertex(
              parent,
              null,
              current,
              1,
              0,
              60,
              60,
              style
            );
 getPrefix(type) {
      let prefix;
      if (type === "xxx") {
        prefix = "shape=image;image=/img/icons/firewall.svg;";
      }
      return prefix;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惕耕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诫肠,更是在濱河造成了極大的恐慌司澎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栋豫,死亡現(xiàn)場(chǎng)離奇詭異挤安,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丧鸯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蛤铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事围肥〗烁桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵穆刻,是天一觀的道長(zhǎng)置尔。 經(jīng)常有香客問我,道長(zhǎng)氢伟,這世上最難降的妖魔是什么榜轿? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮朵锣,結(jié)果婚禮上谬盐,老公的妹妹穿的比我還像新娘。我一直安慰自己诚些,他們只是感情好设褐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泣刹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犀被。 梳的紋絲不亂的頭發(fā)上椅您,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音寡键,去河邊找鬼掀泳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛西轩,可吹牛的內(nèi)容都是我干的员舵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼藕畔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼马僻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起注服,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤韭邓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溶弟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體女淑,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年辜御,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸭你。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袱巨,靈堂內(nèi)的尸體忽然破棺而出阁谆,到底是詐尸還是另有隱情,我是刑警寧澤瓣窄,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布笛厦,位于F島的核電站,受9級(jí)特大地震影響俺夕,放射性物質(zhì)發(fā)生泄漏裳凸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一劝贸、第九天 我趴在偏房一處隱蔽的房頂上張望姨谷。 院中可真熱鬧,春花似錦映九、人聲如沸梦湘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捌议。三九已至,卻和暖如春引有,著一層夾襖步出監(jiān)牢的瞬間瓣颅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工譬正, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宫补,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓曾我,卻偏偏與公主長(zhǎng)得像粉怕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抒巢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容