ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ezdxf HPGL/2 转换 Add-on 实战指南:将 PLT 绘图文件转换为 DXF、SVG、PDF 与位图

ezdxf HPGL/2 转换 Add-on 实战指南:将 PLT 绘图文件转换为 DXF、SVG、PDF 与位图 图形学【免费下载链接】ezdxfPython interface to DXF项目地址https://gitcode.com/gh_mirrors/ez/ezdxf点击查看免费下载HPGL/2Hewlett-Packard Graphics Language 2是 20 世纪 70 年代由惠普公司开发、用于控制笔式绘图仪pen plotter的矢量图形指令语言长期以来是 CAD 与绘图输出设备之间的事实标准通信协议。ezdxf 从版本 1.1 起提供了hpgl2add-onaddons/hpgl2 包它能把 HPGL/2 绘图文件通常为.plt转换为现代矢量格式 DXF、SVG、PDF乃至 PNG/PPM/PBM 位图从而让历史工程图纸数据可以被通用软件工具查看、编辑与二次处理。本文以 HPGL/2 Converter Add-on 文档 为主线结合 api.py 等源码与测试用例完整讲解从文件解析、命令解释、虚拟绘图仪回放到多格式导出的整条处理管线并给出可直接运行的代码示例与参数说明。读完本文你将掌握如何用几行代码将旧式 PLT 文件批量转换为可编辑的 DXF 图纸、可打印的 PDF、可嵌入网页的 SVG 以及位图预览。什么是 HPGL/2 绘图文件HPGL 是一种命令驱动command-driven的矢量图形语言一系列命令控制绘图笔的移动、笔的选取、其他输出参数以及直线、圆弧、圆和文字等几何形状的绘制。绘图仪或其它输出设备逐条解释这些命令并将其转化为绘图介质上的物理笔迹。HPGL 在数十年间持续演进出现了支持更复杂图形操作、并兼容其它图形语言的多种扩展。尽管更新的图形语言与文件格式层出不穷HPGL 至今仍在工程与建筑领域作为矢量图形格式广泛使用。一个 HPGL/2 绘图文件包含了 CAD 应用发送给绘图仪、用于打印工程图纸的全部数据。过去读取这些数据只能依赖绘图仪或专用查看程序成本高昂且不便而 ezdxf 的hpgl2add-on 正是为了打破这一壁垒而生。为什么只需要支持常用子集从 Interpreter 源码 的注释可以看到设计者的明确判断大多数 CAD 应用只向绘图仪发送非常受限的命令子集通常只是折线polylines与填充多边形filled polygons。因此 add-on 的Plotter类只支持最常见的 HPGL/2 命令。许多 CAD 应用产出的 PLT 文件主要就是这两类图元实现整套 HPGL/2 命令集性价比不高。被有意忽略的命令组包括字符组文字通常已被 CAD 应用分解为填充多边形或折线发送配置组IN、DF、RO、IW—— 绘图仪通过新建实例完成初始化页面旋转由 add-on 自身处理多边形组EA、ER、EW、FA、RR、WG等矩形与楔形命令线型与填充属性组LA、RF、SM、SV、TR、UL、WU—— 线型与填充图案通常已被 CAD 应用分解为简单线条。Add-on 的目标与整体架构hpgl2add-on 提供了一套完整的处理管线由以下模块组成模块职责tokenizer.py低层字节流解析从 PCL/RTL 混杂数据中提取 HPGL/2 命令interpreter.py命令解释器将命令转发给虚拟绘图仪plotter.py虚拟绘图仪把命令加工成折线与填充多边形backend.py输出后端抽象、录制器Recorder与回放器Playerproperties.py笔、颜色与填充属性模型api.py面向用户的公开接口to_dxf/to_svg/to_pdf/to_pixmap等贯穿全局的两遍处理设计to_dxf、to_svg、to_pdf、to_pixmap四个高层函数共享同一套两遍two-pass处理策略这在 api.py 中有清晰注释第一遍调用内部函数record_plotter_output()—— 用hpgl2_commands()解析字节流得到命令列表交给Interpreter驱动Plotter将输出录制进Recorder最终得到一个Player对象同时检测整个图形的包围盒bounding box几何变换依据旋转角度、镜像参数计算 placement_matrix用player.transform(m)把录制内容摆放到位第二遍通过跨后端播放器 xplayer.hpgl2_to_drawing()把Player中的录制内容重放到具体后端DXF 后端、SVG 后端或 PyMuPDF 后端上输出。Plot UnitsHPGL/2 的度量单位所有坐标运算都基于 HPGL/2 的绘图单位Plot Unitsplu换算关系贯穿各个模块见 plotter.py 与 backend.py1 plu 0.025 mm40 plu 1 mm1016 plu 1 inch3.39 plu ≈ 300 dpi 下的 1 个点这一单位换算正是各导出函数能够还原原始图纸物理尺寸的基础。快速开始一个完整的 PLT → DXF 转换按文档约定公开接口集中在ezdxf.addons.hpgl2.api模块导入方式如下from ezdxf.addons.hpgl2 import api as hpgl2 with open(hpgl2.plt, rb) as fp: data fp.read() doc hpgl2.to_dxf(data, color_modehpgl2.ColorMode.ACI) doc.saveas(hpgl2_as.dxf)这段代码把hpgl2.plt的字节内容转换为一个 ezdxfDrawing对象并保存为 DXF 文件。要点必须以二进制方式读取 PLT 文件rbcolor_mode决定颜色如何映射详见下文颜色模式返回的doc是标准ezdxf.document.Drawing实例可直接保存、继续编辑或交给 ezdxf 其它 add-on 进一步处理。高层转换函数详解四个高层函数的签名与行为可从 api.py 中完整确认。通用参数参数类型默认值说明rotationint0旋转角度仅允许 0、90、180、270其它值抛出ValueErrormirror_xboolFalse沿 x 轴镜像mirror_yboolFalse沿 y 轴镜像merge_controlMergeControlMergeControl.AUTO填充多边形排序策略详见下文注意to_dxf与to_svg/to_pdf/to_pixmap在镜像语义上略有差异 —— DXF/SVG/PDF 各自后端的坐标系约定不同代码中分别对sy做了适配api.py 与 api.py用户只需按最终图形是否镜像的直觉传参即可。to_dxf(b, *, rotation0, mirror_xFalse, mirror_yFalse, color_modeColorMode.RGB, merge_controlMergeControl.AUTO) - Drawing将字节流中的 HPGL/2 命令导出为 DXF 文档源码行为 包括页面内容创建于模型空间原点未提供缩放值时1 个绘图单位 1 个 DXF 绘图单位1 plu 0.025 mmHPGL 内容是为白纸打印设计的因此在ColorMode.RGB下会添加白色背景填充新增BACKGROUND图层见 api.py所有实体按笔号分配到图层命名规则为PEN_###如PEN_001。将color_mode设为ColorMode.ACI时图层获得对应 ACI 颜色便于后续处理但由于 RGB 颜色在显示时优先级总高于 ACIRGB 模式下不会保留 ACI 语义文档第一个图纸空间布局Layout1会被设置为在单张纸上打印整个模型空间纸张尺寸等于原始绘图文件的毫米尺寸api.py 调用dxf.setup_paperspace(doc, bbox)HPGL/2 的合并控制merge control在像素层面生效DXF 无法精确复刻因此改用按亮度排序填充多边形来避免填充遮挡文字见下文 MergeControl。to_svg(b, *, rotation0, mirror_xFalse, mirror_yFalse, merge_controlMergeControl.AUTO) - str导出为SVG 字符串api.py绘图单位 1:1 映射到viewBox单位图像尺寸即原始绘图文件的毫米尺寸由ezdxf.addons.drawing.svg.SVGRenderBackend渲染并添加白色背景若 HPGL/2 命令流中启用了合并控制MC命令填充会按亮度排序以防遮挡文字。实际效果可通过集成测试佐证integration_tests/test_hpgl2_addon.py 读取integration_tests/data/PLOTFILE.plt后调用to_svg断言生成的 SVG 长度超过 70000 字符且根元素属性为width593.8mm、height419.9mm、viewBox0 0 23752 16794—— 可见页面尺寸与包围盒完全由原始 PLT 内容决定。to_pdf(b, *, rotation0, mirror_xFalse, mirror_yFalse, merge_controlMergeControl.AUTO) - bytes导出为PDF 字节数据api.py绘图单位1 plu 0.025 mm换算为 PDF 单位pt1 pt 1/72 英寸使输出图像保持原始绘图文件的物理尺寸依赖 Python 模块 PyMuPDFAGPL 许可证源码注释见 pymupdf.py安装方式为pip install pymupdf。未安装时函数打印提示信息并返回空字节串b。to_pixmap(b, *, rotation0, mirror_xFalse, mirror_yFalse, merge_controlMergeControl.AUTO, fmtpng, dpi96) - bytes导出为位图图像字节数据api.py支持格式png便携网络图形、ppm便携像素图、pbm便携位图绘图单位按dpi默认 96换算为像素保持原始绘图文件的物理尺寸fmt不在支持列表内时抛出ValueError支持列表常量定义于 pymupdf.py同样依赖 PyMuPDF。典型批量转换脚本四个函数共用同一套几何参数组合使用可以快速构建PLT 归档数字化流水线from pathlib import Path from ezdxf.addons.hpgl2 import api as hpgl2 plt_file Path(BF_ISO.plt) data plt_file.read_bytes() doc hpgl2.to_dxf(data, color_modehpgl2.ColorMode.RGB) doc.saveas(output.dxf) svg_text hpgl2.to_svg(data) Path(output.svg).write_text(svg_text, encodingutf-8) pdf_bytes hpgl2.to_pdf(data) Path(output.pdf).write_bytes(pdf_bytes) png_bytes hpgl2.to_pixmap(data, fmtpng, dpi300) Path(output.png).write_bytes(png_bytes)仓库中提供了可直接运行的参考脚本 examples/addons/hpgl2_viewer.py它加载examples_hpgl2/目录下的示例 PLT 文件BF_ISO.plt、GB01_Stahlbau.plt、HSG_ISO.plt在 Qt 查看器中显示这些文件也是实测转换的理想素材。颜色模式与合并控制ColorMode颜色如何映射到 DXF 实体枚举值行为ColorMode.ACI将笔号作为 DXF 实体的 ACI 颜色使用忽略 RGB 颜色值ColorMode.RGB仍以笔号作为 ACI但同时为 DXF 实体设置 RGB 颜色显示时 RGB 优先级始终高于 ACI默认值为ColorMode.RGB在 api.py 中定义。选择ACI模式便于按图层/笔号做批量管理但会丢失 RGB 真彩色信息。MergeControl填充多边形排序策略HPGL/2 的合并控制MC命令在像素层面决定填充的覆盖关系矢量后端无法精确复刻。为此 add-on 提供了填充排序控制定义于 api.py枚举值行为MergeControl.NONE按打印顺序直接导出填充多边形MergeControl.LUMINANCE按**亮度luminance**排序填充多边形避免深色填充遮挡文字MergeControl.AUTO自动猜测最佳策略仅当命令流中存在MC命令plotter.has_merge_control为真时采用LUMINANCEapi.pyPlayer.sort_filled_paths()的实现backend.py会按填充色的亮度降序排列填充路径并将所有填充路径排在折线与轮廓路径之前模拟先涂背景色、后画线条的打印顺序。低层 API解析、解释与虚拟绘图仪对于需要精细控制的场景add-on 暴露了低层组件。hpgl2_commands(s: bytes) - list[Command]低层 PLT 文件解析器tokenizer.py从字节流中提取 HPGL/2 命令返回Command(name, args)命名元组列表。关键行为入口识别HPGL/2 数据以转义序列[ESC]%1B开头常量ENTER_HPGL2_MODE b\x1b%1Bapi.py解析器还支持\x1b%0B、\x1b%2B、\x1b%3B、\x1b%-1B等多个变体测试用例见 test_821_hpgl2.pyPCL/RTL 混合文件HPGL/2 命令常与打印机命令语言PCL和光栅传输语言RTL命令混在同一个文件中。遇到转义序列说明 HPGL/2 模式已退出解析器会继续向后寻找下一个入口点从而自动跳过 PCL/RTL 内容测试test_skip_all_pcl5_commands验证了这一点特殊命令处理PE编码折线按分号截取并过滤非打印字符LB标签使用文本终止符默认 ASCII 码 3可用DT命令自定义截取已知起始序列若文件以BPIN、INPS、INDF等序列直接开头不含转义序列也会被识别为 HPGL/2 数据。文档特别提醒纯 HPGL/2 文件可能不包含进入 HPGL/2 模式的转义序列此时解析器无法识别 HPGL/2 代码的起点。可以手动在字节流前拼接ENTER_HPGL2_MODEcommands hpgl2_commands(hpgl2.ENTER_HPGL2_MODE data)⚠️ 该序列对任何字节流都会强制开启 HPGL/2 模式无论文件是否为 HPGL/2 绘图文件请谨慎使用。Interpreter 类Interpreter是Plotter的前端interpreter.py将hpgl2_commands解析出的低层命令解释并发送给虚拟绘图仪设备。errors解释过程中产生的错误消息列表如参数数量非法not_implemented_commands输入流中所有不支持/被忽略的命令集合未知命令会进入该列表run(commands)解释命令列表并驱动绘图仪disable_commands(commands)专家级功能手动禁用某些命令例如缩放命令SC、IP、IR。注意禁用改变笔位置的命令可能扭曲甚至破坏绘图输出需谨慎使用。命令分发采用cmd_name约定如cmd_pd、cmd_pu、cmd_sp完整的已实现命令见下表类别已实现命令笔与属性FT填充类型、PC笔色 RGB、PW笔宽、SP选笔、NP笔数、MC合并控制、PS页面尺寸缩放IP、IR、SC输入点与缩放笔移动PD落笔划线、PU抬笔移动、PA绝对定位、PR相对定位绘图CI整圆、AA/AR绝对/相对圆弧、AT/RT三点圆弧、BZ/BR三次贝塞尔曲线、PE编码折线多边形PM进入/退出多边形模式、FP填充多边形、EP描边多边形Plotter 类虚拟绘图仪Plotter表示一台虚拟绘图仪设备plotter.py核心职责把Interpreter发来的命令处理为简单折线与填充多边形发送给低层Backend维护笔状态pen_up/pen_down、绝对/相对模式、多边形模式、当前用户坐标与页面坐标的换算默认页面为 A01189 × 841 plucmd_ps默认值支持缩放命令IP、RP、SC不支持字体渲染与页面旋转RO。Recorder 与 Player录制与回放机制Backend 抽象基类所有输出后端包括 DXF/SVG/PDF 后端与录制器都实现同一个抽象基类Backendbackend.py仅有两个方法draw_polyline(properties, points)绘制折线输入为页面坐标pludraw_paths(properties, paths, filled)绘制填充或轮廓路径filledTrue为填充False为轮廓且当FillType.NONE时强制绘制轮廓。这种统一接口使得录制 → 变换 → 重放到任意后端成为可能。Recorder记录绘图仪输出Recorder实现Backend把Plotter的输出录制为三类数据记录RecordType枚举POLYLINE、FILLED_PATHS、OUTLINE_PATHS。每条记录附带属性哈希相同的显示属性只存储一份Properties副本节省内存。关键方法player()返回持有原始录制的Player实例。文档建议用recorder.player().copy()保护原始录制不被修改draw_polyline(properties, points)/draw_paths(properties, paths, filled)实现Backend接口并存入录制。Player回放与变换Player负责把录制内容回放到其它后端并允许修改录制内容方法说明copy()返回录制副本的新Player__copy__深拷贝录制列表保护原始录制recordings()迭代产出(RecordType, Properties, Data)三元组POLYLINE对应NumpyPoints2d填充/轮廓路径对应NumpyPath2d元组replay(backend)把录制回放到任意Backend实现bbox()返回所有折线与多边形的最小包围盒BoundingBox2d转换前先检测内容范围transform(m)用Matrix44变换矩阵旋转/镜像/平移就地修改录制内容sort_filled_paths()按填充亮度降序重排并把填充路径移到所有轮廓之前顶层placement_matrix(bbox, sx, sy, rotation)backend.py生成把包围盒放置到坐标第一象限的变换矩阵是to_svg/to_pdf内部版面布局的基础。Properties笔、颜色与填充属性Properties类properties.py汇总一次绘图操作的显示属性文档列出的属性如下属性含义默认值pen_index笔号int1pen_color笔颜色RGB 元组无RGB(-1,-1,-1)表示未指定pen_width笔宽单位毫米float0.35fill_type填充类型FillType枚举SOLIDfill_method填充方法FillMethod枚举EVEN_ODDfill_hatch_line_angle填充阴影线角度度0.0fill_hatch_line_spacing填充阴影线间距绘图单位 plu40.0fill_shading_density填充阴影密度百分比 0–100100.0重置后为1.0两个颜色解析方法resolve_pen_color() - RGB返回最终的笔颜色。若当前未指定笔色则查笔表中对应笔号的颜色仍无则返回黑色RGB(0,0,0)resolve_fill_color() - RGB返回最终的填充颜色。SOLID取笔色SHADING按密度min(int(2.55 * (100 - density)), 255)计算灰度HATCHING/CROSS_HATCHING返回浅灰RGB(200,200,200)其余返回白色。默认笔表setup_default_pen_table()properties.py内置了 8 支默认笔宽度均为 0.35 mm笔号颜色0白(255,255,255)1黑(0,0,0)2红(255,0,0)3绿(0,255,0)4黄(255,255,0)5蓝(0,0,255)6品红(255,0,255)7青(0,255,255)当 HPGL/2 命令PC设置笔色与PW设置笔宽出现时笔表按笔号动态更新。FillType 与 FillMethod 枚举FillType填充类型枚举值含义NONE不填充绘制轮廓SOLID实心填充HATCHING阴影线填充CROSS_HATCHING交叉阴影线填充SHADING灰度阴影填充HPGL/2FT命令的参数会映射到这些类型FT3,间距,角度→ 阴影线FT4,间距,角度→ 交叉阴影线FT10,密度→ 灰度阴影其它值回落为实心interpreter.py 与 properties.py。这一映射在测试 test_821_hpgl2.py 中得到验证FT3,80,45→HATCHING间距 80、角度 45FT10,37→SHADING密度 37。FillMethod填充方法/缠绕规则枚举值含义EVEN_ODD奇偶规则NON_ZERO_WINDING非零环绕规则对应 HPGL/2FP命令的参数0/1。异常处理add-on 定义了三个异常api.py均继承自Hpgl2Error异常触发条件Hpgl2Erroradd-on 的基类异常Hpgl2DataNotFound字节流中未找到 HPGL/2 数据——通常是因为缺少进入 HPGL/2 模式转义序列EmptyDrawingHPGL/2 命令未产生任何内容包围盒为空注意record_plotter_output()的容错行为api.py无命令时打印提示并抛出Hpgl2DataNotFound内容为空时抛出EmptyDrawing。而to_dxf/to_svg等高层函数会捕获这些异常并返回空结果空文档 / 空字符串 / 空字节串而不是让转换中断。边界PCL/RTL 混合文件与强制进入 HPGL/2 模式HPGL/2 命令经常与 PCL打印机命令语言和 RTL光栅传输语言命令混合在同一个绘图文件中。hpgl2_commands解析器天然支持这种混合格式遇到表示退出 HPGL/2 模式的转义序列后继续向后扫描寻找下一个入口点。如果遇到不含转义序列的纯 HPGL/2 文件解析器无法自行识别起点需要手动拼接入口序列commands hpgl2_commands(hpgl2.ENTER_HPGL2_MODE data)该做法会无条件开启 HPGL/2 模式对非 HPGL/2 文件也可能产生不可预期的解析结果务必先确认文件性质。测试与验证hpgl2add-on 拥有完整的测试覆盖可作深入学习与验证的参考tests/test_08_addons/test_821_hpgl2.py解析器、解释器、虚拟绘图仪、页面缩放的单元测试——覆盖PE编码折线、LB标签终止符、DT自定义终止符、转义序列变体、笔移动、折线、贝塞尔曲线、圆/圆弧、填充类型设置、页面各向同性/异性缩放等tests/test_08_addons/test_821_hpgl2_polygon_encoded.pyPE命令二进制编码/解码的专项测试tests/test_08_addons/test_825_hpgl2_drawing_backend.py与 drawing add-on 后端联动的测试integration_tests/test_hpgl2_addon.py基于真实文件integration_tests/data/PLOTFILE.plt的集成测试验证to_svg输出尺寸与内容。需要说明的是examples/addons/drawing/hpgl2_export.py展示的是反向流程——利用 drawing add-on 的 HPGL2 输出后端把 DXF 模型空间渲染为 PLT 文件这与本文的PLT → DXF/SVG/PDF转换方向相反二者共同构成 ezdxf 对 HPGL/2 格式的双向支持。小结ezdxf 的hpgl2add-on 提供了一条清晰、可扩展的 PLT 文件数字化管线hpgl2_commands从混合字节流中提取命令 →Interpreter解释 →Plotter虚拟绘图仪加工 →Recorder录制 →Player变换与回放 → 四种后端分别输出 DXF / SVG / PDF / 位图。借助统一的Backend抽象用户甚至可以实现自定义后端将旧式绘图数据接入任何目标格式。对于最常见的折线 填充多边形型 PLT 文件几行 Python 代码即可完成高质量转换是历史工程图纸归档与再利用的实用工具。相关参考文档docs/source/addons/hpgl2.rst公开接口src/ezdxf/addons/hpgl2/api.py解析器src/ezdxf/addons/hpgl2/tokenizer.py解释器src/ezdxf/addons/hpgl2/interpreter.py虚拟绘图仪src/ezdxf/addons/hpgl2/plotter.py录制与回放src/ezdxf/addons/hpgl2/backend.py属性模型src/ezdxf/addons/hpgl2/properties.py示例查看器examples/addons/hpgl2_viewer.py示例 PLT 文件examples_hpgl2/BF_ISO.plt、examples_hpgl2/GB01_Stahlbau.plt、examples_hpgl2/HSG_ISO.plt赞分享图形学【免费下载链接】ezdxfPython interface to DXF项目地址https://gitcode.com/gh_mirrors/ez/ezdxf点击查看免费下载相关推荐终极指南如何快速将PDF转换为SVG矢量图形终极指南如何快速将PDF转换为SVG矢量图形 PDF转SVG是现代文档处理中的一项重要技能特别是当你需要将PDF文档转换为可缩放的矢量图形时。本文将为您详细开发工具CLI图像矢量化终极指南5步将位图转换为完美SVG图像矢量化终极指南5步将位图转换为完美SVG 你是否曾为图片放大后模糊而烦恼或者需要将照片转换为可无限缩放的专业矢量图形图像矢量化技术正是解决这些问题的关前端图像处理img2pdf将图像转换为PDF文件的简单工具img2pdf将图像转换为PDF文件的简单工具 是一个 Python 包可以轻松地将多个图像合并到一个 PDF 文件中。它支持各种图像格式并提供了一些额外图像处理CLI上一篇Flutter 平台通道实战在 examples/platform_channel 示例中调用 iOS、Android 与桌面端原生服务下一篇5分钟实战指南罗技鼠标宏技术助你掌控PUBG武器后坐力创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表