From f719b59be68518d10836fc6ba492b21174c11dd0 Mon Sep 17 00:00:00 2001 From: heimawl <1785969728@qq.com> Date: 星期一, 07 八月 2023 16:50:43 +0800 Subject: [PATCH] 11 --- src/views/patient/viewvant/RightDrawer.vue | 331 +++++++++++++++++++ src/views/patient/viewvant/index.scss | 102 ++++++ src/views/import/index.vue | 2 src/views/patient/viewvant/Graph/methods.js | 152 ++++++++ src/views/patient/viewvant/index.vue | 319 ++++++++++++++++++ src/views/patient/viewvant/iconfont.css | 61 +++ src/components/PageTools/index.vue | 2 7 files changed, 960 insertions(+), 9 deletions(-) diff --git a/src/components/PageTools/index.vue b/src/components/PageTools/index.vue index 5861bf4..c8a7cf3 100644 --- a/src/components/PageTools/index.vue +++ b/src/components/PageTools/index.vue @@ -39,4 +39,4 @@ }; </script> -<style lang="less" scoped></style> +<style lang="scss" scoped></style> diff --git a/src/views/import/index.vue b/src/views/import/index.vue index 2ff68b3..6ee840d 100644 --- a/src/views/import/index.vue +++ b/src/views/import/index.vue @@ -52,4 +52,4 @@ }; </script> -<style lang="less" scoped></style> +<style lang="scss" scoped></style> diff --git a/src/views/patient/viewvant/Graph/methods.js b/src/views/patient/viewvant/Graph/methods.js new file mode 100644 index 0000000..2065bd2 --- /dev/null +++ b/src/views/patient/viewvant/Graph/methods.js @@ -0,0 +1,152 @@ +import '@antv/x6-vue-shape'; +import { Graph,Shape,Addon,FunctionExt} from '@antv/x6' +// 鎷栨嫿鐢熸垚鍥涜竟褰㈡垨鑰呭渾褰� +export const startDragToGraph = (graph,type,e) =>{ + const node = + type === 'Rect' + ? graph.createNode({ + width: 100, + height: 60, + attrs: { + label: { + text: '姝f柟褰㈣妭鐐�', + fill: '#000000', + fontSize: 14, + textWrap: { + width: -10, + height: -10, + ellipsis: true + } + }, + body: { + stroke: '#000000', + strokeWidth: 1, + fill: '#ffffff' + } + }, + ports: ports + }) + : type === 'Circle'?graph.createNode({ + shape: 'ellipse', + width: 100, + height: 100, + attrs: { + label: { + text: '鍦嗗舰鑺傜偣', + fill: '#000000', + fontSize: 14, + textWrap: { + width: -20, + height: -10, + ellipsis: true + } + }, + body: { + stroke: '#000000', + strokeWidth: 1, + fill: '#ffffff' + } + }, + ports: ports + }): + graph.createNode({ + shape: 'polygon', + x: 40, + y: 40, + width: 120, + height: 120, + attrs: { + label: { + text: '鏉′欢鑺傜偣', + fill: '#000000', + fontSize: 14, + textWrap: { + width: -50, + height: '70%', + ellipsis: true + } + }, + body: { + fill: '#ffffff', + stroke: '#000000', + refPoints: '0,10 10,0 20,10 10,20', + strokeWidth: 1 + } + }, + ports: ports + }) + const dnd = new Addon.Dnd({target:graph}) + dnd.start(node,e) +} +const ports = { + groups: { + // 杈撳叆閾炬帴妗╃兢缁勫畾涔� + top: { + position: 'top', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#2D8CF0', + strokeWidth: 2, + fill: '#fff', + }, + }, + }, + // 杈撳嚭閾炬帴妗╃兢缁勫畾涔� + bottom: { + position: 'bottom', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#2D8CF0', + strokeWidth: 2, + fill: '#fff', + }, + }, + }, + left: { + position: 'left', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#2D8CF0', + strokeWidth: 2, + fill: '#fff', + }, + }, + }, + right: { + position: 'right', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#2D8CF0', + strokeWidth: 2, + fill: '#fff', + }, + }, + }, + }, + items: [ + { + id: 'port1', + group: 'top', + }, + { + id: 'port2', + group: 'bottom', + }, + { + id: 'port3', + group: 'left', + }, + { + id: 'port4', + group: 'right', + } + ], +} \ No newline at end of file diff --git a/src/views/patient/viewvant/RightDrawer.vue b/src/views/patient/viewvant/RightDrawer.vue new file mode 100644 index 0000000..d9b5175 --- /dev/null +++ b/src/views/patient/viewvant/RightDrawer.vue @@ -0,0 +1,331 @@ +<template> + <div class="drawer_container"> + <div v-if="drawerType === 'grid'"> + <div class="drawer_title">鐢诲竷鑳屾櫙璁剧疆</div> + <div class="drawer_wrap"> + <el-form label-position="left" label-width="85px"> + <el-form-item label="鏄惁鏄剧ず缃戞牸" label-width="100px"> + <el-switch v-model="showGrid" @change="changeGrid" /> + </el-form-item> + <div v-show="showGrid"> + <el-form-item label="缃戞牸绫诲瀷"> + <el-radio-group v-model="grid.type" @change="changeGridType"> + <el-radio + v-for="item in gridTypeList" + :label="item.value" + :key="item.value" + > + <span>{{ item.label }}</span> + </el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label-width="70px" label="缃戞牸澶у皬"> + <el-slider + v-model="grid.size" + :min="0" + :max="30" + @change="changeGrid" + ></el-slider> + </el-form-item> + <el-form-item label="缃戞牸棰滆壊"> + <el-color-picker v-model="grid.args.color" @change="changeGrid" /> + </el-form-item> + <el-form-item label-width="85px" label="缃戞牸绾垮搴�"> + <el-slider + v-model="grid.args.thickness" + :min="0" + :max="20" + @change="changeGrid" + ></el-slider> + </el-form-item> + </div> + </el-form> + </div> + </div> + <div v-if="drawerType === 'node'"> + <div class="drawer_title">浠诲姟鑺傜偣璁剧疆</div> + <div class="drawer_wrap"> + <el-form label-position="left" label-width="80px"> + <el-form-item label="浠诲姟鍚嶇О"> + <el-input + v-model="drawerNode.nodeText" + @change="changeNodeText" + ></el-input> + </el-form-item> + <el-form-item label="浠诲姟鎵ц浜�" label-width="80px"> + <el-input + v-model="drawerNode.nodeText" + @change="changeNodeText" + ></el-input> + </el-form-item> + <el-form-item label="鑺傜偣鑳屾櫙"> + <el-color-picker v-model="drawerNode.fill" @change="changeFill" /> + </el-form-item> + <el-form-item label-width="70px" label="瀛椾綋澶у皬"> + <el-slider + v-model="drawerNode.fontSize" + :min="10" + :max="20" + @change="changefontSize" + ></el-slider> + </el-form-item> + <el-form-item label="瀛椾綋棰滆壊"> + <el-color-picker + v-model="drawerNode.fontFill" + @change="changeFontFill" + /> + </el-form-item> + <el-form-item label-width="70px" label="杈规瀹藉害"> + <el-slider + v-model="drawerNode.strokeWidth" + :min="0" + :max="10" + @change="changeStrokeWidth" + ></el-slider> + </el-form-item> + <el-form-item label="杈规棰滆壊"> + <el-color-picker + v-model="drawerNode.stroke" + @change="changeStroke" + /> + </el-form-item> + <el-form-item label="鍔熻兘"> + <el-button type="primary" icon="el-icon-upload" @click="toTopZIndex" + >缃《</el-button + > + <el-button + type="danger" + class="margin-left-10" + icon="el-icon-delete" + @click="deleteNode" + >鍒犻櫎</el-button + > + </el-form-item> + </el-form> + <el-button + type="success" + class="margin-left-10" + icon="el-icon-download" + @click="exportData" + >淇濆瓨</el-button + > + </div> + </div> + <div v-if="drawerType === 'edge'"> + <div class="drawer_title">绾挎潯璁剧疆</div> + <div class="drawer_wrap"> + <el-form label-position="left" label-width="80px"> + <el-form-item label="绾挎潯鏂囨湰"> + <el-input + v-model="drawerEdge.EdgeText" + @change="changeEdgeText" + ></el-input> + </el-form-item> + <el-form-item label="绾挎潯瀹藉害" label-width="80px"> + <el-slider + v-model="drawerEdge.edgeWidth" + :min="1" + :max="10" + @change="changeEdgeWidth" + ></el-slider> + </el-form-item> + <el-form-item label="绾挎潯棰滆壊"> + <el-color-picker + v-model="drawerEdge.edgeColor" + @change="changeEdgeColor" + /> + </el-form-item> + <el-form-item label="鍔熻兘"> + <el-button type="primary" icon="el-icon-upload" @click="toTopZIndex" + >缃《</el-button + > + <el-button + type="danger" + class="margin-left-10" + icon="el-icon-delete" + @click="deleteNode" + >鍒犻櫎</el-button + > + </el-form-item> + </el-form> + <el-button + type="success" + class="margin-left-10" + icon="el-icon-download" + @click="exportData" + >淇濆瓨</el-button + > + </div> + </div> + </div> +</template> + +<script> +export default { + name: "RightDrawer", + data() { + return { + gridTypeList: [ + { + label: "鍥涜竟缃戞牸", + value: "mesh", + }, + { + label: "鐐圭姸缃戞牸", + value: "dot", + }, + ], + baseData: "", + showGrid: true, + drawerNode: { + fill: "", + nodeText: "", + fontSize: null, + fontFill: "", + strokeWidth: null, + stroke: "", + }, + drawerEdge: { + EdgeText: "", + edgeWidth: null, + edgeColor: "", + }, + }; + }, + props: { + drawerType: { + type: String, + }, + selectCell: { + type: String | Object, + }, + graph: { + type: String | Object, + }, + grid: { + type: Object, + }, + }, + created() {}, + mounted() {}, + watch: { + selectCell: { + handler(val) { + if (val) { + if (val.isNode()) { + //鑺傜偣 + this.drawerNode.fill = val.store.data.attrs.body.fill; + this.drawerNode.nodeText = val.store.data.attrs.label.text; + this.drawerNode.fontFill = val.store.data.attrs.label.fill; + this.drawerNode.fontSize = Number( + val.store.data.attrs.label.fontSize + ); + this.drawerNode.strokeWidth = Number( + val.store.data.attrs.body.strokeWidth + ); + this.drawerNode.stroke = val.store.data.attrs.body.stroke; + } else { + //杈� + this.drawerEdge.EdgeText = val.store.data.labels + ? val.store.data.labels[0].text + : ""; + this.drawerEdge.edgeWidth = Number( + val.store.data.attrs.line.strokeWidth + ); + this.drawerEdge.edgeColor = val.store.data.attrs.line.stroke; + } + } + }, + immediate: true, + deep: false, + }, + }, + methods: { + // 缃戞牸璁剧疆 + changeGrid() { + this.showGrid ? this.graph.showGrid() : this.graph.hideGrid(); + }, + changeGridType(e) { + this.grid.type = e; + this.changeGrid(); + }, + changeGrid() { + this.graph.drawGrid({ + ...this.grid, + }); + }, + // 鑺傜偣璁剧疆 + changeStrokeWidth(val) { + this.selectCell.attr("body/strokeWidth", val); + }, + changefontSize(val) { + this.selectCell.attr("label/fontSize", val); + }, + changeNodeText() { + this.selectCell.attr("label/text", this.drawerNode.nodeText); + }, + changeStroke(val) { + this.drawerNode.stroke = val; + this.selectCell.attr("body/stroke", this.drawerNode.stroke); + }, + changeFontFill(val) { + this.drawerNode.fontFill = val; + this.selectCell.attr("label/fill", this.drawerNode.fontFill); + }, + changeFill(val) { + this.drawerNode.fill = val; + this.selectCell.attr("body/fill", val); + }, + // 杈硅缃� + changeEdgeText() { + console.log(this.drawerEdge.EdgeText); + this.selectCell.setLabels([ + { attrs: { label: { text: this.drawerEdge.EdgeText } } }, + ]); + }, + changeEdgeWidth(val) { + this.drawerEdge.edgeWidth = val; + this.selectCell.attr("line/strokeWidth", this.drawerEdge.edgeWidth); + }, + changeEdgeColor(val) { + this.drawerEdge.stroke = val; + this.selectCell.attr("line/stroke", this.drawerEdge.stroke); + }, + // 缃《 + toTopZIndex() { + this.selectCell.toFront(); + }, + // 鍒犻櫎 + deleteNode() { + this.$emit("deleteNode"); + }, + // 瀵煎嚭鏁版嵁 + exportData() { + this.baseData = this.graph.toJSON(); + console.log(this.baseData); + }, + // 瀵煎叆鏁版嵁 + importData() { + this.graph.fromJSON(this.baseData); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.drawer_container { + max-width: 300px; + min-width: 300px; + .drawer_title { + border-bottom: 1px solid #e8eaec; + box-sizing: border-box; + padding: 14px 16px; + color: #333; + font-size: 16px; + } + .drawer_wrap { + box-sizing: border-box; + padding: 20px 10px 20px 20px; + } +} +</style> diff --git a/src/views/patient/viewvant/iconfont.css b/src/views/patient/viewvant/iconfont.css new file mode 100644 index 0000000..69ffd7b --- /dev/null +++ b/src/views/patient/viewvant/iconfont.css @@ -0,0 +1,61 @@ +@font-face {font-family: "iconfont"; + src: url('//at.alicdn.com/t/font_2431749_zpzhmewttjs.eot?t=1616140304099'); /* IE9 */ + src: url('//at.alicdn.com/t/font_2431749_zpzhmewttjs.eot?t=1616140304099#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('//at.alicdn.com/t/font_2431749_zpzhmewttjs.woff?t=1616140304099') format('woff'), + url('//at.alicdn.com/t/font_2431749_zpzhmewttjs.ttf?t=1616140304099') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('//at.alicdn.com/t/font_2431749_zpzhmewttjs.svg?t=1616140304099#iconfont') format('svg'); /* iOS 4.1- */ + } + + .iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + .icon-straight:before { + content: "\e752"; + } + + .icon-mousepointershubiao:before { + content: "\e6df"; + } + + .icon-ai28:before { + content: "\e68e"; + } + + .icon-baocun:before { + content: "\e60b"; + } + + .icon-Down-Right:before { + content: "\e741"; + } + + .icon-tuozhuai:before { + content: "\e636"; + } + + .icon-circle:before { + content: "\e642"; + } + + .icon-quxian:before { + content: "\e637"; + } + + .icon-square:before { + content: "\e676"; + } + + .icon-shanchu:before { + content: "\e696"; + } + + .icon-jiantou:before { + content: "\e7e2"; + } + \ No newline at end of file diff --git a/src/views/patient/viewvant/index.scss b/src/views/patient/viewvant/index.scss new file mode 100644 index 0000000..efd0921 --- /dev/null +++ b/src/views/patient/viewvant/index.scss @@ -0,0 +1,102 @@ + +.container_warp { + position: relative; + width: 100%; + height: 100vh; + display: flex; + .operating { + position: absolute; + top: 0; + z-index: 99; + background-color: #ffffff; + padding: 20px 10px; + box-shadow: 1px 1px 4px 0 #0a0a0a2e; + } +} + .btn-group { + border-right: 1px solid #efefef; + display: inline-block; + padding-left: 10px; + padding-right: 14px; + position: relative; + .btn-group_tips { + text-align: center; + top: 63px; + left: 1px; + position: absolute; + color: #fff; + display: flex; + align-items: center; + justify-content: center; + width: 120px; + height: 60px; + background: #515a6e; + border-radius: 6px; + animation: tips 4s; + transition: all 1s; + &:after { + content: ""; + width: 0; + height: 0; + position: absolute; + top: -5px; + left: 46%; + border-width: 0 5px 5px; + border-style: solid; + border-color: transparent transparent #515a6e; + } + } + &:last-of-type { + border-right: 0; + } + .btn { + display: inline-block; + margin: 2px; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + cursor: pointer; + transition: all .4s; + border-radius: 6px; + border: 1px solid rgba(233, 233, 233, 0); + i { + font-size: 20px; + } + } + .currentArrow { + background: #2d8cf0; + color: #fff; + } +} + @keyframes tips { + 0% { + opacity: 0; + transform: scale(0); + } + 10% { + opacity: 1; + transform: scale(1); + } + 90% { + opacity: 1; + transform: scale(1); + } + 100% { + opacity: 0; + transform: scale(0); + } +} + .rotate-square { + display: inline-block; + transform: rotate(45deg); +} + .my-snapline { + color: #000; +} + .right_drawer { + height: 100%; + width: 300px; + border-left: 1px solid #eee; + background: #fff; +} \ No newline at end of file diff --git a/src/views/patient/viewvant/index.vue b/src/views/patient/viewvant/index.vue index 4be3d7a..17601b5 100644 --- a/src/views/patient/viewvant/index.vue +++ b/src/views/patient/viewvant/index.vue @@ -1,17 +1,322 @@ <template> - <div>瑙嗗浘</div> + <div class="container_warp"> + <div id="containerChart"></div> + <RightDrawer + class="right_drawer" + :drawerType="type" + :selectCell="selectCell" + :graph="graph" + :grid="grid" + @deleteNode="deleteNode" + ></RightDrawer> + + <div class="operating"> + <div class="btn-group"> + <div + class="btn" + title="鍦嗗舰鑺傜偣" + @mousedown="startDrag('Circle', $event)" + > + <i class="iconfont icon-circle"></i> + </div> + <div + class="btn" + title="姝f柟褰㈣妭鐐�" + @mousedown="startDrag('Rect', $event)" + > + <i class="iconfont icon-square"></i> + </div> + <div class="btn" title="鏉′欢鑺傜偣"> + <i + class="iconfont icon-square rotate-square" + @mousedown="startDrag('polygon', $event)" + ></i> + </div> + <div class="btn-group_tips" v-if="showTips"> + 鎷栨嫿鐢熸垚<br />璧勪骇鎷撴墤鍥惧舰 + </div> + </div> + <div class="btn-group"> + <el-tooltip content="鐩寸嚎绠ご" placement="bottom"> + <div + :class="['btn', currentArrow === 1 ? 'currentArrow' : '']" + @click="changeEdgeType('normal')" + > + <i class="iconfont icon-ai28"></i> + </div> + </el-tooltip> + <el-tooltip content="鏇茬嚎绠ご" placement="bottom"> + <div + :class="['btn', currentArrow === 2 ? 'currentArrow' : '']" + @click="changeEdgeType('smooth')" + > + <i class="iconfont icon-Down-Right"></i> + </div> + </el-tooltip> + <el-tooltip content="鐩磋绠ご" placement="bottom"> + <div + :class="['btn', currentArrow === 3 ? 'currentArrow' : '']" + @click="changeEdgeType()" + > + <i class="iconfont icon-jiantou"></i> + </div> + </el-tooltip> + </div> + <div class="btn-group"> + <el-tooltip content="鍒犻櫎" placement="bottom"> + <div class="btn" @click="deleteNode()" style="margin-top: 5px"> + <i class="iconfont icon-shanchu"></i> + </div> + </el-tooltip> + <el-tooltip content="淇濆瓨PNG" placement="bottom"> + <div class="btn" @click="saveToPNG()" title="淇濆瓨"> + <i class="iconfont icon-baocun"></i> + </div> + </el-tooltip> + </div> + </div> + </div> </template> <script> +import "@antv/x6-vue-shape"; +import { Graph, Shape, Addon, FunctionExt, DataUri } from "@antv/x6"; +import RightDrawer from "./RightDrawer"; +import insertCss from "insert-css"; +import { startDragToGraph } from "./Graph/methods.js"; +const data = {}; export default { data() { - return {}; + return { + graph: "", + value1: true, + type: "grid", + selectCell: "", + connectEdgeType: { + //杩炵嚎鏂瑰紡 + connector: "normal", + router: { + name: "", + }, + }, + showTips: false, + currentArrow: 1, + grid: { + // 缃戞牸璁剧疆 + size: 20, // 缃戞牸澶у皬 10px + visible: true, // 娓叉煋缃戞牸鑳屾櫙 + type: "mesh", + args: { + color: "#D0D0D0", + thickness: 1, // 缃戞牸绾垮搴�/缃戞牸鐐瑰ぇ灏� + factor: 10, + }, + }, + }; }, - - created() {}, - - methods: {}, + components: { + RightDrawer, + }, + methods: { + initX6() { + var _that = this; + this.graph = new Graph({ + container: document.getElementById("containerChart"), + width: 1700, + height: "100%", + grid: _that.grid, + resizing: { + //璋冩暣鑺傜偣瀹介珮 + enabled: true, + orthogonal: false, + }, + selecting: true, //鍙�� + snapline: true, + interacting: { + edgeLabelMovable: true, + }, + connecting: { + // 鑺傜偣杩炴帴 + anchor: "center", + connectionPoint: "anchor", + allowBlank: false, + snap: true, + createEdge() { + return new Shape.Edge({ + attrs: { + line: { + stroke: "#1890ff", + strokeWidth: 1, + targetMarker: { + name: "classic", + size: 8, + }, + strokeDasharray: 0, //铏氱嚎 + style: { + animation: "ant-line 30s infinite linear", + }, + }, + }, + label: { + text: "", + }, + connector: _that.connectEdgeType.connector, + router: { + name: _that.connectEdgeType.router.name || "", + }, + zIndex: 0, + }); + }, + }, + highlighting: { + magnetAvailable: { + name: "stroke", + args: { + padding: 4, + attrs: { + strokeWidth: 4, + stroke: "#6a6c8a", + }, + }, + }, + }, + }); + insertCss(` + @keyframes ant-line { + to { + stroke-dashoffset: -1000 + } + } + `); + this.graph.fromJSON(data); + // 閲嶅仛銆俹ptions 灏嗚浼犻�掑埌浜嬩欢鍥炶皟涓�� + this.graph.history.redo(); + // 鎾ら攢銆俹ptions 灏嗚浼犻�掑埌浜嬩欢鍥炶皟涓� + this.graph.history.undo(); + // 榧犳爣绉诲叆绉诲嚭鑺傜偣 + this.graph.on( + "node:mouseenter", + FunctionExt.debounce(() => { + const container = document.getElementById("containerChart"); + const ports = container.querySelectorAll(".x6-port-body"); + this.showPorts(ports, true); + }), + 500 + ); + // 榧犳爣绉诲紑鑺傜偣 + this.graph.on("node:mouseleave", () => { + const container = document.getElementById("containerChart"); + const ports = container.querySelectorAll(".x6-port-body"); + this.showPorts(ports, false); + }); + // 鍗曞嚮绌虹櫧 + this.graph.on("blank:click", () => { + this.type = "grid"; + }); + // 鍗曞嚮鑺傜偣鎴栬竟 + this.graph.on("cell:click", ({ cell }) => { + this.type = cell.isNode() ? "node" : "edge"; + }); + // 閫変腑鐨勮妭鐐�/杈瑰彂鐢熸敼鍙�(澧炲垹)鏃惰Е鍙戙�� + this.graph.on("selection:changed", (args) => { + args.added.forEach((cell) => { + this.selectCell = cell; + if (cell.isEdge()) { + cell.isEdge() && cell.attr("line/strokeDasharray", 5); //铏氱嚎铓傝殎绾� + cell.addTools([ + { + name: "vertices", + args: { + padding: 4, + attrs: { + strokeWidth: 0.1, + stroke: "#2d8cf0", + fill: "#ffffff", + }, + }, + }, + ]); + } + }); + args.removed.forEach((cell) => { + cell.isEdge() && cell.attr("line/strokeDasharray", 0); //姝e父绾� + cell.removeTools(); + }); + }); + }, + showPorts(ports, show) { + for (let i = 0, len = ports.length; i < len; i = i + 1) { + ports[i].style.visibility = show ? "visible" : "hidden"; + } + }, + // 鎷栨嫿鐢熸垚姝f柟褰㈡垨鑰呭渾褰� + startDrag(type, e) { + startDragToGraph(this.graph, type, e); + }, + // 鍒犻櫎鑺傜偣 + deleteNode() { + const cell = this.graph.getSelectedCells(); + this.graph.removeCells(cell); + this.type = "grid"; + }, + // 淇濆瓨png + saveToPNG() { + this.$nextTick(() => { + this.graph.toPNG( + (dataUri) => { + // 涓嬭浇 + DataUri.downloadDataUri(dataUri, "璧勪骇鎷撴墤鍥�.png"); + }, + { + backgroundColor: "white", + padding: { + top: 50, + right: 50, + bottom: 50, + left: 50, + }, + quality: 1, + copyStyles: false, + } + ); + }); + }, + // 鏀瑰彉杈瑰舰鐘� + changeEdgeType(e) { + if (e === "normal") { + this.connectEdgeType = { + connector: "normal", + router: { name: "" }, + }; + this.currentArrow = 1; + } else if (e === "smooth") { + this.connectEdgeType = { + connector: "smooth", + router: { name: "" }, + }; + this.currentArrow = 2; + } else { + this.connectEdgeType = { + connector: "normal", + router: { name: "manhattan" }, + }; + this.currentArrow = 3; + } + }, + }, + mounted() { + this.initX6(); + setTimeout(() => { + this.showTips = true; + }, 1000); + setTimeout(() => { + this.showTips = false; + }, 5000); + }, }; </script> -<style lang="scss" scoped></style> +<style lang="scss"> +@import "./iconfont.css"; +@import "./index.scss"; +</style> -- Gitblit v1.9.3