Python的ezdxf包操作dxf文件-矩形排版之最低水平线法

使用python库读取dxf格式文件 提供了读取dxf文件功能的python库主要为dxfgrabber和ezdxf。 阅读详情

dxf格式为R12格式

Python的ezdxf包操作dxf文件-矩形排版之最低水平线法

pip install ezdxf==1.0.2 -i https://pypi.mirrors.ustc.edu.cn/simple/

下面是文件代码

sf001.py

# 水平线类(起始x位置,终止x位置,高度)
class OutLine:
    def __init__(self, origin, end, height):
        self.origin = origin
        self.end = end
        self.height = height

    def __str__(self):
        return "OutLine:origin:{}, end:{}, height:{}".format(self.origin, self.end, self.height)


# 矩形物品类(宽度,高度,编号)
class Product:
    def __init__(self, w, h, num=0):
        self.w = w
        self.h = h
        self.num = num

    def __str__(self):
        return "product:w:{}, h:{}, num:{}".format(self.w, self.h, self.num)

    # 根据长度搜索矩形件(找出宽度小于目标长度的首个矩形件)
    @staticmethod
    def search_by_width(target_width, data):
        for index, p in enumerate(data):
            if p.w <= target_width:
                return index
        return None

    # 根据长度搜索矩形件(找出宽度或高度小于目标长度的首个矩形件)
    @staticmethod
    def search_by_size(target_width, data):
        for index, p in enumerate(data):
            if p.w <= target_width or p.h <= target_width:
                return index
        return None

    # 旋转90度并返回新对象
    def rotate_new(self):
        return Product(self.h, self.w, self.num)


# 布局类
class RectLayout:
    def __init__(self, width, line_list=[]):
        self.width = width
        # 水平线集合(起始x位置,终止x位置,高度)
        self.line_list = line_list
        # 水平线(起始x位置,终止x位置,高度)
        self.lowest_line = None
        # 水平线索引(起始x位置,终止x位置,高度)
        self.lowest_line_idx = 0
        # 最终位置结果[[矩形件编号,左下角横坐标,左下角纵坐标,矩形件宽度,矩形件高度], ...]
        self.result_pos = []
        # 板材利用率
        self.ratio = 0.0

    # 初始化水平线集合(起始x位置,终止x位置,高度)
    def init_line_list(self, origin, end, height):
        init_line = OutLine(origin, end, height)
        self.line_list = [init_line]
        self.lowest_line = init_line
        self.lowest_line_idx = 0

    # 提升最低水平线
    def enhance_line(self, index):
        if len(self.line_list) > 1:
            # 获取高度较低的相邻水平线索引,并更新水平线集
            neighbor_idx = 0
            if index == 0:
                neighbor_idx = 1
            elif index + 1 == len(self.line_list):
                neighbor_idx = index - 1
            else:
                # 左边相邻水平线
                left_neighbor = self.line_list[index - 1]
                # 右边相邻水平线
                right_neighbor = self.line_list[index + 1]
                # 选择高度较低的相邻水平线,左右相邻水平线高度相同时,选择左边相邻的水平线
                if left_neighbor.height < right_neighbor.height:
                    neighbor_idx = index - 1
                elif left_neighbor.height == right_neighbor.height:
                    if left_neighbor.origin < right_neighbor.origin:
                        neighbor_idx = index - 1
                    else:
                        neighbor_idx = index + 1
                else:
                    neighbor_idx = index + 1
            # 选中的高度较低的相邻水平线
            old = self.line_list[neighbor_idx]
            # 更新相邻水平线
            if neighbor_idx < index:
                self.line_list[neighbor_idx] = OutLine(old.origin, old.end + self.line_width(index), old.height)
            else:
                self.line_list[neighbor_idx] = OutLine(old.origin - self.line_width(index), old.end, old.height)
            # 删除当前水平线
            del self.line_list[index]

    # 按位置更新水平线
    def update_line_list(self, index, new_line):
        self.line_list[index] = new_line

    # 按位置插入水平线(插在某索引位置后面)
    def insert_line_list(self, index, new_line):
        new_lists = []
        if len(self.line_list) == index + 1:
            new_lists = self.line_list + [new_line]
        else:
            new_lists = self.line_list[:index + 1] + [new_line] + self.line_list[index + 1:]
        self.line_list = new_lists

    # 计算水平线宽度
    def line_width(self, index):
        line = self.line_list[index]
        return line.end - line.origin

    # 找出最低水平线(如果最低水平线不止一条则选取最左边的那条)
    def find_lowest_line(self):
        # 最低高度
        lowest = min([_l.height for _l in self.line_list])
        # 最低高度时,最小开始横坐标
        origin = min([_l.origin for _l in self.line_list if _l.height == lowest])
        for _idx, _line in enumerate(self.line_list):
            if _line.height == lowest and _line.origin == origin:
                self.lowest_line_idx = _idx
                self.lowest_line = _line

    # 清空水平线集合
    def empty_line_list(self):
        self.line_list.clear()

    # 计算最高水平线高度,即所用板材最大高度
    def cal_high_line(self):
        max_height = max([ll.height for ll in self.line_list])
        return max_height

    # 将矩形物品排样
    def packing(self, _pro: Product):
        # 最低水平线宽度
        lowest_line_width = self.line_width(self.lowest_line_idx)
        # 对矩形件排样
        self.result_pos.append([_pro.num, self.lowest_line.origin, self.lowest_line.height, _pro.w, _pro.h])
        # 更新水平线集
        new_line1 = OutLine(self.lowest_line.origin, self.lowest_line.origin + _pro.w, self.lowest_line.height + _pro.h)
        new_line2 = OutLine(self.lowest_line.origin + _pro.w, self.lowest_line.origin + lowest_line_width, self.lowest_line.height)
        self.update_line_list(self.lowest_line_idx, new_line1)
        if lowest_line_width - _pro.w > 0:
            self.insert_line_list(self.lowest_line_idx, new_line2)

    # 计算板材利用率
    def cal_used_ratio(self):
        # 计算板材利用率
        used_area = 0
        for _p in self.result_pos:
            used_area += _p[3] * _p[4]
        # 板材使用最大高度
        max_high = self.cal_high_line()
        # 利用率
        if max_high > 0:
            self.ratio = round((used_area * 100) / (self.width * max_high), 3)
        return used_area, self.ratio


# 主方法
def compute(container_width,_item_sizes,ran):
    # 矩形物品列表
    products = []
    #for idx in range(item_num):
    for idx in range(len(ran)):
        products.append(Product(_item_sizes[idx][0], _item_sizes[idx][1], ran[idx]))
    products = sorted(products, key=lambda x: x.w * x.h, reverse=True)
    # 初始化布局类
    layout = RectLayout(width=container_width)
    # 初始化水平线集
    layout.init_line_list(0, container_width, 0)
    while products:
        # 最低水平线及其索引
        layout.find_lowest_line()
        # 可用长度
        available_width = layout.line_width(layout.lowest_line_idx)
        # 候选物品索引
        # candidate_idx = Product.search_by_width(available_width, products)
        candidate_idx = Product.search_by_size(available_width, products)
        if candidate_idx is not None:
            # 候选物品
            pro = products[candidate_idx]
            # 宽度放不下时,对矩形件进行旋转
            if pro.w > available_width >= pro.h:
                pro = pro.rotate_new()
            # 将候选物品排样
            layout.packing(pro)
            # 剔除已经排样的物品
            products.pop(candidate_idx)
        else:
            # 最低水平线宽度小于要排样矩形宽度,提升最低水平线
            layout.enhance_line(layout.lowest_line_idx)

    # 计算板材利用率
    _area, _ratio = layout.cal_used_ratio()
    #print("used_area: {}".format(_area))
    #print("ratio: {}%".format(_ratio))
    # 计算最高水平线高度,即所用板材最大高度
    container_height = layout.cal_high_line()
    return layout.result_pos,container_height

 test001.py

import ezdxf
import math
import os
import sf001

def get_xy(e,a):
    x= e.dxf.center[0]+e.dxf.radius*math.cos(math.radians(a));
    y= e.dxf.center[1]+e.dxf.radius*math.sin(math.radians(a));
    return x,y
def get_min_w_h(file_name):
    doc = ezdxf.readfile(file_name,encoding="gbk")
    msp = doc.modelspace()
    points=[]
    for e in msp.query("POLYLINE"):
        for i in e.vertices:
            points.append(i.dxf.location)
    for e in msp.query("CIRCLE"):
        points.append(get_xy(e, 90))
        points.append(get_xy(e, 180))
        points.append(get_xy(e, 270))
        points.append(get_xy(e, 360))
    for e in msp.query("LINE"):
        points.append(e.dxf.start)
        points.append(e.dxf.end)
    for e in msp.query("ARC"):
        points.append(e.start_point)
        points.append(e.end_point)
        start_a=e.dxf.start_angle
        end_a = e.dxf.end_angle
        a=end_a+(360 if start_a>end_a else 0)-start_a
        mid_a=a/2+start_a
        points.append(get_xy(e, mid_a))
    xs=[]
    ys=[]
    for i in points:
        xs.append(i[0])
        ys.append(i[1])
    xs.sort()
    ys.sort()
    xy_min=xs[0],ys[0]
    w=xs[-1]-xs[0]
    h=ys[-1]-ys[0]
    return xy_min,w,h
        
def get_doc(file_name,doc1):
    xy_min,w,h=get_min_w_h(file_name)
    str1=file_name.rsplit("-",2)
    flag_name=str1[1]
    item_num=str1[-1][0:-4]
    #print(flag_name)
    #print(item_num)
    doc = ezdxf.readfile(file_name,encoding="gbk")
    msp = doc.modelspace()
    
    flag = doc1.blocks.new(name=flag_name)
    
    for e in msp.query("POLYLINE"):
        points=[]
        #print(e.dxf.all_existing_dxf_attribs())
        for i in e.vertices:
            x=i.dxf.location[0]-xy_min[0]
            y=i.dxf.location[1]-xy_min[1]
            points.append([x,y])
        if e.dxf.flags==1:
            points.append(points[0])
        arc=0
        for i in e.virtual_entities():
            if i.dxftype() == "ARC":
                arc=1
        if arc==1:
            for i in e.virtual_entities():
                if i.dxftype() == "ARC":
                    x=i.dxf.center[0]-xy_min[0]
                    y=i.dxf.center[1]-xy_min[1]
                    flag.add_arc([x,y], i.dxf.radius, i.dxf.start_angle, i.dxf.end_angle)
                if i.dxftype() == "LINE":
                    ax=i.dxf.start[0]-xy_min[0]
                    ay=i.dxf.start[1]-xy_min[1]
                    ex=i.dxf.end[0]-xy_min[0]
                    ey=i.dxf.end[1]-xy_min[1]
                    flag.add_line([ax,ay],[ex,ey])
        else:
            flag.add_polyline2d(points)
            
    for e in msp.query("CIRCLE"):
        x=e.dxf.center[0]-xy_min[0]
        y=e.dxf.center[1]-xy_min[1]
        flag.add_circle([x,y],e.dxf.radius)
    for e in msp.query("LINE"):
        ax=e.dxf.start[0]-xy_min[0]
        ay=e.dxf.start[1]-xy_min[1]
        ex=e.dxf.end[0]-xy_min[0]
        ey=e.dxf.end[1]-xy_min[1]
        flag.add_line([ax,ay],[ex,ey])
    for e in msp.query("ARC"):
        x=e.dxf.center[0]-xy_min[0]
        y=e.dxf.center[1]-xy_min[1]
        flag.add_arc([x,y], e.dxf.radius, e.dxf.start_angle, e.dxf.end_angle)
    return doc1,flag_name,item_num,w,h

doc1 = ezdxf.new('R2000')

path="workspace"

_item_sizes=[]
ran=[]
gap=2.5
container_width=1500
for file_name in os.listdir(path):
    #后缀判断和前缀判断
    if file_name.endswith('.dxf') and file_name.startswith('3mm'):
        doc1,flag_name,item_num,w,h=get_doc(os.path.join(path,file_name),doc1)
        for i in range(int(item_num)):
            _item_sizes.append([w+2*gap,h+2*gap])
            ran.append(flag_name)

msp1 = doc1.modelspace()
poss,container_height=sf001.compute(container_width,_item_sizes, ran)

for pos in poss:
    a=_item_sizes[ran.index(pos[0])]
    b=[pos[3],pos[4]]
    if a[0]==b[0] and a[1]==b[1]:
        ins=[pos[1]+gap,pos[2]+gap]
        angle=0
    else:
        ins=[pos[1]-gap+b[0],pos[2]+gap]
        angle=90
    msp1.add_blockref(pos[0],ins, dxfattribs={'xscale': 1,'yscale': 1,'rotation': angle})
points = [(0, 0), (container_width, 0),(container_width, container_height), (0, container_height)]
msp1.add_polyline2d(points,dxfattribs={'layer': 'MyLine1','color':100,'closed': True})
doc1.saveas("lowest_horizontal_line_search.dxf")

 1.bat

python test001.py
pause

Python的ezdxf包操作dxf文件-矩形排版之最低水平线法

Python 读取dxf中直线顶点的简单方法 DXF是autoCAD的一种记录数据信息的文件,由标题段、表段、块段、实体段和文件结束段5部分组成。一般来说我们只需要关注实体段就可以了。 例如,以上的三角形DXF文件,由三条直线组成,在Pycharm中打开该文件后,只需要搜索AcDbLine就可以获得该图片的顶点信息,如下: AcDbLine 10 -4.4148327071 20 42.5218097579 30 0.0 10下面代表的是x坐标,20下面代表的是y坐标,30... 阅读详情

相关推荐

dxf解析python_Python 读取DXF文件

至于dxf文件的格式在之前的博文中已经有详细的叙述,在此将不做赘述。from Point import Pointclass DXFReaderImpl:def __init__(self,file):self.file = fileself.points = [] ## 用于记录点实体的坐标值self.points_line = [] ## 用于记录线段的各端点坐标值,包括直线和折线两种线型s...

weixin_39983384的博客 5739

Python的ezdxf包操作dxf文件 获取属性 计算 长度,角度,面积,中心点

print("面积: %s\n" % str(ezdxf.math.area(points)+sum(arc_areas)))#print("长度: %s\n" % math.dist(e.dxf.start, e.dxf.end))print("圆的面积: %s\n" % str(math.pi*e.dxf.radius**2))print("圆的周长: %s\n" % str(math.pi*e.dxf.radius*2))print("长度: %s\n" % sum(mlength))

liujava56的专栏 4264

ezdxf:DXF的Python接口

ezdxf 抽象的 一个用于创建和修改DXF图纸的Python程序包,与DXF版本无关。 您可以打开/保存每个DXF文件,而不会丢失任何内容(注释除外)。DXF文件中的未知标签将被忽略,但会保留以进行保存。 通过这种行为,还可以打开包含来自第三方应用程序的数据的DXF工程图。 快速信息 ezdxf是一个Python软件包,用于创建新的DXF文件并读取/修改/写入现有的DXF文件 目标受众是开发人员 至少需要Python 3.7 与操作系统无关 用CPython和pypy3测试 适用于Windows,Linux和macOS的PyPI上的CPython C扩展作为二进制轮子 其他必需的软件包: 一些低级数学类的可选Cython实现 麻省理工学院执照 DXF版本的读/写/新支持:R12,R2000,R2004,R2007,R2010,R2013和R2018 DXF R13 / R14版本

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

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

qq_43843951的博客 6948

quick_dxf_converter:一个小脚本,利用ezdxf将带有编码的ascii坐标文件转换为dxf折线

quick_dxf_converter 一个小脚本,利用ezdxf将经过编码的ascii坐标文件转换为dxf折线。 需要才能工作。

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 463

【AI+CAD】(一)ezdxf 解析DXF文件

【AI+CAD】(一)ezdxf 解析DXF文件

ZhengrongYue的博客 9587

基于浏览器插件的拼多多买家订单导出方法

基于浏览器插件的拼多多买家订单导出方法

2501_93542170的博客 1733

python:ezdxf——教程

文章目录一、从DXF文件获取数据的教程1、布局2、遍历布局的DXF实体3、访问实体的DXF属性4、得到一个纸空间布局5、通过查询语言检索实体6、按groupby()函数检索实体二、创建简单DXF绘图教程三、图层教程1、创建一个层定义2、变化层状态3、检查可用层4、删除一层四、块教程1、什么是块?2、创建块3、块引用(插入)4、什么是属性?5、使用属性定义6、获取/设置现有块引用的属性7、计算包装块引用8、爆炸块引用9、检查块引用的实体五、LWPolyline教程六、文本教程1、标准文本样式2、新文本风格3、

weixin_44374471的博客 3万+

Dify + Oracle + MCP:轻松构建 RAG 应用与Oracle MCP Agent

通过一个实践案例,展示如何使用 Oracle 23ai 数据库、Dify、Oracle SQLcl MCP 从零开始构建一个功能完备的 RAG 应用,以及通过 Agent 与 SQLcl MCP Server 实现 Oracle 数据访问。

Rambo zheng的博客 2501

GEM5教程--gem5开始之旅(一)

GEM5系列教程--gem5开始之旅一、建立GEM5 GEM5模拟器是一个用于计算机系统结构研究的模块化平台,包含系统级别的结构以及处理器的微体系结构。读者若想详细的了解,请查看其官方文档GEM5文档 读者如果想要入门GEM5的话,可以参考Learning_GEM5这个网站,这里面有较为详细的教程,可以带读者从入门到精通。小编我对GEM5的入门学习也是从这个Learning_GEM5这个网站学习的...

qq_43381135的博客 3万+

python:ezdxf——参考资料

官方文档:https://ezdxf.readthedocs.io/en/master/reference.html DXF实体1、通用的DXF属性2、Insert 1、通用的DXF属性 属性 说明 dxf.layer 层名为字符串;默认值=‘0’ dxf.linetype 行类型为字符串,特殊名称’BYLAYER’, ‘BYBLOCK’;默认值是’BYLAYER’ dxf.color AutoCAD颜色索引,默认=256 dxf.lineweight 线重,以毫米乘以100(例

weixin_44374471的博客 4231

MicroPython驱动ST7789屏避坑实录:从GB2312到完整中文字库的升级之路

本文详细介绍了使用MicroPython驱动ST7789显示屏实现完整中文字库显示的实战方案。从硬件选型到字库系统改造,再到内存优化和显示性能提升,提供了一套突破GB2312限制的全套中文显示解决方案,特别适合ESP32开发者在物联网设备中实现高质量中文显示。

weixin_29190573的博客 394

【免费下载】 推荐开源项目:ezdxf —— 简化DXF文档的创建与修改

在工程设计与制图领域,DXF文件作为CAD数据交换的标准格式之一,广泛应用于各种设计软件中。然而,直接处理和操作这些复杂的二进制或ASCII文件并不直观。为了填补这一空白,**ezdxf**应运而生,这款基于Python的强大库能够支持多种DXF版本(从R12至R2018),并提供了一整套功能全面的工具集,使得读取、修改和新建DXF文档变得异常简单。 #### 技术分析 - **兼容性卓越**...

gitblog_00766的博客 1761

《UDS协议从入门到精通》系列——图解0x85:控制DTC的设置

如何让ECU停止或恢复DTC状态位更新?有哪些注意点?图解+示例教你快速上手UDS 0x85服务!!

车载系统攻城狮 3864

SOC、SOH、OCV

1)放电实验法的测量SOH结果最为准确,但是深度放电会对影响电池的寿命;2)电阻折算法仅将电阻作为评价SOH的依据,但电池老化时电阻的变化范围较小,因此该方法的误差较大;3)电阻折算法需要对电池进行大量的实验,绘制成Map图,但是该方法有一定的局限性,针对不同的电池需要绘制不同的Map图;4)阻抗分析法是目前最为前沿的方法,可以根据阻抗谱较为直观的分析SOH的变化,但是该方法需要的成本较高,每台设备约为5万美元。

m0_61973119的博客 2万+

基于python ezdxf库的.dxf2png/bmp程序

dxf2png/bmp

weixin_45705226的博客 1938

HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能

HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能

perseverance51博客 4237

探索DXF文件的轻松之旅——ezdxf库

**1、项目介绍** `ezdxf`是一个强大的Python库,专为处理DXF(Drawing Exchange Format)文件而设计。无论是创建新文件还是读取、修改和写入现有文档,它都能轻松应对,兼容多个DXF版本,包括R12到R2018。这个库特别适合程序员使用,它允许在不丢失任何数据的情况下加载和编辑第三方应用程序生成的DXF文件。 **2、项目技术分析** `ezdxf`的核心特...

gitblog_00008的博客 4014

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【亲测免费】 开源项目 ezdxf 亮点详解

开源项目 ezdxf 亮点详解 1. 项目的基础介绍 ezdxf 是一个用于创建和修改DXF文件的Python库。DXF(Drawing Exchange Format)是Autodesk公司的CAD软件AutoCAD的绘图交换格式。ezdxf 提供了一个易于使用的接口,允许开发者读取、创建和修改DXF文件,而不需要深入了解其复杂的文件结构。 2. 项目代码目录及介绍 项目的代码目录结构清晰,主要...

gitblog_01096的博客 923

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

python:ezdxf——如何使用

文章目录一、基本文件1、设置/获取标头变量2、设置DXF绘图单元3、创建更具可读性的DXF文件(DXF漂亮打印机)4、为模型空间设置初始视图/缩放二、DXF查看器1、A 360查看器问题2、DXF实体不在查看器中显示3、在AutoCAD加载时显示图像/XREFS4、为模型空间设置初始视图/缩放三、DXF内容1、获取/设置块引用属性2、将XDATA添加到实体3、从维度获取重写的DIMSTYLE值4、覆盖维度的DIMSTYLE值 一、基本文件 一般先决条件: import ezdxf doc = ezdxf.r

weixin_44374471的博客 8280

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

基于ezdxf,放大DXF文件中的线段矩形(Python)

DXF文件格式的后端操作

Chain 808

【Python ezdxf+matplotlib】显示AutoCAD导出的.dxf格式文件

【Python ezdxf+matplotlib】显示AutoCAD导出的.dxf格式文件

ChaoChao66666的博客 2839

Python 中使用 ezdxf:轻松读写 DXF 文件的完整指南

ezdxf以简洁的 API 和强大的功能,让 Python 成为处理 DXF 文件的高效工具。无论你是工程师、开发者还是科研人员,只要涉及 CAD 数据自动化,ezdxf都值得纳入你的技术栈。

2609_95039210的博客 1382

Python批量修改dxf文件中的文本信息

Python批量修改dxf文件中的文本信息@TOC 工程人员在修改CAD图纸的过程中可能会涉及到大量文本内容修改,包括多行文本和单行文本,如果单独一个一个修改费时费力,CAD软件自带有查找替换功能可以批量修改,但只能进行简单的统一替换,对于稍微复杂一些的修改则无能为力。 有些文本修改是有一定规则的,比如需要统一在原有数值上增加一个偏移量,此时可以考虑使用Python进行批量操作,提高工作效率。这里以通信工程中室分图纸修改为例对该方法进行讲解。 首先看下原始图纸: 你好! 这是你第一次使用 Markdown编

happymaker的博客 3254

Python DXF处理快速入门:ezdxf库10个实用技巧

ezdxf是一个功能强大的Python DXF处理库,它为CAD数据操作提供了完整的解决方案。无论你是CAD工程师、数据分析师还是Python开发者,这个库都能帮助你高效处理DXF文件。本文将从基础安装到高级应用,为你展示10个核心使用技巧。 ## 🔧 环境搭建与基础配置 **安装方式一:标准安装** ```bash pip install ezdxf ``` **安装方式二:源码构建**

gitblog_00152的博客 697
上一篇: Python的ezdxf包操作dxf文件 获取属性 计算 长度,角度,面积,中心点
下一篇: Python 抄代码
小6哥
博客等级 码龄18年 16粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值