VUE使用DXFParser组件解析dxf文件生成图片

news2024/10/7 20:36:58
<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中的数据 -->
        <div id="imageContainer">
          <!-- 使用scope.row来获取当前行的数据 -->
          <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数据
        this.processDXF(dxf);
        // console.log(this.processDXF(dxf))
      };

      reader.readAsText(file);
      // reader.readAsArrayBuffer(file)
    },

    processDXF(dxf) {
      // 在这里处理解析后的DXF数据
      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数组中
              break;
            }
          }
        }

      }


    },
    generateCanvasImage(vertices) {
      // 获取Canvas元素
      var canvas = document.createElement("canvas");
      var ctx = canvas.getContext("2d");

      // 设置多边形的颜色
      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; // 设置描边颜色
      ctx.lineWidth = 1; // 设置线宽

      // 移动到第一个顶点
      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 {
          // 否则继续连接顶点
          ctx.lineTo((vertices[e].x - minX) * scale, (vertices[e].y - minY) * scale);
        }
      }
      // 关闭多边形路径
      ctx.closePath();

      // 绘制多边形
      ctx.stroke();


      // 将Canvas内容转换为图片路径
      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>

在这里插入图片描述
大致效果图如果大家有疑问欢迎评论我将在更新问题解析!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像处理与计算机视觉--第四章-图像滤波与增强-第一部分

目录 1.灰度图亮度调整 2.图像模板匹配 3.图像裁剪处理 4.图像旋转处理 5.图像邻域与数据块处理 学习计算机视觉方向的几条经验: 1.学习计算机视觉一定不能操之过急&#xff0c;不然往往事倍功半&#xff01; 2.静下心来&#xff0c;理解每一个函数/算法的过程和精髓&…

C语言入门Day_25 函数与指针小结

目录 前言&#xff1a; 1.函数 2.指针 3.易错点 4.思维导图 前言&#xff1a; 函数就像一个“有魔法的加工盒”&#xff0c;你从入口丢一些原材料进去&#xff0c;它就能加工出一个成品。不同的函数能加工出不同的成品。 入口丢进去的瓶子&#xff0c;水和标签就是输入&a…

win使用git(保姆级教程)

序言 上学期间用的git并不多&#xff0c;但是从研三实习以及后面工作来看&#xff0c;git是一项必备技能&#xff0c;所以在此来学习一下。 下载git安装包 打开网站&#xff0c;根据需求来下载&#xff1b;一般按照如下方式进行下载&#xff1a; 然后安装的时候记得按下图勾…

NebulaGraph实战:3-信息抽取构建知识图谱

自动信息抽取发展了几十年&#xff0c;虽然模型很多&#xff0c;但是泛化能力很难用满意来形容&#xff0c;直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核&#xff0c;但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练&am…

32.栈的应用补充-表达式求值

目录 一. 前缀表达式与后缀表达式 二. 中缀表达式转后缀表达式的手算方法 三. 后缀表达式的手算方法 四. 后缀表达式的机算方法 五. 中缀表达式转前缀表达式的手算方法 六. 前缀表达式的机算方法 七. 中缀表达式转后缀表达式的机算方法 八. 中缀表达式的机算 一. 前缀表…

ElementUI首页导航和左侧菜单静态页面的实现,以及Mockjs和总线的介绍

目录 前言 一. Mock.js 1.1 什么是Mock.js 1.2 Mockjs的安装与配置 1.2.1 安装Mock.js 1.2.2 引入Mock.js 1.3 Mockjs的使用 1.3.1 定义数据测试文件 1.3.2 mock拦截ajax请求 二. 首页导航以及左侧菜单的搭建 2.1 什么是总线 2.2 创建三个vue组件 首页AppMain.vue组…

Learn Prompt- Midjourney Prompt:Prompt 提示语

基础结构​ 一个基本的提示可以简单到一个单词、短语或表情符号。非常短的提示将在很大程度上依赖于 Midjourney 的默认样式。 完整 prompt&#xff1a;可以包括一个或多个图像链接、多个文本短语或单词&#xff0c;以及一个或多个后缀参数 Image Prompts: 可以将图像 URL 添加…

Vue中前端导出word文件

很多时候在工作中会碰到完全由前端导出word文件的需求&#xff0c;因此特地记录一下比较常用的几种方式。 一、提供一个word模板 该方法提供一个word模板文件&#xff0c;数据通过参数替换的方式传入word文件中&#xff0c;灵活性较差&#xff0c;适用于简单的文件导出。需要…

Postgresql源码(113)表达式JIT计算简单分析

相关 《Postgresql源码&#xff08;85&#xff09;查询执行——表达式解析器分析&#xff08;select 11如何执行&#xff09;》 《Postgresql源码&#xff08;113&#xff09;表达式JIT计算简单分析》 1 普通表达式计算 普通表达式计算发生在优化器preprocess_expression中&am…

uni-app 使用 scss 实现推荐标签区域显示效果

效果图 <view class"tag-box"><view class"tag-tip"><view>店家</view><view>推荐</view></view> </view> 方法一 只需修改 $tagFontSize(字体大小) 即可 /* 推荐标签区域 */ .tag-box {$tagFontSize:…

uni-app:实现元素中实现竖直居中

效果展示 前&#xff1a; 后&#xff1a; 未实现前代码 <template><view class"container"><view class"centered-element">我是要被居中的元素</view></view> </template><script>export default {data() {r…

算法与数据结构-堆

文章目录 什么是堆如何实现一个堆&#xff1f;如何基于堆实现排序&#xff1f;1. 建堆2. 排序 什么是堆 堆是一种特殊的树&#xff0c;特殊点有二&#xff0c;如下&#xff1a; 堆是一个完全二叉树&#xff1b;堆中每一个节点的值都必须大于等于&#xff08;或小于等于&#…

【Vue】Mock.js介绍和使用与首页导航栏左侧菜单搭建

目录 一、Mock.js 1.1 mockjs介绍 1.2 mock.js安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js的使用 1.3.1 准备模拟数据 1.3.2 定义拦截路由 1.3.3 测试 二、首页导航栏左侧菜单搭建 2.1 自定义界面组件 (完整代码) 2.2 配置路由 2.3 组件显示折叠和…

uniapp ui安装

安装 ui uni-app官网 (dcloud.net.cn) 安装 pages.js配置 使用 <template><view class"bg"><div class"title"><uni-data-selectv-model"value":localdata"range"change"change">asa</uni-da…

GiliSoft USB Lock v10.5.0 电脑USB设备管控软件

网盘下载 软件功能特性 禁止USB / SD驱动器 禁用从USB / SD磁盘读取&#xff0c;禁用写入USB / SD磁盘&#xff0c;阻止非系统分区。它不允许任何类型的USB / SD驱动器访问您的计算机&#xff0c;除非您授权它或它已在可信设备白名单。 CD锁&#xff0c;块媒体和蓝光光盘 禁用…

代码阅读分析神器-Scitools Understand

这里写目录标题 前言概要功能介绍1.代码统计2.图形化分析3.代码检查 使用方法下载及使用 前言 作为一名程序员&#xff0c;阅读代码是一个必须要拥有的能力&#xff0c;但无奈很多代码逻辑嵌套非常多&#xff0c;看起来非常吃力&#xff0c;看了那段逻辑就忘记了刚才的逻辑&am…

Spring实例化源码解析之ComponentScanAnnotationParser(四)

上一章我们分析了ConfigurationClassParser&#xff0c;配置类的解析源码分析。在ComponentScans和ComponentScan注解修饰的候选配置类的解析过程中&#xff0c;我们需要深入的了解一下ComponentScanAnnotationParser的parse执行流程&#xff0c;SpringBoot启动类为什么这么写&…

01 MIT线性代数-方程组的几何解释

一, 线性方程的几何图像 The geometry of linear equations 线性代数的基本问题就是解n元一次方程组 eg&#xff1a;二元一次方程组 矩阵形式: 系数矩阵(coefficient matrix): 未知数向量: 线性方程组简记为Axb 二, 行图像 Row Picture 行图像遵从解析几何的描述&#xff0…

李宏毅hw-10 ——adversarial attack

一、查漏补缺&#xff1a; 1.关于glob.glob的用法&#xff0c;返回一个文件路径的 列表&#xff1a; 当然&#xff0c;再套用1个sort&#xff0c;就是将所有的文件路径按照字母进行排序了 2.relpath relative_path返回相对于基准路径的相对路径的函数 二、代码剖析&#xff…

Pytorch之AlexNet花朵分类

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 目录 一、AlexNet 1.卷积模块 2.全连接模块 3.AlexNet创新点 1.更深的神经…