这事要从一个挺实际的麻烦说起。我平时用SolidWorks画产品结构、做装配验证,也在借它的API做二次开发、把模型往Unity3D里导。SolidWorks确实好用,但它有点重:启动慢、吃配置,而且想在上面做点“非标操作”的时候,要么写插件,要么绕来绕去。后来我索性自己动手做了一个建模界面——用我自己名字命名的,外观和操作逻辑都尽量贴近SolidWorks,但核心代码全部由自己控制。这个工具我放在“100个实用小工具”系列的第11位,日常用来做快速建模、测试几何算法、导出模型到游戏引擎,非常顺手。
如果你也是SolidWorks用户,或者对CAD类软件的界面到底是怎么实现的、特征树和约束系统背后藏着什么逻辑感兴趣,这篇文章值得从头看到尾。我会把整个界面从窗口布局到视图操作、从草图到拉伸成体、再到导出Unity3D的完整链路拆开来聊,顺便把踩过的坑和排查经验一并交代清楚,保证你能照着思路复现一套能跑的“个人定制版建模界面”。
1. 项目思路拆解:为什么要用一个自己名字命名的建模界面
1.1 从SolidWorks使用痛点说起
先说背景。我日常工作里有两类高频需求:一类是拿SolidWorks建模,然后导出到Unity3D里做交互展示;另一类是跑SolidWorks二次开发脚本,比如解析零件3D模型、自动绘制出包装3D模型这类活。这两类需求都有一个共性:真正费时间的往往不是建模本身,而是软件启动、文件转换、模型修复这一圈流程。
SolidWorks是很强,但它的定位是完整的产品级CAD平台。我打开它只是为了测一个拉伸特征、试一个齿轮箱结构,或者验证一下模型导出的法线方向,这就像为了煎个鸡蛋把整个厨房都烧热了——能用,但没必要。另外,SolidWorks的UI是高度封装的,想改它的命令面板、想加一个自定义的“一键导出到Unity”按钮,虽然可以用宏或者Add-In实现,但每次都要走官方API那套框架,调试成本不低。
所以我就动了念头:自己写一个建模界面,界面风格模仿SolidWorks,但内核完全可控。当时给自己定的目标很朴素,就四条:
- 启动要快,最好3秒内进草图环境;
- 基本建模链路要通,草图、尺寸约束、拉伸、圆角、阵列必须能用;
- 模型导出要方便,直接输出OBJ/STL,方便进Unity3D;
- 整个界面用我的名字命名,作为系列工具里的一张“名片”。
1.2 界面定位与核心功能清单
这个工具不打算做成SolidWorks的替代品,定位是“轻量级建模沙盒”。在动手之前,我仔细梳理了一遍SolidWorks的界面组成,挑出最常用的几个模块,对应到自己的工具里:
| SolidWorks模块 | 我的工具对应实现 | 说明 |
|---|---|---|
| 菜单栏 + CommandManager | 顶部命令区,按建模流程分组 | 文件、草图、特征、视图、导出五个Tab |
| FeatureManager设计树 | 左侧特征树面板 | 记录特征创建顺序,支持参数双击修改 |
| 图形区 + ViewCube | 主视图区 + 自绘ViewCube | 支持旋转、平移、缩放、标准视图切换 |
| 状态栏 | 底部状态栏 | 显示坐标、当前特征状态、悬停提示 |
| 鼠标笔势/快捷键 | 自定义快捷键 + 中键快捷菜单 | 高频操作完全脱离鼠标点击 |
这个清单看着简单,但每一条都有坑。比如特征树节点和模型几何之间怎么联动,我在1.0版本里试过“节点选中只高亮树”,后来发现必须同时高亮模型上的对应面才有意义,不然用户根本不知道自己在选什么。这类交互细节,后面会展开讲。
1.3 技术选型:C# WPF + OpenTK
技术栈我选的是C# + WPF + OpenTK,也就是OpenGL的C#封
