
本文介绍如何使用 python 自动绘制符合真实物理尺寸(毫米级精度)的圆形定位图,并导出为 a4 尺寸 pdf,确保打印后图形尺寸严格准确,适用于钻孔定位等工业场景。
本文介绍如何使用 python 自动绘制符合真实物理尺寸(毫米级精度)的圆形定位图,并导出为 a4 尺寸 pdf,确保打印后图形尺寸严格准确,适用于钻孔定位等工业场景。
在机械加工、PCB 打样或木工定位等实际作业中,常需将设计点位以真实比例(如毫米)精确呈现在纸质图纸上,用于目视对齐与钻孔。传统依赖 excel 手动绘图易引入缩放误差、单元格尺寸失真及打印缩放干扰,导致最终纸面坐标与物理尺寸偏差显著。本文提供一种专业、可靠、零误差的解决方案:用 Python 生成物理尺寸精准的矢量 PDF 图形。
核心思路是绕过像素单位陷阱,直接在「毫米坐标系」中建模,并通过高保真 PDF 输出锁定绝对尺寸。关键在于两点:
- 坐标系统统一为毫米(mm):所有输入(x, y, diameter)均以毫米为单位;
- 输出设备参数严格匹配 A4 物理规格:A4 纸张尺寸为 210 mm × 297 mm,需在绘图时显式设置 figsize(英寸)与 dpi,使 matplotlib 的渲染逻辑与物理尺寸对齐。
以下为完整实现代码(已优化鲁棒性与实用性):
import matplotlib.pyplot as plt from matplotlib.patches import Circle from matplotlib.backends.backend_pdf import PdfPages def draw_circles_to_a4_pdf(circle_data, output_path="drill_template.pdf", margin_mm=5, grid_step_mm=10, show_grid=True): """ 在 A4 尺寸 PDF 中绘制毫米级精度的圆形定位图 Args: circle_data: List[Tuple[x_mm, y_mm, diameter_mm]],所有坐标单位为毫米 output_path: 输出 PDF 路径 margin_mm: 图形边界留白(毫米),避免被打印机裁切 grid_step_mm: 网格线间距(毫米),默认 10 mm show_grid: 是否显示辅助网格 """ # A4 尺寸(毫米)→ 转换为英寸(matplotlib 使用英寸 + DPI) width_inch = 210 / 25.4 height_inch = 297 / 25.4 dpi = 100 # DPI 不影响 PDF 矢量精度,但影响栅格元素(如网格)渲染质量 fig, ax = plt.subplots(figsize=(width_inch, height_inch), dpi=dpi) # 设置坐标范围:留出边距,单位为毫米 xlim = (0, 210) ylim = (0, 297) ax.set_xlim(xlim) ax.set_ylim(ylim) # 绘制辅助网格(可选) if show_grid: for x in range(0, 211, grid_step_mm): ax.axvline(x=x, color='lightgray', linewidth=0.4) for y in range(0, 298, grid_step_mm): ax.axhline(y=y, color='lightgray', linewidth=0.4) # 绘制用户输入的每个圆(注意:radius = diameter/2) for x, y, d in circle_data: if not (0 <= x <= 210 and 0 <= y <= 297): print(f"警告:圆心 ({x:.1f}, {y:.1f}) 超出 A4 边界,将被部分截断") circle = Circle((x, y), d/2, fill=False, edgecolor='black', linewidth=0.8) ax.add_patch(circle) # 关键设置:保持横纵坐标等比例,避免椭圆变形 ax.set_aspect('equal') # 隐藏坐标轴刻度与标签,保留干净图纸 ax.set_xticks([]) ax.set_yticks([]) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False) # 保存为 PDF(矢量格式,无缩放失真) with PdfPages(output_path) as pdf: pdf.savefig(fig, bbox_inches='tight', pad_inches=0) plt.close(fig) print(f"✅ 已生成精准 A4 PDF:{output_path}(尺寸 210×297 mm)") # ✅ 示例:定义钻孔位置(单位:毫米) circles = [ (45.0, 62.5, 8.0), # 第1个孔:x=45mm, y=62.5mm, 直径8mm (120.3, 185.0, 6.5), # 第2个孔:带小数,体现高精度支持 (185.0, 40.0, 12.0), # 第3个孔:靠近右边界 ] # 一键生成可打印图纸 draw_circles_to_a4_pdf( circle_data=circles, output_path="drill_layout_A4.pdf", margin_mm=3, grid_step_mm=5 )
? 重要注意事项:
- 打印设置必须为「实际大小」或「100% 缩放」:在 Adobe Acrobat 或系统打印对话框中,务必取消勾选“适应页面”、“缩放以适合”等自动缩放选项,否则会破坏毫米精度;
- 验证打印精度:首次使用前,建议用游标卡尺实测 PDF 中某圆直径或两点间距,确认误差
- 扩展性提示:该脚本可轻松集成至 Tkinter/pyqt GUI,接收用户输入并实时预览;亦可读取 CSV/Excel 表格批量导入坐标;
- 不推荐使用 reportlab 直接绘图:虽然可行,但 matplotlib 提供更直观的几何对象(Circle、Rectangle)和成熟坐标管理,且 PDF 输出天然支持矢量缩放与高 DPI 渲染。
通过本方案,您彻底摆脱 Excel 单元格拟合误差与打印机驱动缩放干扰,获得一份即打即用、毫米级可信的物理定位模板——这是自动化制造准备环节中不可或缺的精度基石。