这次我们来看一个很常见但很磨人的事:SketchUp 模型导出 CAD。很多人的工作流是“建模很快,导 CAD 很痛苦”,模型建完交给深化或者施工图阶段,常常要经历图层错乱、线型丢失、坐标偏移、单位不对、一个视图一张图手动导半天,最后还得在 CAD 里修图。这次分享的是一套免费而且可复用的做法:用 SketchUp 自带的导出能力叠加轻量 Ruby 脚本,把重复劳动压缩成一次设置、批量输出。
一套流程走完,你能得到的核心能力是三件事:按场景批量导出 CAD、按图层分别导出 CAD、模型清理和导出选项固定成模板。整体不依赖付费插件,不需要额外装大型工具,普通办公电脑就能跑。对经常需要把 SU 模型交给 CAD 做标注、深化、报建、施工图配合的人来说,这套流程可以直接替换掉原来的手动导出习惯。
全文会按这样的顺序展开:先梳理手动导出的慢点在哪,再做模型前置清理,接着讲免费的脚本准备和场景设置,然后给出可直接运行的批量导出脚本,最后是效果验证和常见问题排查。如果你之前靠的是“逐层显示 -> 逐个导出 -> 反复修图”,这篇文章建议收藏后按步骤走一遍。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 适用软件 | SketchUp(Windows 环境为主,Mac 版菜单和 Ruby 控制台位置有差异) |
| 导出格式 | DWG / DXF,SketchUp 原生导出功能即可完成 |
| 免费程度 | 不依赖收费插件,使用 SketchUp 自带功能与 Ruby 脚本 |
| 批量能力 | 支持按场景批量导出,也支持按图层批量导出 |
| 自动化程度 | 支持脚本自动化,可通过 Ruby 控制台运行,无需外部 HTTP API |
| 硬件要求 | 普通办公电脑,导出速度主要取决于模型面片数和场景数量 |
| 启动方式 | 打开 SketchUp 模型,进入 Ruby 控制台执行脚本 |
| 学习成本 | 中等,重点是理解图层、场景、脚本三个概念 |
| 适合场景 | 反复提交 CAD、多视图出图、图层拆分、图纸归档 |
这套方案的核心不是某个神奇插件,而是流程改造。慢不是慢在“SketchUp 导出这一步”,而是慢在“每个视图都要重新设置、导出后还要大量手工修复”。下面先把这个慢点拆开看。
2. 为什么 SU 导 CAD 会这么慢
先看一个典型的低效工作流:
- 在 SketchUp 里建好模型。
- 手动调整视图角度,开投影显示。
- 打开“文件 -> 导出 -> 三维模型”,选择 DWG 格式。
- 在弹出的选项里重新设置单位、版本、路径。
- 导出完成后切下一个视图,重复刚才所有步骤。
- 把所有视图导完,再一张张用 CAD 打开检查,发现图层乱、线型不对、图元散落,再回头改模型。
问题出在哪里?导出动作本身很快,慢在三点。
第一,设置重复。每次导出一个视图都要重新点一次菜单、重新选一次单位、重新确认保存路径。如果模型有十个视图,就要重复十次。真正花在“等待导出”上的时间只是一小部分,大部分时间都在做重复点击。
第二,源模型本身没整理好。如果模型里的组件、组、辅助线全部堆在 Layer0 上,导进 CAD 以后当然分不出图层。CAD 用户拿到文件之后要把大量图元重新归层、整理颜色和线型,这和“从 SU 导出”已经没有关系,完全是源模型阶段欠的债。
第三,场景和导出之间没有衔接。SketchUp 的场景(页面)可以保存视图角度、图层可见性和隐藏状态,但很多项目根本没有利用场景作为“导出批次”。于是每个视图都要手工调显示状态、调视角,导出的文件之间也缺乏统一命名和保存路径,后续归档自然乱。
所以,要提高效率,要做的是三件事:把模型整理规范,把视图变成场景,让脚本代替手工导出。脚本能做到什么程度?脚本可以遍历所有场景,一个接一个导出;也可以按图层临时控制可见性,分别输出图层文件;还可以把文件命名从“场景名”或“图层名”自动生成,完全避免人工起名。这才是“效率翻 10 倍”的实现逻辑,不是单次导出变快,而是整个流程从重复手工变成了批量自动化。
3. 前置准备:单位、图层与模型清理
脚本只能帮你加速“导出”,不能帮你修正“模型本身很乱”的问题。所以,在实际运行批量导出脚本之前,先花十分钟做前置检查。
3.1 统一模型单位
SketchUp 里的“英寸”“英尺”“毫米”“米”,导出到 CAD 之后会直接影响图纸比例。比如你模型用的是米,CAD 里希望用毫米,导出后整个模型尺寸会差 1000 倍。最稳妥的做法是:建模型之前就定好单位,并且在导出前到“模型信息 -> 单位”里确认一次。
如果你的项目已经在用某一种单位,批量脚本能做得更好的,是让每次导出的单位保持一致,而不是每次手工去改。不同版本 SketchUp 的导出选项中单位字段可能有差异,但“单位必须与 CAD 目标图纸一致”这条原则不会变。
3.2 图层命名规范
CAD 之所以要图层,是为了控制线宽、颜色、开关和打印。SketchUp 里画图也应该有对应逻辑。常见的做法是:
- 墙体、门窗、家具、地面、标注、辅助线分开建图层。
- 命名用统一前缀,比如
AX-墙体、AX-门窗、AX-标注,方便 CAD 端识别。 - 不要把所有实体都丢在 Layer0 里。组件内部可以保留 Layer0,但放置到场景中的实体应该分配明确图层。
图层规范越早做,导出到 CAD 后的可用性越高。脚本按图层导出时,也需要图层名字足够清晰,否则自动生成的 DWG 文件名全是“图层1”“图层2”这种含义不明的名字。
3.3 清理无用组件和材质
你可以在需要时将未使用的模型组件和材质从文档中清除,具体入口与最终目的都在“窗口 -> 模型信息 -> 统计信息”等位置,也可以通过 Ruby 脚本执行。
脚本清理示例:
# 清理未使用组件定义、材质,减少文件体积和导出时的处理量 model = Sketchup.active_model model.materials.purge_unused if model.materials.respond_to?(:purge_unused) model.definitions.purge_unused if model.definitions.respond_to?(:purge_unused) puts "模型清理完成"这个脚本的思路是把模型里“已经不存在但定义还残留”的组件和材质清掉,减小模型体积,也能让导出文件更干净。执行前只需要打开目标模型,打开 Ruby 控制台,粘贴运行即可。
3.4 坐标原点和模型位置
CAD 里最常见的灾难之一,是模型离原点特别远,导致打开 DWG 后图元飞到几十万公里外。SU 建模时也容易在离原点很远的坐标区画线。导出前建议把模型移动到原点附近,或者至少确认坐标符合项目习惯。脚本不负责移动模型,这一点必须在模型阶段处理。
4. 免费工具链与脚本准备
这套方案不需要装收费插件。核心依赖只有三样:
- SketchUp 自带导出功能。
- Ruby 控制台。
- 一个能打开 DWG/DXF 的免费查看工具,用于验证导出结果。
如果你已经安装了 SketchUp,那这套流程基本零成本。没有安装 CAD 的读者,也不需要为了验证一个导出的 DWG 去装大型 CAD 软件,用免费的 DWG/DXF 预览工具就能完成效果检查。
4.1 打开 Ruby 控制台
在 SketchUp 的“窗口”菜单里打开 Ruby 控制台,英文版叫 Ruby Console。控制台是一个输入 Ruby 代码并显示输出结果的面板。向其中粘贴脚本后按回车即可运行,这是验证脚本最快的方式。
如果后续需要长期反复使用,可以把脚本保存为.rb文件,在控制台里用 load 命令加载:
load "D:/SU_Scripts/export_scenes.rb"不同版本对脚本路径和 API 方法的支持存在细微差别,先从小样本场景试跑,确认通过后再放开到整个项目。
4.2 导出版本与格式选择
SketchUp 导出 DWG/DXF 时,通常可以选择目标 CAD 版本。建议统一导出为较低版本,让上下游同事用任何 CAD 版本都能打开。具体哪个版本低到足够兼容,要看团队工具环境,不必盲目追求最新版本。
如果只是给深化组做参照,DXF 也很常用,兼容性更好。实际导出时到底选 DWG 还是 DXF,取决于接收方软件和项目要求。脚本层面也只是改一个后缀名的问题。
4.3 关于脚本和导出选项的边界
需要明确一点:脚本不能替你完成“窗口里点导出选项”的全部事情。不同版本 SketchUp 的导出选项差异较大,脚本里无法覆盖所有选项配置。安全的思路是:
- 先手动导出一次,把单位、版本、路径都设好。
- 验证导出的 DWG 符合预期。
- 再交给脚本执行批量导出。
这样脚本承担的是“按已有配置批量重复动作”的工作,而不是凭空替你猜导出参数。
5. 场景设置:批量导出的基础
批量导出不是让脚本随便截一个视图就导出,而是让 SketchUp 按场景一个个输出。所以,场景是这次流程里最重要的一环。
5.1 创建导出场景
在 SketchUp 场景面板里,把需要导出成 CAD 的视图全部保存为场景。例如:
01_平面02_南立面03_东立面04_剖面A05_轴测
创建场景的时候不要只存角度,还要检查图层可见性。如果某个场景只想显示墙体和门窗,就要把家具等图层设置为隐藏并保存到场景属性里。这样脚本每次切换场景时,导出的就是当前场景所见内容。
5.2 场景命名决定文件名
脚本自动导出时,会直接用场景名作为 DWG 文件名。所以场景名不要用“场景1”“Scene 1”这种毫无辨识度的名字。命名规则尽量做到:
- 数字前缀保证导出顺序。
- 层级含义清晰,方便归档。
- 不要包含
\/:*?"<>|等特殊字符。 - 路径建议用英文,避免中文路径导致部分版本导出失败。
一个比较稳的命名示例:01_FLOOR_PLAN、02_SOUTH_ELEVATION、03_SECTION_A。如果你的团队习惯用中文,也可以不用刻意改英文,但路径和文件名的稳定性要在小规模测试中先确认。
5.3 场景与图层的配合
如果你的项目需要“墙体一张图、门窗一张图”这种按图层拆分提交的模式,可以不走场景,直接按图层批量导出。这时要保证每个图层里确实有实体,且图层分类扎实。
两个方向的脚本分别处理不同的使用场景:
- 按场景导出:适合出图视角固定、每个视图包含多层内容的场景。
- 按图层导出:适合按专业拆图、需要分别交付图层的场景。
6. 批量导出实操:从单视图到全场景
下面进入核心操作。整个过程分三步:先运行清理脚本,再按场景批量导出,或者按图层批量导出。先在测试副本上试跑,确认没问题再用到正式项目。
6.1 打开模型并进入 Ruby 控制台
打开要导出的模型,确认模型单位、图层、场景都已经检查过。接着打开 Ruby 控制台,准备粘贴脚本。
建议第一次先做两个场景的测试导出,不要直接十多个场景一起跑。脚本出错时,小样本更容易定位问题。
6.2 按场景批量导出 DWG
这是一个通用模板脚本:
# 按场景(页面)批量导出 DWG # 使用前请确认导出目录存在;脚本按当前已保存的场景顺序执行 model = Sketchup.active_model export_dir = "D:/CAD_Export" Dir.mkdir(export_dir) unless Dir.exist?(export_dir) model.pages.each do |page| # 切换到指定场景,让导出内容与场景保持一致 model.pages.selected_page = page file_path = File.join(export_dir, "#{page.name}.dwg") result = model.export(file_path, "DWG") puts "导出 #{page.name} => #{result}" end脚本逻辑很直接:遍历所有场景,切换当前场景,导出 DWG,文件名用场景名。
执行过程中注意观察控制台输出的=> true还是=> false。true表示导出动作成功,false说明该文件没有导出成功,需要结合报错信息排查。
导出目录D:/CAD_Export需要提前创建,或者调整为你自己想要的路径。脚本里的目录分隔符是正斜杠,避免在 Ruby 字符串里出现反斜杠转义问题。
6.3 按图层批量导出 DWG
按图层导出的思路稍有不同:脚本先记录当前所有图层的可见状态,然后只让目标图层可见,其余全部隐藏,再导出该图层的内容。全部导出完成后恢复原始显示状态。
# 按图层批量导出 DWG,导出后自动恢复源模型显示状态 model = Sketchup.active_model export_dir = "D:/CAD_Layer_Export" Dir.mkdir(export_dir) unless Dir.exist?(export_dir) # 记录每个图层当前可见性 original_visibility = {} model.layers.each { |layer| original_visibility[layer.name] = layer.visible? } model.layers.each do |layer| # 跳过 Layer0:该图层内容通常零散,不适合作为独立导出文件 next if layer.name == "Layer0" # 只显示当前图层 model.layers.each { |other| other.visible = (other.name == layer.name) } file_path = File.join(export_dir, "#{layer.name}.dwg") result = model.export(file_path, "DWG") puts "图层导出 #{layer.name} => #{result}" end # 恢复原始可见状态 model.layers.each { |layer| layer.visible = original_visibility[layer.name] }这个脚本的价值在于,不需要手动一个个开关图层,也不需要记住哪些图层需要导出。只要模型图层本身规范,脚本输出的 DWG 就是一个图层一个文件,命名也不用人工起。
需要特别提醒:脚本执行时会临时改变 SketchUp 的图层显示状态。如果模型里设置了场景,并且场景也保存了图层可见性,脚本的临时修改可能会影响后续手动浏览。所以在脚本最后加一段恢复逻辑很重要,不要省略。
6.4 执行后的预期输出
假设模型里有01_平面、02_南立面、03_东立面三个场景,按场景导出后,D:/CAD_Export目录下应该出现:
01_平面.dwg02_南立面.dwg03_东立面.dwg
按图层导出后,D:/CAD_Layer_Export目录下应该按实际图层名生成对应的 DWG。如果目录下只有部分文件,优先检查:
- 是否跳过了名为 Layer0 的图层。
- 是否有图层没有内容。
- 是否有图层名或路径包含中文字符导致失败。
6.5 从按钮触发脚本
如果你不想每次都打开 Ruby 控制台粘贴脚本,可以做一个简单的工具菜单或者把脚本保存为.rb文件,之后只改路径和模型,执行一行 load 命令。对一个长期项目来说,脚本本身不会经常变,变的是模型和导出目录。建议把路径统一写在脚本顶部,目录结构固定,这样每次只需要确认模型已保存即可。
7. 导出效果验证与质量检查
批量导出完成不等于工作完成。CAD 文件的可用性才是最终目标。建议把验证步骤固定下来,每次导出后快速检查,避免把问题文件发给下游。
7.1 打开看什么
用免费 DWG/DXF 查看工具打开导出文件,按以下维度检查:
| 检查项 | 合格标准 | 不合格表现 |
|---|---|---|
| 图层 | 图层名与源模型一致 | 全部图元堆在 Layer0 或图层名丢失 |
| 尺寸比例 | 在 CAD 中测量关键尺寸符合预期 | 尺寸差 10 倍、1000 倍 |
| 线型 | 无需展线型,CAD 中按打印样式统一处理 | 整张图全是复杂折线、线段碎裂 |
| 视图内容 | 与 SU 场景所见一致 | 隐藏图层被导出、多余实体出现 |
| 坐标范围 | 图元集中在合理坐标范围 | 图元飞到极大坐标区 |
最容易出问题的是比例和图层。比例问题几乎都是单位不一致导致的。图层问题几乎都是源模型阶段没有分好图层导致的。这两类问题不要指望导出时自动修复,应该在源模型阶段解决。
7.2 成功判断标准
一批导出文件是否符合交付要求,可以用最朴素的标准判断:在 CAD 查看器里按图层开关,每层的内容分开;按比例测量一堵已知墙的长度,数据正确;视图角度与 SU 场景一致。
如果这三点都满足,这套流程就是可用的。缺一个,都需要先回头改模型或改场景,再重新导出。
7.3 导出文件名的二次检查
脚本自动命名难免出现场景名与最终交付清单不一致的情况。建议导出后做一次目录清单检查,不要直接在文件夹里肉眼扫一遍就完事。特别是在有中文文件名、特殊字符的目录下,更容易漏掉某个文件。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 导出文件在 CAD 中打不开 | 导出版本过高或文件损坏 | 改用低版本 CAD 打开验证 | 导出时选择较低版本的 DWG 格式 |
| 模型尺寸差很多 | SU 单位和 CAD 单位不一致 | 对比已知尺寸 | 在模型信息中统一单位,按需缩放 |
| 导出后图层全是 Layer0 | 源模型实体没有分配到具体图层 | 检查 SU 模型图层分配情况 | 在 SU 中重新归层,再重新导出 |
| 线型全部是连续线 | SU 导出不直接关联 CAD 线型 | 在 CAD 查看器中检查线型配置 | 到 CAD 中统一线型标准,或导出前在 SU 中用颜色区分 |
| 打开 DWG 后图元在极远处 | 模型离原点太远 | 查看模型包围盒位置 | 在 SU 中将模型移动到原点附近 |
| 脚本输出的部分文件缺失 | 场景名/图层名含有特殊字符 | 在 Ruby 控制台看报错信息 | 改文件名,避免特殊字符和中文路径 |
| 中文路径导出失败 | 不同版本对非 ASCII 路径支持不一致 | 先导出到英文目录测试 | 统一使用英文路径和英文文件名 |
| 一个场景导出内容不完整 | 场景未保存图层可见性 | 切换场景后观察图层状态 | 重新保存场景属性,勾选可见性状态 |
| 按图层导出后模型显示全被隐藏 | 脚本中途报错,恢复逻辑没执行 | 检查 Ruby 控制台报错信息 | 手动把所有图层设为可见,再重跑脚本 |
排查时有一个通用手段:小样本测试。不要直接在几百个子模型上用脚本一次批量跑,先在两个场景、三个图层的小副本上试,确认脚本输出正常,再放到全量项目中使用。
9. 效率提升与最佳实践
这套流程如果要用到日常工作中,建议把下面这些规则变成习惯。
9.1 模板优先
把单位、图层命名、场景命名、导出目录、脚本文件都固定为一套模板。新建项目时直接基于模板起步,而不是每次从零开始建图层、建场景。你的下一套项目,从建模第一笔开始就已经为“导出 CAD”做好了准备。
9.2 先同步,后导出
多人协作项目中,先确认模型同步完成,不要导出到一半发现同事传来了新版本而重复工作。导出前把模型文件保存并锁定版本,保证脚本读到的就是你要导出的最终模型。
9.3 归档结构
建议把项目文件按以下结构管理:
项目文件夹/ ├─ 01_Source/ │ ├─ Project_v01.skp │ └─ Project_v02.skp ├─ 02_Export/ │ ├─ CAD_Plan/ │ └─ CAD_Layer/ └─ 03_Review/ └─ 导出检查记录.xlsx导出文件放在独立目录,避免混在模型素材里。检查记录可以简单记录每一次导出时间、模型版本、文件数量、发现的问题,方便追溯。
9.4 善用保存场景属性
如果脚本导出的内容和你在 SU 里看到的视图不一致,大部分原因是场景没有保存图层可见性。养成习惯:在场景面板里创建场景后,明确保存“图层可见性”和“相机视角”。这能减少 90% 的场景导出问题。
9.5 适合什么团队
这套方法最适合需要定期把 SKP 模型转成 DWG 配合施工图、深化、报建和基础图纸整理的团队。如果只是偶尔导一次 CAD,脚本化带来的收益有限,但场景和图层规范依然值得做。
9.6 不适合什么情况
如果你的需求是“SU 模型导进 CAD 里要保留材质贴图、照明信息、实体属性、复杂线宽和打印样式”,那 DWG/DXF 本身就不是最佳载体。CAD 图纸是用来表达几何和工程信息的,不是用来承载 SU 渲染信息的。这类需求应该考虑别的交付方式,而不是在导出环节硬扛。
回到最开始的思路:效率提升的关键,是把“重复手动设置”变成“一次性场景配置 + 脚本批量执行”。并不是导出动作本身有十倍差距,而是你不再需要反复做低价值的重复操作。源模型整理得越规范,批量导出脚本能发挥的作用就越大。
第一步可以先试的场景,是把现有模型里两三个常用视图做成场景,用按场景批量导出的脚本跑一遍,对比一次手动导出的耗时。确认可行后,再逐步把图层规范、脚本归档、团队命名规则补起来。后面做熟之后,这套流程可以继续扩展成“一键导出多个 SKP 文件”或“导出后自动整理目录”的完整工具链。