☰
SketchUp批量导出CAD:用Ruby脚本实现按场景与图层自动出图
2026/10/16 6:47:23 网站建设 项目流程

这次我们来看一个很常见但很磨人的事: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_剖面A
  • 05_轴测

创建场景的时候不要只存角度,还要检查图层可见性。如果某个场景只想显示墙体和门窗,就要把家具等图层设置为隐藏并保存到场景属性里。这样脚本每次切换场景时,导出的就是当前场景所见内容。

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_平面.dwg
  • 02_南立面.dwg
  • 03_东立面.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 文件”或“导出后自动整理目录”的完整工具链。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询