资讯详情

CadQuery 文件导入导出完全指南:DXF、STEP、装配体与网格格式实战

📅 2026/10/10 1:36:18 | 华诺云谱 👁 阅读
CadQuery 文件导入导出完全指南:DXF、STEP、装配体与网格格式实战
3D建模【免费下载链接】cadqueryA python parametric CAD scripting framework based on OCCT项目地址https://gitcode.com/gh_mirrors/ca/cadquery点击查看免费下载CadQuery 基于 OpenCascadeOCCT内核构建文件的导入导出本质上是 B-Rep 几何与各种交换格式之间的转换。本文基于仓库文档 doc/importexport.rst 与对应源码实现系统讲解 CadQuery 如何导入 DXF、STEP、XMLXCAF、XBF 文件以及如何将 Workplane 与 Assembly 对象导出为 STEP、STL、AMF、3MF、SVG、DXF、glTF、TJS、VRML、VTP 等格式并深入每个关键参数的源码级含义帮助你在 CAD 数据交换中做出正确的格式与参数选择。支持的文件格式总览外部文件格式主要用于与其他软件交换 CAD 模型数据但需要明确一点CadQuery 目前不支持任何携带参数化parametric数据的交换格式唯一完全参数化的格式是 CadQuery 自身的 Python 脚本形式。导入导出格式清单如下方向格式典型用途导入DXF导入复杂 2D 轮廓如铝型材截面的 2D 图纸再拉伸成所需长度导入STEP与其他 CAD/分析系统如 FreeCAD交换模型螺钉等标准件常有现成 STEP 文件导入XML (XCAF)OCCT 内部装配格式保存 Assembly 的颜色/结构信息导入XBFOCCT 内部二进制装配格式导出DXF2D 截面与 Sketch 输出导出SVG带隐藏线的 2D 投影图适合工程插图导出STEP与外部 CAD 交换 B-Rep 几何导出STL / AMF / 3MF网格格式面向增材制造3D 打印AMF、3MF 支持更多特性但通用性不如 STL导出TJSThreeJS 的 JSON 网格格式用于在 Web 浏览器中展示 3D 模型CadQuery 文档中的嵌入式 3D 示例即用它渲染导出VRML基于网格的交互式 3D 网页格式导出VTPVTK 库使用的网格格式导出glTF面向 Web 的网格格式仅支持 Assembly 导出.glb二进制或.gltf文本由扩展名决定导出XML (XCAF) / XBFOCCT 内部装配格式这些格式在代码中的分发入口有两个Workplane/Shape 一侧是 exporters/exportAssembly 一侧是 Assembly.export两者都通过解析文件扩展名来确定导出格式。导入 DXF把 2D 轮廓变成可建模几何DXF 文件通过cq.importers.importDXF方法导入。典型用法是导入轮廓后直接用wires()和toPending()使其进入待处理状态再执行后续建模操作import cadquery as cq result ( cq.importers.importDXF(/path/to/dxf/circle.dxf).wires().toPending().extrude(10) )这里toPending()的作用是告诉 CadQuery让当前 Workplane 上的边/线框对链中下一个建模操作这里是extrude(10)可用。importDXF的完整签名定义在 importers/init.pytol默认1e-6将边合并为线框wire时的容差exclude/include按图层名筛选两者只能二选一同时给出会抛出ValueError图层名比较不区分大小写实现见 _importDXF。从源码结构看底层导入逻辑位于 importers/dxf.py它通过DXF_CONVERTERS字典把 ezdxf 读到的实体逐类转换为 OCCT 边支持的实体类型有七种DXF_CONVERTERS { LINE: _dxf_line, CIRCLE: _dxf_circle, ARC: _dxf_arc, POLYLINE: _dxf_polyline, LWPOLYLINE: _dxf_polyline, SPLINE: _dxf_spline, ELLIPSE: _dxf_ellipse, }转换得到的零散边会经ShapeAnalysis_FreeBounds.ConnectEdgesToWires_s按容差连接成线框再由sortWiresByBuildOrder排序后调用Face.makeFromWires生成面——所以importDXF返回的 Workplane 上承载的是面Face这也是为什么wires()提取后能直接参与拉伸。导入 STEP单位换算在读取时完成STEP 通过cq.importers.importStep导入注意 Step 的大写import cadquery as cq result cq.importers.importStep(/path/to/step/block.stp) # 也可指定目标单位OCCT 会将文件头声明的单位换算为该单位 result cq.importers.importStep(/path/to/step/block.stp, unitM)默认将几何换算到毫米。unit参数是目标单位OCCT 会从 STEP 文件头声明的单位缩放到你请求的单位。合法取值由 UnitLiterals 定义MM、CM、M、KM、INCH、FT、MI、UM、NM。实现上_importStep 先调用Interface_Static.SetCVal_s(xstep.cascade.unit, unit.upper())设置目标单位再用STEPControl_Reader逐个转移根对象TransferRoot读取失败时抛出ValueError(STEP File could not be loaded)。此外cq.importers.importShape还统一封装了STEP、DXF、BREP、BIN四种类型见 ImportTypes其中 BREP/BIN 是 OCCT 原生格式的读写通道。导出 STEPWorkplane 的默认路径导出 Workplane 对象到 STEP 时不需要显式指定格式类型——扩展名会决定导出类型import cadquery as cq box cq.Workplane().box(10, 10, 10) box.export(/path/to/step/box.step)非默认扩展名需要显式指定类型如果必须使用.stp这类非标准扩展名CadQuery 会因识别不了扩展名而抛错此时要显式指定导出类型box cq.Workplane().box(10, 10, 10) # 使用 ExportTypes 枚举 box.export(/path/to/step/box.stp, cq.exporters.ExportTypes.STEP) # 也可以直接传字面量 box.export(/path/to/step/box2.stp, STEP)这个“按扩展名推断”的行为来自 exporters/export它取文件名最后一段大写后与 ExportTypes 的取值比对不匹配就抛出ValueError(Unknown extensions, specify export type explicitly)。通过 opt 字典设置额外选项STEP 导出接受附加选项详细说明见Shape.exportStep与Assembly.exportAssembly的文档box cq.Workplane().box(10, 10, 10) # 通过 opt 字典提供额外选项 box.export(/path/to/step/box.step, opt{write_pcurves: False}) # 等价地直接在底层 Shape 对象上导出 box.val().export(/path/to/step/box2.step, opt{write_pcurves: False})从源码看opt中的write_pcurves、precision_mode会被 Shape.exportStep 转成 OCCT 的Interface_Static设置write.surfacecurve.mode控制是否写入参数化曲线关闭可显著减小文件体积write.precision.mode控制 STEP 实体的不确定度取值 -1、0 或 1默认 0。单位控制unit 与 outputUnit 的分工CadQuery 默认以毫米导出 STEP。两个关键参数的分工是unit模型几何数值所采用的内部单位outputUnit写入 STEP 文件头部的声明单位不指定时默认等于unit。二者取值均出自UnitLiterals。通常建模时假定一种单位、导出时声明即可import cadquery as cq # 创建一个以厘米为单位的 10cm 盒子 box cq.Workplane().box(10, 10, 10) box.export(/path/to/step/box.step, unitCM)若希望一个毫米模型在 STEP 头中声明为米则保持unitMM默认值只设outputUnitMOCCT 会相应缩放坐标值box cq.Workplane().box(10, 10, 10) box.export(/path/to/step/box.step, unitMM, outputUnitM)对应实现见 Shape.exportStepxstep.cascade.unit设为unitwrite.step.unit设为outputUnit为 None 时回落到unit。导出装配体STEP / XML / XBFCadQuery 的 Assembly 可以直接导出为 STEP、XBF 或 XML导出器提供多种选项改变装配在外部 CAD 程序中的呈现方式。所有装配导出方法都会保留颜色信息。默认导出Assembly.export按扩展名写入文件import cadquery as cq assy cq.Assembly() body cq.Workplane().box(10, 10, 10) assy.add(body, colorcq.Color(1, 0, 0), namebody) pin cq.Workplane().center(2, 2).cylinder(radius2, height20) assy.add(pin, colorcq.Color(0, 1, 0), namepin) # 保存到 STEP assy.export(out.step) # 保存到 XBF assy.export(out.xbf) # 保存到 XML assy.export(out.xml)默认导出会产生一个带自动命名对象、嵌套结构的 STEP 文件各对象颜色被保留但你设置的名称不会保留。Assembly.export 中装配体侧合法扩展名为STEP、XML、XBF、VRML、VTKJS、GLTF、GLB、STLSTEP 与 XCAF 类格式分别走 exportAssembly 和 exportCAF。装配体的单位设置unit与outputUnit的语义与 Workplane 导出一致默认MM# 以微米为单位的装配体 assy cq.Assembly() assy.add(cq.Workplane().box(10, 10, 10), namebox) assy.export(/path/to/step/assy.step, unitUM) # 内部按微米建模但让 STEP 头声明为毫米 assy2 cq.Assembly() assy2.add(cq.Workplane().box(10, 10, 10), namebox) assy2.export(/path/to/step/assy.step, unitUM, outputUnitMM)fused 模式融合为单一实体modefused会尝试生成一个单一融合形状同时尽量保留每个装配对象的名字与颜色。注意融合操作在某些情况下可能有性能问题并且可能改变融合后固体的面。assy cq.Assembly() assy.add(cq.Workplane().box(10, 10, 10), colorcq.Color(1, 0, 0), namebody) assy.add( cq.Workplane().center(2, 2).cylinder(radius2, height20), colorcq.Color(0, 1, 0), namepin, ) # 保存为融合后的 STEP assy.export(out.stp, STEP, modefused) # 也可以以关键字参数形式传递附加选项如 glue assy.export(out_glue.step, modefused, glueTrue, write_pcurvesFalse)fused 模式的额外选项在 exportAssembly 的文档字符串中有完整说明fuzzy_tolOCCT 融合运算的模糊容差仅 fused 模式使用glue启用 glue 模式以改善 fused 导出性能仅适用于不相交或仅相切/部分重叠的形状若形状以不相容方式相交glue 可能产生无效结果默认Falsewrite_pcurves是否写入参数化曲线默认Trueprecision_modeSTEP 实体不确定度控制-1/0/1默认 0name_geometries把子形状名称传播到几何 STEP 实体上。mode的合法值由 ExportModes 定义default与fused。命名顶层装配对象在 DEFAULT 或 FUSED 模式下都可以通过在调用Assembly.export前设置 assembly 的name属性来命名 STEP 文件中的顶层对象assy Assembly(namemy_assembly) assy.export( out.stp, cq.exporters.ExportTypes.STEP, modecq.exporters.assembly.ExportModes.FUSED, )若不指定名称源码会回退到 UUIDstr(uuid.uuid1())见 exportStepMeta 与toCAF路径以避免命名冲突。带元数据导出给面附加名称、颜色与图层可以通过Assembly.addSubshape把元数据名称、颜色、图层挂到任意形状上随后Assembly.export或exportStepMeta会将其写入输出文件import cadquery as cq from cadquery.occ_impl.exporters.assembly import exportStepMeta assy cq.Assembly(nametop-level) cube_1 cq.Workplane().box(10.0, 10.0, 10.0) assy.add(cube_1, namecube_1, colorcq.Color(green)) # 为子形状顶面添加名称、颜色与图层 assy.addSubshape( cube_1.faces(Z).val(), namecube_1_top_face, colorcq.Color(red), layercube_1_top_face, ) assy.export(out.step)从实现看exportStepMeta 独立于常规exportAssembly存在因为它与 fused 模式不兼容且会压平 STEP 层级它为每个带元数据的面创建 subshape label写入ADVANCED_FACE名称、逐面颜色并同时创建同名图层——这是因为部分软件不认识ADVANCED_FACE实体需要从图层读取名称。导入装配体装配体可从 STEP、XBF 或 XML 文件导入入口是Assembly.load类方法注意从实例上调用它时会创建一个新的装配体assy cq.Assembly.load(out.step) # 按扩展名推断类型 assy cq.Assembly.load(out.xml, importTypeXML) assy cq.Assembly.importStep(out.step) # importStep 是 load 的便捷封装Assembly.load 按扩展名推断类型为STEP、XML、XBF之一其中只有 STEP 支持加载时的单位换算unit参数默认MMXBF/XML 则经由 importers/assembly.py 中的 XCAF 驱动读回。导出装配体到 glTFAssembly 支持导出 glTF面向 Web 的网格格式Assembly.export直接按扩展名写入要二进制 glTF 就把扩展名改成.glbassy cq.Assembly() assy.add(cq.Workplane().box(10, 10, 10), colorcq.Color(1, 0, 0), namebody) assy.add( cq.Workplane().center(2, 2).cylinder(radius2, height20), colorcq.Color(0, 1, 0), namepin, ) assy.export(out.gltf) # 文本 glTF改成 out.glb 即为二进制从源码看exportGLTF 做了两件值得注意的事一是二进制与否由binary参数控制未指定时按扩展名判断.gltf→ 文本其余 → 二进制二是导出前会临时给装配体附加Location((0, 0, 0), (1, 0, 0), -90)把 CadQuery 的右系 Z 朝上坐标系映射到 glTF 规范的右系 Y 朝上坐标系导出完成后恢复原变换。glTF 导出同样接受tolerance默认 1e-3与angularTolerance默认 0.1两个网格化参数。导出 SVG参数化的 2D 投影SVG 导出器把形状做隐藏线消除HLR投影后输出选项通过opt字典传入可省略以使用默认值import cadquery as cq from cadquery import exporters result cq.Workplane().box(10, 10, 10) result.export(/path/to/file/box.svg)可设置的选项及其在 getSVG 中的默认值选项含义默认值width图像宽度None时按高度自适应800height图像高度None时按宽度自适应240marginLeft文档左侧内边距200marginTop文档顶部内边距20projectionDir相机观察方向的单位向量(-1.75, 1.1, 5)showAxes是否显示坐标轴指示器仅当投影方向保持默认时可见TruestrokeWidth可见边的线宽-1表示按缩放自动计算-1.0strokeColor可见边颜色RGB 0-255(0, 0, 0)hiddenColor隐藏边颜色RGB 0-255(160, 160, 160)showHidden是否显示隐藏线Truefocus指定后生成透视 SVG值为投影器距离Noneresult.export( /path/to/file/box_custom_options.svg, opt{ width: 300, height: 300, marginLeft: 10, marginTop: 10, showAxes: False, projectionDir: (0.5, 0.5, 0.5), strokeWidth: 0.25, strokeColor: (255, 0, 0), hiddenColor: (0, 0, 255), showHidden: True, }, )加上focus: 25则会得到带透视效果的输出。源码里还有一个文档表格未列出的up选项默认为None保持 OCCT 默认的平面内朝向用于指定投影输出中向上的方向边曲线的离散化精度由模块常量DISCRETIZATION_TOLERANCE 1e-3固定。导出 STL网格质量参数STL 导出器可调节网格质量参数语义与Shape.exportStl一致result cq.Workplane().box(10, 10, 10) result.export(/path/to/file/mesh.stl)对复杂对象往往需要实验tolerance与angularTolerance才能找到可接受的网格。底层实现在 Shape.exportStl其完整参数为tolerance线偏差设置限制曲线与其离散化之间的距离太小会产生消耗计算资源的大网格太大则细节不足exportStl直接调用时默认1e-3经Workplane.export分发时默认0.1angularTolerance角偏差设置限制折线相邻线段之间的夹角默认0.1ascii输出 ASCIITrue或二进制FalseSTL默认二进制relative为 True 时容差按被网格化边的尺寸缩放默认 True可能导致大特征被明显多面体化而小特征过密parallel是否并行网格化默认 True。导出 AMF 与 3MFAMF 与 3MF 导出器同样支持网格质量参数fileNameAMF 输出路径与文件名tolerance线偏差默认 0.1是一个多场景适用的起点angularTolerance角偏差默认 0.1。复杂对象同样建议实验这两个参数。注意 AMF/3MF 导出没有颜色与材质参数。result cq.Workplane().box(10, 10, 10) result.export(/path/to/file/mesh.amf, tolerance0.01, angularTolerance0.1)从源码看AMF 路径先tessellate(tolerance, angularTolerance)再交给 AmfWriter3MF 路径则是ThreeMFWriter(shape, tolerance, angularTolerance, **opt)内部网格化见 exporters/export。导出 TJSThreeJSTJS 导出器生成一个描述 ThreeJS WebGL 场景的 JSON 文件参数中的对象被转换成网格构成场景的 ThreeJS 几何。可调参数与 AMF 相同fileName、tolerance默认 0.1、angularTolerance默认 0.1。result cq.Workplane().box(10, 10, 10) result.export( /path/to/file/mesh.json, tolerance0.01, angularTolerance0.1, exportTypeexporters.ExportTypes.TJS, )注意示例中必须显式指定TJS因为文件扩展名用的是.json如果扩展名用.tjsCadQuery 会自动识别 TJS 格式。导出 VRMLVRML 导出器的参数与网格质量调节方式和 STL 一致result cq.Workplane().box(10, 10, 10) result.export(/path/to/file/mesh.vrml, tolerance0.01, angularTolerance0.1)实现上 Workplane 一侧的 VRML 走 OCCT 的VrmlAPI先shape.mesh再VrmlAPI.Write_s而 Assembly 一侧的 VRML 由 exportVRML 基于 VTK 的vtkVRMLExporter完成默认tolerance1e-3。导出 DXF2D 截面、Sketch 与近似策略注意DXF 导出仅支持当前工作平面上的 2D 截面或 Sketch。基本用法import cadquery as cq from cadquery import exporters result cq.Workplane().box(10, 10, 10).section() exporters.exportDXF(result, /path/to/file/object.dxf) # 或者 result.export(/path/to/file/object.dxf)Sketch 也可以直接导出result cq.Sketch().rect(1, 1) result.export(/path/to/file/object.dxf)选项approx 与 doc_unitsexportDXF 接受三个控制参数approx把 Workplane 转换为 DXF 实体的近似策略——None不做近似spline把所有样条近似为三次样条arc把所有曲线近似为圆弧加直线段tolerance近似容差文档/模型空间单位默认1e-3英寸比例图纸约 1 thou毫米比例图纸约 1 µmdoc_unitsezdxf 文档/模型空间单位编号。DXF 文档默认单位为毫米doc_units 4doc_units单位0Unitless1Inches2Feet3Miles4Millimeters5Centimeters6Meters文档单位可以设为任何 ezdxf 支持的单位result cq.Workplane().box(10, 10, 10).section() exporters.exportDXF(result, /path/to/file/object.dxf, doc_units6) # 米 # 或 result.export(/path/to/file/object.dxf, opt{doc_units: 6})近似策略为什么默认可能丢曲线默认情况下DXF 导出器按 OpenCascade 内核的原样输出样条。遗憾的是某些软件无法处理高阶样条导入 DXF 后曲线会缺失。解决办法是指定近似策略cq.exporters.exportDXF(result, /path/to/file/object.dxf, approxspline)从 DxfDocument 的构造签名看它还提供dxfversion默认AC1027即 R2013与setup是否初始化默认样式等参数。DxfDocument还是把多个 Workplane 写入同一 DXF 文档多个图层的入口先add_layer(name, color...)定义图层再add_shape(shape, layer)最后dxf.document.saveas(...)保存用法示例见该类的文档字符串。源码中还有一个文档未展开的 exportDXFProjection它通过 HLR 投影导出3D 对象的可见轮廓到 DXF参数含投影方向dir、原点pnt与up。其他导出格式只认文件名的格式其余导出格式除文件名外不接受任何附加参数统一写法result cq.Workplane().box(10, 10, 10) result.export(/path/to/file/object.[file_extension])务必使用正确的扩展名让 CadQuery 判定格式拿不准时回退到显式类型result cq.Workplane().box(10, 10, 10).section() result.export(/path/to/file/object.dxf, exporters.ExportTypes.DXF)从 ExportTypes 的完整取值看除文档列出的格式外源码还支持两种 OCCT 原生格式的导出字面量BREP文本 B-Rep经 Shape.exportBrep与BIN二进制 B-Rep经 Shape.exportBin配合importBrep/importBin可以无损往返保存中间几何状态。此外 Assembly 侧还支持VTKJSexportVTKJS 会在临时目录生成 vtk.js 场景后打包成 zip以及装配体级STLAssembly.export(out.stl, asciiTrue/False)通过toCompound()合并后网格化。小结CadQuery 的导入导出体系围绕两个分发入口组织Workplane/Shape 侧的 exporters/export按扩展名推断opt字典传参与 Assembly 侧的 Assembly.export扩展名 mode/unit/outputUnit等参数。选择格式的核心原则是需要 B-Rep 精度与外部 CAD 协作选 STEP/装配体三件套STEP/XBF/XML需要 2D 图纸互操作选 DXF需要出图选 SVG需要 3D 打印选 STL/AMF/3MF需要 Web 展示选 glTF/TJS/VRML。单位换算在导入与导出 STEP 时都通过 OCCT 的xstep.cascade.unit/write.step.unit接口完成而网格类格式的质量则由tolerance与angularTolerance两个偏差参数统一控制。相关行为在 tests/test_exporters.py、tests/test_importers.py 与 tests/test_assembly.py 中有对应的自动化测试覆盖。赞分享3D建模【免费下载链接】cadqueryA python parametric CAD scripting framework based on OCCT项目地址https://gitcode.com/gh_mirrors/ca/cadquery点击查看免费下载相关推荐CadQuery导入导出完全手册STEP、STL、DXF格式的终极指南CadQuery导入导出完全手册STEP、STL、DXF格式的终极指南 CadQuery是一个基于Python的参数化CAD脚本框架基于OCCT构建提供了3D建模OpenSCAD文件导入导出完全指南支持STL、DXF、SVG、3MF等10格式OpenSCAD文件导入导出完全指南支持STL、DXF、SVG、3MF等10格式 OpenSCAD作为一款 程序员专用的3D CAD建模软件 其强大的 文图形学3D建模桌面应用notepad--代码格式化配置文件导入导出notepad 代码格式化配置文件导入导出 一、配置文件概述 notepad 作为一款跨平台文本编辑器支持Windows/Linux/macOS提供了丰桌面应用上一篇如何快速上手PP-DocLayoutV2_onnx5分钟完成文档结构分析实战教程下一篇vscode-markdown列表编辑技巧自动编号与智能缩进创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑