第六章:CAD 技能详解

CAD(计算机辅助设计)是 OpenGIS-Skills 中第二大技能分类,共收录 21 个技能。与 GIS 领域侧重空间数据处理不同,CAD 类技能覆盖了从底层几何内核到上层的建筑设计应用、从 2D 制图到 BIM 信息模型、从多平台桌面应用到 Web 端轻量方案的完整链条。无论你是在开发一个几何算法库,还是在做 AutoCAD 插件二次开发,或是构建一套在线 3D 查看器,本章都能帮你快速定位到最匹配的技能。

本章按工具的技术层次和应用场景,将 21 个技能划分为七个子领域:几何内核与算法、参数化 3D CAD、2D 制图、PCB/EDA、BIM 与 IFC、.NET AutoCAD 二次开发、数据交换与可视化。每个技能都会给出核心定位、适用场景和关键 API 或代码示例,让你在面对具体任务时能够快速决策”我应该加载哪个技能”。


6.1 CAD 技能全景

下表给出了全部 21 个 CAD 技能的快速索引。你可以按”分类”列快速定位到感兴趣的子领域,也可以按”等级”列判断技能的技术深度——”内核”级最深,”框架/应用”级居中,”插件”级最贴业务。

分类 技能 等级 平台/语言 说明
几何内核 occt 内核 C++/Python Open CASCADE Technology,工业级三维几何内核
几何算法 clipper2 算法 C++/C#/Python/Delphi 高性能 2D 多边形布尔运算与偏移库
几何算法 clipper1 算法 多语言 Clipper 1.x 旧版,部分场景仍在使用
参数化 3D freecad 应用 C++/Python 开源参数化 3D CAD/BIM 平台,10+ 工作台
脚本 3D openscad DSL 自研语言 声明式 CSG 脚本建模语言,适合程序化生成
脚本 3D cadquery API Python 基于 OCCT 的 Python 链式 API 参数化建模
约束 3D solvespace 应用 C++/CMake 轻量级约束求解器,35+ 约束类型
Web3D chili3d 库 TypeScript/WASM 纯 Web 端 3D CAD(OCCT.js + Three.js)
参数化 3D blender 应用 C++/Python 开源 3D 创作套件,bpy Python API 与 Geometry Nodes 程序化建模
2D 制图 qcad 应用 C++/JavaScript 开源 2D CAD 编辑器,ECMAScript 扩展系统
2D 制图 librecad 应用 C++/Qt 开源 2D CAD,支持命令行批处理
Web2D lightcad 框架 C#/TypeScript 轻量 Web 2D CAD 框架,基于 Fabric.js
PCB/EDA kicad 应用 C++/Python 开源 PCB 设计套件,原理图→布局→生产输出
BIM/IFC xbim 库 .NET (C#) BIM/IFC 工具集,强类型 IFC 实体模型
AutoCAD.NET ifoxcad 框架 .NET (C#) AutoCAD 二次开发框架,多 CAD 兼容
AutoCAD.NET fy_layout 插件 .NET (C#) 基于 LightCAD 的施工场地布置插件
AutoCAD.NET lightningcad 插件 .NET (C#) 建筑围护深化设计插件
AutoCAD.NET tongwen 插件 .NET (C#) 工程图纸多语言无损翻译套件
数据交换 libredwg 库 C/Python DWG 文件读写库,R13~2021 格式支持
可视化 astral3d 框架 JS/TS 工业级 Web 3D 可视化平台,30+ 格式支持
数据交换 design-drawing-svg-md 工具 SVG/Markdown 设计图 SVG+MD 双载体记录,钢结构施工图→可复现图纸描述

6.2 几何内核与算法

这一节涵盖整个 CAD 技能栈的最底层——几何计算基础设施。occt 提供工业级的 3D 实体建模能力,clipper2 和 clipper1 负责 2D 矢量边界的布尔运算。如果你需要在自己的程序中嵌入几何计算能力而不是使用现成的 CAD 软件,这三个技能是你的首选。

6.2.1 occt——Open CASCADE Technology

定位:occt 是整个 opengis-skills CAD 分类中等级最高的技能(标记为”内核”)。Open CASCADE Technology(OCCT)是一个工业级 C++ 三维几何建模内核,同时也是 FreeCAD、CadQuery、Chili3D、Xbim 等众多上层 CAD/BIM 工具的底层引擎。掌握 occt 等同于掌握了 CAD 软件开发的”发动机”。

核心概念:

OCCT 围绕三个支柱构建:建模数据(几何+拓扑)、建模算法(布尔运算、圆角、扫掠等)和数据交换(STEP/IGES/STL 等格式)。

(1) B-Rep 边界表示(Boundary Representation)

OCCT 采用 B-Rep 作为核心几何表达方式。B-Rep 通过边界来定义实体:一个实体由外壳(Shell)包围,外壳由面(Face)组成,面由边界环(Wire)界定,边界环由边(Edge)构成,每条边有起点和终点两个顶点(Vertex)。

(2) 拓扑形状(TopoDS_Shape 层次结构)

OCCT 的拓扑类全部隶属于 TopoDS 包,继承关系如下:

TopoDS_Shape(基类,所有拓扑对象)
  ├── TopoDS_Vertex(顶点)
  ├── TopoDS_Edge(边)
  ├── TopoDS_Wire(线框/环)
  ├── TopoDS_Face(面)
  ├── TopoDS_Shell(壳)
  ├── TopoDS_Solid(实体)
  ├── TopoDS_CompSolid(复合实体)
  └── TopoDS_Compound(复合体)

常用的类型判断与转换宏:BRep_Tool::Surface(face) 获取曲面、TopExp_Explorer 遍历子形状、BRepGProp 计算体积/面积/质心。

(3) 布尔运算(BRepAlgoAPI_Fuse/Common/Cut)

OCCT 的布尔运算统一在 BRepAlgoAPI 包下:

  • Fuse(并集):BRepAlgoAPI_Fuse(shape1, shape2),融合两个形体
  • Common(交集):BRepAlgoAPI_Common(shape1, shape2),取两者的公共部分
  • Cut(差集):BRepAlgoAPI_Cut(shape1, shape2),从 shape1 中挖掉与 shape2 重叠的部分
  • Section(截面):BRepAlgoAPI_Section(shape1, shape2),计算两形体相交的线

所有布尔运算类均继承自 BRepBuilderAPI_MakeShape,调用 Shape() 方法获取结果。

(4) STEP/IGES I/O

OCCT 提供了两种主要的 CAD 中性格式读写能力:

  • STEP 读写:STEPControl_Reader / STEPControl_Writer。STEP(ISO 10303,通常为 .stp/.step 文件)是工业界最通用的几何数据交换标准,支持实体、曲面、装配关系等完整信息。
  • IGES 读写:IGESControl_Reader / IGESControl_Writer。IGES(.igs/.iges)是较早的标准,主要面向曲面和线框,不保留实体特征历史。

(5) 网格生成(BRepMesh_IncrementalMesh)

BRepMesh_IncrementalMesh 将 B-Rep 几何离散化为三角网格,是数据导出为 STL、可视化、FEM 分析等场景的必要步骤。通过设置线性偏差(Deflection)和角度偏差(Angle)参数控制离散精度。

(6) 可视化(AIS_Shape 交互式对象)

OCCT 自带的 3D 可视化框架由 AIS(Application Interactive Services)、V3d_Viewer、Graphic3d 等模块组成。AIS_Shape 是连接几何与显示的桥梁——创建一个 AIS_Shape 对象并将 TopoDS_Shape 关联到它,就可以把几何体绘制到 3D 视图中,并支持高亮、选择、拖拽等交互。

典型应用场景:

  • 开发自有几何建模软件的内核
  • 在 CAD 数据格式转换服务中嵌入 OCCT 作为几何引擎(STEP→STL、STEP→glTF 等)
  • 使用 pythonOCC(OCCT 的 Python 绑定)做自动化几何处理脚本
  • FreeCAD 的 Part 模块、CadQuery 的建模操作均直接调用 OCCT

示例代码——创建并导出立方体:

#include <BRepPrimAPI_MakeBox.hxx>
#include <STEPControl_Writer.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
#include <StlAPI_Writer.hxx>

// 创建一个 10x10x10 的立方体
TopoDS_Shape box = BRepPrimAPI_MakeBox(10.0, 10.0, 10.0).Shape();

// 导出为 STEP
STEPControl_Writer stepWriter;
stepWriter.Transfer(box, STEPControl_AsIs);
stepWriter.Write("box.stp");

// 导出为 STL
BRepMesh_IncrementalMesh(box, 0.1);
StlAPI_Writer stlWriter;
stlWriter.Write(box, "box.stl");

6.2.2 clipper2——高性能 2D 多边形布尔运算

定位:Clipper2 是由 Angus Johnson 开发的 2D 多边形布尔运算库——Clipper 的完全重写版本,原生支持 C++、C#、Python 和 Delphi。它专注于 2D 平面上的精确几何运算,是 CAD/CAM 刀路计算、GIS 矢量叠加分析、激光切割排样等场景的核心算法库。

核心特性:

(1) 64 位整数坐标精度

Clipper2 内部所有几何计算均使用 64 位整数(int64_t / long),而非浮点数。这从根本上消除了浮点运算中常见的舍入误差和拓扑不一致问题。但代价是:用户需要将实际坐标值通过缩放因子(如 1 单位 = 1000 内部单位)转换为整数。Clipper2 提供了 PathsD 类型自动处理浮点数到整数的转换。

(2) 布尔运算

四个标准布尔运算均通过 Clipper 类的方法完成:

  • Intersection(交集):Clipper64.Intersect(pathsA, pathsB, fillRule)
  • Union(并集):Clipper64.Union(paths, fillRule)
  • Difference(差集):Clipper64.Difference(pathsA, pathsB, fillRule)
  • XOR(异或):Clipper64.Xor(pathsA, pathsB, fillRule)

FillRule(填充规则)支持 EvenOdd(奇偶填充)和 NonZero(非零环绕)两种,决定自交多边形内部的”洞”如何判定。

(3) 多边形偏移(ClipperOffset)

ClipperOffset 类实现多边形的内外膨胀/收缩(Offset / Inflate),核心参数:

  • 偏移距离(delta):正值向外膨胀,负值向内收缩
  • 连接类型(JoinType):Square(方角)、Round(圆角,可设精度)、Miter(斜角,可设限值)
  • 端点类型(EndType):Polygon(闭合)、Joined(直线末端)、Butt/Square/Round(开放路径端点样式)

(4) Minkowski 运算

  • Minkowski.Sum(pattern, path, isClosed):闵可夫斯基和
  • Minkowski.Diff(pattern, path, isClosed):闵可夫斯基差

这些运算在机器人路径规划(计算 C-space 障碍物)、碰撞检测、形态学膨胀/腐蚀等场景下非常关键。

代码示例——C# 计算两个多边形的交集:

using Clipper2Lib;

// 定义多边形 A(三角形)
Path64 polyA = Clipper.MakePath(new long[] { 0, 0, 100, 0, 50, 100 });

// 定义多边形 B(矩形)
Path64 polyB = Clipper.MakePath(new long[] { 25, 25, 75, 25, 75, 125, 25, 125 });

// 计算交集
Paths64 solution = Clipper.Intersect(
    new Paths64 { polyA },
    new Paths64 { polyB },
    FillRule.NonZero
);

// solution 中即为两个多边形的重叠区域

何时使用 Clipper2 vs OCCT:

对比维度 Clipper2 OCCT
维度 2D 2D + 3D
坐标精度 64位整数(精确) 双精度浮点
几何类型 多边形/路径 B-Rep 实体/曲面/线框
性能 极高(专为 2D 优化) 中等(3D 通用)
语言绑定 C++/C#/Python/Delphi C++(pythonOCC 非官方)
典型场景 GIS 面叠加、CAM 刀路、排样 CAD 建模、BIM 几何分析

6.2.3 clipper1——旧版 Clipper

定位:clipper1 是 Clipper 库的 1.x 版本。虽然 Clipper2 在性能和 API 设计上全面优于 Clipper1,但部分存量项目仍依赖 Clipper1 的特定 API 行为,OpenGIS-Skills 因此保留了 clipper1 作为独立技能。

核心差异:

对比维度 Clipper 1.x Clipper 2.x
命名空间 ClipperLib Clipper2Lib
布尔运算类 Clipper Clipper64 / ClipperD
路径类型 List<IntPoint> Path64 / PathD
多路径类型 List<List<IntPoint>> Paths64 / PathsD
偏移类 ClipperOffset ClipperOffset(同名称,不同 API)
填充规则 PolyFillType 枚举 FillRule 枚举
缩放转换 手动 * scalingFactor ClipperD 自动处理
Minkowski 无内置 Minkowski.Sum/Diff

迁移指南:从 Clipper1 迁移到 Clipper2 的关键步骤:

  1. 将所有 List<IntPoint> 替换为 Path64,List<List<IntPoint>> 替换为 Paths64
  2. 将 Clipper.Execute(ClipType, PolyFillType) 替换为 Clipper64.Intersect/Union/Difference/Xor(paths, fillRule)
  3. 浮点输入改用 PathD/PathsD,库自动完成缩放转换
  4. 偏移操作的方法签名从 ClipperOffset.AddPath(path, joinType, endType) 改为 ClipperOffset.AddPath(path, joinType, endType),但返回值从 List<List>` 统一为 `Paths64`

何时仍使用 clipper1:只有在维护老项目、团队尚未完成迁移、或依赖的第三方库仍绑定 clipper1 API 时才需要。新项目应直接选用 clipper2。


6.3 参数化 3D CAD

本节涵盖 5 个面向 3D 参数化建模的技能。它们代表了几种截然不同的建模哲学:FreeCAD 是经典的特征式参数化建模(点→草图→特征→装配),OpenSCAD 是声明式 CSG 脚本建模,CadQuery 是链式 API 编程建模,SolveSpace 是约束驱动建模,Chili3D 则是纯 Web 端的在线 CAD。

6.3.1 freecad——开源参数化 3D CAD/BIM

定位:FreeCAD 是一个开源、跨平台、以参数化建模为核心的三维 CAD/CAE/CAM 平台。它基于 OpenCASCADE 7.8.1 几何内核,使用 Coin3D 做 3D 渲染,Qt 6.x 做 GUI,内置 Python 3.11 解释器。截至本教程编写时的最新稳定版本为 1.1.3(2026 年 7 月)。FreeCAD 的技能文件是 CAD 分类中内容最深厚的之一,覆盖了从用户操作到 Python 脚本、从工作台开发到底层 OCCT 调用的全部层次。

核心概念——工作台系统(Workbench):

FreeCAD 的界面组织方式不同于商业 CAD 的单一”模式”切换,而是采用开放式的工作台(Workbench)系统。用户在不同工作台之间切换,获得该领域的一组专用工具。所有工作台共享同一个文档对象模型,切换工作台不会丢失数据。以下是核心工作台及其功能定位:

工作台 核心功能 典型操作
Sketcher 2D 草图约束绘制 画线/弧/圆,施加距离/角度/平行/垂直/相切约束
Part CSG 建模(基本体+布尔运算) 创建立方体/球/圆柱/圆锥,Fuse/Cut/Common,从脚本构建底级形状
PartDesign 基于特征的参数化建模 Sketch→Pad(拉伸)/Pocket(挖槽)/Revolution(旋转)→Fillet(圆角)/Chamfer(倒角)
Assembly 装配体(1.1.0 内置) Joint 约束系统(Fixed/Revolute/Slider/Cylindrical 等),在同一文档中组织零件装配
Arch/BIM 建筑信息模型 墙/楼板/柱/窗/门/屋顶构建,IFC 导入导出
CAM 数控加工路径 创建 Job(作业)→定义刀具→生成铣削/钻孔路径→后处理输出 G-code
FEM 有限元分析 定义材料(Material)→网格划分(FEM Mesh)→施加约束和载荷→运行 CalculiX 求解器→查看结果
TechDraw 工程图纸生成 从 3D 模型投影生成 2D 视图、剖面、尺寸标注、公差标注
Draft 二维辅助绘图 直线/弧线/矩形/多边形绘制,捕捉系统,阵列复制
Spreadsheet 参数表 存储设计参数(如长度、厚度),其他对象通过表达式引用

Python 脚本 API:

FreeCAD 从设计之初就将 Python 可编程性作为一等特性。所有 GUI 命令对应的 Python 代码均可在控制台中查看和执行。以下是一个完整的 Python 脚本示例——用 PartDesign 工作台创建一个带孔的法兰:

import FreeCAD as App
import PartDesign as PD
import Sketcher

# 创建新文档
doc = App.newDocument("Flange")

# 步骤1:创建一个圆柱底座(Pad)
body = doc.addObject("PartDesign::Body", "Body")
# 在 XZ 平面上创建草图
sketch = doc.addObject("Sketcher::SketchObject", "Sketch")
body.addObject(sketch)
sketch.Support = (doc.getObject("XZ_Plane"), [""])
sketch.MapMode = "FlatFace"
# 画一个圆并施加半径约束
sketch.addGeometry(Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), 50))
sketch.addConstraint(Sketcher.Constraint("Radius", 0, 50))

# 将草图拉伸 20mm 高度
pad = doc.addObject("PartDesign::Pad", "Pad")
body.addObject(pad)
pad.Profile = sketch
pad.Length = 20

# 步骤2:打孔——在底座上表面创建草图,画小圆,做 Pocket
# ...(类似流程)

doc.recompute()

无头模式(Headless):FreeCAD 支持在无 GUI 环境下作为 Python 模块导入和运行,这对服务器端批量处理和 CI 流水线非常有用:

import FreeCAD as App
App.Console.PrintMessage("Running in headless mode\n")
# 执行建模或格式转换逻辑

文件格式:

  • FCStd:FreeCAD 原生格式(ZIP 包 + XML 文档结构 + BREP 几何数据)
  • 导入:STEP、IGES、STL、OBJ、DXF、SVG
  • 导出:STEP、IGES、STL、OBJ、DXF、SVG、IFC、glTF、PDF(通过 TechDraw)

6.3.2 openscad——声明式 CSG 脚本建模

定位:OpenSCAD 是一款独特的 3D CAD 建模工具——它不是交互式的,而是基于脚本声明式地描述几何体。用户用 OpenSCAD 自有的函数式语言编写建模脚本,OpenSCAD 解释执行这个脚本,通过 CSG(Constructive Solid Geometry)构建实体并渲染预览。

核心理念:与 FreeCAD 的”点→草图→特征”不同,OpenSCAD 的哲学是”描述你想要什么,而不是如何构建它“。这使 OpenSCAD 天然适合程序员思维、精确的参数化设计和程序化生成(如齿轮、螺丝、散热器格栅等有数学规律的零件)。

核心语法:

// 基本体
cube([10, 20, 5]);                // 长方体 [x, y, z]
sphere(r=10, $fn=100);             // 球体($fn 控制面数精度)
cylinder(h=20, r1=5, r2=10);      // 圆柱(可渐缩)
polyhedron(points, faces);         // 自定义多面体

// 变换
translate([x, y, z]) { ... }      // 平移
rotate([ax, ay, az]) { ... }      // 旋转
scale([sx, sy, sz]) { ... }       // 缩放
mirror([nx, ny, nz]) { ... }      // 镜像
resize([nx, ny, nz]) { ... }      // 缩放到目标尺寸
color("red") { ... }              // 着色(仅预览)

// 布尔运算
union() { A; B; }                  // 并集
difference() { A; B; C; }         // 差集(A - B - C)
intersection() { A; B; }          // 交集

// 模块化
module myPart(size) {
    cube(size);
}
myPart([10, 20, 5]);
// 控制结构
for (i = [0:5]) { ... }           // 循环
if (condition) { ... }            // 条件
children([index]);                 // 子节点引用

// 函数
function f(x) = x * 2 + 1;
echo(f(5));                        // 输出调试

标准库与扩展生态:

  • MCAD:机械零件库(螺丝、螺母、轴承、齿轮等标准件)
  • BOSL(Belfry OpenSCAD Library):功能极丰富的通用建模库,提供了更高级的变换、形状、掩模、螺纹等
  • wing-tip:机翼剖面生成模块

命令行导出:

# 直接导出 STL
openscad -o output.stl input.scad

# 导出 PNG 预览图
openscad -o preview.png --imgsize=800,600 input.scad

# 导出 DXF(纯 2D 投影)
openscad -o output.dxf input.scad

与 FreeCAD/CadQuery 的选择:OpenSCAD 适合纯程序员的参数化几何(脚本体积小、逻辑清晰、可被版本控制完美管理),但不适合需要曲面操作(NURBS)、STEP 互操作、约束求解和交互式编辑的场景——那些情况应选 FreeCAD 或 CadQuery。


6.3.3 cadquery——Python 链式 API 参数化 3D 建模

定位:CadQuery 是一个基于 OCCT(通过 OCP 绑定)的 Python 参数化 3D CAD 建模库,核心理念是”用链式 API 写出可读性极高的建模代码“。如果你觉得 OpenSCAD 的语法过于局限、FreeCAD 的 Python API 过于冗长,CadQuery 提供的”流畅接口(Fluent API)”很可能就是你想要的。

核心工作流:

CadQuery 的建模流程围绕 Workplane(工作平面) 概念展开:

  1. 创建一个 Workplane 对象(默认在 XY 平面上)
  2. 在其上绘制 2D 轮廓(矩形、圆、多边形或组合形状)
  3. 将 2D 轮廓沿 Z 轴拉伸(extrude)或旋转(revolve),得到 3D 实体
  4. 选择实体的特定面,在该面上创建新的 Workplane
  5. 在新工作平面上继续操作(打孔、拉伸凸台、圆角等)

这种”在面上创建工作面→2D→3D→选面→继续“的模式极其直观,非常接近机械设计工程师的思维过程。

链式 API 示例:

import cadquery as cq

# 一个带孔的支架:底座 + 立板 + 加强筋 + 圆角 + 安装孔
result = (
    cq.Workplane("XY")
    # 底座:矩形拉伸
    .rect(60, 40).extrude(10)
    # 选底座上表面,创建立板
    .faces(">Z").workplane()
    .rect(10, 30).extrude(40)
    # 选底座上表面和立板侧面,创建加强筋
    .faces(">Z").workplane()
    .transformed(offset=cq.Vector(0, 15, 0))
    .rect(8, 8).extrude(35)
    # 给底座四角打安装孔
    .faces(">Z[0]").workplane()
    .rect(50, 30, forConstruction=True)
    .vertices().hole(3, 10)
    # 给立板顶部倒圆角
    .faces(">Z").edges("|Y").fillet(2)
)

核心机制详解:

(1) 选择器系统(Selectors)

这是 CadQuery 最强大的特性之一。选择器用简洁的字符串语法精确过滤面、边或顶点:

选择器 含义
faces(">Z") 法线朝 +Z 方向的面
faces(">Z[0]") 法线朝 +Z 的面中 Z 坐标最大的那个
faces("<Z") 法线朝 -Z 的面
faces("%Plane") 平行于指定平面的面
edges("|Y") 平行于 Y 轴的边
edges(">X") 中点 X 坐标大于原点的边
vertices() 选特定位置的点(常与 forConstruction 配合)
faces().edges() 先选面再取边,逐步细化

(2) CQGI (CadQuery Gateway Interface)

CQGI 是 CadQuery 的命令行交互界面,支持在 VS Code / Jupyter 中实时预览模型。配合 cq-editor(图形化前端),可以实现”写代码→即时看 3D 结果”的开发体验。

(3) 布尔运算和倒角

cq.Workplane 对象可直接进行布尔运算和特征操作:

a = cq.Workplane("XY").box(10, 10, 10)
b = cq.Workplane("XY").sphere(6)
union_result = a.union(b)            # 并集
cut_result = a.cut(b)                 # 差集
common_result = a.intersect(b)        # 交集

# 倒角和圆角
part = cq.Workplane("XY").box(20, 20, 10)
part = part.faces(">Z").chamfer(2)   # 上表面边倒角 2mm
part = part.edges().fillet(1)         # 所有边倒圆角 1mm

导出格式:STEP(推荐,保留 B-Rep 精确几何)、STL(3D 打印)、GLTF(Web 可视化)。

CadQuery vs FreeCAD vs OpenSCAD 对比:

维度 CadQuery FreeCAD OpenSCAD
编程语言 Python 标准库 Python 脚本 API 自研 DSL
几何内核 OCCT(OCP 绑定) OCCT 7.8.1 CGAL
STEP 支持 原生读写 原生读写 不支持
NURBS 曲面 支持 支持 不支持
GUI cq-editor(轻量) 完整的工作台系统 脚本编辑器+预览
学习曲线 中等(需 Python + 选择器语法) 中高(需理解 FreeCAD 对象模型) 低(语法简单但有局限)

6.3.4 solvespace——轻量级约束求解 3D CAD

定位:SolveSpace 是一款免费开源的参数化 2D/3D CAD,最独特之处在于它是一个可独立使用的约束求解器库。软件体积仅约 10MB,却支持 35+ 种几何约束类型,非常适合快速原型设计、机械零件草图和将约束求解功能嵌入其他应用。

核心特性:

(1) 约束系统

SolveSpace 的约束类型覆盖了机械设计中最常见的关系:

  • 距离约束:点-点距离、点-线距离、线-线距离
  • 角度约束:线-线角度
  • 位置约束:点-点重合、点在线/圆/弧上、中点
  • 几何约束:平行、垂直、相切、对称、共线、等长/等半径
  • 逻辑约束:水平、竖直

所有约束实时求解,意味着拖动几何元素时整个系统保持约束一致性——这是 SolveSpace 作为约束求解器的核心价值。

(2) 建模流程

SolveSpace 的建模逻辑清晰且轻量:

  1. 在 2D 草图中绘制几何(线、圆、弧、样条、贝塞尔曲线)
  2. 施加尺寸和几何约束
  3. 通过拉伸(Extrude)或旋转(Revolve)将草图转为 3D 实体
  4. 可选的布尔运算(并集、差集、交集)
  5. 装配体支持(3.0+)

(3) 支持格式:导入/导出 STEP、STL、DXF、SVG、PDF、OBJ。其中 STEP 导出保留了 B-Rep 精确几何。

(4) 命令行接口

SolveSpace 提供了完整的命令行模式,适合自动化处理和 CI/CD 集成:

# 从 solvespace 文件导出为 STL
solvespace-cli model.slvs -o output.stl

# 导出为 DXF(工程图视图)
solvespace-cli model.slvs -o output.dxf --view front --scale 1:1

最适合的场景:

  • 快速做机械零件草图验证
  • 需要精确约束求解(如连杆机构运动分析)
  • 将约束求解器嵌入自有软件(SolveSpace 的 C 语言 API 库清晰可集成)
  • 教学和入门——安装包小、学习曲线低、无需复杂配置

6.3.5 chili3d——纯 Web 3D CAD

定位:Chili3D 是一款基于 Web 浏览器的开源 3D CAD 应用。它通过将 OpenCASCADE 编译为 WebAssembly(OCCT.js + WASM),与 Three.js 渲染引擎集成,在浏览器内实现了接近桌面级 CAD 的建模和查看能力。

技术架构:

  • TypeScript 全栈:整个项目用 TypeScript 编写,前后端统一语言
  • OCCT.js(WASM):OpenCASCADE 7.x 通过 Emscripten 编译为 WebAssembly,在浏览器中执行 B-Rep 几何运算
  • Three.js:WebGL 渲染层,负责 3D 场景的绘制和交互
  • Rspack:构建工具,替代 Webpack 获得更快的编译速度

核心能力:

  • 建模:基本体(长方体/圆柱/球/圆锥)、2D 草图绘制、布尔运算(并集/差集/交集)、拉伸/旋转/扫掠/放样、倒角/圆角
  • 捕捉:对象捕捉(点/边/面)、工作平面捕捉、轴追踪、特征点自动检测
  • 编辑:移动/旋转/镜像/删除、子形状操作、爆炸复合体
  • 测量:角度、长度、面积、体积计算
  • 文档管理:创建/打开/保存、撤销/重做、事务历史
  • 格式支持:导入导出 STEP、IGES、BREP(0.6.1+ 新增)

与桌面 CAD 的差异:

维度 Chili3D FreeCAD / SolidWorks
部署 零安装,浏览器打开即用 需下载安装 ~500MB
性能 WASM 近原生(约 70-80% 桌面性能) 原生编译,全速
文件存储 IndexedDB(浏览器本地) 本地文件系统
参数化 不支持参数化约束 完整参数化
扩展性 前端生态(TypeScript) Python/C++ 插件

Node.js 服务端渲染:Chili3D 的 OCCT.js 后端可以在 Node.js 中运行,利用 Linux 服务器为 Web 前端提供几何计算服务——例如:浏览器端提交 STEP 文件,服务端完成布尔运算、网格化、格式转换等重计算后返回结果。

典型场景:在线 CAD 查看器、轻量编辑、团队协同预览、嵌入网页的产品配置器。


6.4 2D CAD 与制图

虽然 3D 建模工具越来越强大,但 2D 制图仍然是工程施工、图纸交付、机械出图等领域不可替代的基本功。OpenGIS-Skills 包含三个 2D CAD 技能——两个桌面应用(QCAD 和 LibreCAD)和一个 Web 框架(LightCAD),分别对应不同的使用场景。

6.4.1 qcad——开源专业 2D CAD 编辑器

定位:QCAD 是 RibbonSoft 公司维护的开源 2D CAD 编辑系统,基于 Qt 框架用 C++ 编写。其最突出的能力是专业的 DXF/DWG 读写支持——读取 DWG R9~R2018、DXF R12~R32,写入 DXF R12~R32 和 DWG R15~R2018。

核心功能模块:

(1) ECMAScript (JavaScript) 扩展系统

QCAD 最独特的设计是其内置了 Qt Script(基于 ECMAScript / JavaScript)作为脚本语言。所有菜单命令本质上都是 ECMAScript 脚本,位于 scripts/ 目录下,用户可以直接查看和修改。这意味着:

  • 开发自定义工具就是写一个 JavaScript 文件
  • 可以一键录制用户操作并导出为脚本
  • 无编译环节,修改脚本后重启 QCAD 即生效
  • 支持完整的 JavaScript 语言特性(类、函数、正则、JSON 等)

(2) 图层管理

QCAD 提供标准的 CAD 图层体系:创建/删除图层、设置颜色/线型/线宽、锁定/冻结/隐藏、通过图层状态管理器批量控制。图层与块(Block)配合,可以实现符号库的标准化管理。

(3) 图块定义和插入

块(Block)是 CAD 中可复用的符号单元。QCAD 支持创建块定义(包含若干图元)、将块定义插入到图纸的任意位置/角度/缩放、嵌套块、属性块(带可编辑文字标签的块)。块的底层存储使用 RBlockReferenceEntity 关联到 RBlock 定义。

(4) 标注系统

QCAD 提供全套工程标注类型:线性标注(水平和垂直距离)、对齐标注(两点间实际距离)、角度标注、半径/直径标注、坐标标注、引线标注。标注样式(箭头类型、文字高度、单位格式)通过标注样式管理器统一控制。

(5) QCAD/CAM

QCAD 的专业版包含 QCAD/CAM 模块,可以在 2D 图形基础上生成数控加工路径(轮廓铣削、钻孔、铣内腔),并输出 G-Code。这是 QCAD 从”绘图工具”扩展到”制造准备工具”的关键桥梁。

(6) 打印和布局

支持纸空间(Paper Space)和模型空间(Model Space)分离、多视口布局、自定义打印比例、打印预览和批量打印。


6.4.2 librecad——开源 2D CAD(Qt 社区版)

定位:LibreCAD 是 QCAD 社区版的延续,采用 C++ 和 Qt 编写,同样是开源 2D CAD 工具。LibreCAD 与 QCAD 的核心差异在于:

维度 QCAD LibreCAD
许可证 社区版 GPL / 专业版商业 GPL v2
ECMAScript 脚本 支持 不支持(使用 C++ 插件框架 v2+)
DWG 读写 支持(专业版 + ODA 库) 仅读取(实验性)
CAM 专业版内置 不支持
插件系统 JavaScript 脚本 C++ 动态库
目标用户 专业制图 + 自动化 通用 2D CAD + 教育

命令行批处理模式:LibreCAD 提供了 -x 选项以无 GUI 模式运行,支持命令行格式转换和批量处理:

# DXF 转 SVG
librecad -x "dxf2svg" -i input.dxf -o output.svg

# 批量打印
librecad -x "print" -i drawing.dxf -p printer_name

API 扩展:LibreCAD 2.2+ 引入了 C++ 插件框架,允许开发者编译 .so/.dll 动态库来扩展 LibreCAD 的功能。插件可以注册新命令、添加工具栏、操作文档中的实体。

与 QCAD 的选择:

  • 如果你需要 ECMAScript 脚本自动化、DWG 写入、CAM 路径生成:选择 QCAD
  • 如果你只需要纯 2D 制图、DFX 编辑、轻量使用,且在意完全免费:选择 LibreCAD

6.4.3 lightcad——轻量 Web 2D CAD 框架

定位:LightCAD 是由启道软件(Qidao Soft)开发的专业级开源 CAD 平台,基于 .NET 10 和 C#,是整个 opengis-skills CAD 生态中规模最大的单体项目之一。但这里讨论的是 LightCAD 作为技能文件在 CAD 2D 制图方面的内容——其 Web 端的 2D 渲染能力、Fabric.js 集成和为二次开发提供的 TypeScript 接口。

核心架构:

LightCAD 采用严格的分层设计:

用户界面层    →  LightCAD.WinForm / LightCAD.Model
应用运行时层  →  LightCAD.Runtime
绘图交互层    →  LightCAD.Drawing
渲染工具层    →  LightCAD.RenderUtils (Three.js4Net + OpenTK)
核心数据层    →  LightCAD.Core
数学基础层    →  LightCAD.MathLib

2D 绘图能力:

  • 基本图元:直线、圆弧、椭圆、多段线、样条曲线、填充区域、文本、多行文本
  • 标注系统:线性标注、对齐标注、角度标注、半径/直径标注
  • 图层管理:颜色、线型、线宽、可见性控制
  • 选择系统:点选、框选、按图元类型/颜色/图层过滤
  • 捕捉系统:端点、中点、圆心、交点、切点、垂足

Web 端二次开发:

LightCAD 的 Web 渲染层基于 Three.js4Net(将 Three.js 能力桥接到 .NET),同时提供了面向 Web 前端的 TypeScript/JavaScript 接口。开发者可以用 TypeScript 创建自定义实体、注册命令、构建 UI 面板,实现与桌面端完全一致的绘图功能——但运行在浏览器中。

Web 嵌入示例:将一个 LightCAD 绘图画布嵌入到 Web 页面中,提供基础的 2D 查看和标注能力——这是在 BIM 协同、图纸审批、现场验收等场景下的典型用法。


6.5 PCB/EDA——KiCad

定位:KiCad 是目前最成熟的开源电子设计自动化(EDA)工具套件。与 CAD 分类中的其他技能主要面向机械/建筑领域不同,KiCad 是唯一专注于印刷电路板(PCB)设计的技能。KiCad 采用 GPL-3.0 许可证,在 CERN 持续支持下达到了企业级可用性。

核心子模块:

模块 功能 对应可执行程序
原理图编辑器(Eeschema) 绘制电路原理图,元器件符号放置,电气连接,层次化子图 kicad-cli sch
PCB 编辑器(Pcbnew) 元器件布局,信号布线(交互式/差分对/推挽),铜覆层 kicad-cli pcb
3D 查看器 3D 渲染 PCB 板和元器件,STEP 模型导入 内置于 Pcbnew
封装编辑器 创建和管理元器件封装(Footprint) kicad-cli fp
符号编辑器 创建和管理原理图符号(Symbol) 内置于 Eeschema
Gerber 查看器 查看生产文件(Gerber + 钻孔) gerbview

Python 脚本 API(KiCad 8.0+):

从 KiCad 8.0 开始,官方引入了 pcbnew Python 模块的稳定 API,支持通过脚本自动化常见的 PCB 开发任务。以下是几个典型场景:

import pcbnew

# 加载 PCB 文件
board = pcbnew.LoadBoard("my_project.kicad_pcb")

# 遍历所有元器件,打印位号和封装名
for footprint in board.GetFootprints():
    ref = footprint.GetReference()
    fp = footprint.GetFPID().GetLibItemName()
    print(f"{ref}: {fp}")

# 导出 BOM(物料清单)——实际代码会更长,这里示意逻辑
# ...

# 运行设计规则检查(DRC)
drc = pcbnew.DRC()
drc.RunTests(board)

命令行自动化(KiCad 9.x+ CLI):

# 从原理图更新 PCB
kicad-cli pcb update --board project.kicad_pcb --schematic project.kicad_sch

# 导出 Gerber 生产文件
kicad-cli pcb export gerbers --board project.kicad_pcb --output gerbers/

# 导出 BOM
kicad-cli sch export bom --schematic project.kicad_sch --output bom.csv

# 导出 3D STEP 模型
kicad-cli pcb export step --board project.kicad_pcb --output project.step

文件格式:KiCad 6.0+ 使用基于 S-expressions 的新文件格式(.kicad_sch、.kicad_pcb、.kicad_mod 等),纯文本、人类可读、版本控制友好——这是 KiCad 区别于传统二进制格式 EDA 工具的一大优势。


6.6 BIM 与 IFC——xbim

定位:Xbim(the eXtensible Building Information Modelling toolkit)是一个面向 .NET 平台的开源 BIM 开发工具集。它将 buildingSMART 组织的 IFC 标准(ISO 16739)——从晦涩的 STEP/EXPRESS 文本格式——转化为 .NET 开发者可以直接用 C# 读、写、查询、编辑、可视化的强类型对象模型。

核心能力:

(1) 强类型 IFC 实体模型

Xbim 的最大价值在于:它将 IFC 模式中的每一个实体(如 IfcWall、IfcDoor、IfcSlab、IfcRelAggregates 等数百个实体类型)映射为自动生成的 C# 接口/类。这意味着在 Visual Studio 或 Rider 中开发时,IDE 能为 IFC 属性提供完整的智能提示和编译期类型检查。这与那些把 IFC 数据当作”字符串集合”来处理的方案有着本质区别。

(2) IFC 格式兼容

Xbim 原生支持三种 IFC 序列化方式:

  • STEP21(.ifc):最常用的文本格式
  • IFC XML(.ifcXML):基于 XML 的 IFC 表述
  • IFC ZIP(.ifcZIP):压缩包格式

支持的 IFC 版本包括 IFC2x3、IFC4 和 IFC4x3。

(3) Xbim.Geometry 几何引擎

Xbim 并非只能解析”数据”——通过 Xbim.Geometry 模块,它可以将 IFC 中以参数化、隐式方式描述的几何(如 IfcExtrudedAreaSolid 拉伸实体、IfcBooleanClippingResult 布尔裁剪结果)转换为精确的 B-Rep 表达和可显示的三角网格,底层基于 OCCT 7.6.x。

(4) 可视化

  • xbimXplorer:基于 WPF 的桌面 BIM 模型查看器
  • xbimWebUI:基于 WebGL 的浏览器端查看器,配合 .wexbim 二进制几何流实现 Web 端 BIM 展示

(5) COBie 数据交换

COBie(Construction Operations Building Information Exchange)是面向设施运维阶段的资产信息交换标准。Xbim 通过 XbimCobieExpress 模块支持 COBie 数据的生成和校验。

代码示例——.NET 中读取 IFC 文件并统计墙的数量:

using Xbim.Ifc;
using Xbim.Ifc4.Interfaces;

// 打开 IFC 文件
using var model = IfcStore.Open("Building.ifc");

// 查询所有墙(IfcWall / IfcWallStandardCase)
var walls = model.Instances.OfType<IIfcWall>();
Console.WriteLine($"墙体数量: {walls.Count()}");

// 遍历每面墙的属性
foreach (var wall in walls)
{
    var name = wall.Name;
    var type = wall.GetType().Name;
    Console.WriteLine($"  {type}: {name}");
}

// 计算总楼板面积
var slabs = model.Instances.OfType<IIfcSlab>();
double totalArea = 0;
foreach (var slab in slabs)
{
    // 通过几何引擎或属性集获取面积...
}

在 BIM 生态中的位置:Xbim 与 IfcOpenShell(C++/Python)是开源 IFC 世界两座并列的高峰。选择 Xbim 的关键理由:如果你已经深度使用 .NET 技术栈(C#/Azure/ASP.NET),Xbim 是最自然的选择——它不需要引入额外的语言运行时,IDE 集成度最高。


6.7 .NET AutoCAD 二次开发

这一节是 CAD 技能中最”业务导向”的部分——四个技能全部围绕 AutoCAD 平台的 .NET 二次开发展开。从底层框架(IFoxCAD)、到施工场布(FY_Layout)、到围护深化设计(LightningCAD)、再到图纸翻译(TongWen),它们形成了一个”基础框架 + 垂直业务插件”的完整生态。

6.7.1 ifoxcad——AutoCAD .NET 二次开发框架

定位:IFoxCAD 是一个基于 .NET 的 AutoCAD / 中望CAD(ZWCAD)/ 浩辰CAD(GstarCAD)二次开发类库,由雪山飞狐(狐哥)开创、落魄山人重构。它的核心设计理念是”最小化内核 + 扩展方法“——只用 DBTrans、SymbolTable、ResultData、SelectFilter 四个核心类作为基础,其余所有功能通过 C# 的扩展方法实现。

核心机制:

(1) DBTrans——统一事务封装

AutoCAD .NET API 中所有数据库操作必须包裹在 using (Transaction tr = db.TransactionManager.StartTransaction()) { ... tr.Commit(); } 样板代码中。IFoxCAD 的 DBTrans 彻底消灭了这个样板:

// 传统 AutoCAD .NET API(每段操作约 6 行样板代码)
using (var tr = db.TransactionManager.StartTransaction())
{
    var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
    var btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
    var line = new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0));
    btr.AppendEntity(line);
    tr.AddNewlyCreatedDBObject(line, true);
    tr.Commit();
}

// IFoxCAD 方式——用 DBTrans 消除样板
using (var tr = new DBTrans())
{
    var line = new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0));
    tr.CurrentSpace.AddEntity(line);
}

DBTrans 自动管理事务的开启、提交和回滚,自动获取当前空间(模型空间/图纸空间),开发者只需关注业务逻辑。

(2) 链式扩展方法

IFoxCAD 为 AutoCAD 原生实体类型提供了大量链式扩展方法,例如:

// 创建带属性的直线
var line = new Line(p1, p2)
    .SetLayer("中心线")       // 设置图层
    .SetColorIndex(1)          // 设置颜色(红色)
    .SetLinetype("CENTER")     // 设置线型
    .AddToCurrentSpace();      // 添加到模型空间

(3) 多 CAD 兼容

IFoxCAD 深度兼容三种 CAD 平台:

  • AutoCAD(Autodesk):主流商业 CAD
  • 中望 CAD(ZWCAD):国产 CAD,广泛应用于国内企业
  • 浩辰 CAD(GstarCAD):另一款国产 CAD

不同平台之间底层 API 存在细微差异(如某些方法在 ZWCAD 中不适用),IFoxCAD 的封装屏蔽了这些差异,实现一套代码三平台运行。

(4) 依赖注入(DI)集成

IFoxCAD 内建了对 .NET 通用 DI 容器的支持,允许通过构造函数注入服务、配置和日志,适合大型 CAD 插件项目的工程化管理。

(5) 命令注册(ICommand 接口)

通过实现 ICommand 接口(而非传统 AutoCAD 的 [CommandMethod] 特性标注),IFoxCAD 提供了更灵活的命令注册方式——支持命令分组、条件启用/禁用、运行时热加载。

典型场景:任何基于 .NET 的 AutoCAD 二次开发项目,IFoxCAD 都应该作为基础框架被引入。它能将开发效率提升数倍,同时消除内存泄漏(事务未释放)、跨平台兼容等隐性风险。


6.7.2 fy_layout——施工场地布置插件

定位:FY_Layout(飞扬集成设计平台)是 LightCAD 平台的场地布置二次开发插件,也是 opengis-skills 技能仓库中 CAD 类文件体积最大的技能(26,822 字节)。它演示了如何基于 LightCAD 核心框架进行专业功能的扩展开发,覆盖了施工场地布置中常见的全部业务元素。

核心功能模块:

模块 说明 关键算法
板房布置 临时建筑(宿舍、办公室、仓库)的二维排布 矩形放置、阵列复制、碰撞检测
塔吊布置 塔式起重机的位置规划 覆盖半径计算、干涉分析
道路系统 施工道路和运输路径绘制 道路中线生成、交叉口处理、路基参数化
围墙布置 工地围墙/围栏自动生成 沿边界线等距分布、门洞自动避让
基坑开挖 开挖区域绘制与放坡计算 多边形偏移、放坡系数计算、土方量估算
绿化草坪 绿化区域绘制 多边形填充、边界平滑
硬化地面 道路和场地硬化 区域填充、面积统计

技术特点:FY_Layout 采用二三维一体化——所有场布元素同时支持二维平面绘制和三维立体显示,两者使用统一的数据模型。这意味着设计者在俯视图中放置板房后,可以立即切换到三维视图查看效果,无需任何转换。

作为技能的学习价值:FY_Layout 技能文件不仅是一个业务插件的参考,更是一个”如何基于 LightCAD 框架开发 CAD 领域插件的完整示范”——包括元素类型定义、Provider 参数化系统、UI 面板开发、命令注册、数据序列化等全部环节。


6.7.3 lightningcad——建筑围护深化设计插件

定位:LightningCAD(闪电围护)是一款面向建筑围护结构深化设计(外墙/屋面/幕墙)的 AutoCAD 插件,支持 AutoCAD 2019-2027 和中望 CAD 2022+ 双平台。

核心功能:

(1) 板材自动排布

围护深化设计的核心是”板材排布”——在指定墙面或屋面区域内,按照一定规则将板材逐块排列。LightningCAD 的板材排布模块支持:

  • 外墙板:横向/纵向排布,自动避让门窗洞口
  • 内墙板:适配内隔墙构造要求
  • 屋面板:找坡/不找坡两种模式(找坡模式下系统根据坡度自动调整板材切割角度)
  • 楼承板:钢结构楼板专用排布

排布完成后支持手动微调——锚点拖拽调整长度、板材合并/拆分、批量属性修改。

(2) 幕墙系统

两种幕墙形式:

  • 框式幕墙:立柱、横梁、面板分别定义和排布
  • 单元式幕墙:以”单元板块”为单位整体划分

(3) 铝板分格和展开

对于金属幕墙(铝板/铝塑板),LightningCAD 提供分格算法——将大面铝板按标准规格自动划分为小板,并生成展开图(用于工厂下料)。

(4) 龙骨布置

自动在墙体和屋面系统中布置竖向龙骨和水平檩条,支持间距定义、端部处理和洞口加强。

(5) 统计输出

自动生成板材统计表(型号、规格、数量、面积)、龙骨下料清单、收边件明细。


6.7.4 tongwen——工程图纸多语言翻译套件 🔥

定位:同文(Tongwen)是 opengis-skills 中最新增补的 CAD 技能,也是一款非常独特的 CAD/BIM 工具——它解决的问题不是”画图”或”建模”,而是工程图纸的跨语言无损翻译。其名称取自”车同轨,书同文”的理念,寓意打通中外工程协作的语言壁垒。

核心痛点与解法:

传统做法是将图纸中的文字逐条复制粘贴到 Excel、翻译、再手动回填——耗时、易出错、更致命的是会破坏图纸的图层结构、文字样式和坐标位置。同文的方案是在完整保留图纸原生数据(图层、坐标、文字样式、块属性、对象关联)的前提下,实现文本的自动提取→术语约束翻译→人工审校→受控回写。整个过程对图纸”零破坏”。

技术方案:

利用 CAD API 逐实体遍历,识别文字类实体(Dimension/Leader 标注、MText 多行文本、Attribute 块属性、图层名称、图框标题栏),提取文本内容和精确的几何属性(位置坐标、文字高度、旋转角度、对齐方式),译文写入时严格保持原属性不变。

核心功能:

功能模块 说明
文字提取 自动扫描全图文字对象,批量提取文本内容、坐标、图层、样式属性
术语库 四层翻译知识系统(通用词典 + 行业术语库 + 项目术语库 + 人工修正记忆),确保同一术语在全项目中译文一致
翻译执行 调用翻译引擎(内置本地引擎/可对接外部 API),逐条翻译,术语约束自动生效
人工审校 四级风险质量检查(阻断/高/中/低),支持人工逐条审查和修正
回写图纸 三种回写策略(原位替换/双语并排/仅译文),完整保留图层/颜色/字体/高度/旋转角度
批量处理 命令行模式支持多张图纸一键批量翻译,适合百张图纸的项目级翻译任务

语言支持:20+ 语言方向——中文↔英文/日文/韩文/法文/德文/西班牙文/俄文/阿拉伯文等,以及上述语种之间的互译。

平台支持:AutoCAD 2019-2026,数据存储本地优先(不依赖任何云服务),支持纯离线运行。

排版保护:这是同文最核心的技术承诺——翻译后文字在图纸中的位置、大小、旋转角度、图层、颜色、字体、对齐方式与原文字完全一致。这是它区别于”用 OCR 或截图翻译工具处理图纸”的根本差异点。

典型场景:国内设计院向海外业主/监理交付双语图纸;中国工程企业承接海外项目的施工图翻译;竣工档案的多语种归档。


6.8 数据交换与可视化

CAD 数据的价值不仅在于创建和编辑,更在于在不同系统之间流转和在多种终端上呈现。最后两个技能分别解决”数据格式互通”和”3D 可视化”两大关键需求。

6.8.1 libredwg——自由 DWG 读写库

定位:LibreDWG 是 GNU 项目下的一个完全开源的 C 语言库,专门用于读写 AutoCAD 的 DWG 文件格式。DWG 作为 CAD 行业的”事实标准”文件格式,长期被 Autodesk 作为专有格式控制,而 LibreDWG 是当前最完善的开源 DWG 处理方案。

版本兼容性:

LibreDWG 对 DWG 格式的读取覆盖率接近 99%,支持从最古老的 R1.2 到最新的 R2018 版本(共 30+ 个版本),具体包括:

  • 早期:r1.1~r14
  • 中期:r2000~r2004(写入功能达到”基本可用”级别)
  • 近期:r2007~r2018(读取功能完善,写入功能在持续改进中)

核心组件:

组件 功能
libredwg C 库 DWG 解析和生成的核心引擎
dwgread 命令行读取工具,输出 JSON/DXF/SVG 等多种格式
dwgwrite 命令行写入工具,从 JSON 创建 DWG 文件
dxf2dwg DXF 到 DWG 的转换
dwg2dxf DWG 到 DXF 的转换
dwg2SVG DWG 到 SVG 的转换(用于 Web 预览)
libredwg-python Python 绑定(社区维护)

命令行工具示例:

# 读取 DWG 文件并输出为 JSON(含所有实体属性)
dwgread -O json input.dwg > output.json

# DWG 转 DXF
dwg2dxf input.dwg -o output.dxf

# DXF 转 DWG
dxf2dwg input.dxf -o output.dwg

# 查看 DWG 文件的元信息
dwgread -v4 input.dwg

Python 绑定使用示例:

import libredwg

# 读取 DWG
dwg = libredwg.DwgData()
libredwg.dwg_read_file("drawing.dwg", dwg)

# 遍历所有实体
for obj in dwg.object:
    if obj.type == libredwg.DWG_TYPE_LINE:
        print(f"线段: ({obj.line.start.x}, {obj.line.start.y}) → ({obj.line.end.x}, {obj.line.end.y})")
    elif obj.type == libredwg.DWG_TYPE_TEXT:
        print(f"文字: {obj.text.text_value}")

典型应用场景:

  • 在 Web 服务中解析 DWG 文件提取实体信息(如自动统计门窗数量)
  • 批量 DWG→DXF 或 DWG→SVG 格式转换
  • 在非 Windows 平台(Linux/macOS)上处理 DWG 文件
  • 作为自建 CAD 数据管道的底层依赖

6.8.2 astral3d——工业 3D 可视化平台

定位:Astral3D 是杭州星孪数字科技团队开发的现代化 Web 3D 编辑器和三维引擎,基于 Vue3 + Three.js 技术栈,采用 Apache-2.0 许可证开源。它专为数字孪生场景(智慧城市、智慧工厂、智慧建筑)优化,是目前国内最具影响力的 Web 3D 开源解决方案之一。

核心特性:

(1) 格式支持

Astral3D 支持 30+ 种 3D 模型格式导入,覆盖了 CAD/BIM 全生态:

格式类型 支持的格式
通用 3D GLTF / GLB / OBJ / FBX / 3DS / DAE / PLY / STL
BIM RVT(Revit)/ IFC / NWD(Navisworks)
CAD DWG / DXF
点云 LAS / LAZ / PTS / XYZ
倾斜摄影 OSGB / 3DTiles

(2) 大模型轻量化

数字孪生场景中,一个完整的 BIM 模型可能包含百万级构件。Astral3D 通过以下技术手段解决 Web 端的渲染性能问题:

  • LOD(Level of Detail):根据相机距离自动切换模型精度层级
  • 实例化渲染(Instancing):对重复构件(如柱子、窗户)只存储一份几何数据,GPU 端批量绘制
  • 分包加载:将大场景按空间区域分片,按需加载当前视野内的模型

(3) CAD 数据互转

Astral3D 内置了 CAD 格式与 Web 标准格式的转换管线:

OBJ / STL / STEP / IFC / DWG / RVT
         ↓ 解析 + 轻量化处理
    glTF / GLB(Web 端高效渲染)

这意味着用户上传一份 Revit 模型或 IFC 文件后,Astral3D 自动完成解析和轻量化,生成可在浏览器中秒开的 glTF 文件。

(4) 扩展能力

  • 插件系统:支持第三方插件的热加载/卸载,类似 VS Code 的扩展体系
  • 脚本运行时:内嵌 JavaScript/TypeScript 脚本引擎,可编写自定义交互逻辑
  • 粒子系统:内置火焰/烟雾/萤火虫等特效
  • 天气系统:晴天/雨天/雪天/雾天环境模拟
  • 动画编辑器:完整的关键帧动画和时间轴编辑

与 chili3d 的选择:

对比 Astral3D Chili3D
定位 数字孪生可视化平台 Web 端 CAD 建模工具
建模能力 弱(侧重浏览和标记) 强(完整 B-Rep 建模)
格式广度 30+ 种,含 BIM/CAD/点云 STEP/IGES/BREP/STL
大场景性能 极强(LOD/实例化/分包) 中等
UI 框架 Vue3(前端领域标准) 自研 Ribbon 界面

简单记忆:如果你需要在 Web 端编辑 CAD 模型,选 Chili3D;如果你需要在 Web 端展示和管理 BIM/CAD 数据,选 Astral3D。


6.9 CAD 技能选择决策树

面对 21 个技能,选择哪个取决于你的任务类型。以下决策树帮你快速定位:

需要 CAD 技能?
├─ 几何算法 → clipper2(首选)/ clipper1(旧项目维护)
├─ 3D 几何内核开发 → occt
├─ 3D 建模
│   ├─ 我喜欢用 Python 写建模脚本 → cadquery
│   ├─ 我喜欢声明式函数语言 → openscad
│   ├─ 我需要完整的交互式 GUI → freecad
│   ├─ 我需要精确的约束求解(机构运动)→ solvespace
│   └─ 我需要在浏览器里建模 → chili3d
├─ 2D 制图
│   ├─ 桌面端专业制图 + 脚本自动化 → qcad
│   ├─ 桌面端轻量制图 + 免费 → librecad
│   └─ Web 端 2D 绘图框架 → lightcad
├─ PCB 设计 → kicad
├─ BIM 与 IFC
│   ├─ .NET 技术栈 → xbim
│   └─ C++/Python 技术栈 → occt + IfcOpenShell(非本技能范畴)
├─ AutoCAD 二次开发
│   ├─ 我需要一个基础框架简化开发 → ifoxcad
│   ├─ 施工场地布置 → fy_layout
│   ├─ 建筑围护深化设计 → lightningcad
│   └─ 工程图纸多语言翻译 → tongwen
├─ DWG 文件读写
│   ├─ C 语言或 Python 绑定 → libredwg
│   └─ 仅需 DWG 查看,不开源也可 → qcad(读取)+ ODA SDK
└─ 3D 可视化
    ├─ 数字孪生 / BIM 大场景 Web 浏览 → astral3d
    └─ Web 端 CAD 模型编辑 → chili3d

组合技能推荐:

在实际项目中,多个 CAD 技能经常协同使用。以下是三组经典搭配:

场景 技能组合 说明
CAD 数据转换服务 occt + libredwg 用 libredwg 读 DWG,用 occt 做几何转换和网格化,输出 STL/STEP/glTF
BIM Web 可视化平台 xbim + astral3d 用 xbim 解析 IFC 提取几何和属性,用 astral3d 做 Web 端渲染和交互
AutoCAD 插件全栈开发 ifoxcad + tongwen + lightningcad 以 ifoxcad 为框架底座,集成 tongwen(翻译)和 lightningcad(围护设计)的业务能力

6.10 本章小结

本章详细解析了 opengis-skills 中全部 21 个 CAD 技能。如果只能记住三个关键点,请记住:

  1. 金字塔结构:底层是 occt 几何内核和 clipper2 几何算法;中间层是 freecad/cadquery/openscad/solvespace 等参数化建模工具;顶层是 ifoxcad/lightningcad/tongwen 等面向 AutoCAD 平台的垂直业务插件。你的任务在哪一层,就加载哪一层的技能。

  2. 平台分化明显:桌面端(FreeCAD、QCAD、KiCad)、浏览器端(Chili3D、Astral3D、LightCAD)、.NET 企业端(IFoxCAD、Xbim)三类各有专属技能。不要用桌面端的技能去解决 Web 端的问题。

  3. 真实项目需要组合:没有哪个单技能能覆盖一个真实的工程场景。一个标准的”读取 DWG→解析 BIM 几何→转换格式→Web 展示”流程,就需要 libredwg + xbim + occt + astral3d 四个技能接力完成。学会按决策树选择和按推荐组合搭配,是高效使用 CAD 技能的关键。


← 上一章 目录 下一章 →