Vue3使用AntvG6寫拓撲圖,可添加修改刪除節點和邊

npm安裝antv/g6

npm install @antv/g6 --save

上代碼

<template><div id="tpt1" ref="container" style="width: 100%;height: 100%;"></div>
</template><script setup>import { Renderer as SVGRenderer } from '@antv/g-svg';//通過svg方式呈現import { Graph,iconfont } from '@antv/g6';import { onMounted, onUnmounted, ref,nextTick,computed } from 'vue';const container = ref();const nodes = ref([{ id: '1', style: { x: 550, y: 100 },data:{id:'1',name:"wifi路由器",type:"路由器"} }//數據格式])const edges = ref([{ id:'1-3-g1',source: '1', target: '3',data:{id:1,name:"線路1",status:0,outRate:"80MB/s",inRate:"50MB/s",scoureName:"url",scoureType:"",scoureUrl:"",targetName:"http",targetType:"",targetUrl:"",watchDevice:"",watchUrl:""} }//數據格式])let graph:any = nullonMounted(() => {updateChart();})onUnmounted(() => {graph && graph.clear();});//獲取所有節點const getNodeData = () => {return graph.getNodeData()}//獲取所有邊const getEdgeData = () => {return graph.getEdgeData()}//獲取縮放比例const getZoom = () => {return graph.getZoom();}const updateChart = () => {const style = document.createElement('style');style.innerHTML = `@import url(${iconfont.css});`;document.head.appendChild(style);graph = new Graph({container: container.value,data: {nodes: nodes.value,edges: edges.value,},edge: {// type:"extra-label-edge",style: {//線條的樣式cursor: 'pointer',lineWidth: 1,labelText: (d:any) => {// 改變邊上的第一行第二行顏色nextTick(()=>{let parentElement = document.getElementById(d.id)let tspanList = parentElement.getElementsByTagName("tspan")setTimeout(()=>{if(tspanList.length>=2){tspanList[0].setAttribute("fill","#81f4f9")tspanList[1].setAttribute("fill","#eca13c")}})})return props.isEdit||(d.data.outRate==''&&d.data.inRate=='')?'':`?${d.data.outRate}\n?${d.data.inRate}`;},data:(d)=>{return d.data},endArrow: props.isEdit?true:false,endArrowType: (d) => d.id.split('-')[0],increasedLineWidthForHitTesting:10,stroke: '#83d6dc',labelAutoRotate:true,//是否旋轉與邊一致labelFill: '#fff',labelFontSize: 11,labelPadding:[3,7],zIndex:2},},transforms: [{type:"process-parallel-edges",mode:"bundle",distance: 50}],node: {type: 'image',style:{padding:[10,10],size: [60,60],labelText: (d:any) => {return d.data.name;},src: (d)=>{//通過類型自定義節點圖片let imgArr:any = {"交換機":"tpt_jhj.png","路由器":"tpt_lyq.png","安全設備":"tpt_fhq.png","其他設備":"tpt_qt.png",}return (d.data.type?getImageUrl(imgArr[d.data.type]):getImageUrl('tpt_qt.png')) || getImageUrl('tpt_qt.png')},data:(d)=>{return d.data},labelPosition: 'bottom',labelFill: '#fff',labelFontSize: 13,labelBackground: false,//背景顏色labelBackgroundFill: 'linear-gradient(#e66465, #9198e5)',labelBackgroundStroke: '#9ec9ff',labelBackgroundRadius: 2,labelFontWeight: 600,labelPadding:[3,10],zIndex:3,labelOffsetY:8,badge: false, // 是否顯示徽標badges: [{ text: 'x', placement: 'right-top',padding:[2,5] },],badgePalette: ['red'], // 徽標的背景色板badgeFontSize: 10, // 徽標字體大小}},behaviors: [{type:'zoom-canvas'//縮放},{type: 'drag-canvas',key: 'drag-canvas-1',},{type:"drag-element",key: 'drag-element-1',enableAnimation:false,shadow:false//拖動樣式},{type: 'create-edge',key:"create-edge-1",trigger: 'click',//dragonCreate: (edge) => {//創建線的樣式const { style, ...rest } = edge;return {...rest,data:{name:"",status:0,scoureName:"",scoureType:"",scoureUrl:"",targetName:"",targetType:"",targetUrl:"",watchDevice:"",watchUrl:"",inRate:"",outRate:"",},style: {...style,stroke: 'red',lineWidth: 2,endArrow: true,},};},},],renderer: () => new SVGRenderer(),});graph.render();//鼠標右鍵點擊節點編輯graph.on('node:contextmenu', (e) => {//添加編輯設備不為0是修改form.value = e.target.config.style.datasubmitNode();});}//添加設備按鈕const addNode = () => {form.value.id = 0submitNode();}//添加修改節點const submitNode = () => {if(form.value.id == 0){//添加nodes.value = graph.getNodeData();graph.addData({nodes:[{id: nodes.value.length>0?`${graph.getNodeData().length+1}`:"1",style:{ x: container.value.clientWidth/2, y: 30 },data:{id:nodes.value.length>0?`${graph.getNodeData().length+1}`:"1",name:form.value.name,type:form.value.type}}]})}else{graph.updateNodeData([{id:form.value.id,data:form.value}])}graph.render();}
</script>

運行結果

不斷更新

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Arduino編譯和燒錄STM32——基于J-link SWD模式

一、安裝Stm32 Arduino支持 在arduino中添加stm32的開發板地址&#xff1a;https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json 安裝stm32開發板支持 二、安裝STM32CubeProgrammer 從stm32網站中安裝&#xff1a;https://ww…

智慧城市氣象中臺架構:多源天氣API網關聚合方案

在開發與天氣相關的應用時&#xff0c;獲取準確的天氣信息是一個關鍵需求。萬維易源提供的“天氣預報查詢”API為開發者提供了一個高效、便捷的工具&#xff0c;可以通過簡單的接口調用查詢全國范圍內的天氣信息。本文將詳細介紹如何使用該API&#xff0c;以及其核心功能和調用…

Vue 組件化開發

引言 在當今的 Web 開發領域&#xff0c;構建一個功能豐富且用戶體驗良好的博客是許多開發者的目標。Vue.js 作為一款輕量級且高效的 JavaScript 框架&#xff0c;其組件化開發的特性為我們提供了一種優雅的解決方案。通過將博客拆分成多個獨立的組件&#xff0c;我們可以提高代…

Deno 統一 Node 和 npm,既是 JS 運行時,又是包管理器

Deno 是一個現代的、一體化的、零配置的 JavaScript 運行時、工具鏈&#xff0c;專為 JavaScript 和 TypeScript 開發設計。目前已有數十萬開發者在使用 Deno&#xff0c;其代碼倉庫是 GitHub 上 star 數第二高的 Rust 項目。 Stars 數102620Forks 數5553 主要特點 內置安全性…

應用篇02-鏡頭標定(上)

本節主要介紹相機的標定方法&#xff0c;包括其內、外參數的求解&#xff0c;以及如何使用HALCON標定助手實現標定。 計算機視覺——相機標定(Camera Calibration)_攝像機標定-CSDN博客 1. 原理 本節介紹與相機標定相關的理論知識&#xff0c;不一定全&#xff0c;可以參考相…

PG CTE 遞歸 SQL 翻譯為 達夢版本

文章目錄 PG SQLDM SQL總結 PG SQL with recursive result as (select res_id,phy_res_code,res_name from tbl_res where parent_res_id (select res_id from tbl_res where phy_res_code org96000#20211203155858) and res_type_id 1 union all select t1.res_id, t1.p…

C# Where 泛型約束

在C#中&#xff0c;Where關鍵字主要有兩種用途 1、在泛型約束中限制類型參數 2、在LINQ查詢中篩選數據 本文主要介紹where關鍵字在在泛型約束中的使用 泛型定義中的 where 子句指定對用作泛型類型、方法、委托或本地函數中類型參數的參數類型的約束。通過使用 where 關鍵字和…

《MySQL:MySQL表的約束-主鍵/復合主鍵/唯一鍵/外鍵》

表的約束&#xff1a;表中一定要有各種約束&#xff0c;通過約束&#xff0c;讓未來插入數據庫表中的數據是符合預期的。約束本質是通過技術手段&#xff0c;倒逼程序員插入正確的數據。即&#xff0c;站在mysql的視角&#xff0c;凡是插入進來的數據&#xff0c;都是符合數據約…

Qt 創建QWidget的界面庫(DLL)

【1】新建一個qt庫項目 【2】在項目目錄圖標上右擊&#xff0c;選擇Add New... 【3】選擇模版&#xff1a;Qt->Qt設計師界面類&#xff0c;選擇Widget&#xff0c;填寫界面類的名稱、.h .cpp .ui名稱 【4】創建C調用接口&#xff08;默認是創建C調用接口&#xff09; #ifnd…

汽車免拆診斷案例 | 2011款雪鐵龍世嘉車刮水器偶爾自動工作

故障現象 一輛2011款雪鐵龍世嘉車&#xff0c;搭載1.6 L 發動機&#xff0c;累計行駛里程約為19.8萬km。車主反映&#xff0c;該車刮水器偶爾會自動工作&#xff0c;且前照燈偶爾會自動點亮。 故障診斷 接車后試車發現&#xff0c;除了上述故障現象以外&#xff0c;當用遙控器…

【Linux】NAT、代理服務、內網穿透

NAT、代理服務、內網穿透 一. NAT1. NAT 技術2. NAT IP 轉換過程3. NAPT 技術4. NAT 技術的缺陷 二. 代理服務器1. 正向代理2. 反向代理3. NAT 和代理服務器 內網穿透內網打洞 一. NAT NAT&#xff08;Network Address Translation&#xff0c;網絡地址轉換&#xff09;技術&a…

MobaXterm連接Ubuntu(SSH)

1.查看Ubuntu ip 打開終端,使用指令 ifconfig 由圖可知ip地址 2.MobaXterm進行SSH連接 點擊session,然后點擊ssh,最后輸入ubuntu IP地址以及用戶名

Spring Boot系列之使用Arthas Tunnel Server 進行遠程調試實踐

Spring Boot系列之使用Arthas Tunnel Server 進行遠程調試實踐 前言 在開發和運維 Java 應用的過程中&#xff0c;遠程診斷和調試是一個不可或缺的需求。尤其是當生產環境出現問題時&#xff0c;能夠快速定位并解決這些問題至關重要。Arthas 是阿里巴巴開源的一款強大的 Java…

圖像預處理-添加水印

一.ROI切割 類似裁剪圖片&#xff0c;但是原理是基于Numpy數組的切片操作(ROI數組切片是會修改原圖數據的)&#xff0c;也就是說這個“裁剪”不是為了保存“裁剪”部分&#xff0c;而是為了方便修改等處理。 import cv2 as cv import numpy as npimg cv.imread(../images/dem…

數據結構——八大排序算法

排序在生活中應用很多&#xff0c;對數據排序有按成績&#xff0c;商品價格&#xff0c;評論數量等標準來排序。 數據結構中有八大排序&#xff0c;插入、選擇、快速、歸并四類排序。 目錄 插入排序 直接插入排序 希爾排序 選擇排序 堆排序 冒泡排序 快速排序 hoare…

吃透LangChain(五):多模態輸入與自定義輸出

多模態數據輸入 這里我們演示如何將多模態輸入直接傳遞給模型。我們目前期望所有輸入都以與OpenAl 期望的格式相同的格式傳遞。對于支持多模態輸入的其他模型提供者&#xff0c;我們在類中添加了邏輯以轉換為預期格式。 在這個例子中&#xff0c;我們將要求模型描述一幅圖像。 …

【Rust 精進之路之第10篇-借用·規則】引用 (``, `mut`):安全、高效地訪問數據

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025年4月20日 引言:所有權的“限制”與“變通”之道 在上一篇【所有權核心】中,我們揭示了 Rust 如何通過所有權規則和移動 (Move) 語義來保證內存安全,避免了垃圾回收器的同時,也防止了諸…

劍指Offer(數據結構與算法面試題精講)C++版——day16

劍指Offer&#xff08;數據結構與算法面試題精講&#xff09;C版——day16 題目一&#xff1a;序列化和反序列化二叉樹題目二&#xff1a;從根節點到葉節點的路徑數字之和題目三&#xff1a;向下的路徑節點值之和附錄&#xff1a;源碼gitee倉庫 題目一&#xff1a;序列化和反序…

OpenCV 模板與多個對象匹配方法詳解(繼OpenCV 模板匹配方法詳解)

文章目錄 前言1.導入庫2.圖片預處理3.輸出模板圖片的寬和高4.模板匹配5.獲取匹配結果中所有符合閾值的點的坐標5.1 threshold 0.9&#xff1a;5.2 loc np.where(res > threshold)&#xff1a; 6.遍歷所有匹配點6.1 loc 的結構回顧6.2 loc[::-1] 的作用6.2.1 為什么需要反轉…

產品經理學習過程

一&#xff1a;掃盲篇&#xff08;初始產品經理&#xff09; 階段1&#xff1a;了解產品經理 了解產品經理是做什么的、產品經理的分類、產品經理在實際工作中都會接觸什么樣的崗位、以及產品經理在實際工作中具體要做什么事情。 二&#xff1a;準備篇 階段2&#xff1a;工…