尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ezdxf PLOTSETTINGS 打印设置全面解析:DXF 布局打印参数的属性、组码与源码实现
图形学【免费下载链接】ezdxfPython interface to DXF项目地址https://gitcode.com/gh_mirrors/ez/ezdxf点击查看免费下载本篇技术指南以 ezdxf 官方 API 参考文档 plotsettings.rst 为主体骨架结合仓库内src/ezdxf/entities/layout.py、src/ezdxf/layouts/layout.py等源码实现系统讲解 DXF 中打印设置PLOTSETTINGS的全部属性、默认值、组码与位标志含义。读完本文你将掌握在 ezdxf 中直接读写布局打印参数、正确设置纸张/边距/打印比例/打印样式以及通过Layout.page_setup()一行完成整套页面配置的实战能力。1. PLOTSETTINGS 与 DXFLayout打印设置存在哪里在 DXF 文件结构中PLOTSETTINGS打印设置并不是一个独立漂浮的实体。根据 ezdxf 官方参考文档的说明所有 PLOTSETTINGS 属性都隶属于 LAYOUT 实体文档作者同时谨慎地表示不确定该实体是否也会作为独立实体出现。其类结构在文档中被明确为项目值父类Subclass ofezdxf.entities.DXFObjectDXF 类型DXF typePLOTSETTINGS工厂函数Factory function内部数据结构源码层面印证了这一点。在 src/ezdxf/entities/layout.py 中acdb_plot_settings子类DefSubclass(AcDbPlotSettings, {...})集中定义了全部打印属性随后PlotSettings(DXFObject)类layout.py#L203-L267以DXFTYPE PLOTSETTINGS注册为实体而DXFLayout(PlotSettings)layout.py#L341-L394直接继承了PlotSettings其DXFATTRIBS DXFAttributes(base_class, acdb_plot_settings, acdb_layout)表明 LAYOUT 实体由基类 AcDbPlotSettings 子类 AcDbLayout 子类三层拼接而成。此外src/ezdxf/sections/objects.py#L553-L569 中的ACAD_PLOTSETTINGS: PLOTSETTINGS映射说明在 DXF 的 OBJECTS 分区中ACAD_PLOTSETTINGS字典项对应的实体类型正是PLOTSETTINGS。因此在实际编程中你几乎总是通过Layout对象模型空间或图纸空间间接访问这些打印属性例如msp.dxf.plot_layout_flags。2. 属性总览组码、默认值与单位原文档给出了每个属性的默认值以下是完整继承并补充了 DXF 组码的属性清单组码来源于 acdb_plot_settings 定义属性名dxf.前缀组码默认值说明page_setup_name1页面设置名称plot_configuration_file2Adobe PDF源码默认打印机/绘图仪配置文件PC3paper_size4A3纸张规格名称plot_view_name6打印视图名称配合plot_type3current_style_sheet7关联的 CTB 打印样式文件left_margin407.5mm左边距bottom_margin4120mm下边距right_margin427.5mm右边距top_margin4320mm上边距paper_width44420mm纸张宽度paper_height45297mm纸张高度plot_origin_x_offset460打印原点 X 偏移mmplot_origin_y_offset470打印原点 Y 偏移mmplot_window_x1480打印窗口左下角 Xplot_window_y1490打印窗口左下角 Yplot_window_x21400打印窗口右上角 Xplot_window_y21410打印窗口右上角 Yscale_numerator1421自定义打印比例分子真实世界/纸张单位scale_denominator1431自定义打印比例分母绘图单位plot_layout_flags70688打印布局位标志见下节plot_paper_units721源码默认打印纸张单位plot_rotation730打印旋转plot_type745源码默认打印范围类型standard_scale_type7516源码默认标准比例类型shade_plot_mode760源码默认着色打印模式shade_plot_resolution_level772源码默认着色打印分辨率级别shade_plot_custom_dpi78300自定义 DPI仅级别 5 时生效unit_factor1471单位换算系数mm ↔ inchpaper_image_origin_x1480纸张图像原点 Xpaper_image_origin_y1490纸张图像原点 Yshade_plot_handle333可选着色打印对象的句柄需要特别注意的一处文档与源码差异原文档记载plot_configuration_file默认值为Adobe PDF而源码中该属性默认值为且注释明确写道An optional empty string selects the default printer/plotter可选空字符串表示选择默认打印机/绘图仪见 layout.py#L34-L35。同样plot_paper_units、plot_rotation、plot_type、standard_scale_type、shade_plot_mode、shade_plot_resolution_level的默认值以源码为准分别为 1、0、5、16、0、2而plot_layout_flags的默认值688两者一致。另外所有尺寸类属性边距、纸张、原点偏移、窗口在 DXF 文件中统一以毫米mm存储这一点在源码注释中反复强调# in mm、# all paper sizes in mm。3. 位标志与枚举型属性详解3.1plot_layout_flags组码 70默认 688这是一个按位编码bit-coded的标志组合原文档给出的位含义表如下与源码注释完全一致位值含义1plot viewport borders打印视口边框2show plot-styles显示打印样式4plot centered居中打印8plot hidden隐藏打印即隐藏图纸空间实体16use standard scale使用标准比例32plot with plot-styles使用打印样式打印64scale lineweights缩放线宽128plot entity lineweights打印实体线宽512draw viewports first先绘制视口1024model type模型类型2048update paper更新图纸4096zoom to paper on update更新时缩放到图纸8192initializing初始化中16384prev plot-init上一次打印初始化默认值688分解为16 32 128 512即默认同时启用使用标准比例、使用打印样式打印、打印实体线宽、先绘制视口四项。在 src/ezdxf/layouts/layout.py#L60-L74 中这些位值被定义为Layout类的常量PLOT_VIEWPORT_BORDERS、SHOW_PLOT_STYLES、PLOT_CENTERED……并配套了一组语义化 setter 方法layout.py#L302-L346plot_viewport_borders(state)/show_plot_styles(state)/plot_centered(state)plot_hidden(state)/use_standard_scale(state)/use_plot_styles(state)scale_lineweights(state)/print_lineweights(state)/draw_viewports_first(state)model_type(state)/update_paper(state)/zoom_to_paper_on_update(state)plot_flags_initializing(state)/prev_plot_init(state)它们最终都通过set_plot_flags(flag, state)调用底层set_flag_state(flag, statestate, nameplot_layout_flags)来置位或清零。另一个值得注意的细节在 DXFLayout.export_entity 导出时ezdxf 会自动调用self.set_flag_state(1024, self.dxf.name.upper() MODEL, plot_layout_flags)即根据布局名是否为 MODEL 自动维护 1024model type标志位无需用户手工干预。此外源码注释指出打印透明度Plot transparencies选项存储在 LAYOUT 实体的 XDATA 分区1001 PLOTTRANSPARENCY / 1071 1不属于该标志位。3.2plot_paper_units组码 72值含义0Plot in inches英寸1Plot in millimeters毫米2Plot in pixels像素该属性直接影响get_plot_unit_scale_factor()与default_viewport_config()中的单位换算当单位为英寸时比例因子乘上25.4换算为 mmlayout.py#L291-L300、layout.py#L536-L572。源码中其取值被校验器限制在0–2范围越界时回退到默认值。3.3plot_rotation组码 73值含义0No rotation不旋转190 degrees counterclockwise逆时针 90°2Upside-down倒置 180°390 degrees clockwise顺时针 90°Layout.page_setup()在写入该值前会校验rotation必须落在0–3否则抛出DXFValueError。3.4plot_type组码 74源码默认 5值含义0Last screen display上次屏幕显示1Drawing extents图形范围2Drawing limits图形界限3View specified by code 6由组码 6 指定的视图4Window specified by codes 48, 49, 140, and 141由组码 48/49/140/141 指定的窗口5Layout information布局信息默认Layout类提供了 set_plot_type(value) 方法只接受0–5的整数越界抛出DXFValueError(Plot type value out of range (0-5).)。当选择类型 3 时配合plot_view_name组码 6指定视图名选择类型 4 时由 set_plot_window(lower_left, upper_right) 写入四个窗口组码并自动把plot_type置为 4。3.5standard_scale_type组码 75源码默认 16标准打印比例类型是 DXF 中最长的枚举之一原文档与 src/ezdxf/lldxf/const.py#L582-L615 的STD_SCALES字典完全对应值比例值比例0Scaled to Fit适合缩放171:211/1281181:421/641191:831/321201:1041/161211:1653/321221:2061/81231:3073/161241:4081/41251:5093/81261:100101/21272:1113/41284:11211298:113313010:1146131100:11511321000:1161:1在STD_SCALES中英制比例被存储为(分子, 分母)元组例如1/1281即(1.0/128.0, 12.0)而公制比例直接如1:50→(1.0, 50.0)。page_setup()传入整数scale时正是通过const.STD_SCALES.get(standard_scale, (1.0, 1.0))解析出分子分母的。3.6shade_plot_mode组码 76与shade_plot_resolution_level组码 77着色打印模式值含义0As Displayed按显示1Wireframe线框2Hidden隐藏线3Rendered渲染着色打印分辨率级别值含义0Draft草稿1Preview预览2Normal普通源码默认3Presentation演示4Maximum最大5Custom自定义当级别设为5Custom时shade_plot_custom_dpi组码 78默认 300才生效。源码将其合法范围限制为100–32767越界时通过fit_into_integer_range(100, 32768)自动修正layout.py#L171-L178。shade_plot_handle组码 333是可选的实体句柄指向着色打印关联对象ezdxf 在 xref 资源注册/映射 时会自动处理其句柄转换。4. 打印比例、纸张与边距ezdxf 的换算逻辑4.1 纸张与边距默认纸张为 A3 横向paper_width420、paper_height297单位 mm四边距默认为左右7.5mm、上下20mm。这些值全部以 mm 存储即使plot_paper_units为英寸DXF 内部尺寸仍为 mm仅通过unit_factor组码 147默认 1做视图层换算page_setup()中 mm 模式unit_factor 1.0inch 模式unit_factor 1.0/25.4layout.py#L688-L692。源码对unit_factor施加了is_greater_zero校验。4.2 自定义打印比例scale_numerator分子真实世界/纸张单位与scale_denominator分母绘图单位共同定义自定义打印比例默认均为1即 1:1。Layout.get_plot_unit_scale_factor()的实现为scale numerator / denom # denom 为 0 时返回 1.0 if plot_paper_units 1: # mm return scale else: # inch return scale * 25.45. 打印原点偏移与打印窗口plot_origin_x_offset/plot_origin_y_offset组码 46/47定义打印原点相对可打印区域左下角的偏移page_setup()会将传入的offset乘以单位系数换算为 mm 后写入layout.py#L688-L690。这两个值在reset_paper_limits()layout.py#L699-L722中被用于计算limmin/limmaxshift_x left_margin x_offset shift_y bottom_margin y_offset dxf.limmin (-shift_x, -shift_y) dxf.limmax (paper_width - shift_x, paper_height - shift_y)即图纸界限limits是相对于打印原点的纸张边界打印原点 可打印区域左下角 原点偏移。这也是get_paper_limits()返回值的几何含义。四个窗口组码plot_window_x1/y1/x2/y248/49/140/141定义按窗口打印的裁剪矩形由Layout.set_plot_window(lower_left, upper_right)一次性写入并自动切换plot_type4。6. 页面设置、打印设备与打印样式page_setup_name组码 1命名页面设置的名称默认空字符串。plot_configuration_file组码 2打印机/绘图仪 PC3 配置文件或系统打印机名空字符串表示使用系统默认打印机。page_setup()的device参数默认值为DWG to PDF.pc3。current_style_sheet组码 7关联的 CTB 打印样式文件。Layout.set_plot_style(nameezdxf.ctb, showFalse)layout.py#L255-L265不仅写入文件名还会自动开启使用打印样式标志位并可选地开启显示打印样式self.dxf_layout.dxf.current_style_sheet name self.use_plot_styles(True) self.show_plot_styles(show)配套的get_plot_style_filename()可直接读取当前打印样式文件名。7. 高级 APILayout.page_setup()一键完成页面配置虽然 PLOTSETTINGS 的每个属性都可以直接读写但 ezdxf 在 Layout.page_setup() 中提供了更高层的封装一条调用即可完成打印设置、纸张规格、原点、比例、旋转乃至视图重置layout.page_setup( size(297, 210), # 纸张尺寸 (宽, 高) margins(0, 0, 0, 0), # (上, 右, 下, 左)顺时针顺序 unitsmm, # mm 或 inch offset(0, 0), # 打印原点偏移 2D 点 rotation0, # 0-3见旋转表 scale16, # 0-32 标准比例索引或 (1, 50) 自定义比例 nameezdxf, # 纸张名前缀生成 {name}_({width}_x_{height}_{unit}) deviceDWG to PDF.pc3, # PC3 配置文件或系统打印机名 )其内部执行顺序源码可验证为校验rotation0–3与scaleint 或 tuple分子分母均不可为 0解析单位inch时plot_paper_units0、换算系数25.4mm时plot_paper_units1写入 PLOTSETTINGS 各字段清除use_standard_scale标志page_setup_name置空设备、纸张名、四边距、纸张尺寸、比例分子分母、单位、旋转、原点偏移、标准比例、unit_factor调用reset_paper_limits()、reset_extents()、reset_viewports()重置图纸界限、范围与视口。此外ezdxf 还提供面向 DXF R12 的page_setup_r12()layout.py#L736-L812它通过写头部变量$PLIMMIN/$PLIMMAX/$PEXTMIN/$PEXTMAX来模拟页面设置并创建主视口——因为 R12 格式没有 OBJECTS 分区无法承载 LAYOUT/PLOTSETTINGS 实体。实战示例四种典型页面配置仓库示例 examples/paperspace_setup_R2000.py 完整演示了四种典型场景可概括为# 场景 1Letter 纸、英寸、0.5 英寸边距 layout.page_setup(size(11, 8.5), margins(0.5, 0.5, 0.5, 0.5), unitsinch) # 场景 2A4、mm、默认 1:1 比例并向布局添加视口 layout2.page_setup(size(297, 210), margins(10, 10, 10, 10), unitsmm) layout2.add_viewport(center(100, 100), size(50, 50), view_center_point(60, 40), view_height20, status2) # 场景 3A4、mm、图纸空间 1:50 缩放1 mm 打印 50 绘图单位 layout3.page_setup(size(297, 210), margins(10, 10, 10, 10), unitsmm, scale(1, 50)) # 场景 4A4、mm、1:1 但带 (50, 50) 打印原点偏移 layout4.page_setup(size(297, 210), margins(10, 10, 10, 10), unitsmm, scale(1, 1), offset(50, 50))该示例还特别注释了一个易混淆点图纸空间paperspace的缩放比例与 VIEWPORT 的缩放是两回事——page_setup的scale只影响图纸空间单位与打印 mm 的换算关系视口内模型空间的缩放由add_viewport的view_height/view_center_point等参数决定。测试佐证仓库测试 tests/test_03_dxf_layouts/test_300_layout.py#L124-L138 验证了page_setup()的默认行为新建布局后调用layout.page_setup()会自动创建一个主视口断言len(layout) 1注释为missing main viewport entity这是由page_setup()内部reset_viewports()→add_new_main_viewport()完成的layout.py#L574-L595。8. 源码级细节补充属性校验与自动修复plot_paper_units、plot_rotation、plot_type、standard_scale_type、shade_plot_mode、shade_plot_resolution_level均带validator.is_in_integer_range(...)校验和fixerRETURN_DEFAULT兜底shade_plot_custom_dpi使用fit_into_integer_range把越界值钳制回100–32768。这意味着即使读入不规范的 DXF 文件ezdxf 也能安全地规范化这些取值。导出流程PlotSettings.export_entity()layout.py#L216-L255按固定属性顺序写出AcDbPlotSettings子类标记及全部打印组码shade_plot_handle单独处理DXFLayout则在导出前自动维护MODEL_TYPE位。句柄资源shade_plot_handle在 xref 复制map_resources时按映射表转换句柄若为0或缺失则直接丢弃避免悬挂引用。9. 结语属性读写速查直接在代码中读写 PLOTSETTINGS 属性时遵循布局对象 →dxf命名空间 → 属性的链路即可import ezdxf doc ezdxf.new(R2000) layout doc.layouts.new(MyLayout) # 直接读写全部为 mm 单位 layout.dxf.paper_size A4 layout.dxf.paper_width, layout.dxf.paper_height 297, 210 layout.dxf.left_margin layout.dxf.right_margin 10 layout.dxf.top_margin layout.dxf.bottom_margin 10 layout.dxf.plot_paper_units 1 # mm layout.dxf.plot_rotation 0 layout.set_plot_type(1) # drawing extents layout.set_plot_style(monochrome.ctb) # 写入 CTB 并启用打印样式 layout.use_standard_scale(False) # 或者用一行高级 API 完成整套配置 layout.page_setup(size(297, 210), margins(10, 10, 10, 10), unitsmm, scale(1, 50))总结核心要点PLOTSETTINGS 全部属性内嵌于 LAYOUT 实体源码中DXFLayout继承自PlotSettings所有尺寸字段以 mm 存储plot_layout_flags是按位组合、默认 688标准比例枚举与STD_SCALES字典一一对应实际项目优先使用Layout.page_setup()或语义化 setter 而非裸写位值。如需更深了解布局管理器与图纸空间的关系可继续阅读 docs/source/layouts/layouts.rst 与 docs/source/layouts/layout_manager.rst。赞分享图形学【免费下载链接】ezdxfPython interface to DXF项目地址https://gitcode.com/gh_mirrors/ez/ezdxf点击查看免费下载相关推荐攻克DXF图纸打印难题ezdxf深度解析PLOTSETTINGS段配置与实战攻克DXF图纸打印难题ezdxf深度解析PLOTSETTINGS段配置与实战 引言你还在为DXF打印设置头疼吗 在CAD计算机辅助设计Computer图形学ezdxf Paperspace 布局实战页面设置、视口Viewport与打印出图完整指南ezdxf Paperspace 布局实战页面设置、视口Viewport与打印出图完整指南 导读 Paperspace图纸空间是 ezdxf 中组织模图形学Excelize打印设置终极指南页面布局与打印区域的精确控制Excelize打印设置终极指南页面布局与打印区域的精确控制 想要完美打印Excel文件吗Excelize作为纯Go语言编写的Excel处理库提供了强大的后端办公自动化上一篇gogcli gog update status 命令完全指南查询已安装与最新发布版本的实现原理与实战用法下一篇深入解析 filepathx为 Go 标准库 filepath.Glob 补齐 ** 双星递归匹配能力klauspost/compress 实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

OpenCV霍夫圆检测原理与HoughCircles调参实战

OpenCV霍夫圆检测原理与HoughCircles调参实战

1. 参数空间思维:为什么霍夫变换能"看见"圆很多初学者第一次接触霍夫变换时,最容易卡住的地方不是代码,而是"参数空间"这个概念。我当年第一次看到x-y空间和a-b空间这种说法时,也懵了很久。这里用一个最朴素的…

📅 2026/10/14 8:05:17
无限乐观与自我救赎:用微小行动重建生活秩序

无限乐观与自我救赎:用微小行动重建生活秩序

两年前的一个深夜,我把自己锁在书房里,对着电脑屏幕发了三个小时呆。那天不是发生了什么天大的事,就是连续几个项目受挫、一直关注的领域又出变数、手头积压的事越堆越多,整个人像被按进水底一样透不过气。我那会儿第一次认真想一…

📅 2026/10/14 8:05:17
现代C++智能指针详解:从RAII到unique_ptr/shared_ptr/weak_ptr

现代C++智能指针详解:从RAII到unique_ptr/shared_ptr/weak_ptr

你是不是也经历过这种场面:代码跑着跑着突然崩了,报错指向某个delete之后还在使用的指针;或者内存占用一路飙升,查了半天发现是某个对象被 new 出来之后丢了指向它的指针,再也无法释放。早期写 C 的人,十个…

📅 2026/10/14 8:05:17
MORE NEWS

更多资讯

📰

从符文到数学:教育游戏如何用规则设计点燃孩子的学习内驱力

前天整理项目文件,翻到 Numera Quest: Kingdom of Math Runes 的第一个可玩原型。这个以数学为内核、用符文做表意系统的教育游戏,最初不过是我对“孩子看见数字就头大”这件事的一次反抗。它现在依然算不上什么爆款,但从立项、开发再到上线三…

📰

LiteLLM统一接入多模型:从SDK到代理网关的工程实践

做LLM应用最烦的一件事,不是模型效果不够好,而是“接模型”这件事本身太零碎。前阵子一个朋友跟我聊他的AI助手项目:默认对话想用一个模型,复杂推理想切到另一个平台的长上下文模型,批量总结又要走便宜一点的模型。听起…

📰

AI辅助App开发全流程:从想法到上架的实战指南

1. 从想法到上架:AI辅助App开发的全景拆解这两年我身边不少朋友都在问同一个问题:现在AI这么强,是不是一个人就能把一款App从想法做到上架?我的回答一直是——能,但前提是你得搞清楚AI到底能帮你做什么、不能帮你做什么…

📰

iOS 17游客内购失败原因与StoreKit 2账户声明方案

1. 项目概述:这不是“绕过限制”,而是理清苹果内购游客登录的底层逻辑最近有好几位做教育类App、工具型小程序和轻量级SaaS服务的朋友陆续找到我,问同一个问题:“用户不注册、不登录,直接以游客身份打开App&#xff0c…

📰

PDF分布式处理实战:轻量级架构与工程落地

简介:本资源是一份面向互联网后端开发工程师与分布式系统学习者的深度技术笔记PDF,聚焦分布式系统核心机制——分布式锁、分布式事务及CAP/BASE理论。内容覆盖Redis(SETNXRedLock)、ZooKeeper(有序临时节点监听器&…

📰

栈与表达式求值:双栈法及中缀转后缀的机试实战

如果你正在准备某通信科技公司的机试,“实现一个简单的计算器”这道题几乎绕不开。我第一次在在线笔试系统里看到它时,心里想:不就是小学算术吗?真正把代码写出来才发现,它考的不是你会不会算数,而是你对待…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬