VUE使用DXFParser組件解析dxf文件生成圖片的操作代碼
更新時間:2023年09月27日 12:09:27 作者:幸思無聲_東莞
這篇文章主要介紹了VUE使用DXFParser組件解析dxf文件生成圖片的操作代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
<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來獲取當(dāng)前行的數(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 對應(yīng)的顏色為紅色
// 頂點坐標(biāo)列表
// 計算圖形的包圍框
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");
// 如果條件成立,移動到當(dāng)前頂點位置,不連接上一次的頂點
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í)行相應(yīng)操作的方式,不過在組合式 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-01
vue-electron使用serialport時問題解決方案
這篇文章主要介紹了vue-electron使用serialport時問題解決方案,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
教你60行代碼實現(xiàn)一個迷你響應(yīng)式系統(tǒng)vue
這篇文章主要為大家介紹了教你60行代碼實現(xiàn)一個迷你響應(yīng)式系統(tǒng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-03-03

