第06章-数据导入导出
第06章:数据导入导出
6.1 导出功能概述
6.1.1 支持的导出格式
CadQuery支持多种导出格式,每种格式有其特定的应用场景:
| 格式 | 扩展名 | 特点 | 典型应用 |
|---|---|---|---|
| STEP | .step, .stp | 无损、精确、工业标准 | CAD交换、精密制造 |
| STL | .stl | 三角网格、通用 | 3D打印、快速原型 |
| BREP | .brep | OpenCASCADE原生 | 数据存档 |
| 3MF | .3mf | 支持颜色和材质 | 高级3D打印 |
| AMF | .amf | 支持材质和颜色 | 增材制造 |
| VRML | .wrl | 支持颜色、古老格式 | 可视化 |
| DXF | .dxf | 2D绘图 | CAD制图 |
| SVG | .svg | 2D矢量图 | 网页显示、激光切割 |
| JSON | .json | CadQuery对象序列化 | 数据存储 |
| glTF | .gltf, .glb | Web3D标准 | Web显示、游戏 |
6.1.2 基本导出方法
import cadquery as cq
# 创建一个模型
model = cq.Workplane("XY").box(30, 20, 10)
# 使用exporters模块导出
cq.exporters.export(model, "model.step")
cq.exporters.export(model, "model.stl")
# 装配体使用save方法
assy = cq.Assembly()
assy.add(model, name="box")
assy.save("assembly.step")
6.2 STEP格式导出
6.2.1 STEP格式介绍
STEP (Standard for the Exchange of Product Data) 是ISO 10303标准定义的CAD数据交换格式。它的主要优点:
- 无损:保留精确的几何信息
- 标准化:被所有主流CAD软件支持
- 完整性:可以包含装配体结构、颜色等信息
6.2.2 导出STEP文件
import cadquery as cq
# 简单模型
model = (
cq.Workplane("XY")
.box(50, 30, 20)
.faces(">Z")
.workplane()
.hole(10)
)
# 导出为STEP
cq.exporters.export(model, "part.step")
# 或指定格式类型
cq.exporters.export(model, "part.stp", exportType="STEP")
6.2.3 STEP导出选项
import cadquery as cq
from cadquery import exporters
model = cq.Workplane("XY").box(30, 20, 10)
# 使用exportStep函数获得更多控制
# 注意:实际API可能因版本而异
cq.exporters.export(
model,
"detailed_part.step",
exportType="STEP"
)
6.2.4 装配体STEP导出
import cadquery as cq
# 创建装配体
base = cq.Workplane("XY").box(50, 50, 10)
pillar = cq.Workplane("XY").cylinder(30, 10)
assy = cq.Assembly()
assy.add(base, name="base", color=cq.Color("blue"))
assy.add(pillar, name="pillar", color=cq.Color("red"),
loc=cq.Location(cq.Vector(0, 0, 10)))
# 保存装配体
# 颜色和结构会被保留
assy.save("assembly.step")
6.3 STL格式导出
6.3.1 STL格式介绍
STL (Stereolithography) 格式使用三角形网格来表示3D表面。它是3D打印最常用的格式。
优点:
- 广泛支持
- 简单的文件结构
- 适合3D打印
缺点:
- 近似表示,非精确
- 不支持颜色(基本版)
- 不支持装配体结构
6.3.2 基本STL导出
import cadquery as cq
model = cq.Workplane("XY").box(30, 20, 10).edges().fillet(2)
# 导出为ASCII STL
cq.exporters.export(model, "model_ascii.stl")
# 导出为二进制STL(文件更小)
cq.exporters.export(model, "model_binary.stl", exportType="STL")
6.3.3 STL精度控制
STL导出时可以控制网格精度:
import cadquery as cq
# 创建带曲面的模型
model = cq.Workplane("XY").sphere(20)
# 低精度导出(文件小,表面粗糙)
cq.exporters.export(
model,
"sphere_low.stl",
tolerance=0.5, # 较大的公差
angularTolerance=0.5
)
# 高精度导出(文件大,表面光滑)
cq.exporters.export(
model,
"sphere_high.stl",
tolerance=0.01, # 较小的公差
angularTolerance=0.1
)
6.3.4 STL导出选项详解
import cadquery as cq
model = cq.Workplane("XY").cylinder(30, 15)
# 详细的STL导出选项
cq.exporters.export(
model,
"cylinder.stl",
tolerance=0.1, # 线性公差(mm)
angularTolerance=0.1, # 角度公差(弧度)
exportType="STL"
)
6.4 其他3D格式导出
6.4.1 3MF格式
3MF是微软推广的新一代3D打印格式,支持颜色、材质等信息:
import cadquery as cq
# 创建带颜色的装配体
part1 = cq.Workplane("XY").box(20, 20, 10)
part2 = cq.Workplane("XY").cylinder(15, 8)
assy = cq.Assembly()
assy.add(part1, name="base", color=cq.Color("red"))
assy.add(part2, name="top", color=cq.Color("blue"),
loc=cq.Location(cq.Vector(0, 0, 10)))
# 导出为3MF(保留颜色)
assy.save("colored_model.3mf")
6.4.2 glTF格式
glTF是Web3D的标准格式,适合在网页中显示3D模型:
import cadquery as cq
model = cq.Workplane("XY").box(30, 20, 10)
# 导出为glTF
cq.exporters.export(model, "model.gltf")
# 导出为二进制glTF(GLB)
cq.exporters.export(model, "model.glb")
6.4.3 VRML格式
import cadquery as cq
model = cq.Workplane("XY").box(30, 20, 10)
# 导出为VRML
cq.exporters.export(model, "model.wrl", exportType="VRML")
6.5 2D格式导出
6.5.1 DXF导出
DXF (Drawing Exchange Format) 用于导出2D图形:
import cadquery as cq
# 创建3D模型
model = (
cq.Workplane("XY")
.box(50, 30, 20)
.faces(">Z")
.workplane()
.rect(30, 15)
.cutThruAll()
)
# 导出顶视图为DXF
# 首先获取顶面的轮廓
top_face = model.faces(">Z").val()
cq.exporters.export(model, "top_view.dxf", exportType="DXF")
6.5.2 SVG导出
SVG用于导出2D矢量图形:
import cadquery as cq
# 创建模型
model = cq.Workplane("XY").box(50, 30, 20)
# 导出为SVG
cq.exporters.export(model, "projection.svg", exportType="SVG")
6.5.3 2D轮廓导出
import cadquery as cq
# 创建2D轮廓
profile = (
cq.Workplane("XY")
.rect(50, 30)
.rect(30, 15, forConstruction=False)
.val()
)
# 导出为DXF用于激光切割
cq.exporters.export(
cq.Workplane("XY").rect(50, 30),
"laser_cut.dxf",
exportType="DXF"
)
6.6 数据导入
6.6.1 导入STEP文件
import cadquery as cq
# 导入STEP文件
imported = cq.importers.importStep("existing_part.step")
# imported是一个Workplane对象,可以继续操作
result = (
imported
.faces(">Z")
.workplane()
.hole(10) # 在导入的模型上添加孔
)
cq.exporters.export(result, "modified_part.step")
6.6.2 导入后的操作
import cadquery as cq
# 导入外部STEP模型
housing = cq.importers.importStep("housing.step")
# 在导入的模型基础上添加特征
result = (
housing
.faces(">Z")
.workplane()
.rarray(20, 20, 3, 3)
.hole(5)
.faces("|Z")
.edges()
.fillet(2)
)
cq.exporters.export(result, "housing_modified.step")
6.6.3 导入DXF文件
import cadquery as cq
# 导入DXF作为2D草图
dxf_shape = cq.importers.importDXF("profile.dxf")
# 将2D轮廓拉伸成3D
result = cq.Workplane("XY").add(dxf_shape).extrude(10)
cq.exporters.export(result, "extruded_dxf.step")
6.6.4 导入SVG文件
import cadquery as cq
# 导入SVG路径
svg_shape = cq.importers.importDXF("design.dxf") # 或者使用专门的SVG导入
# 拉伸
result = cq.Workplane("XY").add(svg_shape).extrude(5)
6.7 高级导出技巧
6.7.1 批量导出
import cadquery as cq
import os
# 创建多个零件
parts = {
"base": cq.Workplane("XY").box(50, 50, 10),
"pillar": cq.Workplane("XY").cylinder(30, 10),
"cover": cq.Workplane("XY").box(40, 40, 5),
}
# 创建输出目录
output_dir = "parts_export"
os.makedirs(output_dir, exist_ok=True)
# 批量导出
for name, part in parts.items():
# 导出STEP
cq.exporters.export(part, f"{output_dir}/{name}.step")
# 导出STL
cq.exporters.export(part, f"{output_dir}/{name}.stl")
print(f"已导出 {len(parts)} 个零件")
6.7.2 参数化导出
import cadquery as cq
def export_parametric_part(length, width, height, filename):
"""生成并导出参数化零件"""
model = (
cq.Workplane("XY")
.box(length, width, height)
.edges("|Z")
.fillet(min(length, width, height) * 0.1)
)
cq.exporters.export(model, f"{filename}.step")
cq.exporters.export(model, f"{filename}.stl", tolerance=0.05)
return model
# 生成不同尺寸的零件
sizes = [
(30, 20, 10, "small"),
(60, 40, 20, "medium"),
(90, 60, 30, "large"),
]
for l, w, h, name in sizes:
export_parametric_part(l, w, h, name)
6.7.3 导出装配体零件清单
import cadquery as cq
import json
# 创建装配体
base = cq.Workplane("XY").box(100, 60, 10)
pillar = cq.Workplane("XY").cylinder(40, 15)
bolt = cq.Workplane("XY").cylinder(20, 3)
assy = cq.Assembly(name="Machine")
assy.add(base, name="base_plate")
assy.add(pillar, name="main_pillar", loc=cq.Location(cq.Vector(0, 0, 10)))
for i in range(4):
assy.add(bolt, name=f"bolt_{i}")
# 导出装配体
assy.save("machine.step")
# 生成零件清单
bom = []
for name, part in assy.traverse():
if part.obj is not None:
bom.append({
"name": name,
"type": type(part.obj).__name__
})
# 保存BOM
with open("bom.json", "w") as f:
json.dump(bom, f, indent=2)
print("BOM:", bom)
6.7.4 为3D打印优化导出
import cadquery as cq
def export_for_3dprint(model, filename, layer_height=0.2):
"""优化导出用于3D打印的STL"""
# 计算合适的公差(基于层高)
tolerance = layer_height / 2
angular_tolerance = 0.1
# 导出
cq.exporters.export(
model,
f"{filename}.stl",
tolerance=tolerance,
angularTolerance=angular_tolerance
)
print(f"导出: {filename}.stl")
print(f" 公差: {tolerance}mm")
print(f" 建议层高: {layer_height}mm")
# 使用
model = cq.Workplane("XY").sphere(25)
export_for_3dprint(model, "print_ready", layer_height=0.2)
6.8 格式转换最佳实践
6.8.1 从CAD软件导入工作流
import cadquery as cq
# 1. 导入外部STEP模型
imported_model = cq.importers.importStep("from_solidworks.step")
# 2. 检查导入结果
print(f"导入的实体数: {len(imported_model.solids().vals())}")
print(f"导入的面数: {len(imported_model.faces().vals())}")
# 3. 修改模型
modified = (
imported_model
.faces(">Z")
.workplane()
.hole(8)
)
# 4. 导出为其他格式
cq.exporters.export(modified, "modified.step")
cq.exporters.export(modified, "modified.stl", tolerance=0.05)
6.8.2 格式选择指南
| 应用场景 | 推荐格式 | 原因 |
|---|---|---|
| CAD软件交换 | STEP | 精确、通用 |
| FDM 3D打印 | STL/3MF | 广泛支持 |
| SLA 3D打印 | STL | 高精度网格 |
| Web显示 | glTF | 标准Web3D |
| 激光切割 | DXF | 2D矢量 |
| 数据存档 | STEP | 无损存储 |
| CNC加工 | STEP | 精确几何 |
6.8.3 常见问题与解决
import cadquery as cq
# 问题1:STL文件太大
# 解决:增加公差值
model = cq.Workplane("XY").sphere(50)
cq.exporters.export(model, "small_file.stl", tolerance=0.2)
# 问题2:导入的STEP模型无法操作
# 解决:确保导入成功并转换为Workplane
imported = cq.importers.importStep("part.step")
wp = cq.Workplane("XY").add(imported)
# 问题3:导出的DXF无法打开
# 解决:检查版本兼容性,尝试不同的DXF版本
6.9 本章小结
本章详细介绍了CadQuery的数据导入导出功能:
-
STEP格式
- 工业标准,无损传输
- 支持装配体和颜色
-
STL格式
- 3D打印首选
- 精度控制很重要
-
其他格式
- 3MF:现代3D打印格式
- glTF:Web3D标准
- DXF/SVG:2D图形
-
数据导入
- STEP文件导入和修改
- DXF轮廓导入
-
高级技巧
- 批量导出
- 参数化导出
- 3D打印优化
通过本章学习,您应该能够:
- 选择合适的导出格式
- 控制导出精度
- 导入外部CAD数据
- 实现批量数据处理
下一章我们将学习高级建模技巧,包括复杂曲面、参数化设计等内容。

浙公网安备 33010602011771号