第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的数据导入导出功能:

  1. STEP格式

    • 工业标准,无损传输
    • 支持装配体和颜色
  2. STL格式

    • 3D打印首选
    • 精度控制很重要
  3. 其他格式

    • 3MF:现代3D打印格式
    • glTF:Web3D标准
    • DXF/SVG:2D图形
  4. 数据导入

    • STEP文件导入和修改
    • DXF轮廓导入
  5. 高级技巧

    • 批量导出
    • 参数化导出
    • 3D打印优化

通过本章学习,您应该能够:

  • 选择合适的导出格式
  • 控制导出精度
  • 导入外部CAD数据
  • 实现批量数据处理

下一章我们将学习高级建模技巧,包括复杂曲面、参数化设计等内容。


posted @ 2026-01-10 13:15  我才是银古  阅读(34)  评论(0)    收藏  举报