2、文件体系总纲:为什么需要文件体系、核心文件夹结构设计、版本管理基础(Git入门)

说实话,我见过太多光学工程师,设计能力一流,但文件管理一塌糊涂。

有一次,一个同事找我借一个透镜设计源文件。他翻遍了桌面、下载文件夹、微信聊天记录,最后跟我说:“我记得文件名里有‘最终版’三个字。” 结果他发过来五个“最终版”,每个都不一样。嗯,这种场景,你想想看,是不是很熟悉?

所以,在咱们正式开始搭建光学设计文件体系之前,得先聊聊“为什么”。

2.1 为什么需要文件体系?

说白了,文件体系不是为了“好看”,而是为了“救命”。

我个人习惯,在项目启动的第一天,就把文件夹结构搭好。为什么这么急?因为项目一旦跑起来,你根本没时间回头整理。

文件体系的核心价值:

  • 可追溯性:三个月后,你还能找到“当时那个0.8视场的MTF曲线”对应的ZEMAX文件。
  • 可复现性:换一台电脑,或者换一个人,能完全复现你的设计过程。
  • 可协作性:团队里每个人都知道“最新版”在哪里,不会出现“我改了你别动”的尴尬。
  • 可交付性:项目结束时,你能快速打包出完整的交付物,而不是花三天找文件。

我在项目中遇到过最惨的一次:一个做了半年的投影镜头项目,因为硬盘坏了,所有本地文件全丢。幸好我们用了Git,从远程仓库拉回来,只损失了当天上午的工作量。从那以后,我再也不敢把文件体系当摆设。

2.2 核心文件夹结构设计

文件夹结构怎么设计?我建议你遵循一个原则:按项目生命周期分,而不是按文件类型分。

什么意思?很多人喜欢建“ZEMAX文件夹”、“CodeV文件夹”、“PDF文件夹”。这种结构,找文件的时候你会疯掉。因为一个项目里,ZEMAX文件可能有几十个版本,散落在不同子文件夹里,你根本不知道哪个对应哪个。

下面是我用了多年的结构,你可以直接拿来用:

Project_Name/
├── 00_Project_Info/          # 项目立项、需求文档、合同
│   ├── 01_Requirements/
│   ├── 02_Contracts/
│   └── 03_Meeting_Notes/
├── 01_Design/                # 设计源文件
│   ├── 01_Initial_Design/    # 初始结构
│   ├── 02_Optimization/      # 优化过程
│   ├── 03_Tolerance/         # 公差分析
│   └── 04_Final_Design/      # 最终设计
├── 02_Simulation/            # 仿真与验证
│   ├── 01_Stray_Light/
│   ├── 02_Thermal/
│   └── 03_Mechanical_Check/
├── 03_Prototype/             # 样机与测试
│   ├── 01_Drawing/
│   ├── 02_Test_Report/
│   └── 03_Photos/
├── 04_Deliverables/          # 最终交付物
│   ├── 01_Source_Files/
│   ├── 02_Documents/
│   └── 03_Presentation/
├── 05_References/            # 参考资料
│   ├── 01_Patents/
│   ├── 02_Standards/
│   └── 03_Vendor_Specs/
└── README.md                 # 项目说明文件

我的小技巧:

每个文件夹前面加数字编号(00, 01, 02...),这样在文件管理器里会自动按顺序排列。你想想看,打开项目文件夹,第一眼看到的就是“项目信息”,然后是“设计”、“仿真”、“样机”、“交付”,是不是很清晰?

这个结构的好处是:按流程走。你从需求开始,到设计、仿真、样机、交付,每一步都有对应的文件夹。不会出现“设计文件散落在桌面”的情况。

2.3 版本管理基础(Git入门)

说到版本管理,很多光学工程师的第一反应是:“我又不是程序员,学什么Git?”

我曾经也这么想。直到有一次,我为了对比两个优化方案的差异,手动保存了“方案A_v1.zmx”、“方案A_v2.zmx”、“方案A_final.zmx”、“方案A_final_真的最终版.zmx”…… 一共十几个文件。最后我自己都分不清哪个是哪个。

Git就是来解决这个问题的。

2.3.1 Git能做什么?

场景 传统做法 Git做法
保存版本 手动复制文件,改文件名 git commit,自动记录差异
回溯历史 翻找“最终版”文件 git checkout,一键回到任意版本
对比差异 肉眼对比两个ZEMAX文件 git diff,自动显示改动行
团队协作 微信传文件,手动合并 git push/pull,自动合并冲突
备份恢复 手动复制到U盘/网盘 git push到远程仓库,一键恢复

2.3.2 Git入门三板斧

你不需要成为Git专家,只需要掌握三个命令,就能解决80%的问题。

  1. git init:在项目文件夹里初始化一个Git仓库。只需要做一次。
  2. git add + git commit:保存当前版本。相当于“拍照存档”。
  3. git log + git checkout:查看历史版本,并切换到任意版本。

举个例子,假设你有一个ZEMAX文件:

# 第一步:初始化仓库(只在第一次做)
cd Project_Name
git init

# 第二步:添加文件并保存版本
git add 01_Design/01_Initial_Design/initial_lens.zmx
git commit -m "初始结构,双高斯,F/2.8,焦距50mm"

# 第三步:修改文件后,再次保存
git add 01_Design/02_Optimization/optimized_lens.zmx
git commit -m "第一次优化,像质提升,MTF@30lp/mm达到0.6"

# 第四步:查看历史
git log --oneline
# 输出:
# a1b2c3d 第一次优化,像质提升
# e4f5g6h 初始结构,双高斯

# 第五步:回到初始版本看看
git checkout e4f5g6h

注意:

Git默认不会跟踪二进制文件(如.zmx、.seq)的“内容差异”,它只会保存整个文件的新版本。这意味着,如果你频繁修改大文件,仓库体积会增长很快。我的建议是:每次commit只保存一个“有意义”的版本,比如“优化前”、“优化后”、“公差分析前”,而不是每改一个参数就commit一次。

2.3.3 一个简单的Git工作流

我个人习惯用这种工作流,简单、不容易出错:

  1. 每天开始工作前:git pull(如果有远程仓库,拉取最新版本)
  2. 完成一个里程碑:git add . + git commit -m "描述改动"
  3. 每天结束工作前:git push(推送到远程仓库备份)

就这么简单。你不需要学分支、合并、rebase那些复杂操作。对于光学设计项目,一个主分支(main)就够了。

避坑指南:

我曾经犯过一个错误:把整个“设计”文件夹都git add了,结果把几十个中间版本文件(比如“test_001.zmx”、“test_002.zmx”)都提交了。仓库瞬间变得臃肿不堪。后来我学会了用.gitignore文件,把临时文件、中间文件排除在外。

一个简单的.gitignore示例:

# 忽略所有临时文件
*.bak
*.tmp
# 忽略中间版本(如果你有命名规范)
*_test_*
*_temp_*

2.4 本章知识结构图

下面这张图,把文件体系的三个核心部分串起来了。你可以把它当作一个“检查清单”,每次启动新项目时对照着做。

文件体系总纲知识结构图 文件体系总纲:三大核心支柱 为什么需要文件体系 核心文件夹结构 版本管理(Git) 可追溯性 可复现性 可协作性 可交付性 00_项目信息 01_设计源文件 02_仿真验证 03_样机测试 04_交付物 git init(初始化) git add + commit(存档) git log + checkout(回溯) git push/pull(协作) 核心原则:按项目生命周期分文件夹,用Git管理版本, 每天开始pull,每天结束push。