【工具学习】- Python通过dxfgrabber库获取CAD信息

news2024/11/13 14:31:05

Python - dxfgrabber库获取CAD信息

😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 一个有梦有戏的人 @怒放吧德德
🌝分享学习心得,欢迎指正,大家一起学习成长!

在这里插入图片描述

文章目录

  • Python - dxfgrabber库获取CAD信息
    • 前言
    • dxfgrabber库
      • DXF的内容
        • dxfgrabber中的entities
          • LINE类型的数据
          • CIRCLE类型的数据
          • POLYLINE类型的数据
          • POINT类型的数据
        • dxfgrabber中的layers
        • dxfgrabber中的blocks
      • 案例
        • python代码
        • Java代码
    • 总结

前言

最近需要通过python来获取cad模型的内容信息,然而笔者也没学过python,只能用过查询+动手摸索一步一步进行下去,然后通过dxfgrabber进行本次的学习与实践,在通过Java去执行脚本获取值。以下就是笔者对本次学习与工作的记录。

dxfgrabber库

dxfgrabber 是一个 Python 库,用于读取和解析 AutoCAD DXF(Drawing Exchange Format)文件。DXF 是一种常用的 CAD 文件格式,用于存储和交换二维和三维图形数据。dxfgrabber 提供了一个简单而强大的接口,用于从 DXF 文件中提取图形对象的信息,如线段、圆、多边形、文本等。它可以读取 DXF 文件的实体(entities)、图层(layers)、块(blocks)、属性(attributes)等元素,并提供了方便的方法来访问和操作这些数据。使用 dxfgrabber,你可以编写 Python 脚本来读取和分析 DXF 文件,提取其中的几何信息、属性数据或其他图形元素。这使得你可以轻松地处理和转换 DXF 数据,进行自动化的 CAD 数据处理、生成报告、可视化或其他相关任务。总之,dxfgrabber 是一个方便的工具,使你能够轻松地处理和分析 DXF 文件,从中提取所需的图形和属性信息。

具体内容与api可以看一下官方文档:dxfgrabber — dxfgrabber 1.0.0 documentation

DXF的内容

在解析CAD模型时,我们是通过转成DXF文件,通过对DXF文件进行解析,从而得到所需的数据集。
我们通过读取.dxf文件获得一个dxf对象,这里我准备了一个dxf文件

dxf = dxfgrabber.readfile("D:\\Code\\draft.dxf")

接着我们在下一行打个断点,可以查看读到得文件得对象都有什么属性。
在这里插入图片描述

从Expression中就已经可以之间看到有那些数据了。

dxfgrabber中的entities

先看一下entities,在 dxfgrabber 中,entities 是一个 DXF 文件中所有实体对象的集合。每个实体对象都具有一组特定的属性,可以通过访问这些属性来获取有关实体的信息,他的基类是Shape
通过断点查看属性,但是不管是实体内部还是实体各种类型下的属性,不同的DXF文件可能包含其他自定义属性或应用特定的标准属性,这取决于创建DXF文件的工具和设置。
在这里插入图片描述

但是,不同得图形类型就会呈现不同的数据属性。

LINE类型的数据

首先看一下line类型的数据,通过expression可以看出线形的某些数据,其中start和end是其起始坐标。以及颜色等其他属性。
在这里插入图片描述

这里我调用其方法打印出来每条线的起始位置坐标,这个如果是需要绘制那种特定的路线,那么可以根据他的颜色值来进行判断。如下代码,我通过每个实体的dxftype去判断是何种类型,以下只是判断了线型,并且获取其起点坐标,以及颜色数值。

# -*- coding: utf-8 -*-
import dxfgrabber


def get_line_coordinates():
    dxf = dxfgrabber.readfile("D:\\Code\\draft.dxf")
    coordinates = []
    for e in dxf.entities:
        if e.dxftype == 'LINE':
            start_x = e.start[0]
            start_y = e.start[1]
            start_z = e.start[2]
            color = e.color
            coordinates.append((start_x, start_y, start_z))
            print(u"颜色:" + str(color) + u", " + e.dxftype + u" - 起点坐标:" + str(start_x) + u", " + str(start_y)
                  + u", " + str(start_z));
    return coordinates


line_coordinates = get_line_coordinates()
print(line_coordinates)

结果如下的打印输出
在这里插入图片描述
6547608e022&title=&width=810.6666666666666)

CIRCLE类型的数据

通过断点的方式来查看circle类型中存在着那些属性,其中最常见的就是以下属性:

  • center:圆心坐标,表示为一个包含X、Y、Z值的元组或点对象。
  • radius:圆的半径,表示为一个浮点数。
  • thickness:圆的厚度,表示为一个浮点数。通常在2D绘图中为0。
  • color:圆的颜色,表示为一个整数值。可以使用颜色表进行解释。
  • layer:圆所在的图层名称,表示为一个字符串。
  • linetype:圆的线型名称,表示为一个字符串。例如,"CONTINUOUS"表示实线。
  • linetype_scale:圆的线型比例,表示为一个浮点数。
  • extrusion:圆的挤压方向,表示为一个包含X、Y、Z值的元组或向量对象。通常在2D绘图中为(0, 0, 1)。
  • start_angle:圆的起始角度,表示为一个浮点数。默认为0度,以弧度为单位。
  • end_angle:圆的结束角度,表示为一个浮点数。默认为2π(360度),以弧度为单位。

在这里插入图片描述

这里接下来就不演示代码了,需要查看属性可以通过断点的形式去查看,通过点属性的方式得到相应的值,就只是介绍可能存在的属性字段。

POLYLINE类型的数据

每个实体类型为POLYLINE(多段线)的实体对象具有以下常见属性:

  • points:多段线的顶点坐标列表,表示为包含X、Y、Z值的元组或点对象。
  • closed:指示多段线是否闭合的布尔值。
  • thickness:多段线的厚度,表示为一个浮点数。通常在2D绘图中为0。
  • color:多段线的颜色,表示为一个整数值。可以使用颜色表进行解释。
  • layer:多段线所在的图层名称,表示为一个字符串。
  • linetype:多段线的线型名称,表示为一个字符串。例如,"CONTINUOUS"表示实线。
  • linetype_scale:多段线的线型比例,表示为一个浮点数。
  • extrusion:多段线的挤压方向,表示为一个包含X、Y、Z值的元组或向量对象。通常在2D绘图中为(0, 0, 1)。
  • elevation:多段线的高度(Z轴值),表示为一个浮点数。通常在2D绘图中为0。
POINT类型的数据

每个实体类型为POINT(点)的实体对象具有以下常见属性:

  • point:点的坐标,表示为一个包含X、Y、Z值的元组或点对象。
  • thickness:点的厚度,表示为一个浮点数。通常在2D绘图中为0。
  • color:点的颜色,表示为一个整数值。可以使用颜色表进行解释。
  • layer:点所在的图层名称,表示为一个字符串。

还有许多数据类型就不一一介绍,根据具体的DXF文件,不同文件可能存在不同数据。

dxfgrabber中的layers

layers,在dxfgrabber库中,要查看图层的相关信息,可以通过库里面的layers来获取他包含所有图层的列表。
通过断点可以看到其内部有哪些属性,不同的dxf文件,属性都可能不同。以下是我这个dxf文件所有的属性

  • name:图层的名称,表示为一个字符串。
  • color:图层的颜色,表示为一个整数值。可以使用颜色表进行解释。
  • linetype:图层的线型名称,表示为一个字符串。例如,"CONTINUOUS"表示实线。
  • frozen:一个布尔值,指示图层是否被冻结(不可见)。
  • on:属性用于表示图层是否处于打开状态。
  • locked:一个布尔值,指示图层是否被锁定,即无法进行编辑。

在这里插入图片描述

dxfgrabber中的blocks

DXF文件的块(Blocks)信息可以通过访问blocks属性来获取。blocks是一个包含所有块的字典,其中键是块的名称,值是表示块的对象。
每个块对象具有以下常见属性和方法:

  • name:块的名称,表示为一个字符串。
  • entities:块中的实体对象列表。
  • basepoint:块的基点坐标,表示为一个包含X、Y、Z值的元组或点对象。
  • insertion_points:块的插入点坐标列表,表示为包含X、Y、Z值的元组或点对象。
  • has_attributes:一个布尔值,指示块是否包含属性定义。
  • get_attribute(tag):获取块的属性值,其中tag为属性的标签。
  • extrusion:实体对象的挤出方向。
  • is_xref:属性用于表示实体对象是否来自外部引用,外部引用是一种将其他DXF文件中的实体对象链接到当前DXF文件的机制。

在这里插入图片描述

案例

本次案例是编写一个脚本,再通过Java来执行这段代码。用的环境是python2.7,jdk1.8。虽然比较老了,下次再把python升到3.10。

python代码

首先是python代码,本次编写逻辑很简单,只是单纯的使用dxfgrabber库读取dxf文件,并且以json的形式把值返回回去,这里只是判断实体的类型为LINE,输出类型与起点的x,y坐标值。

# -*- coding: utf-8 -*-
import sys
import json
import dxfgrabber


def get_line_coordinates():
    dxf = dxfgrabber.readfile("D:\\Code\\draft.dxf")
    coordinates = []
    for e in dxf.entities:
        if e.dxftype == 'LINE':
            data = {
				"type": e.dxftype,
                "x": e.start[0],
                "y": e.start[1]
            }
            coordinates.append(data)
    return coordinates


line_coordinates = get_line_coordinates()

# 将结果写入到标准输出,而不是打印
sys.stdout.write(json.dumps(line_coordinates))

Java代码

因为在Java环境中执行python代码,会出现环境不同,找不到库,所以需要设置一下环境路径,以及python的解释器路径。通过PythonInterpreter.get方法去执行函数,需要携带两个参数,一个是函数名,另一个是返回的对象类型,这里我们用PyFunction类来进行返回,通过调用__call__来获得一个python对象,我们返回的是一个数组对象,所以这里可以转成PyList对象。后面通过alibaba.fastjson来转成JSONArray对象。
这些代码也就只是为了学习而制作,身为一名python小白,对这些还不够理解,可能常规做法并不这样做,因此后续还需要更多的尝试。

/**
* @Author: lyd
* @Description: 执行代码
* @Date: 2023/5/31
*/
public class JavaExecutorPythonUtils {
    // TODO Auto-generated method stub
    public static void main(String[] args) throws JsonProcessingException {
        System.setProperty("python.path", "C:\\Users\\14194\\.windows-build-tools\\python27\\Lib\\site-packages");
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile("D:\\Code\\test.py");
        // 设置 Python 解释器路径
        interpreter.exec("import sys");
        interpreter.exec("sys.path.append('C:\\Users\\14194\\.windows-build-tools\\python27')");
        // 第一个参数为需要执行的函数(变量)的名字,第二个参数为期望返回的对象类型
        PyFunction pyFunction = interpreter.get("get_line_coordinates", PyFunction.class);
        //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
        PyObject pyobj = pyFunction.__call__();
        PyList pyList = (PyList) pyobj;
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(pyList);
        JSONArray jsonArray = JSON.parseArray(s);
        System.out.println("the anwser is: " + jsonArray);
    }
}

运行结果
在这里插入图片描述

总结

本次就是第一次对python读取cad信息进行摸索,好多都不是很会,也没有学过python,对python语言还是不够理解,这也就导致了在Java中执行脚本的时候有些摸不着头脑,也希望看到本篇文章的读者能够给一些建议与信息提示。总的来说,就是用过dxfgrabber库获取文件对象,在读取所需的内容,工作使用肯定不可能如此简单就完成,我的需求是获取cad中的某些路径,就差不多是cad图中描绘了车的行动轨迹路线,然后我想把这些行动轨迹的坐标获取出来,通过后端的一些处理在传到前端web界面显示。希望路过的伙伴给个建议或提示。

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

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

相关文章

如何利用Stable Diffusion WebUI快速制作漫画开源

今天给大家带来的是如何利用Stable Diffusion WebUI快速制作漫画。 欢迎大家可以关注我的公众号《乔说科技》,关于如何制作动漫前置学习,请点击如下文章查看相关技术: (1)如何安装绘图工具Stable Diffusion WebUI&…

2023 手术机器人现状

先看一下主要分类: 手术机器人总览,看一下这张图: 先简单说一下国外的: 1 . 达芬奇手术机器人 简单地说,达芬奇机器人就是高级的腹腔镜系统。大家可能对现在流行的微创治疗手段如:胸腔镜、腹腔镜、妇科腔…

dubbo 3.2.0 token-有bug慎用

dubbo3 provider可以配置token dubbo: application: name: merge-provider-1 qos-enable: false protocol: name: dubbo port: 20880 registry: address: zookeeper://${zookeeper.address:192.168.157.151}:2181 provider: token: “true” 当token 配置为true的时候&#x…

Electron25集成Vue3新建多开窗口|vite4+electron窗体管理器

继上一次分享electron24vite4整合构建桌面端窗口应用。这次在此基础上分享封装多开窗口管理器ElectronVite-MultiWin。 https://blog.csdn.net/yanxinyun1990/article/details/130944508 截至目前Electron最新稳定版本到25了。 electron快速迭代更新,vite的高效构建…

dubbo 3.2.0 merge模式及 adaptive class 生成过程

MergeInvoker生成过程分析 dubbo 3.2.0 merge模式是汇聚多个group内相同服务的返回&#xff0c;核心MergeInvoker代码在public class RegistryDirectory extends DynamicDirectory 内的如下函数。 private List<Invoker<T>> toMergeInvokerList(List<Invoker&…

Spring整合Mybatis框架开发步骤分析

文章目录 1.导入坐标2.配置SpringConfig类3.配置jdbc配置类4.配置MybatisConfig配置类5. xml配置与注解配置之间的转换对比 1.导入坐标 先将依赖坐标导入pom文件中、里面包括spring-context、druid、mybatis、mysql-connector-java、 spring开放出接口标准&#xff0c;如想和…

Redis6 数据结构Hash

前言 在Redis中&#xff0c;hashtable 被称为字典&#xff08;dictionary&#xff09;,它是一个数组链表到结构。每个键值对都会有一个dictEntry OBJ_ENCODING_HT 这种编码夯实内部才是真正的哈希表结构&#xff0c;或称为字典结构&#xff0c;其可以实现O(1)复杂度的读写操作…

深度学习进阶篇[7]:Transformer模型长输入序列、广义注意力、FAVOR+快速注意力、蛋白质序列建模实操。

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

MP3 Module 语音播放模块(Arduino和串口控制)

MP3 Module 语音播放模块&#xff08;Arduino和串口控制&#xff09; 前言电气参数原理图MP3文件所放位置和命名规则&#xff1a;接线代码串口控制通讯指令&#xff08;部分&#xff09;实验结果 前言 Emakefun MP3语音模块内置8 MB存储空间&#xff0c;无需外接SD卡&#xff…

acwing提高——迭代加深+双向dfs+IDA*

1.迭代加深 顾名思义说明迭代的层数逐渐加深&#xff0c;这样做法有点像bfs的做法层层突出&#xff0c;符合的题型是答案在层数较低的那一层里 加成序列 题目https://www.acwing.com/problem/content/description/172/ #include<bits/stdc.h> using namespace std; c…

接口测试系列之 —— 前端交互测试和后端逻辑测试

01 前端交互测试 前端页面与后端代码之间的交互测试&#xff0c;可以理解为接口功能测试的一个子集。 测试准备 在进行交互测试前&#xff0c;首先要对前端功能有明确的认知&#xff0c;能够明确区分&#xff1a; 什么功能属于前端页面逻辑功能 什么功能又属于前端与后端…

路径规划算法:基于树种优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于树种优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于树种优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法树种…

JMeter快速入门指南:轻松掌握基本操作

Jmeter 介绍 Jmeter 是一款使用Java开发的&#xff0c;开源免费的&#xff0c;测试工具&#xff0c; 主要用来做功能测试和性能测试&#xff08;压力测试/负载测试&#xff09;. 而且用Jmeter 来测试 Restful API, 非常好用。 2023Jmeter性能测试项目实战教程&#xff0c;十…

ffmpeg下载及ffmpy3安装使用

ffmpeg下载及ffmpy3安装使用 1.下载ffmpeg 进入网址&#xff1a;https://www.gyan.dev/ffmpeg/builds/ 在release builds中下载ffmpeg-release-full.7z 下载好后解压到自己想存放的目录&#xff0c;例如&#xff1a;D:\Tool\ffmpeg-6.0-full_build 2.配置环境变量 右键此电…

《最新出炉》Python+Playwright自动化测试-1-环境准备与搭建

一.简介 有很多人问能不能介绍一下Playwright这款自动化神器的相关知识&#xff0c;现在网上的资料太少了。其实在各大博客和公众号也看到过其相关的介绍和讲解。要不就是不全面、不系统&#xff0c;要不就是系统全面但是人家是收费的。当然了接下来也可能介绍的不全面或者不系…

什么是压力测试?什么是负载测试?这两个区别是什么?

前言 之前给一个客户做项目时&#xff0c;由于自己对性能测试了解并不深&#xff0c;搞不懂压力测试和负载测试的区别&#xff0c;导致后面还是由负责性能测试的同事来处理&#xff0c;他跟我说了很多关于压力测试和负载测试的区别&#xff0c;现在我总结如下。 压力测试 压…

解决node上传文件乱码问题终极方案

问题描述 今天在菜鸟教程学习node上传文件时遇到了一个中文乱码的问题&#xff0c;文件名包含中文就会显示乱码&#xff0c;上传到服务器的文件名也是乱码。试了两个方法都不行&#xff0c;最后还是问了万能的度娘才解决。 我做了一个非常简单的上传文件的界面&#xff0c; …

Java SE(十二)之多线程

文章目录 概述1.进程&线程2.并行&并发 线程创建方式1.第一种&#xff1a;继承Thread类2.第二种&#xff1a;实现Runnable接口3.Callable、FutureTask接口4.线程创建的三种方式对比 Thread常用方法1.构造器2.设置和获取线程名称3.线程调度4.线程控制5.线程生命周期 线程…

静态路由和默认路由的工作原理

目录 静态路由 静态路由配置 默认&#xff08;缺省&#xff09;路由 路由的高级特性 1&#xff0c;递归路由 2&#xff0c;等价路由 3&#xff0c;浮动路由 4&#xff0c;路由汇总 环路问题&#xff1a; 解决方法&#xff1a; 静态路由 在路由器手动添加路由条目 静…

基于深度学习的高精度浣熊检测识别系统(PyTorch+Pyside6+模型)

摘要&#xff1a;基于深度学习的高精度浣熊检测&#xff08;水牛、犀牛、斑马和大象&#xff09;识别系统可用于日常生活中或野外来检测与定位浣熊目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的浣熊目标检测识别&#xff0c;另外支持结果可视化与图片或视…