Python通过dxfgrabber库实现获取CAD信息
作者:一个有梦有戏的人 发布时间:2021-02-26 00:18:49
前言
最近需要通过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);
}
}
运行结果
来源:https://blog.csdn.net/qq_43843951/article/details/130977705
猜你喜欢
- 写在前面:本节主要讲述一些基本的,常用的SQL语句,而非数据库方面的基本知识。数据库方面的知识留待以后再讲,现在就我们平常常用的一些SQL语
- 首先介绍两种编码方式硬编码和onehot编码,在模型训练所需要数据中,特征要么为连续,要么为离散特征,对于那些值为非数字的离散特征,我们要么
- 很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人研究p
- 使用ewebeditor作为后台编辑器时,尤其是一个页面中使用多次该编辑器时,在提交数据时,可能会遇到数据被重复提交的情况。搜索找来一些解决
- 生成方式Python中想要自动生成 model文件可以通过 sqlacodegen这个命令来生成对应的model文件sqlacodegen
- #!/usr/local/bin/php -q author:freemouse <?php // 下面是说明. print (&qu
- 本文列举了所有关于PHP语言中使用socket相关服务的一些函数。注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请
- 本文实例讲述了Python常见MongoDB数据库操作。分享给大家供大家参考,具体如下:MongoDB 是一个基于分布式文件存储的数据库。由
- 使用python完成超级基础的学生管理系统,供大家参考,具体内容如下说明:1、本学生管理系统非常非常简易,只有增,显,查,删,改功能,对于P
- 什么是组播点对点连接可以处理很多通信需求,不过随着直接连接数的增加,在多对通信方之间传递相同的消息会变得越来越困难。单独地向各个接收方发送消
- 用下面这个函数:Function CheckStringLength(txt) &n
- 一、引言Pillow,是Python Imaging Library (PIL)的一个分支,用于处理图像。它是Python编程语言中最常用的
- 本文实例为大家分享了Python PyQt4实现QQ抽屉效果展示的具体代码,供大家参考,具体内容如下先看截图效果:主要是使用了QT的QTab
- 表的故障检测和修正的一般过程如下:◆ 检查出错的表。如果该表检查通过,则完成任务,否则必须修复出错的数据库表。◆ 在开始修复之前对表文件进行
- python虚拟环境迁移:注意事项:直接将虚拟环境复制到另一台机器,直接执行是会有问题的。那么可以采用以下办法:思路:将机器1虚拟环境下的包
- 以前用Ubuntu的时候感觉很简单的事到ContOS上却变得很头痛,在执行以下命令安装python-pip居然什么也没执行。yum inst
- 本文实例讲述了Python实例方法、类方法、静态方法的区别与作用。分享给大家供大家参考,具体如下:Python中至少有三种比较常见的方法类型
- pytorch中构建卷积层一般使用nn.Conv2d方法,有些情况下我们需要自定义卷积核的权值weight,而nn.Conv2d中的卷积参数
- 前言利用Python的ffmpy库提取视频中的音频。本文提供工具类代码。环境依赖需要安装ffmpy,安装指令:pip install ffm
- 一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了。php下载文件其实用一个a标签就能实现,比如 <a