ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

ezdxf 图纸空间(Paperspace)视口(VIEWPORT)完全指南:页面设置、缩放比例、图层冻结与属性覆盖

ezdxf 图纸空间(Paperspace)视口(VIEWPORT)完全指南:页面设置、缩放比例、图层冻结与属性覆盖 图形学【免费下载链接】ezdxfPython interface to DXF项目地址https://gitcode.com/gh_mirrors/ez/ezdxf点击查看免费下载本文以 ezdxf 官方教程 psp_viewports.rst 为骨架结合仓库内示例脚本与源码实现系统讲解在图纸空间Paperspace布局中创建和管理 VIEWPORT 视口的完整流程从页面设置page_setup、视口添加与缩放比例计算到视口方向调整、图层冻结与逐视口图层属性覆盖。读完本文你将掌握用 ezdxf 为 R2000 版本 DXF 文件制作多视口图纸布局的完整实战方案并能理解底层 DXF 数据的存储原理。教程背景与核心示例脚本本教程基于示例脚本 viewports_in_paperspace.py 展开。该脚本会为 DXF R12 与 R2000 版本各生成一个图纸文件其模型空间内容包含三个位于 WCS世界坐标系XY 平面内的平面几何图形一个红色矩形、一个绿色圆、一个青色三角形均由 create_2d_modelspace_content 创建一个 20×20 网格、由正弦/余弦函数生成起伏曲面的 3D 网格由 create_3d_modelspace_content 创建高度为 3.0范围 30×30。模型空间内容如下图所示图片路径gfx/vp-tut-msp-content.png重要为什么建议使用 R2000 版本原教程给出了一个重要警告如果需要在图纸空间布局中使用页面尺寸请使用 DXF R2000 或更高版本因为 DXF R12 的页面尺寸导出无法正常工作作者在 BricsCAD 中发现 R12 导出的图纸尺寸错误在 Autodesk DWG Trueview 中发现边距错误且未找到原因也未修复。这是图纸空间布局在 DXF 版本支持上的一个硬性边界实战中务必注意。页面设置Page Setup定义纸张本身DXF 参考手册中关于图纸空间布局特性的文档非常匮乏关于如何使用几乎没有任何实践说明因此本教程中大部分信息是作者通过反复试错总结出来的假设。Paperspace类的page_setup()方法定义了纸张本身的属性。模型空间和图纸空间的单位互不相关甚至可以使用不同的单位制英制、米制但为了简单起见官方建议两个空间使用相同的单位系统layout.page_setup(size(24, 18), margins(1, 1, 1, 1), unitsinch)page_setup 完整参数签名从源码 layout.py 可以看到page_setup()的完整签名与默认值def page_setup( self, size: tuple[float, float] (297, 210), # 纸张尺寸 (宽, 高) margins: tuple[float, float, float, float] (0, 0, 0, 0), # (上, 右, 下, 左)注意是顺时针顺序 units: str mm, # mm 或 inch offset: tuple[float, float] (0, 0), # 绘图原点偏移2D 点 rotation: int 0, # 旋转取值 0-3 scale: Union[int, tuple[float, float]] 16, # 标准比例类型索引或 (分子, 分母) 元组 name: str ezdxf, # 纸张名称前缀 device: str DWG to PDF.pc3, # 设备 .pc3 配置文件或系统打印机名 ) - None:各参数要点size定义旋转模式 0 下纸张的整体尺寸。最佳实践是先在横向landscape模式下定义纸张范围之后再通过rotate参数旋转纸张。margins四元组顺序为(top, right, bottom, left)顺时针。内部会按unit_factor转换为毫米存储英寸换算系数为 25.4。units仅支持mm和inch大小写不敏感源码中units.startswith(inch)判定其他值会抛出DXFValueError。rotation取值表源码与教程一致取值含义0不旋转1逆时针旋转 90 度2上下颠倒180 度3顺时针旋转 90 度源码 layout.py 中会对rotation做校验非 0-3 的值抛出DXFValueError(valid rotation values: 0-3)。scale反映图纸空间paperspace中纸张单位与绘图单位之间的关系。可以传整数0-32 范围内的标准比例类型索引映射关系在const.STD_SCALES中也可以传(分子, 分母)元组例如(1, 50)表示 1:50。教程建议保持默认 1:1并在图纸空间中用与纸张尺寸相同的单位绘制线条和文字。注意分子或分母为 0 会抛出DXFValueError。page_setup 写入了哪些 DXF 数据源码显示page_setup()会设置 PLOTSETTINGS 头部的多项属性并把纸张名称规范化为{name}_({width:.2f}_x_{height:.2f}_{units})格式如ezdxf_(24.00_x_18.00_Inches)同时写入plot_configuration_file、四边*_margin、paper_width/paper_height统一换算为毫米、scale_numerator/scale_denominator、plot_paper_units0 表示 Inches1 表示 MM、plot_rotation、绘图原点偏移等最后调用reset_paper_limits()、reset_extents()、reset_viewports()重置纸张极限、范围和视口。更简单的页面设置Drawing.page_setup原教程作者在写作过程中注意到更换打印机/绘图仪和纸张尺寸会导致布局内容移位因为所有纸张尺寸都是在没有边距的情况下定义的也许最好把所有边距设为零。为此作者在Drawing类上添加了辅助方法page_setup()并提供了示例 simple_page_setup.py 演示用法。Drawing.page_setup()位于 document.py签名如下def page_setup( self, name: str Layout1, # 图纸空间布局名称 fmt: str ISO A3, # 纸张格式 landscapeTrue, # True 横向False 纵向 ) - Paperspace:该方法要求 DXF R2000 或更新版本。fmt支持的纸张格式尺寸均为横向度量值名称单位宽高ISO A0mm1189841ISO A1mm841594ISO A2mm594420ISO A3mm420297ISO A4mm297210ANSI Ainch118.5ANSI Binch1711ANSI Cinch2217ANSI Dinch3422ANSI Einch4434ARCH Cinch2418ARCH Dinch3624ARCH Einch4836ARCH E1inch4230Letterinch118.5Legalinch148.5该布局使用纸张格式对应的单位作为绘图单位无边距、无偏移、图纸空间比例为 1:1因此更换输出设备非常容易至少在 BricsCAD 中如此。示例脚本中还提醒无边距布局的绘图空间是整个纸张但打印机/绘图仪不会打印到纸张边缘真实文件中应始终在纸张边缘与内容之间保留安全空间且该安全空间的大小因设备而异、无法预知建议结合psp.dxf.paper_width和psp.dxf.paper_height自行设计。在图纸空间中绘图你可以像在任意布局空间一样向图纸空间添加 DXF 实体。坐标系原点(0, 0)位于画布canvas的左下角画布范围等于纸张尺寸减去边距。你可以绘制超出该范围的内容但 CAD 应用程序可能不会打印这些内容。在 viewports_in_paperspace.py 中作者按此规则做了如下计算并绘制边框layout: Paperspace doc.layout(Layout1) # Arch C 18 x 24 in width, height 24, 18 m 1 layout.page_setup(size(width, height), margins(m, m, m, m), unitsinch) # 画布由纸张尺寸减去边距定义 canvas_width width - 2 * m # 22 canvas_height height - 2 * m # 16 # 画布左下角坐标为 0, 0关于 R12 的特殊处理示例脚本同时支持 R12 导出但 R12 走的是另一条路径page_setup_r12()见 layout.py。该方法会先删除所有已存在的视口然后通过头部变量$PLIMMIN、$PLIMMAX、$PEXTMIN、$PEXTMAX设置打印范围并缩放边距与纸张尺寸源码中有 TODO 注释不知道如何在 R12 中设置 inch/mm 模式。同时注意DXF R12 只支持一个图纸空间即一个布局任何布局名称都返回同一个布局见 viewports_in_paperspace.py 的注释。添加视口Adding ViewportsViewportDXF VIEWPORT实体是一个指向模型空间的窗口用于在图纸空间中按任意缩放比例和旋转角度显示模型空间的内容。VIEWPORT 实体通过工厂方法Paperspace.add_viewport()添加。从源码 layout.py 可以看到其完整签名def add_viewport( self, center: UVec, # 视口在图纸空间中的中心点 size: tuple[float, float], # 视口在图纸空间中的 (宽, 高) view_center_point: UVec, # 要显示的模型空间区域中心点 view_height: float, # 模型空间中要显示的区域高度 status: int 2, # 视口状态默认 2 dxfattribsNone, # 附加 DXF 属性 ) - Viewport:关键点center定义视口在图纸空间中的中心位置size定义 VIEWPORT 在图纸空间中的宽度和高度要显示的模型空间内容由view_center_point和view_height定义默认图层为 VIEWPORTS源码中attribs字典明确写了layer: VIEWPORTS用于后续控制视口边框显隐status语义源码注释-1表示开启但在屏幕外或因为$MAXACTVP计数超出而非激活0表示关闭任何大于 0 的值表示开启且激活其中1是活动视口2是下一个以此类推dxf.id由get_next_viewport_id()自动分配从 2 开始递增源码 layout.py。添加视口后的图纸空间布局如下图所示图片路径gfx/vp-tut-psp-content.png缩放比例Scaling Factor由尺寸与视高的比值决定VIEWPORT 的缩放因子不是一个显式的数值而是由size参数中的 VIEWPORT 高度与view_height参数的比值关系决定的。源码 viewport.py 中的get_scale()方法印证了这一计算方式def get_scale(self) - float: Returns the scaling factor from modelspace to viewport. msp_height self.dxf.view_height if abs(msp_height) 1e-12: return 0.0 vp_height self.dxf.height return vp_height / msp_height # 视口高度 / 模型空间视高当两个值相等时缩放比例为 1:1paperspace.add_viewport( center(14.5, 2.5), size(5, 5), view_center_point(12.5, 7.5), view_height5, )当view_height比 VIEWPORT 高度大 5 倍时缩放比例为 1:5paperspace.add_viewport( center(8.5, 2.5), size(5, 5), view_center_point(10, 5), view_height25, )原示例 viewports_in_paperspace.py 中还演示了更多比例组合view_height10、视口高5得到 1:2矩形视图size(0.3, 0.15)、view_height7.5得到 1:50缩放比例 7.5 / 0.15 50并在每个视口下方用add_text()标注了比例文字形成规范的平面图 局部放大图图纸布局。另外可参考 viewport.py 的get_aspect_ratio()返回width / height与 viewport.py 的get_modelspace_limits()返回模型空间中可见范围的(min_x, min_y, max_x, max_y)这两个辅助方法可用于进一步验证视口覆盖的模型空间区域。视口方向View Direction从俯视到任意视角VIEWPORT 的默认视角是俯视top down view即沿 Z 轴向下看但可以通过dxf命名空间中的view_target_point和view_direction_vector属性更改为任意视角vp paperspace.add_viewport( center(16, 10), size(4, 4), view_center_point(0, 0), view_height30 ) vp.dxf.view_target_point (40, 40, 0) vp.dxf.view_direction_vector (-1, -1, 1)从源码 viewport.py 的 DXF 属性定义看view_direction_vector组码 163D 点默认值为Z_AXIS即(0, 0, 1)对应俯视view_target_point组码 173D 点默认值为NULLVEC(0, 0, 0)。get_view_direction()方法会返回归一化的视角向量is_top_view属性判断是否仍为俯视与 Z 轴接近即为俯视见 viewport.py。示例中设置view_target_point(40, 40, 0)、view_direction_vector(-1, -1, 1)后视口将以斜向 45° 视角展示 3D 网格即Viewport to 3D Mesh视图。注意get_transformation_matrix()模型空间到图纸空间变换矩阵目前仅支持俯视视口见 viewport.py 注释。视口边框Viewport Frame用图层控制显隐VIEWPORT 的边框线borderlines默认显示在图纸空间中但VIEWPORT 实体本身没有控制边框显隐的属性。边框的可见性由分配给 VIEWPORT 实体的图层控制——在 ezdxf 中默认图层是 VIEWPORTS源码见 layout.py 的layer: VIEWPORTS注释use separated layer to turn off for plotting。关闭该图层即可隐藏该图层上所有 VIEWPORT 实体的边框但图层 VIEWPORTS 需要由库的使用者自行创建vp_layer doc.layers.add(VIEWPORTS) vp_layer.off()示例 viewports_in_paperspace.py 中的写法更稳健先检查图层是否存在不存在才创建然后统一关闭if VIEWPORTS not in doc.layers: vp_layer doc.layers.add(VIEWPORTS) else: vp_layer doc.layers.get(VIEWPORTS) vp_layer.off()源码注释还指出VIEWPORT 图层不是固定的可以通过add_viewport(..., dxfattribs{layer: MyViewportLayer})指定自定义视口图层。冻结图层Freeze Layers每个视口独立控制可见性每个 VIEWPORT 可以有独立的冻结图层冻结的图层在该视口内不可见。要冻结视口中的图层只需把冻结图层名称以列表list-like 对象形式赋值给 VIEWPORT 实体的frozen_layers属性vp.frozen_layers [Layer0, Layer1]从源码 viewport.py 看frozen_layers是列表属性并配套提供了更精细的操作方法freeze(layer_name)冻结指定图层thaw(layer_name)解冻指定图层is_frozen(layer_name)查询指定图层是否已冻结。图层名比较通过validator.make_table_key()统一键化因此大小写不敏感与所有表名规则一致。重要关于不存在的图层名原教程特别提示AutoCAD 和 BricsCAD 不会因图层名没有对应的图层表条目而崩溃且图层名称与所有表名一样不区分大小写。源码 viewport.py 的post_load_hook印证了这一点读取文件时冻结图层以句柄形式存储组码 331加载后通过实体数据库把句柄解析回图层名遇到不存在的图层KeyError会被静默忽略pass不会报错。覆盖图层属性Override Layer Properties逐视口的图层样式覆盖每个 VIEWPORT 可以单独覆盖图层属性。这些覆盖存储在Layer实体中并通过 VIEWPORT 的句柄handle引用。该流程略为复杂示例文件 viewports_override_layer_attributes.py 有完整演示核心四步获取Layer对象从图层获取LayerOverrides对象覆盖该 VIEWPORT 的属性提交更改。layer doc.layers.get(Layer0) override layer.get_vp_overrides() override.set_linetype(vp.dxf.handle, DASHED) override.commit()LayerOverrides 源码级解析LayerOverrides类定义于 layer.py通过Layer.get_vp_overrides()见 layer.py获取。支持的属性覆盖包括ACI 颜色set_color(vp_handle, value)仅接受合法的图层颜色索引真彩色set_rgb(vp_handle, value)RGB 三元组传None可移除真彩色设置透明度set_transparency(vp_handle, value)0.0 完全不透明1.0 完全透明线型set_linetype(vp_handle, value)要求该线型存在于 LTYPE 表中否则抛出ValueError线宽set_lineweight(vp_handle, value)要求是合法的图层线宽值对应的方法均有配套的get_*()读取方法。关键点是 layer.py 中commit()的注释Without a commit() all changes are lost!不调用 commit() 所有更改都会丢失——覆盖数据在内存中累积只有commit()才会真正写回Layer实体的扩展数据。此外还有has_overrides()查询某视口是否存在覆盖和discard(vp_handleNone)丢弃指定视口或全部视口的覆盖。示例脚本 viewports_override_layer_attributes.py 分别演示了override_aci逐视口设置 ACI 色、override_rgb逐视口设置 RGB 真彩色、override_ltype逐视口设置线型如 DASHED2/DOT2和override_lw逐视口设置线宽如 13-140 等标准线宽值四种覆盖方式并把$LWDISPLAY头部变量置 1 以便在 DXF 查看器中显示线宽。仓库中还有对应的单元测试 test_141_layer_vp_override.py 可作参考。完整运行示例与配套工具把上述所有元素组合起来运行 viewports_in_paperspace.pypython examples/viewports_in_paperspace.py脚本的main()会依次为 R12、R2000、R2007 三个版本生成viewports_in_paperspace_{dxfversion}.dxf文件默认输出到~/Desktop/Outbox目录不存在时输出到当前目录。R2000/R2007 文件中包含矩形1:2、圆1:5、三角形1:1、总览视图1:1、1:50 微缩视口以及 3D 网格斜视角视口等多个视口。需要一提的是示例最后调用了 document.py 的set_modelspace_vport(height, center)方法如 viewports_override_layer_attributes.py 中的doc.set_modelspace_vport(60, (50, 30))它用于设置 CAD 应用打开文件时模型空间的初始视图/缩放位置替换当前的*Active视口配置并重置坐标系为 WCS——这是让用户打开文件后直接看到目标内容的实用技巧。小结本文完整覆盖了 ezdxf 图纸空间视口布局的六大技术要点页面设置page_setup()及辅助的Drawing.page_setup()定义纸张尺寸、边距、单位、旋转与比例注意margins为(上, 右, 下, 左)顺时针顺序图纸空间绘图原点在画布左下角画布 纸张 − 边距R12 请改用page_setup_r12()添加视口add_viewport(center, size, view_center_point, view_height, status)默认图层 VIEWPORTS缩放比例视口高度 / view_height源码get_scale()直接印证相等即 1:1方向与边框默认俯视通过view_target_point/view_direction_vector改变视角通过关闭 VIEWPORTS 图层隐藏边框图层冻结与属性覆盖frozen_layers逐视口冻结图层LayerOverrides逐视口覆盖 ACI 颜色、真彩色、透明度、线型与线宽记得调用commit()。若需在实战中进一步验证视口实体的序列化与缩放行为可阅读测试文件 test_211_viewport.py含 R12 与 R2000 的 VIEWPORT 实体读写测试以及图层概念的官方文档 layers.rst。赞分享图形学【免费下载链接】ezdxfPython interface to DXF项目地址https://gitcode.com/gh_mirrors/ez/ezdxf点击查看免费下载相关推荐ezdxf Paperspace 布局实战页面设置、视口Viewport与打印出图完整指南ezdxf Paperspace 布局实战页面设置、视口Viewport与打印出图完整指南 导读 Paperspace图纸空间是 ezdxf 中组织模图形学ezdxf 图层表内部结构与视口图层属性覆盖机制深度解析ezdxf 图层表内部结构与视口图层属性覆盖机制深度解析 本文基于 ezdxf 仓库的 图层表内部结构文档 https://link.gitcode.com/i图形学ezdxf VIEWPORT 实体完全指南布局空间视口的创建、属性体系与源码级原理解析ezdxf VIEWPORT 实体完全指南布局空间视口的创建、属性体系与源码级原理解析 导读 本文以 docs/source/dxfentities/view图形学上一篇umy-ui高性能表格组件库深度使用指南下一篇claude-code-best-practice工作流设计提升团队协作效率的6个关键策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表