VUE使用DXFParser組件解析dxf文件生成圖片的操作代碼
更新時間:2023年09月27日 12:09:27 作者:幸思無聲_東莞
這篇文章主要介紹了VUE使用DXFParser組件解析dxf文件生成圖片的操作代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
<template> <div> <input type="file" @change="handleFileChange" /> </div> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="Control_No" label="序號" width="180" /> <el-table-column prop="Index" label="編號" width="180" /> <el-table-column prop="ID" label="ID" width="180" /> <el-table-column prop="BH" label="編號" width="180" /> <el-table-column prop="Piece_Name" label="部位名稱" width="180" /> <el-table-column prop="data" label="日期" />' <el-table-column label="精品圖片"> <template v-slot="scope"> <!-- 在這里訪問tableData.vertices中的數(shù)據(jù) --> <div id="imageContainer"> <!-- 使用scope.row來獲取當前行的數(shù)據(jù) --> <img :src="generateCanvasImage(scope.row.vertices)" alt="精品圖片" /> </div> </template> </el-table-column> </el-table> </template> <script> import DXFParser from 'dxf-parser'; export default { data() { return { tableData: [], } }, methods: { handleFileChange(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const contents = e.target.result; // const decoder = new TextDecoder('utf-8'); // const decodedContents = decoder.decode(contents); const parser = new DXFParser(); const dxf = parser.parseSync(contents); // 處理解析后的DXF數(shù)據(jù) this.processDXF(dxf); // console.log(this.processDXF(dxf)) }; reader.readAsText(file); // reader.readAsArrayBuffer(file) }, processDXF(dxf) { // 在這里處理解析后的DXF數(shù)據(jù) console.log(dxf); this.tableData.splice(0, this.tableData.length); // 示例:繪制一些圖形到canvas上 console.log(dxf.blocks) // dxf.blocks.forEach((e)=>{ // console.log(e) // }) var Control_No = 1; for (var key in dxf.blocks) { if ('entities' in dxf.blocks[key]) { // console.log(dxf.blocks[key].entities[0].type) for (var i in dxf.blocks[key].entities) { if ("TEXT" === dxf.blocks[key].entities[i].type) { var ver = []; for (var w = 4; w < dxf.blocks[key].entities.length; w++) { if (dxf.blocks[key].entities[w].vertices) { dxf.blocks[key].entities[w].vertices[0].new = true ver = ver.concat(dxf.blocks[key].entities[w].vertices); } } console.log(ver.concat(dxf.blocks[key].entities[5].vertices)) var newItem = { Control_No: Control_No++, Index: key, ID: dxf.blocks[key].entities[0].text, BH: dxf.blocks[key].entities[1].text, Piece_Name: dxf.blocks[key].entities[2].text, vertices: ver, data: dxf.blocks[key].entities[3].text }; this.tableData.push(newItem); // 將新對象添加到tableData數(shù)組中 break; } } } } }, generateCanvasImage(vertices) { // 獲取Canvas元素 var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); // 設(shè)置多邊形的顏色 var color = "#FF0000"; // 十六進制顏色值,例如 16711680 對應的顏色為紅色 // 頂點坐標列表 // 計算圖形的包圍框 var minX = Number.MAX_VALUE; var minY = Number.MAX_VALUE; var maxX = Number.MIN_VALUE; var maxY = Number.MIN_VALUE; for (var i = 0; i < vertices.length; i++) { var vertex = vertices[i]; minX = Math.min(minX, vertex.x); minY = Math.min(minY, vertex.y); maxX = Math.max(maxX, vertex.x); maxY = Math.max(maxY, vertex.y); } // 計算縮放因子 var width = maxX - minX; var height = maxY - minY; var scale = Math.min(canvas.width / width, canvas.height / height); // 繪制多邊形 ctx.beginPath(); ctx.strokeStyle = color; // 設(shè)置描邊顏色 ctx.lineWidth = 1; // 設(shè)置線寬 // 移動到第一個頂點 ctx.moveTo((vertices[0].x - minX) * scale, (vertices[0].y - minY) * scale); // 依次連接頂點 for (var e = 1; e < vertices.length; e++) { if (vertices[e].new === true) { console.log("true"); // 如果條件成立,移動到當前頂點位置,不連接上一次的頂點 ctx.moveTo((vertices[e].x - minX) * scale, (vertices[e].y - minY) * scale); } else { // 否則繼續(xù)連接頂點 ctx.lineTo((vertices[e].x - minX) * scale, (vertices[e].y - minY) * scale); } } // 關(guān)閉多邊形路徑 ctx.closePath(); // 繪制多邊形 ctx.stroke(); // 將Canvas內(nèi)容轉(zhuǎn)換為圖片路徑 var imgDataURL = canvas.toDataURL("image/png"); // 在HTML頁面上顯示圖片 var imgElement = document.createElement("img"); imgElement.src = imgDataURL; return imgElement.src // 將圖片元素添加到頁面中的圖片容器 // var container = document.getElementById("imageContainer"); // container.appendChild(imgElement); } } } </script>
大致效果圖如果大家有疑問歡迎評論我將在更新問題解析!
到此這篇關(guān)于VUE使用DXFParser組件解析dxf文件生成圖片的文章就介紹到這了,更多相關(guān)vue解析dxf文件生成圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3.0監(jiān)聽器watch與watchEffect詳解
在 Vue 3 中,watch 仍然是一種用于監(jiān)聽數(shù)據(jù)變化并執(zhí)行相應操作的方式,不過在組合式 API 中,watch 的使用方式與選項式 API 略有不同,這篇文章主要介紹了Vue3.0監(jiān)聽器watch與watchEffect,需要的朋友可以參考下2023-12-12解讀計算屬性和watch監(jiān)聽的區(qū)別及說明
計算屬性是基于它們的依賴進行緩存的,只有在它的相關(guān)依賴發(fā)生改變時才會重新求值,而watch則是一個更為通用的監(jiān)聽器,它可以在數(shù)據(jù)變化時執(zhí)行異步操作或開銷較大的操作2025-01-01vue-electron使用serialport時問題解決方案
這篇文章主要介紹了vue-electron使用serialport時問題解決方案,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09教你60行代碼實現(xiàn)一個迷你響應式系統(tǒng)vue
這篇文章主要為大家介紹了教你60行代碼實現(xiàn)一個迷你響應式系統(tǒng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-03-03